userver: userver/dump/meta_containers.hpp Source File
Loading...
Searching...
No Matches
meta_containers.hpp
1#pragma once
2
3#include <iterator>
4#include <map>
5#include <set>
6#include <type_traits>
7#include <unordered_map>
8#include <unordered_set>
9#include <utility>
10#include <vector>
11
12#include <userver/dump/meta.hpp>
13#include <userver/utils/meta.hpp>
14
15USERVER_NAMESPACE_BEGIN
16
17namespace dump {
18
19/// @{
20/// Customization point: insert an element into a container
21template <typename T, typename Alloc>
22void Insert(std::vector<T, Alloc>& cont, T&& elem) {
23 cont.push_back(std::forward<T>(elem));
24}
25
26template <typename K, typename V, typename Comp, typename Alloc>
27void Insert(std::map<K, V, Comp, Alloc>& cont, std::pair<const K, V>&& elem) {
28 cont.insert(std::move(elem));
29}
30
31template <typename K, typename V, typename Hash, typename Eq, typename Alloc>
32void Insert(std::unordered_map<K, V, Hash, Eq, Alloc>& cont, std::pair<const K, V>&& elem) {
33 cont.insert(std::move(elem));
34}
35
36template <typename T, typename Comp, typename Alloc>
37void Insert(std::set<T, Comp, Alloc>& cont, T&& elem) {
38 cont.insert(std::forward<T>(elem));
39}
40
41template <typename T, typename Hash, typename Eq, typename Alloc>
42void Insert(std::unordered_set<T, Hash, Eq, Alloc>& cont, T&& elem) {
43 cont.insert(std::forward<T>(elem));
44}
45/// @}
46
47/// Check if a range is a container
48template <typename T>
49concept IsContainer =
50 meta::kIsRange<T> && std::is_default_constructible_v<T> && meta::kIsSizable<T> &&
51 requires(T& t, meta::RangeValueType<T>&& v) { dump::Insert(t, std::move(v)); };
52
53} // namespace dump
54
55USERVER_NAMESPACE_END