meta: assoc container's ::erase/::find accept also convertible keys
This commit is contained in:
@@ -1817,20 +1817,22 @@ struct meta_associative_container::meta_associative_container_proxy {
|
||||
}
|
||||
|
||||
[[nodiscard]] static bool erase(void *container, meta_any key) {
|
||||
using k_type = typename meta_associative_container_traits<Type>::key_type;
|
||||
bool ret = false;
|
||||
|
||||
if(const auto *k_ptr = key.try_cast<typename meta_associative_container_traits<Type>::key_type>(); k_ptr) {
|
||||
ret = meta_associative_container_traits<Type>::erase(*static_cast<Type *>(container), *k_ptr);
|
||||
if(const auto *k_ptr = key.try_cast<typename meta_associative_container_traits<Type>::key_type>(); k_ptr || key.convert<k_type>()) {
|
||||
ret = meta_associative_container_traits<Type>::erase(*static_cast<Type *>(container), k_ptr ? *k_ptr : key.cast<k_type>());
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
[[nodiscard]] static iterator find(void *container, meta_any key) {
|
||||
using k_type = typename meta_associative_container_traits<Type>::key_type;
|
||||
iterator ret{};
|
||||
|
||||
if(const auto *k_ptr = key.try_cast<typename meta_associative_container_traits<Type>::key_type>(); k_ptr) {
|
||||
ret = iterator{std::in_place_type<Type>, meta_associative_container_traits<Type>::find(*static_cast<Type *>(container), *k_ptr)};
|
||||
if(const auto *k_ptr = key.try_cast<typename meta_associative_container_traits<Type>::key_type>(); k_ptr || key.convert<k_type>()) {
|
||||
ret = iterator{std::in_place_type<Type>, meta_associative_container_traits<Type>::find(*static_cast<Type *>(container), k_ptr ? *k_ptr : key.cast<k_type>())};
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -184,7 +184,7 @@ TEST_F(MetaContainer, StdMap) {
|
||||
|
||||
ASSERT_EQ(view.size(), 5u);
|
||||
ASSERT_EQ((*view.find(0)).second.cast<char>(), 'a');
|
||||
ASSERT_EQ((*view.find(1)).second.cast<char>(), 'b');
|
||||
ASSERT_EQ((*view.find(1.)).second.cast<char>(), 'b');
|
||||
|
||||
ASSERT_TRUE(view.erase(0));
|
||||
ASSERT_EQ(view.size(), 4u);
|
||||
@@ -194,6 +194,7 @@ TEST_F(MetaContainer, StdMap) {
|
||||
|
||||
ASSERT_EQ((*view.find(1)).second.cast<char>(), 'f');
|
||||
|
||||
ASSERT_TRUE(view.erase(1.));
|
||||
ASSERT_TRUE(view.clear());
|
||||
ASSERT_EQ(view.size(), 0u);
|
||||
}
|
||||
@@ -236,7 +237,7 @@ TEST_F(MetaContainer, StdSet) {
|
||||
|
||||
ASSERT_EQ(view.size(), 5u);
|
||||
ASSERT_EQ((*view.find(0)).first.cast<int>(), 0);
|
||||
ASSERT_EQ((*view.find(1)).first.cast<int>(), 1);
|
||||
ASSERT_EQ((*view.find(1.)).first.cast<int>(), 1);
|
||||
|
||||
ASSERT_TRUE(view.erase(0));
|
||||
ASSERT_EQ(view.size(), 4u);
|
||||
@@ -246,6 +247,7 @@ TEST_F(MetaContainer, StdSet) {
|
||||
|
||||
ASSERT_EQ((*view.find(1)).first.cast<int>(), 1);
|
||||
|
||||
ASSERT_TRUE(view.erase(1.));
|
||||
ASSERT_TRUE(view.clear());
|
||||
ASSERT_EQ(view.size(), 0u);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user