UdonLibrary 1.0.0
機械システム研究部 C++ ライブラリ
読み取り中…
検索中…
一致する文字列を見つけられません
SerializedSize.hpp
[詳解]
1//
2// シリアライズ後のサイズを取得する
3//
4// Copyright (c) 2022-2024 udonrobo
5//
6
7#pragma once
8
10#include <type_traits>
11#include <utility>
12#include <limits.h>
13
16#include <Udon/Types/Float.hpp>
21
22#if CHAR_BIT != 8
23# error "1byte is must be 8bit"
24#endif
25
26namespace Udon
27{
28 namespace Impl
29 {
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
std::is_enum< T > IsEnum
Definition Typedef.hpp:49
RemoveConstT< RemoveVolatileT< RemoveReferenceT< T > > > RemoveCVRefT
Definition Typedef.hpp:28
std::is_floating_point< T > IsFloatingPoint
Definition Typedef.hpp:40
EnableIfT< Test, void > EnableIfVoidT
Definition Typedef.hpp:69
typename std::remove_reference< T >::type RemoveReferenceT
Definition Typedef.hpp:25
std::integral_constant< bool, IsIntegral< T >::value and not IsBool< T >::value > IsIntegralNotBool
Definition Typedef.hpp:37
std::is_same< T, bool > IsBool
Definition Typedef.hpp:31
std::is_array< T > IsArray
Definition Typedef.hpp:52
Definition Bit.hpp:12
Definition SerializedSize.hpp:31
size_t ResultType
Definition SerializedSize.hpp:33
constexpr ResultType operator()(Args &&... args) const noexcept
Definition SerializedSize.hpp:36