UdonLibrary 1.0.0
機械システム研究部 C++ ライブラリ
読み取り中…
検索中…
一致する文字列を見つけられません
Serializer.hpp
[詳解]
1//
2// シリアライザ
3//
4// Copyright (c) 2022-2024 udonrobo
5//
6
7#pragma once
8
9#include "Impl/Serializer.hpp"
10#include "Impl/Deserializer.hpp"
14
15namespace Udon
16{
17
21 template <typename T>
22 constexpr size_t SerializedSize() noexcept
23 {
24 static_assert(Traits::IsSerializable<T>::value, "T is not packed sizable"); // T は "シリアライズ後のサイズを取得可能な型" である必要がある
25
26 return Udon::Ceil(Impl::SerializedBitSizeImpl{}(T{}) / static_cast<double>(CHAR_BIT)) + Udon::CRC8_SIZE;
27 }
28
34 template <typename T>
35 bool Serialize(const T& object, ArrayView<uint8_t> buffer)
36 {
37 // コンパイル時型チェック
38 static_assert(Traits::IsSerializable<T>::value, "T must be serializable type."); // T はシリアライズ可能な型である必要があります。T クラス内で UDON_ENUMERABLE(...) マクロにメンバ変数をセットすることで、シリアライズ可能になります。
39
40 // バッファサイズチェック
41 if (buffer.size() != SerializedSize<T>())
42 {
43 return false;
44 }
45
46 // チェックサムを除いた領域を取得
47 const auto dataView = buffer.removeBackView(Udon::CRC8_SIZE);
48
49 // シリアライズ
50 Impl::Serializer serializer{ dataView };
51 serializer(object);
52
53 // チェックサム挿入
54 buffer.back() = Udon::CRC8(dataView);
55 return true;
56 }
57
58
63 template <typename T>
64 std::vector<uint8_t> Serialize(const T& object)
65 {
66 static_assert(Traits::IsSerializable<T>::value, "T must be serializable type."); // T はシリアライズ可能な型である必要があります。T クラス内で UDON_ENUMERABLE(...) マクロにメンバ変数をセットすることで、シリアライズ可能になります。
67
68 std::vector<uint8_t> buffer(SerializedSize<T>());
69
70 Serialize(object, buffer);
71
72 return buffer;
73 }
74
79 {
80 return buffer.back() == Udon::CRC8(buffer.removeBackView(Udon::CRC8_SIZE));
81 }
82
86 template <typename T>
88 {
89 // コンパイル時型チェック
90 static_assert(Traits::IsSerializable<T>::value, "T must be deserializable type."); // T は逆シリアライズ可能な型である必要があります。T クラス内で UDON_PACKABLE マクロにメンバ変数をセットすることで、逆シリアライズ可能になります。
91
92 // バッファサイズチェック
93 if (buffer.size() != SerializedSize<T>())
94 {
95 return Udon::nullopt;
96 }
97
98 // チェックサムチェック
99 if (not CanDeserialize(buffer))
100 {
101 return Udon::nullopt;
102 }
103
104 T retval{};
105
107 deserializer(retval);
108
109 return retval;
110 }
111
112} // namespace Udon
配列参照クラス
Definition ArrayView.hpp:27
ArrayView removeBackView(size_type count)
末尾から指定要素削除したビューを作成する。
Definition ArrayView.hpp:172
constexpr size_type size() const
Definition ArrayView.hpp:90
reference back()
Definition ArrayView.hpp:131
Definition Deserializer.hpp:28
Definition Serializer.hpp:30
オプショナル型
Definition Optional.hpp:62
Definition Bit.hpp:12
bool CanDeserialize(ArrayView< const uint8_t > buffer)
逆シリアル化可能かどうかを判定します
Definition Serializer.hpp:78
constexpr size_t CRC8_SIZE
Definition CRC.hpp:13
bool Serialize(const T &object, ArrayView< uint8_t > buffer)
バッファにシリアル化する
Definition Serializer.hpp:35
Udon::Optional< T > Deserialize(ArrayView< const uint8_t > buffer)
バイト列からオブジェクトに逆シリアル化します
Definition Serializer.hpp:87
uint8_t CRC8(ArrayView< const uint8_t > buffer)
バイト列から CRC-8 値を計算する
Definition CRC.hpp:17
constexpr size_t SerializedSize() noexcept
Tをシリアライズした際のバイト列の要素数を取得する
Definition Serializer.hpp:22
constexpr NulloptT nullopt
無効値
Definition Optional.hpp:52
constexpr int Ceil(double x)
小数点切り上げ (std::ceil)
Definition Math.hpp:129
Definition SerializedSize.hpp:31
T が シリアライズ可能か判定する
Definition SerializerTraits.hpp:97