21 #ifndef SIG_CONTAINER_TRAITS_H
22 #define SIG_CONTAINER_TRAITS_H
29 #include <unordered_set>
30 #include <unordered_map>
31 #include <initializer_list>
33 #include "../array.hpp"
75 static const bool exist =
false;
84 static const bool exist =
false;
87 template<
template<
class,
size_t>
class C,
class T,
size_t N>
94 static const size_t size = N;
99 template<
class U,
size_t M>
106 static C<T, N>
make(
size_t n){
return C<T, N>(); }
114 c.push_back(std::move(t));
118 template<
class T,
size_t N>
122 template<
class T,
size_t N>
153 template<
template<
class,
class>
class C,
class T,
class A>
156 static const bool exist =
true;
161 using rebind = C<U, typename A::template rebind<U>::other>;
164 static C<T, A>
make(
size_t n){
return C<T, A>(); }
172 c.push_back(std::move(t));
175 static void concat(C<T, A>& lhs, C<T, A>
const& rhs)
177 lhs.insert(lhs.end(), rhs.begin(), rhs.end());
179 static void concat(C<T, A>& lhs, C<T, A>&& rhs)
181 lhs.insert(lhs.end(), std::make_move_iterator(rhs.begin()), std::make_move_iterator(rhs.end()));
185 template<
class... Args>
188 static std::vector<Args...>
make(
size_t n){ std::vector<Args...> tmp; tmp.reserve(n);
return tmp; }
191 template<
class... Args>
195 template<
class... Args>
206 template<
template<
class,
class,
class>
class C,
class T,
template<
class>
class O,
class A>
209 static const bool exist =
true;
217 static C<T, O<T>, A>
make(
size_t n){
return C<T, O<T>, A>(); }
225 c.insert(std::move(t));
228 static void concat(C<T, O<T>, A>& lhs, C<T, O<T>, A>
const& rhs)
230 lhs.insert(rhs.begin(), rhs.end());
232 static void concat(C<T, O<T>, A>& lhs, C<T, O<T>, A>&& rhs)
234 lhs.insert(std::make_move_iterator(rhs.begin()), std::make_move_iterator(rhs.end()));
239 template<
template<
class,
class,
class,
class>
class C,
class K,
class T,
template<
class>
class O,
class A>
242 static const bool exist =
true;
246 template<
class U,
class V>
250 static C<K, T, O<K>, A>
make(
size_t n){
return C<K, T, O<K>, A>(); }
255 c.insert(std::forward<P>(pair));
258 static void concat(C<K, T, O<K>, A>& lhs, C<K, T, O<K>, A>
const& rhs)
260 lhs.insert(rhs.begin(), rhs.end());
262 static void concat(C<K, T, O<K>, A>& lhs, C<K, T, O<K>, A>&& rhs)
264 lhs.insert(std::make_move_iterator(rhs.begin()), std::make_move_iterator(rhs.end()));
268 template<
class... Args>
272 template<
class... Args>
277 template<
class K,
class T,
class... Args>
281 template<
class K,
class T,
class... Args>
286 template<
class... Args>
290 template<
class... Args>
291 struct container_traits<std::multimap<Args...>> :
public associative_container_traits<std::multimap<Args...>>
302 template<
template<
class,
class,
class,
class>
class C,
class T,
template<
class>
class H,
template<
class>
class O,
class A>
305 static const bool exist =
true;
313 static C<T, H<T>, O<T>, A>
make(
size_t n){
315 return C<T, H<T>, O<T>, A>();
324 c.insert(std::move(t));
327 static void concat(C<T, H<T>, O<T>, A>& lhs, C<T, H<T>, O<T>, A>
const& rhs)
329 lhs.insert(rhs.begin(), rhs.end());
331 static void concat(C<T, H<T>, O<T>, A>& lhs, C<T, H<T>, O<T>, A>&& rhs)
333 lhs.insert(std::make_move_iterator(rhs.begin()), std::make_move_iterator(rhs.end()));
337 template<
template<
class,
class,
class,
class,
class>
class C,
class K,
class T,
template<
class>
class H,
template<
class>
class O,
class A>
340 static const bool exist =
true;
344 template<
class U,
class V>
348 static C<K, T, H<K>, O<K>, A>
make(
size_t n){
350 return C<K, T, H<K>, O<K>, A>();
356 c.insert(std::forward<P>(pair));
359 static void concat(C<K, T, H<K>, O<K>, A>& lhs, C<K, T, H<K>, O<K>, A>
const& rhs)
361 lhs.insert(rhs.begin(), rhs.end());
363 static void concat(C<K, T, H<K>, O<K>, A>& lhs, C<K, T, H<K>, O<K>, A>&& rhs)
365 lhs.insert(std::make_move_iterator(rhs.begin()), std::make_move_iterator(rhs.end()));
369 template<
class... Args>
373 template<
class... Args>
378 template<
class K,
class T,
class... Args>
382 template<
class K,
class T,
class... Args>
387 template<
class... Args>
391 template<
class... Args>
392 struct container_traits<std::unordered_multimap<Args...>> :
public hash_container_traits<std::unordered_multimap<Args...>>
C< U, O< U >, typename A::template rebind< U >::other > rebind
static C< T, H< T >, O< T >, A > make(size_t n)
static C< T, N > make(size_t n)
static void add_element(C< T, N > &c, T &&t)
static void add_element(C< T, A > &c, T const &t)
static void concat(C< K, T, H< K >, O< K >, A > &lhs, C< K, T, H< K >, O< K >, A > &&rhs)
static void add_element(C< T, N > &c, T const &t)
C< U, V, H< U >, O< U >, typename A::template rebind< std::pair< U, V >>::other > rebind
static std::vector< Args...> make(size_t n)
C< U, H< U >, O< U >, typename A::template rebind< U >::other > rebind
static void concat(C< K, T, O< K >, A > &lhs, C< K, T, O< K >, A > const &rhs)
static void add_element(C< K, T, O< K >, A > &c, P &&pair)
static C< T, O< T >, A > make(size_t n)
static void add_element(C< T, O< T >, A > &c, T &&t)
static void concat(C< T, A > &lhs, C< T, A > const &rhs)
static void concat(C< T, H< T >, O< T >, A > &lhs, C< T, H< T >, O< T >, A > const &rhs)
static void concat(C< T, H< T >, O< T >, A > &lhs, C< T, H< T >, O< T >, A > &&rhs)
static void concat(C< K, T, H< K >, O< K >, A > &lhs, C< K, T, H< K >, O< K >, A > const &rhs)
static C< T, A > make(size_t n)
static void add_element(C< T, O< T >, A > &c, T const &t)
static C< K, T, O< K >, A > make(size_t n)
C< U, V, O< U >, typename A::template rebind< std::pair< U, V >>::other > rebind
sequence_container_traits
C< U, typename A::template rebind< U >::other > rebind
static void add_element(C< T, A > &c, T &&t)
static void concat(C< T, A > &lhs, C< T, A > &&rhs)
static void concat(C< T, O< T >, A > &lhs, C< T, O< T >, A > &&rhs)
static void add_element(C< K, T, H< K >, O< K >, A > &c, P &&pair)
static void concat(C< T, O< T >, A > &lhs, C< T, O< T >, A > const &rhs)
std::pair< const K, T > value_type
static C< K, T, H< K >, O< K >, A > make(size_t n)
static void concat(C< K, T, O< K >, A > &lhs, C< K, T, O< K >, A > &&rhs)
static void add_element(C< T, H< T >, O< T >, A > &c, T &&t)
auto map(F &&func, C &&list)
1引数高階関数
static void add_element(C< T, H< T >, O< T >, A > &c, T const &t)
associative_container_traits
std::pair< const K, T > value_type