UdonLibrary 1.0.0
機械システム研究部 C++ ライブラリ
読み取り中…
検索中…
一致する文字列を見つけられません
SerializerTraits.hpp
[詳解]
1//
2// シリアライズ可能か判定するメタ関数
3//
4// Copyright (c) 2022-2024 udonrobo
5//
6
7#pragma once
8
11#include <utility>
12
13namespace Udon
14{
15
16 namespace Impl
17 {
18 using namespace Udon::Traits;
19
21 {
22 using ResultType = bool;
23
24 template <typename... Args>
25 constexpr ResultType operator()(Args&&... args) const noexcept
26 {
27 return argsUnpack(std::forward<Args>(args)...);
28 }
29
30 private:
31 // 可変長引数展開
32 template <typename Head, typename... Tail>
33 constexpr ResultType argsUnpack(Head&& head, Tail&&... tail) const noexcept
34 {
35 // 全メンバが出力可能か判定し、論理積を得る
36 return Test<RemoveReferenceT<Head>>::test(*this, std::forward<Head>(head)) and
37 argsUnpack(std::forward<Tail>(tail)...);
38 }
39
40 // 可変長引数展開 (終端)
41 constexpr ResultType argsUnpack() const noexcept { return true; }
42
43 public:
44 // T のビット数を取得できるか判定するテスト
45 // 部分特殊化を用いる
46 template <typename T, typename = void>
47 struct Test
48 {
49 static constexpr bool test(...) { return false; }
50 };
51
52 // 算術型は可能
53 template <typename Arithmetic>
54 struct Test<Arithmetic, EnableIfVoidT<IsArithmetic<Arithmetic>::value>>
55 {
56 static constexpr bool test(...) { return true; }
57 };
58
59 // 列挙型は可能
60 template <typename Enum>
61 struct Test<Enum, EnableIfVoidT<IsEnum<Enum>::value>>
62 {
63 static constexpr bool test(...) { return true; }
64 };
65
66 // 配列型は要素がシリアライズ可能であれば可能
67 template <typename Array>
68 struct Test<Array, EnableIfVoidT<IsArray<Array>::value>>
69 {
70 template <typename T>
71 static constexpr bool test(const IsSerializableImpl& self, T&& array)
72 {
73 return Test<typename std::remove_extent<Array>::type>::test(self, *array); // 要素のサイズが取得可能である場合
74 }
75 };
76
77 // enumerate 関数を持つ型は enumerate 関数が true を返した場合可能
78 template <typename Enumerable>
79 struct Test<Enumerable, EnableIfVoidT<HasMemberFunctionEnumerate<Enumerable>::value>>
80 {
81 template <typename T>
82 static constexpr bool test(const IsSerializableImpl& tester, T&& e)
83 {
84 return e.enumerate(tester);
85 }
86 };
87 };
88
89 } // namespace Impl
90
91 namespace Traits
92 {
94 template <typename T>
96 : std::integral_constant<bool, Impl::IsSerializableImpl{}(RemoveReferenceT<T>{})>
97 {
98 };
99
100 } // namespace Traits
101} // namespace Udon
Definition SerializerTraits.hpp:92
std::is_enum< T > IsEnum
Definition Typedef.hpp:49
std::is_arithmetic< T > IsArithmetic
Definition Typedef.hpp:43
EnableIfT< Test, void > EnableIfVoidT
Definition Typedef.hpp:69
std::is_array< T > IsArray
Definition Typedef.hpp:52
Definition Bit.hpp:12
static constexpr bool test(const IsSerializableImpl &self, T &&array)
Definition SerializerTraits.hpp:71
static constexpr bool test(...)
Definition SerializerTraits.hpp:63
static constexpr bool test(const IsSerializableImpl &tester, T &&e)
Definition SerializerTraits.hpp:82
Definition SerializerTraits.hpp:48
static constexpr bool test(...)
Definition SerializerTraits.hpp:49
Definition SerializerTraits.hpp:21
constexpr ResultType operator()(Args &&... args) const noexcept
Definition SerializerTraits.hpp:25
bool ResultType
Definition SerializerTraits.hpp:22
T に enumerate(f) が存在するかどうかを判定する
Definition HasMemberFunction.hpp:135
T が シリアライズ可能か判定する
Definition SerializerTraits.hpp:97