DNA Calib 1.1
Project brief
Traits.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#ifdef _MSC_VER
6 #pragma warning(push)
7 #pragma warning(disable : 4365 4987)
8#endif
9#include <cstdint>
10#include <type_traits>
11#include <utility>
12#ifdef _MSC_VER
13 #pragma warning(pop)
14#endif
15
16static_assert(sizeof(char) == 1ul, "Unsupported platform, char is not 8-bits wide.");
17
18namespace terse {
19
20namespace traits {
21
22template<typename ...>
23struct sink {
24 using type = void;
25};
26
27template<typename T, typename = void>
28struct needs_allocator : std::false_type {};
29
30template<typename T>
31struct needs_allocator<T, typename sink<typename T::allocator_type,
32 decltype(std::declval<T>().get_allocator())>::type> : std::true_type {};
33
34template<class>
35struct true_sink : std::true_type {};
36
37// Serializer member functions
38template<class T>
39static auto test_serialize_member(std::int32_t)->true_sink<decltype(std::declval<T>().serialize(std::declval<T&>()))>;
40
41template<class>
42static auto test_serialize_member(std::uint32_t)->std::false_type;
43
44template<class T>
45struct has_serialize_member : decltype(test_serialize_member<T>(0)) {};
46
47template<class T>
48static auto test_load_member(std::int32_t)->true_sink<decltype(std::declval<T>().load(std::declval<T&>()))>;
49
50template<class>
51static auto test_load_member(std::uint32_t)->std::false_type;
52
53template<class T>
54struct has_load_member : decltype(test_load_member<T>(0)) {};
55
56template<class T>
57static auto test_save_member(std::int32_t)->true_sink<decltype(std::declval<T>().save(std::declval<T&>()))>;
58
59template<class>
60static auto test_save_member(std::uint32_t)->std::false_type;
61
62template<class T>
63struct has_save_member : decltype(test_save_member<T>(0)) {};
64
65template<class TContainer>
66static auto test_reserve_member(std::int32_t)->true_sink<decltype(std::declval<TContainer>().reserve(0u))>;
67
68template<class>
69static auto test_reserve_member(std::uint32_t)->std::false_type;
70
71template<class T>
72struct has_reserve_member : decltype(test_reserve_member<T>(0)) {};
73
74template<class TContainer>
75static auto test_push_back_member(std::int32_t)->true_sink<decltype(std::declval<TContainer>().push_back(
76 std::declval<typename TContainer::value_type>()))>;
77
78template<class>
79static auto test_push_back_member(std::uint32_t)->std::false_type;
80
81template<class T>
82struct has_push_back_member : decltype(test_push_back_member<T>(0)) {};
83
84// Serializer free functions
85
86template<class T>
87static auto test_serialize_function(std::int32_t)->true_sink<decltype(serialize(std::declval<T&>(), std::declval<T&>()))>;
88
89template<class>
90static auto test_serialize_function(std::uint32_t)->std::false_type;
91
92template<class T>
93struct has_serialize_function : decltype(test_serialize_function<T>(0)) {};
94
95template<class T>
96static auto test_load_function(std::int32_t)->true_sink<decltype(load(std::declval<T&>(), std::declval<T&>()))>;
97
98template<class>
99static auto test_load_function(std::uint32_t)->std::false_type;
100
101template<class T>
102struct has_load_function : decltype(test_load_function<T>(0)) {};
103
104template<class T>
105static auto test_save_function(std::int32_t)->true_sink<decltype(save(std::declval<T&>(), std::declval<T&>()))>;
106
107template<class>
108static auto test_save_function(std::uint32_t)->std::false_type;
109
110template<class T>
111struct has_save_function : decltype(test_save_function<T>(0)) {};
112
113template<typename TContainer>
114using is_batchable = std::is_scalar<typename TContainer::value_type>;
115
116template<typename TContainer>
118 static constexpr bool value = (sizeof(typename TContainer::value_type) > 1ul);
119};
120
121template<typename T>
122struct is_pair : public std::false_type {};
123
124template<typename K, typename V>
125struct is_pair<std::pair<K, V> > : public std::true_type {};
126
127template<typename T>
128struct is_tuple : public std::false_type {};
129
130template<typename K, typename V>
131struct is_tuple<std::tuple<K, V> > : public std::true_type {};
132
133} // namespace traits
134
135} // namespace terse
static auto test_reserve_member(std::int32_t) -> true_sink< decltype(std::declval< TContainer >().reserve(0u))>
static auto test_load_function(std::int32_t) -> true_sink< decltype(load(std::declval< T & >(), std::declval< T & >()))>
static auto test_serialize_function(std::int32_t) -> true_sink< decltype(serialize(std::declval< T & >(), std::declval< T & >()))>
static auto test_serialize_member(std::int32_t) -> true_sink< decltype(std::declval< T >().serialize(std::declval< T & >()))>
static auto test_save_function(std::int32_t) -> true_sink< decltype(save(std::declval< T & >(), std::declval< T & >()))>
static auto test_load_member(std::int32_t) -> true_sink< decltype(std::declval< T >().load(std::declval< T & >()))>
static auto test_save_member(std::int32_t) -> true_sink< decltype(std::declval< T >().save(std::declval< T & >()))>
static auto test_push_back_member(std::int32_t) -> true_sink< decltype(std::declval< TContainer >().push_back(std::declval< typename TContainer::value_type >()))>
std::is_scalar< typename TContainer::value_type > is_batchable
Definition: Traits.h:114
Definition: Archive.h:14
Definition: Traits.h:102
Definition: Traits.h:54
Definition: Traits.h:72
Definition: Traits.h:111
Definition: Traits.h:63
Definition: Traits.h:117
Definition: Traits.h:122
Definition: Traits.h:128
Definition: Traits.h:28
Definition: Traits.h:23
void type
Definition: Traits.h:24
Definition: Traits.h:35