1#ifndef ENTT_META_CONTAINER_HPP
2#define ENTT_META_CONTAINER_HPP
11#include <unordered_map>
12#include <unordered_set>
14#include "../container/dense_map.hpp"
15#include "../container/dense_set.hpp"
18#include "type_traits.hpp"
25template<
typename,
typename =
void>
26struct fixed_size_sequence_container: std::true_type {};
28template<
typename Type>
29struct fixed_size_sequence_container<Type, std::void_t<decltype(&Type::clear)>>: std::false_type {};
31template<
typename Type>
32inline constexpr bool fixed_size_sequence_container_v = fixed_size_sequence_container<Type>::value;
34template<
typename,
typename =
void>
35struct key_only_associative_container: std::true_type {};
37template<
typename Type>
38struct key_only_associative_container<Type, std::void_t<typename Type::mapped_type>>: std::false_type {};
40template<
typename Type>
41inline constexpr bool key_only_associative_container_v = key_only_associative_container<Type>::value;
43template<
typename,
typename =
void>
44struct reserve_aware_container: std::false_type {};
46template<
typename Type>
47struct reserve_aware_container<Type, std::void_t<decltype(&Type::reserve)>>: std::true_type {};
49template<
typename Type>
50inline constexpr bool reserve_aware_container_v = reserve_aware_container<Type>::value;
59template<
typename Type>
61 static_assert(std::is_same_v<Type, std::remove_cv_t<std::remove_reference_t<Type>>>,
"Unexpected type");
64 static constexpr bool fixed_size = internal::fixed_size_sequence_container_v<Type>;
101 if constexpr(internal::reserve_aware_container_v<Type>) {
116 if constexpr(
fixed_size || !std::is_default_constructible_v<typename Type::value_type>) {
167 value ? *
static_cast<const typename Type::value_type *
>(value) : *
static_cast<const std::remove_reference_t<typename Type::const_reference> *
>(
cref))};
192template<
typename Type>
194 static_assert(std::is_same_v<Type, std::remove_cv_t<std::remove_reference_t<Type>>>,
"Unexpected type");
197 static constexpr bool key_only = internal::key_only_associative_container_v<Type>;
230 if constexpr(internal::reserve_aware_container_v<Type>) {
273 return static_cast<Type *
>(
container)->emplace(*
static_cast<const typename Type::key_type *
>(
key), *
static_cast<const typename Type::mapped_type *
>(value)).second;
305template<
typename...
Args>
314template<
typename Type, auto N>
322template<
typename...
Args>
330template<
typename...
Args>
338template<
typename...
Args>
347template<
typename...
Args>
355template<
typename...
Args>
364template<
typename...
Args>
372template<
typename...
Args>
380template<
typename...
Args>
Associative container for key-value pairs with unique keys.
Associative container for unique objects of a given type.
constexpr Type make_obj_using_allocator(const Allocator &allocator, Args &&...args)
Uses-allocator construction utility (waiting for C++20).
@ cref
Const aliasing mode, the object points to a const element.