UdonLibrary
1.0.0
機械システム研究部 C++ ライブラリ
Toggle main menu visibility
読み取り中…
検索中…
一致する文字列を見つけられません
SerializedSize.hpp
[詳解]
1
//
2
// シリアライズ後のサイズを取得する
3
//
4
// Copyright (c) 2022 udonrobo
5
//
6
7
#pragma once
8
9
#include <
Udon/Stl/EnableSTL.hpp
>
10
#include <type_traits>
11
#include <utility>
12
#include <limits.h>
13
14
#include <
Udon/Algorithm/Math.hpp
>
15
#include <
Udon/Algorithm/CRC.hpp
>
16
#include <
Udon/Types/Float.hpp
>
17
#include <
Udon/Traits/Typedef.hpp
>
18
#include <
Udon/Traits/AlwaysFalse.hpp
>
19
#include <
Udon/Serializer/SerializerTraits.hpp
>
20
#include <
Udon/Traits/HasMemberFunction.hpp
>
21
22
#if CHAR_BIT != 8
23
# error "1byte is must be 8bit"
24
#endif
25
26
namespace
Udon
27
{
28
namespace
Impl
29
{
30
struct
SerializedBitSizeImpl
31
{
32
public
:
33
using
ResultType
= size_t;
34
35
template
<
typename
... Args>
36
constexpr
ResultType
operator()
(Args&&... args)
const
noexcept
37
{
38
return
argsUnpack(std::forward<Args>(args)...);
39
}
40
41
private
:
43
template
<
typename
Head,
typename
... Tail>
44
constexpr
ResultType
argsUnpack(Head&& head, Tail&&... tail)
const
noexcept
45
{
46
return
Sizeof<Head&&>::value(*
this
, std::forward<Head>(head)) +
47
argsUnpack(std::forward<Tail>(tail)...);
48
}
49
51
constexpr
ResultType
argsUnpack() const noexcept {
return
0; }
52
53
private
:
56
template
<
typename
T,
typename
=
void
>
57
struct
Sizeof
58
{
59
static
constexpr
ResultType
value(...) noexcept
60
{
61
#ifdef __FUNCTION__
62
static_assert
(AlwaysFalse<T>::value,
"T is not sizable!"
__FUNCTION__);
// サイズを取得できないオブジェクトが渡された場合、コンパイルエラーになる
63
#else
64
static_assert
(AlwaysFalse<T>::value,
"T is not sizable!"
);
// サイズを取得できないオブジェクトが渡された場合、コンパイルエラーになる
65
#endif
66
return
0;
67
}
68
};
69
71
template
<
typename
Bool>
72
struct
Sizeof<Bool,
EnableIfVoidT
<
IsBool
<
RemoveCVRefT
<Bool>>::value>>
73
{
74
static
constexpr
ResultType
value(...) noexcept {
return
1; }
75
};
76
78
template
<
typename
Integral>
79
struct
Sizeof<Integral,
EnableIfVoidT
<
IsIntegralNotBool
<
RemoveCVRefT
<Integral>>::value>>
80
{
81
static
constexpr
ResultType
value(...) noexcept {
return
sizeof
(Integral) * CHAR_BIT; }
82
};
83
85
template
<
typename
Float>
86
struct
Sizeof<Float,
EnableIfVoidT
<
IsFloatingPoint
<
RemoveCVRefT
<Float>>::value>>
87
{
88
static
constexpr
ResultType
value(...) noexcept {
return
sizeof
(Udon::Float32) * CHAR_BIT; }
89
};
90
92
template
<
typename
Enum>
93
struct
Sizeof<Enum,
EnableIfVoidT
<
IsEnum
<
RemoveCVRefT
<Enum>>::value>>
94
{
95
static
constexpr
ResultType
value(...) noexcept {
return
sizeof
(Enum) * CHAR_BIT; }
96
};
97
99
template
<
typename
Array>
100
struct
Sizeof<Array,
EnableIfVoidT
<
IsArray
<
RemoveCVRefT
<Array>>::value>>
101
{
102
static
constexpr
ResultType
value(
const
SerializedBitSizeImpl&
self
, Array&& array)
noexcept
103
{
104
using
ElementT =
typename
std::remove_extent<RemoveReferenceT<Array>>::type;
105
return
Sizeof<ElementT>::value(
self
, std::forward<ElementT>(*array)) * std::extent<RemoveReferenceT<Array>>::value;
106
}
107
};
108
110
template
<
typename
Enumerable>
111
struct
Sizeof<Enumerable,
EnableIfVoidT
<HasMemberFunctionEnumerate<
RemoveReferenceT
<Enumerable>>::value>>
112
{
113
static
constexpr
ResultType
value(
const
SerializedBitSizeImpl&
self
, Enumerable&& e)
noexcept
114
{
115
return
e.enumerate(
self
);
116
}
117
};
118
};
119
}
// namespace Impl
120
}
// namespace Udon
AlwaysFalse.hpp
CRC.hpp
EnableSTL.hpp
Float.hpp
HasMemberFunction.hpp
Math.hpp
SerializerTraits.hpp
Typedef.hpp
Udon::Impl
Definition
CanUtility.hpp:11
Udon::Traits::IsEnum
std::is_enum< T > IsEnum
Definition
Typedef.hpp:49
Udon::Traits::RemoveCVRefT
RemoveConstT< RemoveVolatileT< RemoveReferenceT< T > > > RemoveCVRefT
Definition
Typedef.hpp:28
Udon::Traits::IsFloatingPoint
std::is_floating_point< T > IsFloatingPoint
Definition
Typedef.hpp:40
Udon::Traits::EnableIfVoidT
EnableIfT< Test, void > EnableIfVoidT
Definition
Typedef.hpp:69
Udon::Traits::RemoveReferenceT
typename std::remove_reference< T >::type RemoveReferenceT
Definition
Typedef.hpp:25
Udon::Traits::IsIntegralNotBool
std::integral_constant< bool, IsIntegral< T >::value and not IsBool< T >::value > IsIntegralNotBool
Definition
Typedef.hpp:37
Udon::Traits::IsBool
std::is_same< T, bool > IsBool
Definition
Typedef.hpp:31
Udon::Traits::IsArray
std::is_array< T > IsArray
Definition
Typedef.hpp:52
Udon
Definition
Bit.hpp:12
Udon::self
CanBusTeensy< Bus > * CanBusTeensy< Bus >::self
Definition
CanBusTeensy.hpp:275
Udon::Impl::SerializedBitSizeImpl
Definition
SerializedSize.hpp:31
Udon::Impl::SerializedBitSizeImpl::ResultType
size_t ResultType
Definition
SerializedSize.hpp:33
Udon::Impl::SerializedBitSizeImpl::operator()
constexpr ResultType operator()(Args &&... args) const noexcept
Definition
SerializedSize.hpp:36