-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtraits.h
60 lines (48 loc) · 1.7 KB
/
traits.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#pragma once
#include <type_traits>
namespace serializer
{
namespace traits
{
template <typename T>
struct is_map : std::false_type {};
template <typename... Ts>
struct is_map<std::map<Ts...>> : std::true_type {};
template <typename... Ts>
struct is_map<std::unordered_map<Ts...>> : std::true_type {};
template<typename... Ts>
inline constexpr bool is_map_v = is_map<Ts...>::value;
template <typename T1, typename T2>
struct is_map_w_key : std::false_type {};
template <typename KeyT, typename... Ts>
struct is_map_w_key<KeyT, std::map<KeyT, Ts...>> : std::true_type {};
template <typename KeyT, typename... Ts>
struct is_map_w_key<KeyT, std::unordered_map<KeyT, Ts...>> : std::true_type {};
template<typename KeyT, typename... Ts>
inline constexpr bool is_map_w_key_v = is_map_w_key<KeyT, Ts...>::value;
template <typename T>
struct is_pair : std::false_type {};
template <typename... Ts>
struct is_pair<std::pair<Ts...>> : std::true_type {};
template<typename... Ts>
inline constexpr bool is_pair_v = is_pair<Ts...>::value;
template <typename T, typename Arg1>
struct has_serialize_function {
private:
template <typename U>
static decltype(std::declval<U>().serialize(std::declval<std::add_lvalue_reference_t<Arg1>>()), void(), std::true_type()) test(int);
template <typename>
static std::false_type test(...);
public:
using type = decltype(test<T>(int(0)));
enum { value = type::value };
};
template <typename T, typename Arg>
inline constexpr bool has_serialize_function_v = has_serialize_function<T, Arg>::value;
template<bool deserializer>
struct SerializerTraits {
using is_serializer = std::integral_constant<bool, not deserializer>;
using is_deserializer = std::integral_constant<bool, deserializer>;
};
}
}