summaryrefslogtreecommitdiff
path: root/absl/container/flat_hash_map.h
diff options
context:
space:
mode:
authorGravatar Evan Brown <ezb@google.com>2024-03-12 14:29:39 -0700
committerGravatar Copybara-Service <copybara-worker@google.com>2024-03-12 14:31:30 -0700
commit038561296676d1cae4a3cee30f8c924befbb6083 (patch)
tree724042c21eb6dfc0913a1eff86ffc7da3e0f4274 /absl/container/flat_hash_map.h
parent3c1f9be71ee280539f02e57c5e461b0271f54e91 (diff)
Add extern templates for common swisstable types.
Motivation: mitigate linker input size increase from swisstable optimizations. Note: the changes in raw_hash_set.h are fixing build errors that happened when adding the explicit instantiations. The change in unchecked_deref is because set iterators have const reference access whereas map iterators have mutable reference access and the function is never actually called for sets (it's used in raw_hash_map) so it wasn't needed before. I'm not sure why the soo_slot/soo_iterator problems didn't cause compile errors earlier. PiperOrigin-RevId: 615174043 Change-Id: Iac5eb2332a76e9b70021156fbb2b8def47a5391d
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