summaryrefslogtreecommitdiff
path: root/absl/container/flat_hash_map.h
diff options
context:
space:
mode:
Diffstat (limited to 'absl/container/flat_hash_map.h')
-rw-r--r--absl/container/flat_hash_map.h41
1 files changed, 41 insertions, 0 deletions
diff --git a/absl/container/flat_hash_map.h b/absl/container/flat_hash_map.h
index a33c794f..2f4457d6 100644
--- a/absl/container/flat_hash_map.h
+++ b/absl/container/flat_hash_map.h
@@ -31,15 +31,20 @@
#define ABSL_CONTAINER_FLAT_HASH_MAP_H_
#include <cstddef>
+#include <cstdint>
+#include <memory>
#include <new>
+#include <string>
#include <type_traits>
#include <utility>
#include "absl/algorithm/container.h"
+#include "absl/base/config.h"
#include "absl/base/macros.h"
#include "absl/container/internal/container_memory.h"
#include "absl/container/internal/hash_function_defaults.h" // IWYU pragma: export
#include "absl/container/internal/raw_hash_map.h" // IWYU pragma: export
+#include "absl/container/internal/raw_hash_set.h" // IWYU pragma: export
#include "absl/memory/memory.h"
namespace absl {
@@ -632,6 +637,42 @@ struct IsUnorderedContainer<
} // namespace container_algorithm_internal
+// Explicit template instantiations for common map types in order to decrease
+// linker input size. Note that explicitly instantiating flat_hash_map itself
+// doesn't help because it has no non-alias members. If we need to decrease
+// linker input size more, we could potentially (a) add more key/value types,
+// e.g. string_view/Cord, (b) instantiate some template member functions, e.g.
+// operator[]/find. The EXTERN argument is `extern` for the declaration and
+// empty for the definition.
+#define ABSL_INTERNAL_TEMPLATE_FLAT_HASH_MAP(TEMPLATE, KEY, VALUE) \
+ TEMPLATE class absl::container_internal::raw_hash_map< \
+ absl::container_internal::FlatHashMapPolicy<KEY, VALUE>, \
+ absl::container_internal::hash_default_hash<KEY>, \
+ absl::container_internal::hash_default_eq<KEY>, \
+ std::allocator<std::pair<const KEY, VALUE>>>; \
+ TEMPLATE class absl::container_internal::raw_hash_set< \
+ absl::container_internal::FlatHashMapPolicy<KEY, VALUE>, \
+ absl::container_internal::hash_default_hash<KEY>, \
+ absl::container_internal::hash_default_eq<KEY>, \
+ std::allocator<std::pair<const KEY, VALUE>>>;
+
+// We use exact-width integer types rather than `int`/`long`/`long long` because
+// these are the types recommended in the Google C++ style guide and which are
+// commonly used in Google code.
+ABSL_INTERNAL_TEMPLATE_FLAT_HASH_MAP(extern template, int32_t, int32_t);
+ABSL_INTERNAL_TEMPLATE_FLAT_HASH_MAP(extern template, std::string, int32_t);
+ABSL_INTERNAL_TEMPLATE_FLAT_HASH_MAP(extern template, int32_t, std::string);
+ABSL_INTERNAL_TEMPLATE_FLAT_HASH_MAP(extern template, int64_t, int64_t);
+ABSL_INTERNAL_TEMPLATE_FLAT_HASH_MAP(extern template, std::string, int64_t);
+ABSL_INTERNAL_TEMPLATE_FLAT_HASH_MAP(extern template, int64_t, std::string);
+ABSL_INTERNAL_TEMPLATE_FLAT_HASH_MAP(extern template, uint32_t, uint32_t);
+ABSL_INTERNAL_TEMPLATE_FLAT_HASH_MAP(extern template, std::string, uint32_t);
+ABSL_INTERNAL_TEMPLATE_FLAT_HASH_MAP(extern template, uint32_t, std::string);
+ABSL_INTERNAL_TEMPLATE_FLAT_HASH_MAP(extern template, uint64_t, uint64_t);
+ABSL_INTERNAL_TEMPLATE_FLAT_HASH_MAP(extern template, std::string, uint64_t);
+ABSL_INTERNAL_TEMPLATE_FLAT_HASH_MAP(extern template, uint64_t, std::string);
+ABSL_INTERNAL_TEMPLATE_FLAT_HASH_MAP(extern template, std::string, std::string);
+
ABSL_NAMESPACE_END
} // namespace absl