Просмотр исходного кода

dense_map: emplace create-and-discard mode if strictly required only

Michele Caini 4 лет назад
Родитель
Сommit
e5dcea1fa0
1 измененных файлов с 19 добавлено и 11 удалено
  1. 19 11
      src/entt/container/dense_map.hpp

+ 19 - 11
src/entt/container/dense_map.hpp

@@ -599,19 +599,27 @@ public:
      * insertion took place.
      */
     template<typename... Args>
-    std::pair<iterator, bool> emplace(Args &&...args) {
-        auto &node = packed.first().emplace_back(packed.first().size(), std::forward<Args>(args)...);
-        const auto index = key_to_bucket(node.element.first);
+    std::pair<iterator, bool> emplace([[maybe_unused]] Args &&...args) {
+        if constexpr(sizeof...(Args) == 0u) {
+            return insert_or_do_nothing(key_type{});
+        } else if constexpr(sizeof...(Args) == 1u) {
+            return insert_or_do_nothing(std::forward<Args>(args).first..., std::forward<Args>(args).second...);
+        } else if constexpr(sizeof...(Args) == 2u) {
+            return insert_or_do_nothing(std::forward<Args>(args)...);
+        } else {
+            auto &node = packed.first().emplace_back(packed.first().size(), std::forward<Args>(args)...);
+            const auto index = key_to_bucket(node.element.first);
+
+            if(auto it = constrained_find(node.element.first, index); it != end()) {
+                packed.first().pop_back();
+                return std::make_pair(it, false);
+            }
 
-        if(auto it = constrained_find(node.element.first, index); it != end()) {
-            packed.first().pop_back();
-            return std::make_pair(it, false);
-        }
+            std::swap(node.next, sparse.first()[index]);
+            rehash_if_required();
 
-        std::swap(node.next, sparse.first()[index]);
-        rehash_if_required();
-
-        return std::make_pair(--end(), true);
+            return std::make_pair(--end(), true);
+        }
     }
 
     /**