@@ -68,46 +68,73 @@ using SpanBytes = Span<uint8_t>;
68
68
using SpanBytesConst = Span<uint8_t const >;
69
69
using StringSize = uint16_t ;
70
70
71
- // ------------- Forward declarations of BufferSize ------------------
71
+ // Check if a Function like this is implemented:
72
+ //
73
+ // template <typename Func> std::string_view TypeDefinition(T&, Func&);
74
+
75
+ template <typename T, class = void >
76
+ struct has_TypeDefinition : std::false_type
77
+ {
78
+ };
79
+
80
+ const auto EmptyFuncion = [](const char *, void *) {};
81
+ using EmptyFunc = decltype(EmptyFuncion);
82
+
83
+ template <typename T1, typename T2>
84
+ using enable_if_same_t = std::enable_if_t <std::is_same_v<T1, T2>>;
72
85
73
86
template <typename T>
87
+ struct has_TypeDefinition <
88
+ T, enable_if_same_t <std::string_view,
89
+ decltype (TypeDefinition(std::declval<T&>(),
90
+ std::declval<EmptyFunc&>()))>>
91
+ : std::true_type
92
+ {
93
+ };
94
+
95
+ // ------------- Forward declarations of BufferSize ------------------
96
+
97
+ template <typename T, bool = true >
74
98
size_t BufferSize (const T& val);
75
99
76
100
template <>
77
101
size_t BufferSize (const std::string& str);
78
102
79
- template <class T , size_t N>
103
+ template <class T , size_t N, std:: enable_if_t <!has_TypeDefinition<std::array<T, N>>::value, bool > = true >
80
104
size_t BufferSize (const std::array<T, N>& v);
81
105
82
- template <template <class , class > class Container , class T , class ... TArgs>
106
+ template <template <class , class > class Container , class T , class ... TArgs,
107
+ std::enable_if_t <!has_TypeDefinition<Container<T, TArgs...>>::value, bool > = true >
83
108
size_t BufferSize (const Container<T, TArgs...>& vect);
84
109
85
110
// ---------- Forward declarations of DeserializeFromBuffer -----------
86
111
87
- template <typename T>
112
+ template <typename T, bool = true >
88
113
void DeserializeFromBuffer (SpanBytesConst& buffer, T& dest);
89
114
90
115
template <>
91
116
void DeserializeFromBuffer (SpanBytesConst& buffer, std::string& str);
92
117
93
- template <class T , size_t N>
118
+ template <class T , size_t N, std:: enable_if_t <!has_TypeDefinition<std::array<T, N>>::value, bool > = true >
94
119
void DeserializeFromBuffer (SpanBytesConst& buffer, std::array<T, N>& v);
95
120
96
- template <template <class , class > class Container , class T , class ... TArgs>
121
+ template <template <class , class > class Container , class T , class ... TArgs,
122
+ std::enable_if_t <!has_TypeDefinition<Container<T, TArgs...>>::value, bool > = true >
97
123
void DeserializeFromBuffer (SpanBytesConst& buffer, Container<T, TArgs...>& dest);
98
124
99
125
// ---------- Forward declarations of SerializeIntoBuffer -----------
100
126
101
- template <typename T>
127
+ template <typename T, bool = true >
102
128
void SerializeIntoBuffer (SpanBytes& buffer, const T& value);
103
129
104
130
template <>
105
131
void SerializeIntoBuffer (SpanBytes& buffer, const std::string& str);
106
132
107
- template <class T , size_t N>
133
+ template <class T , size_t N, std:: enable_if_t <!has_TypeDefinition<std::array<T, N>>::value, bool > = true >
108
134
void SerializeIntoBuffer (SpanBytes& buffer, const std::array<T, N>& v);
109
135
110
- template <template <class , class > class Container , class T , class ... TArgs>
136
+ template <template <class , class > class Container , class T , class ... TArgs,
137
+ std::enable_if_t <!has_TypeDefinition<Container<T, TArgs...>>::value, bool > = true >
111
138
void SerializeIntoBuffer (SpanBytes& buffer, const Container<T, TArgs...>& vect);
112
139
113
140
// -----------------------------------------------------------------------
@@ -228,31 +255,6 @@ inline T EndianSwap(T t)
228
255
std::runtime_error (" Problem with IndianSwap" );
229
256
}
230
257
}
231
-
232
- // Check if a Function like this is implemented:
233
- //
234
- // template <typename Func> std::string_view TypeDefinition(T&, Func&);
235
-
236
- template <typename T, class = void >
237
- struct has_TypeDefinition : std::false_type
238
- {
239
- };
240
-
241
- const auto EmptyFuncion = [](const char *, void *) {};
242
- using EmptyFunc = decltype(EmptyFuncion);
243
-
244
- template <typename T1, typename T2>
245
- using enable_if_same_t = std::enable_if_t <std::is_same_v<T1, T2>>;
246
-
247
- template <typename T>
248
- struct has_TypeDefinition <
249
- T, enable_if_same_t <std::string_view,
250
- decltype (TypeDefinition(std::declval<T&>(),
251
- std::declval<EmptyFunc&>()))>>
252
- : std::true_type
253
- {
254
- };
255
-
256
258
template <typename T>
257
259
inline constexpr bool is_number ()
258
260
{
@@ -314,7 +316,7 @@ inline constexpr bool is_vector()
314
316
// -----------------------------------------------------------------------
315
317
// -----------------------------------------------------------------------
316
318
317
- template <typename T>
319
+ template <typename T, bool >
318
320
inline size_t BufferSize (const T& val)
319
321
{
320
322
static_assert (is_number<T>() || has_TypeDefinition<T>(), " Missing TypeDefinition" );
@@ -341,13 +343,15 @@ inline size_t BufferSize(const std::string& str)
341
343
return sizeof (StringSize) + str.size ();
342
344
}
343
345
344
- template <class T , size_t N>
346
+ template <class T , size_t N,
347
+ std::enable_if_t <!has_TypeDefinition<std::array<T, N>>::value, bool >>
345
348
inline size_t BufferSize (const std::array<T, N>&)
346
349
{
347
350
return BufferSize (T{}) * N;
348
351
}
349
352
350
- template <template <class , class > class Container , class T , class ... TArgs>
353
+ template <template <class , class > class Container , class T , class ... TArgs,
354
+ std::enable_if_t <!has_TypeDefinition<Container<T, TArgs...>>::value, bool >>
351
355
inline size_t BufferSize (const Container<T, TArgs...>& vect)
352
356
{
353
357
if constexpr (std::is_trivially_copyable_v<T> && is_vector<Container<T, TArgs...>>())
@@ -369,7 +373,7 @@ inline size_t BufferSize(const Container<T, TArgs...>& vect)
369
373
// -----------------------------------------------------------------------
370
374
// -----------------------------------------------------------------------
371
375
372
- template <typename T>
376
+ template <typename T, bool >
373
377
inline void DeserializeFromBuffer (SpanBytesConst& buffer, T& dest)
374
378
{
375
379
static_assert (is_number<T>() || has_TypeDefinition<T>(), " Missing TypeDefinition" );
@@ -412,7 +416,8 @@ inline void DeserializeFromBuffer(SpanBytesConst& buffer, std::string& dest)
412
416
buffer.trimFront (size);
413
417
}
414
418
415
- template <typename T, size_t N>
419
+ template <typename T, size_t N,
420
+ std::enable_if_t <!has_TypeDefinition<std::array<T, N>>::value, bool >>
416
421
inline void DeserializeFromBuffer (SpanBytesConst& buffer, std::array<T, N>& dest)
417
422
{
418
423
if (N * BufferSize (T{}) > buffer.size ())
@@ -434,7 +439,8 @@ inline void DeserializeFromBuffer(SpanBytesConst& buffer, std::array<T, N>& dest
434
439
}
435
440
}
436
441
437
- template <template <class , class > class Container , class T , class ... TArgs>
442
+ template <template <class , class > class Container , class T , class ... TArgs,
443
+ std::enable_if_t <!has_TypeDefinition<Container<T, TArgs...>>::value, bool >>
438
444
inline void DeserializeFromBuffer (SpanBytesConst& buffer, Container<T, TArgs...>& dest)
439
445
{
440
446
uint32_t num_values = 0 ;
@@ -475,7 +481,7 @@ inline void DeserializeFromBuffer(SpanBytesConst& buffer, Container<T, TArgs...>
475
481
// -----------------------------------------------------------------------
476
482
// -----------------------------------------------------------------------
477
483
478
- template <typename T>
484
+ template <typename T, bool >
479
485
inline void SerializeIntoBuffer (SpanBytes& buffer, T const & value)
480
486
{
481
487
static_assert (is_number<T>() || has_TypeDefinition<T>(), " Missing TypeDefinition" );
@@ -523,7 +529,8 @@ inline void SerializeIntoBuffer(SpanBytes& buffer, std::string const& str)
523
529
buffer.trimFront (size);
524
530
}
525
531
526
- template <typename T, size_t N>
532
+ template <typename T, size_t N,
533
+ std::enable_if_t <!has_TypeDefinition<std::array<T, N>>::value, bool >>
527
534
inline void SerializeIntoBuffer (SpanBytes& buffer, std::array<T, N> const & vect)
528
535
{
529
536
if (N > std::numeric_limits<uint32_t >::max ())
@@ -553,7 +560,8 @@ inline void SerializeIntoBuffer(SpanBytes& buffer, std::array<T, N> const& vect)
553
560
}
554
561
}
555
562
556
- template <template <class , class > class Container , class T , class ... TArgs>
563
+ template <template <class , class > class Container , class T , class ... TArgs,
564
+ std::enable_if_t <!has_TypeDefinition<Container<T, TArgs...>>::value, bool >>
557
565
inline void SerializeIntoBuffer (SpanBytes& buffer, Container<T, TArgs...> const & vect)
558
566
{
559
567
const auto num_values = static_cast <uint32_t >(vect.size ());
0 commit comments