1/*
2 * Copyright (C) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15#ifndef HDC_SERIAL_STRUCT_DEFINE_H
16#define HDC_SERIAL_STRUCT_DEFINE_H
17
18#include <cmath>
19#include <cstdint>
20#include <cstring>
21#include <map>
22#include <optional>
23#include <string>
24#include <tuple>
25#include <variant>
26#include <vector>
27
28#include <securec.h>
29
30// static file define. No need not modify. by zako
31namespace Hdc {
32// clang-format off
33namespace SerialStruct {
34    namespace SerialDetail {
35        template<class MemPtrT> struct MemPtr {
36        };
37        template<class T, class U> struct MemPtr<U T::*> {
38            using type = T;
39            using MemberType = U;
40        };
41        template<class... Fields> struct MessageImpl {
42        public:
43            MessageImpl(Fields &&... fields)
44                : _fields(std::move(fields)...)
45            {
46            }
47
48            template<class Handler> void Visit(Handler &&handler) const
49            {
50                VisitImpl(std::forward<Handler>(handler), std::make_index_sequence<sizeof...(Fields)>());
51            }
52
53        private:
54            std::tuple<Fields...> _fields;
55
56            template<class Handler, size_t... I> void VisitImpl(Handler &&handler, std::index_sequence<I...>) const
57            {
58                (handler(std::get<I>(_fields)), ...);
59            }
60        };
61
62        template<uint32_t Tag, class MemPtrT, MemPtrT MemPtr, uint32_t Flags> struct FieldImpl {
63            using type = typename SerialDetail::MemPtr<MemPtrT>::type;
64            using MemberType = typename SerialDetail::MemPtr<MemPtrT>::MemberType;
65            constexpr static const uint32_t TAG = Tag;
66            constexpr static const uint32_t FLAGS = Flags;
67            const std::string field_name;
68
69            static decltype(auto) get(const type &value)
70            {
71                return value.*MemPtr;
72            }
73
74            static decltype(auto) get(type &value)
75            {
76                return value.*MemPtr;
77            }
78        };
79
80        template<uint32_t Tag, size_t Index, class MemPtrT, MemPtrT MemPtr, uint32_t Flags> struct OneofFieldImpl {
81            using type = typename SerialDetail::MemPtr<MemPtrT>::type;
82            using MemberType = typename SerialDetail::MemPtr<MemPtrT>::MemberType;
83            constexpr static const uint32_t TAG = Tag;
84            constexpr static const size_t INDEX = Index;
85            constexpr static const uint32_t FLAGS = Flags;
86            const std::string field_name;
87
88            static decltype(auto) get(const type &value)
89            {
90                return value.*MemPtr;
91            }
92
93            static decltype(auto) get(type &value)
94            {
95                return value.*MemPtr;
96            }
97        };
98
99        template<uint32_t Tag, class MemPtrT, MemPtrT MemPtr, uint32_t KeyFlags, uint32_t ValueFlags>
100        struct MapFieldImpl {
101            using type = typename SerialDetail::MemPtr<MemPtrT>::type;
102            using MemberType = typename SerialDetail::MemPtr<MemPtrT>::MemberType;
103            constexpr static const uint32_t TAG = Tag;
104            constexpr static const uint32_t KEY_FLAGS = KeyFlags;
105            constexpr static const uint32_t VALUE_FLAGS = ValueFlags;
106
107            const std::string field_name;
108
109            static decltype(auto) get(const type &value)
110            {
111                return value.*MemPtr;
112            }
113
114            static decltype(auto) get(type &value)
115            {
116                return value.*MemPtr;
117            }
118        };
119    }
120
121    enum class WireType : uint32_t {
122        VARINT = 0,
123        FIXED64 = 1,
124        LENGTH_DELIMETED = 2,
125        START_GROUP = 3,
126        END_GROUP = 4,
127        FIXED32 = 5,
128    };
129    enum Flags { NO = 0, S = 1, F = 2 };
130    template<uint32_t flags = Flags::NO> struct FlagsType {
131    };
132
133    template<class T> struct Descriptor {
134        static_assert(sizeof(T) == 0, "You need to implement descriptor for your own types");
135        static void type()
136        {
137        }
138    };
139
140    template<class... Fields> constexpr auto Message(Fields &&... fields)
141    {
142        return SerialDetail::MessageImpl<Fields...>(std::forward<Fields>(fields)...);
143    }
144
145    template<uint32_t Tag, auto MemPtr, uint32_t Flags = Flags::NO> constexpr auto Field(const std::string &fieldName)
146    {
147        return SerialDetail::FieldImpl<Tag, decltype(MemPtr), MemPtr, Flags> { fieldName };
148    }
149
150    template<uint32_t Tag, size_t Index, auto MemPtr, uint32_t Flags = Flags::NO>
151    constexpr auto OneofField(const std::string &fieldName)
152    {
153        return SerialDetail::OneofFieldImpl<Tag, Index, decltype(MemPtr), MemPtr, Flags> { fieldName };
154    }
155
156    template<uint32_t Tag, auto MemPtr, uint32_t KeyFlags = Flags::NO, uint32_t ValueFlags = Flags::NO>
157    constexpr auto MapField(const std::string &fieldName)
158    {
159        return SerialDetail::MapFieldImpl<Tag, decltype(MemPtr), MemPtr, KeyFlags, ValueFlags> { fieldName };
160    }
161
162    template<class T> const auto &MessageType()
163    {
164        static const auto message = Descriptor<T>::type();
165        return message;
166    }
167
168    template<class T, class Enable = void> struct Serializer;
169
170    struct Writer {
171        virtual void Write(const void *bytes, size_t size) = 0;
172    };
173
174    struct Reader {
175        virtual size_t Read(void *bytes, size_t size) = 0;
176    };
177
178    namespace SerialDetail {
179        template<class T, class V, class F, class W, class Enable = void>
180        struct HasSerializePacked : public std::false_type {
181        };
182
183        template<class T, class V, class F, class W>
184        struct HasSerializePacked<T, V, F, W,
185            std::void_t<decltype(std::declval<T>().SerializePacked(
186                std::declval<V>(), std::declval<F>(), std::declval<W &>()))>> : public std::true_type {
187        };
188
189        template<class T, class V, class F, class W>
190        constexpr bool HAS_SERIALIZE_PACKED_V = HasSerializePacked<T, V, F, W>::value;
191
192        template<class T, class V, class F, class R, class Enable = void>
193        struct HasParsePacked : public std::false_type {
194        };
195
196        template<class T, class V, class F, class R>
197        struct HasParsePacked<T, V, F, R,
198            std::void_t<decltype(std::declval<T>().ParsePacked(
199                std::declval<V &>(), std::declval<F>(), std::declval<R &>()))>> : public std::true_type {
200        };
201
202        template<class T, class V, class F, class R>
203        constexpr bool HAS_PARSE_PACKED_V = HasParsePacked<T, V, F, R>::value;
204
205        static uint32_t MakeTagWireType(uint32_t tag, WireType wireType)
206        {
207            return (tag << 3) | static_cast<uint32_t>(wireType);  // 3:tag type offset
208        }
209
210        static inline void ReadTagWireType(uint32_t tagKey, uint32_t &tag, WireType &wireType)
211        {
212            wireType = static_cast<WireType>(tagKey & 0b0111);
213            tag = tagKey >> 3;  // 3:tag type offset
214        }
215
216        static uint32_t MakeZigzagValue(int32_t value)
217        {
218            return (static_cast<uint32_t>(value) << 1) ^ static_cast<uint32_t>(value >> 31);   //31:uint32_t val offset
219        }
220
221        static uint64_t MakeZigzagValue(int64_t value)
222        {
223            return (static_cast<uint64_t>(value) << 1) ^ static_cast<uint64_t>(value >> 63);  // 63:uint32_t val offset
224        }
225
226        static int32_t ReadZigzagValue(uint32_t value)
227        {
228            return static_cast<int32_t>((value >> 1) ^ (~(value & 1) + 1));
229        }
230
231        static int64_t ReadZigzagValue(uint64_t value)
232        {
233            return static_cast<int64_t>((value >> 1) ^ (~(value & 1) + 1));
234        }
235
236        template<class To, class From> To BitCast(From from)
237        {
238            static_assert(sizeof(To) == sizeof(From), "");
239            static_assert(std::is_trivially_copyable_v<To>, "");
240            static_assert(std::is_trivially_copyable_v<From>, "");
241            To to;
242            memcpy_s(&to, sizeof(To), &from, sizeof(from));
243            return to;
244        }
245
246        struct WriterSizeCollector : public Writer {
247            void Write(const void *, size_t size) override
248            {
249                byte_size += size;
250            }
251            size_t byte_size = 0;
252        };
253
254        struct LimitedReader : public Reader {
255            LimitedReader(Reader &parent, size_t sizeLimit)
256                : _parent(parent), _size_limit(sizeLimit)
257            {
258            }
259
260            size_t Read(void *bytes, size_t size) override
261            {
262                auto sizeToRead = std::min(size, _size_limit);
263                auto readSize = _parent.Read(bytes, sizeToRead);
264                _size_limit -= readSize;
265                return readSize;
266            }
267
268            size_t AvailableBytes() const
269            {
270                return _size_limit;
271            }
272
273        private:
274            Reader &_parent;
275            size_t _size_limit;
276        };
277
278        static bool ReadByte(uint8_t &value, Reader &in)
279        {
280            return in.Read(&value, 1) == 1;
281        }
282
283        static void WriteVarint(uint32_t value, Writer &out)
284        {
285            constexpr uint8_t bytesSize = 5;
286            constexpr uint8_t bytesOffset = 7;
287            uint8_t b[bytesSize] {};
288            for (size_t i = 0; i < bytesSize; ++i) {
289                b[i] = value & 0b0111'1111;
290                value >>= bytesOffset;
291                if (value) {
292                    b[i] |= 0b1000'0000;
293                } else {
294                    out.Write(b, i + 1);
295                    break;
296                }
297            }
298        }
299
300        static void WriteVarint(uint64_t value, Writer &out)
301        {
302            constexpr uint8_t bytesSize = 10;
303            constexpr uint8_t bytesOffset = 7;
304            uint8_t b[bytesSize] {};
305            for (size_t i = 0; i < bytesSize; ++i) {
306                b[i] = value & 0b0111'1111;
307                value >>= bytesOffset;
308                if (value) {
309                    b[i] |= 0b1000'0000;
310                } else {
311                    out.Write(b, i + 1);
312                    break;
313                }
314            }
315        }
316
317#if defined(HOST_MAC)
318        static void WriteVarint(unsigned long value, Writer &out)
319        {
320            WriteVarint(static_cast<uint64_t>(value), out);
321        }
322#endif
323
324        static bool ReadVarint(uint32_t &value, Reader &in)
325        {
326            value = 0;
327            constexpr uint8_t bytesSize = 5;
328            constexpr uint8_t bytesOffset = 7;
329            for (size_t c = 0; c < bytesSize; ++c) {
330                uint8_t x;
331                if (!ReadByte(x, in)) {
332                    return false;
333                }
334                value |= static_cast<uint32_t>(x & 0b0111'1111) << bytesOffset * c;
335                if (!(x & 0b1000'0000)) {
336                    return true;
337                }
338            }
339
340            return false;
341        }
342
343        static bool ReadVarint(uint64_t &value, Reader &in)
344        {
345            value = 0;
346            constexpr uint8_t bytesSize = 10;
347            constexpr uint8_t bytesOffset = 7;
348            for (size_t c = 0; c < bytesSize; ++c) {
349                uint8_t x;
350                if (!ReadByte(x, in)) {
351                    return false;
352                }
353                value |= static_cast<uint64_t>(x & 0b0111'1111) << bytesOffset * c;
354                if (!(x & 0b1000'0000)) {
355                    return true;
356                }
357            }
358            return false;
359        }
360
361#if defined(HOST_MAC)
362        static bool ReadVarint(unsigned long &value, Reader &in)
363        {
364            uint64_t intermediateValue;
365            if (ReadVarint(intermediateValue, in)) {
366                value = static_cast<unsigned long>(intermediateValue);
367                return true;
368            }
369            return false;
370        }
371#endif
372
373        static void WriteFixed(uint32_t value, Writer &out)
374        {
375#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
376            out.Write(&value, sizeof(value));
377#else
378            static_assert(false, "Not a little-endian");
379#endif
380        }
381
382        static void WriteFixed(uint64_t value, Writer &out)
383        {
384#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
385            out.Write(&value, sizeof(value));
386#else
387            static_assert(false, "Not a little-endian");
388#endif
389        }
390
391        static void WriteFixed(double value, Writer &out)
392        {
393            WriteFixed(BitCast<uint64_t>(value), out);
394        }
395
396        static void WriteFixed(float value, Writer &out)
397        {
398            WriteFixed(BitCast<uint32_t>(value), out);
399        }
400
401        static void WriteVarint(int32_t value, Writer &out)
402        {
403            WriteVarint(BitCast<uint32_t>(value), out);
404        }
405
406        static void WriteVarint(int64_t value, Writer &out)
407        {
408            WriteVarint(BitCast<uint64_t>(value), out);
409        }
410
411        static void WriteSignedVarint(int32_t value, Writer &out)
412        {
413            WriteVarint(MakeZigzagValue(value), out);
414        }
415
416        static void WriteSignedVarint(int64_t value, Writer &out)
417        {
418            WriteVarint(MakeZigzagValue(value), out);
419        }
420
421        static void WriteSignedFixed(int32_t value, Writer &out)
422        {
423            WriteFixed(static_cast<uint32_t>(value), out);
424        }
425
426        static void WriteSignedFixed(int64_t value, Writer &out)
427        {
428            WriteFixed(static_cast<uint64_t>(value), out);
429        }
430
431        static void WriteTagWriteType(uint32_t tag, WireType wireType, Writer &out)
432        {
433            WriteVarint(MakeTagWireType(tag, wireType), out);
434        }
435
436        static bool ReadFixed(uint32_t &value, Reader &in)
437        {
438#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
439            return in.Read(&value, sizeof(value)) == sizeof(value);
440#else
441            static_assert(false, "Not a little-endian");
442#endif
443        }
444
445        static bool ReadFixed(uint64_t &value, Reader &in)
446        {
447#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
448            return in.Read(&value, sizeof(value)) == sizeof(value);
449#else
450            static_assert(false, "Not a little-endian");
451#endif
452        }
453
454        static bool ReadFixed(double &value, Reader &in)
455        {
456            uint64_t intermediateValue;
457            if (ReadFixed(intermediateValue, in)) {
458                value = BitCast<double>(intermediateValue);
459                return true;
460            }
461            return false;
462        }
463
464        static bool ReadFixed(float &value, Reader &in)
465        {
466            uint32_t intermediateValue;
467            if (ReadFixed(intermediateValue, in)) {
468                value = BitCast<float>(intermediateValue);
469                return true;
470            }
471            return false;
472        }
473
474        static bool ReadVarint(int32_t &value, Reader &in)
475        {
476            uint32_t intermediateValue;
477            if (ReadVarint(intermediateValue, in)) {
478                value = BitCast<int32_t>(intermediateValue);
479                return true;
480            }
481            return false;
482        }
483
484        static bool ReadVarint(int64_t &value, Reader &in)
485        {
486            uint64_t intermediateValue;
487            if (ReadVarint(intermediateValue, in)) {
488                value = BitCast<int64_t>(intermediateValue);
489                return true;
490            }
491            return false;
492        }
493
494        static bool ReadSignedVarint(int32_t &value, Reader &in)
495        {
496            uint32_t intermediateValue;
497            if (ReadVarint(intermediateValue, in)) {
498                value = ReadZigzagValue(intermediateValue);
499                return true;
500            }
501            return false;
502        }
503
504        static bool ReadSignedVarint(int64_t &value, Reader &in)
505        {
506            uint64_t intermediateValue;
507            if (ReadVarint(intermediateValue, in)) {
508                value = ReadZigzagValue(intermediateValue);
509                return true;
510            }
511            return false;
512        }
513
514        static bool ReadSignedFixed(int32_t &value, Reader &in)
515        {
516            uint32_t intermediateValue;
517            if (ReadFixed(intermediateValue, in)) {
518                value = static_cast<int64_t>(intermediateValue);
519                return true;
520            }
521            return false;
522        }
523
524        static bool ReadSignedFixed(int64_t &value, Reader &in)
525        {
526            uint64_t intermediateValue;
527            if (ReadFixed(intermediateValue, in)) {
528                value = static_cast<int64_t>(intermediateValue);
529                return true;
530            }
531            return false;
532        }
533
534        template<class T, uint32_t Tag, size_t Index, class MemPtrT, MemPtrT MemPtr, uint32_t Flags>
535        void WriteField(const T &value,
536            const SerialDetail::OneofFieldImpl<Tag, Index, MemPtrT, MemPtr, Flags> &, Writer &out)
537        {
538            using OneOf = SerialDetail::OneofFieldImpl<Tag, Index, MemPtrT, MemPtr, Flags>;
539            Serializer<typename OneOf::MemberType>::template SerializeOneof<OneOf::INDEX>(
540                OneOf::TAG, OneOf::get(value), FlagsType<OneOf::FLAGS>(), out);
541        }
542
543        template<class T, uint32_t Tag, class MemPtrT, MemPtrT MemPtr, uint32_t KeyFlags, uint32_t ValueFlags>
544        void WriteField(const T &value,
545            const SerialDetail::MapFieldImpl<Tag, MemPtrT, MemPtr, KeyFlags, ValueFlags> &, Writer &out)
546        {
547            using Map = SerialDetail::MapFieldImpl<Tag, MemPtrT, MemPtr, KeyFlags, ValueFlags>;
548            Serializer<typename Map::MemberType>::SerializeMap(
549                Map::TAG, Map::get(value), FlagsType<Map::KEY_FLAGS>(), FlagsType<Map::VALUE_FLAGS>(), out);
550        }
551
552        template<class T, uint32_t Tag, class MemPtrT, MemPtrT MemPtr, uint32_t Flags>
553        void WriteField(const T &value, const SerialDetail::FieldImpl<Tag, MemPtrT, MemPtr, Flags> &, Writer &out)
554        {
555            using Field = SerialDetail::FieldImpl<Tag, MemPtrT, MemPtr, Flags>;
556            Serializer<typename Field::MemberType>::Serialize(
557                Field::TAG, Field::get(value), FlagsType<Field::FLAGS>(), out);
558        }
559
560        template<class T, class... Field>
561        void WriteMessage(const T &value, const SerialDetail::MessageImpl<Field...> &message, Writer &out)
562        {
563            message.Visit([&](const auto &field) { WriteField(value, field, out); });
564        }
565
566        template<uint32_t Flags, class ValueType, class It>
567        void WriteRepeated(uint32_t tag, It begin, It end, Writer &out)
568        {
569            if (begin == end) {
570                return;
571            }
572            if constexpr (SerialDetail::HAS_SERIALIZE_PACKED_V<Serializer<ValueType>, ValueType, FlagsType<Flags>,
573                Writer>) {
574                WriteVarint(MakeTagWireType(tag, WireType::LENGTH_DELIMETED), out);
575                WriterSizeCollector sizeCollector;
576                for (auto it = begin; it != end; ++it) {
577                    Serializer<ValueType>::SerializePacked(*it, FlagsType<Flags> {}, sizeCollector);
578                }
579                WriteVarint(sizeCollector.byte_size, out);
580                for (auto it = begin; it != end; ++it) {
581                    Serializer<ValueType>::SerializePacked(*it, FlagsType<Flags> {}, out);
582                }
583            } else {
584                for (auto it = begin; it != end; ++it) {
585                    Serializer<ValueType>::Serialize(tag, *it, FlagsType<Flags>(), out);
586                }
587            }
588        }
589
590        template<uint32_t KeyFlags, uint32_t ValueFlags, class Key, class Value>
591        void WriteMapKeyValue(const std::pair<const Key, Value> &value, Writer &out)
592        {
593            Serializer<Key>::Serialize(1, value.first, FlagsType<KeyFlags> {}, out, true);
594            Serializer<Value>::Serialize(2, value.second, FlagsType<ValueFlags> {}, out, true);  // 2:tag value
595        }
596
597        template<uint32_t KeyFlags, uint32_t ValueFlags, class T>
598        void WriteMap(uint32_t tag, const T &value, Writer &out)
599        {
600            auto begin = std::begin(value);
601            auto end = std::end(value);
602
603            for (auto it = begin; it != end; ++it) {
604                WriteTagWriteType(tag, WireType::LENGTH_DELIMETED, out);
605                WriterSizeCollector sizeCollector;
606                WriteMapKeyValue<KeyFlags, ValueFlags>(*it, sizeCollector);
607                WriteVarint(sizeCollector.byte_size, out);
608                WriteMapKeyValue<KeyFlags, ValueFlags>(*it, out);
609            }
610        }
611
612        template<uint32_t KeyFlags, uint32_t ValueFlags, class Key, class Value>
613        bool ReadMapKeyValue(std::pair<Key, Value> &value, Reader &in)
614        {
615            static const auto pairAsMessage = Message(Field<1, &std::pair<Key, Value>::first, KeyFlags>("key"),
616                Field<2, &std::pair<Key, Value>::second, ValueFlags>("value"));
617            return ReadMessage(value, pairAsMessage, in);
618        }
619
620        template<uint32_t KeyFlags, uint32_t ValueFlags, class T>
621        bool ReadMap(WireType wireType, T &value, Reader &in)
622        {
623            if (wireType != WireType::LENGTH_DELIMETED) {
624                return false;
625            }
626            size_t size;
627            if (ReadVarint(size, in)) {
628                LimitedReader limitedIn(in, size);
629                while (limitedIn.AvailableBytes() > 0) {
630                    std::pair<typename T::key_type, typename T::mapped_type> item;
631                    if (!ReadMapKeyValue<KeyFlags, ValueFlags>(item, limitedIn)) {
632                        return false;
633                    }
634                    value.insert(std::move(item));
635                }
636                return true;
637            }
638            return false;
639        }
640
641        template<uint32_t Flags, class ValueType, class OutputIt>
642        bool ReadRepeated(WireType wireType, OutputIt output_it, Reader &in)
643        {
644            if constexpr (SerialDetail::HAS_PARSE_PACKED_V<Serializer<ValueType>, ValueType, FlagsType<Flags>,
645                Reader>) {
646                if (wireType != WireType::LENGTH_DELIMETED) {
647                    return false;
648                }
649
650                size_t size;
651                if (ReadVarint(size, in)) {
652                    LimitedReader limitedIn(in, size);
653
654                    while (limitedIn.AvailableBytes() > 0) {
655                        ValueType value;
656                        if (!Serializer<ValueType>::ParsePacked(value, FlagsType<Flags>(), limitedIn)) {
657                            return false;
658                        }
659                        output_it = value;
660                        ++output_it;
661                    }
662                    return true;
663                }
664                return false;
665            } else {
666                ValueType value;
667                if (Serializer<ValueType>::Parse(wireType, value, FlagsType<Flags>(), in)) {
668                    output_it = value;
669                    ++output_it;
670                    return true;
671                }
672                return false;
673            }
674        }
675
676        template<class T, uint32_t Tag, size_t Index, class MemPtrT, MemPtrT MemPtr, uint32_t Flags>
677        void ReadField(T &value, uint32_t tag, WireType wireType,
678            const SerialDetail::OneofFieldImpl<Tag, Index, MemPtrT, MemPtr, Flags> &, Reader &in)
679        {
680            if (Tag != tag) {
681                return;
682            }
683            using OneOf = SerialDetail::OneofFieldImpl<Tag, Index, MemPtrT, MemPtr, Flags>;
684            Serializer<typename OneOf::MemberType>::template ParseOneof<OneOf::INDEX>(
685                wireType, OneOf::get(value), FlagsType<OneOf::FLAGS>(), in);
686        }
687
688        template<class T, uint32_t Tag, class MemPtrT, MemPtrT MemPtr, uint32_t KeyFlags, uint32_t ValueFlags>
689        void ReadField(T &value, uint32_t tag, WireType wireType,
690            const SerialDetail::MapFieldImpl<Tag, MemPtrT, MemPtr, KeyFlags, ValueFlags> &, Reader &in)
691        {
692            if (Tag != tag) {
693                return;
694            }
695            using Map = SerialDetail::MapFieldImpl<Tag, MemPtrT, MemPtr, KeyFlags, ValueFlags>;
696            Serializer<typename Map::MemberType>::ParseMap(
697                wireType, Map::get(value), FlagsType<Map::KEY_FLAGS>(), FlagsType<Map::VALUE_FLAGS>(), in);
698        }
699
700        template<class T, uint32_t Tag, class MemPtrT, MemPtrT MemPtr, uint32_t Flags>
701        void ReadField(T &value, uint32_t tag, WireType wireType,
702            const SerialDetail::FieldImpl<Tag, MemPtrT, MemPtr, Flags> &, Reader &in)
703        {
704            if (Tag != tag) {
705                return;
706            }
707            using Field = SerialDetail::FieldImpl<Tag, MemPtrT, MemPtr, Flags>;
708            Serializer<typename Field::MemberType>::Parse(wireType, Field::get(value), FlagsType<Field::FLAGS>(), in);
709        }
710
711        template<class T, class... Field> bool ReadMessage(T &value, const MessageImpl<Field...> &message, Reader &in)
712        {
713            uint32_t tagKey;
714            while (ReadVarint(tagKey, in)) {
715                uint32_t tag;
716                WireType wireType;
717                ReadTagWireType(tagKey, tag, wireType);
718                message.Visit([&](const auto &field) { ReadField(value, tag, wireType, field, in); });
719            }
720            return true;
721        }
722    }
723
724    template<class T, class Enable> struct Serializer {
725        // Commion Serializer threat type as Message
726        static void Serialize(uint32_t tag, const T &value, FlagsType<>, Writer &out, bool force = false)
727        {
728            SerialDetail::WriterSizeCollector sizeCollector;
729            SerialDetail::WriteMessage(value, MessageType<T>(), sizeCollector);
730            if (!force && sizeCollector.byte_size == 0) {
731                return;
732            }
733            SerialDetail::WriteTagWriteType(tag, WireType::LENGTH_DELIMETED, out);
734            SerialDetail::WriteVarint(sizeCollector.byte_size, out);
735            SerialDetail::WriteMessage(value, MessageType<T>(), out);
736        }
737
738        static bool Parse(WireType wireType, T &value, FlagsType<>, Reader &in)
739        {
740            if (wireType != WireType::LENGTH_DELIMETED) {
741                return false;
742            }
743            size_t size;
744            if (SerialDetail::ReadVarint(size, in)) {
745                SerialDetail::LimitedReader limitedIn(in, size);
746                return SerialDetail::ReadMessage(value, MessageType<T>(), limitedIn);
747            }
748            return false;
749        }
750    };
751
752    template<> struct Serializer<int32_t> {
753        static void Serialize(uint32_t tag, int32_t value, FlagsType<>, Writer &out, bool force = false)
754        {
755            (void)force;
756            SerialDetail::WriteTagWriteType(tag, WireType::VARINT, out);
757            SerialDetail::WriteVarint(value, out);
758        }
759
760        static void Serialize(uint32_t tag, int32_t value, FlagsType<Flags::S>, Writer &out, bool force = false)
761        {
762            (void)force;
763            SerialDetail::WriteTagWriteType(tag, WireType::VARINT, out);
764            SerialDetail::WriteSignedVarint(value, out);
765        }
766
767        static void Serialize(
768            uint32_t tag, int32_t value, FlagsType<Flags::S | Flags::F>, Writer &out, bool force = false)
769        {
770            (void)force;
771            SerialDetail::WriteTagWriteType(tag, WireType::FIXED32, out);
772            SerialDetail::WriteSignedFixed(value, out);
773        }
774
775        static void SerializePacked(int32_t value, FlagsType<>, Writer &out)
776        {
777            SerialDetail::WriteVarint(value, out);
778        }
779
780        static void SerializePacked(int32_t value, FlagsType<Flags::S>, Writer &out)
781        {
782            SerialDetail::WriteSignedVarint(value, out);
783        }
784
785        static void SerializePacked(int32_t value, FlagsType<Flags::S | Flags::F>, Writer &out)
786        {
787            SerialDetail::WriteSignedFixed(value, out);
788        }
789
790        static bool Parse(WireType wire_type, int32_t &value, FlagsType<>, Reader &in)
791        {
792            if (wire_type != WireType::VARINT)
793                return false;
794            return SerialDetail::ReadVarint(value, in);
795        }
796
797        static bool Parse(WireType wire_type, int32_t &value, FlagsType<Flags::S>, Reader &in)
798        {
799            if (wire_type != WireType::VARINT)
800                return false;
801            return SerialDetail::ReadSignedVarint(value, in);
802        }
803
804        static bool Parse(WireType wire_type, int32_t &value, FlagsType<Flags::S | Flags::F>, Reader &in)
805        {
806            if (wire_type != WireType::FIXED32)
807                return false;
808            return SerialDetail::ReadSignedFixed(value, in);
809        }
810
811        static bool ParsePacked(int32_t &value, FlagsType<>, Reader &in)
812        {
813            return SerialDetail::ReadVarint(value, in);
814        }
815
816        static bool ParsePacked(int32_t &value, FlagsType<Flags::S>, Reader &in)
817        {
818            return SerialDetail::ReadSignedVarint(value, in);
819        }
820
821        static bool ParsePacked(int32_t &value, FlagsType<Flags::S | Flags::F>, Reader &in)
822        {
823            return SerialDetail::ReadSignedFixed(value, in);
824        }
825    };
826
827    template<> struct Serializer<uint32_t> {
828        static void Serialize(uint32_t tag, uint32_t value, FlagsType<>, Writer &out, bool force = false)
829        {
830            (void)force;
831            SerialDetail::WriteTagWriteType(tag, WireType::VARINT, out);
832            SerialDetail::WriteVarint(value, out);
833        }
834
835        static void Serialize(uint32_t tag, uint32_t value, FlagsType<Flags::F>, Writer &out, bool force = false)
836        {
837            (void)force;
838            SerialDetail::WriteTagWriteType(tag, WireType::FIXED32, out);
839            SerialDetail::WriteFixed(value, out);
840        }
841
842        static void SerializePacked(uint32_t value, FlagsType<>, Writer &out)
843        {
844            SerialDetail::WriteVarint(value, out);
845        }
846
847        static void SerializePacked(uint32_t value, FlagsType<Flags::F>, Writer &out)
848        {
849            SerialDetail::WriteFixed(value, out);
850        }
851
852        static bool Parse(WireType wire_type, uint32_t &value, FlagsType<>, Reader &in)
853        {
854            if (wire_type != WireType::VARINT)
855                return false;
856            return SerialDetail::ReadVarint(value, in);
857        }
858
859        static bool Parse(WireType wire_type, uint32_t &value, FlagsType<Flags::F>, Reader &in)
860        {
861            if (wire_type != WireType::FIXED32)
862                return false;
863            return SerialDetail::ReadFixed(value, in);
864        }
865
866        static bool ParsePacked(uint32_t &value, FlagsType<>, Reader &in)
867        {
868            return SerialDetail::ReadVarint(value, in);
869        }
870
871        static bool ParsePacked(uint32_t &value, FlagsType<Flags::F>, Reader &in)
872        {
873            return SerialDetail::ReadFixed(value, in);
874        }
875    };
876
877    template<> struct Serializer<int64_t> {
878        static void Serialize(uint32_t tag, int64_t value, FlagsType<>, Writer &out, bool force = false)
879        {
880            (void)force;
881            SerialDetail::WriteTagWriteType(tag, WireType::VARINT, out);
882            SerialDetail::WriteVarint(value, out);
883        }
884
885        static void Serialize(uint32_t tag, int64_t value, FlagsType<Flags::S>, Writer &out, bool force = false)
886        {
887            (void)force;
888            SerialDetail::WriteTagWriteType(tag, WireType::VARINT, out);
889            SerialDetail::WriteSignedVarint(value, out);
890        }
891
892        static void Serialize(
893            uint32_t tag, int64_t value, FlagsType<Flags::S | Flags::F>, Writer &out, bool force = false)
894        {
895            (void)force;
896            SerialDetail::WriteTagWriteType(tag, WireType::FIXED64, out);
897            SerialDetail::WriteSignedFixed(value, out);
898        }
899
900        static void SerializePacked(int64_t value, FlagsType<>, Writer &out)
901        {
902            SerialDetail::WriteVarint(value, out);
903        }
904
905        static void SerializePacked(int64_t value, FlagsType<Flags::S>, Writer &out)
906        {
907            SerialDetail::WriteSignedVarint(value, out);
908        }
909
910        static void SerializePacked(int64_t value, FlagsType<Flags::S | Flags::F>, Writer &out)
911        {
912            SerialDetail::WriteSignedFixed(value, out);
913        }
914
915        static bool Parse(WireType wire_type, int64_t &value, FlagsType<>, Reader &in)
916        {
917            if (wire_type != WireType::VARINT)
918                return false;
919            return SerialDetail::ReadVarint(value, in);
920        }
921
922        static bool Parse(WireType wire_type, int64_t &value, FlagsType<Flags::S>, Reader &in)
923        {
924            if (wire_type != WireType::VARINT)
925                return false;
926            return SerialDetail::ReadSignedVarint(value, in);
927        }
928
929        static bool Parse(WireType wire_type, int64_t &value, FlagsType<Flags::S | Flags::F>, Reader &in)
930        {
931            if (wire_type != WireType::FIXED64)
932                return false;
933            return SerialDetail::ReadSignedFixed(value, in);
934        }
935
936        static bool ParsePacked(int64_t &value, FlagsType<>, Reader &in)
937        {
938            return SerialDetail::ReadVarint(value, in);
939        }
940
941        static bool ParsePacked(int64_t &value, FlagsType<Flags::S>, Reader &in)
942        {
943            return SerialDetail::ReadSignedVarint(value, in);
944        }
945
946        static bool ParsePacked(int64_t &value, FlagsType<Flags::S | Flags::F>, Reader &in)
947        {
948            return SerialDetail::ReadSignedFixed(value, in);
949        }
950    };
951
952    template<> struct Serializer<uint64_t> {
953        static void Serialize(uint32_t tag, uint64_t value, FlagsType<>, Writer &out, bool force = false)
954        {
955            (void)force;
956            SerialDetail::WriteTagWriteType(tag, WireType::VARINT, out);
957            SerialDetail::WriteVarint(value, out);
958        }
959
960        static void Serialize(uint32_t tag, uint64_t value, FlagsType<Flags::F>, Writer &out, bool force = false)
961        {
962            if (!force && value == UINT64_C(0))
963                return;
964
965            SerialDetail::WriteTagWriteType(tag, WireType::FIXED64, out);
966            SerialDetail::WriteFixed(value, out);
967        }
968
969        static void SerializePacked(uint64_t value, FlagsType<>, Writer &out)
970        {
971            SerialDetail::WriteVarint(value, out);
972        }
973
974        static void SerializePacked(uint64_t value, FlagsType<Flags::F>, Writer &out)
975        {
976            SerialDetail::WriteFixed(value, out);
977        }
978
979        static bool Parse(WireType wire_type, uint64_t &value, FlagsType<>, Reader &in)
980        {
981            if (wire_type != WireType::VARINT)
982                return false;
983            return SerialDetail::ReadVarint(value, in);
984        }
985
986        static bool Parse(WireType wire_type, uint64_t &value, FlagsType<Flags::F>, Reader &in)
987        {
988            if (wire_type != WireType::FIXED64)
989                return false;
990            return SerialDetail::ReadFixed(value, in);
991        }
992
993        static bool ParsePacked(uint64_t &value, FlagsType<>, Reader &in)
994        {
995            return SerialDetail::ReadVarint(value, in);
996        }
997
998        static bool ParsePacked(uint64_t &value, FlagsType<Flags::F>, Reader &in)
999        {
1000            return SerialDetail::ReadFixed(value, in);
1001        }
1002    };
1003
1004    template<> struct Serializer<double> {
1005        static void Serialize(uint32_t tag, double value, FlagsType<>, Writer &out, bool force = false)
1006        {
1007            if (!force && std::fpclassify(value) == FP_ZERO) {
1008                return;
1009            }
1010            SerialDetail::WriteTagWriteType(tag, WireType::FIXED64, out);
1011            SerialDetail::WriteFixed(value, out);
1012        }
1013
1014        static void SerializePacked(double value, FlagsType<>, Writer &out)
1015        {
1016            SerialDetail::WriteFixed(value, out);
1017        }
1018
1019        static bool Parse(WireType wire_type, double &value, FlagsType<>, Reader &in)
1020        {
1021            if (wire_type != WireType::FIXED64) {
1022                return false;
1023            }
1024            return SerialDetail::ReadFixed(value, in);
1025        }
1026
1027        static bool ParsePacked(double &value, FlagsType<>, Reader &in)
1028        {
1029            return SerialDetail::ReadFixed(value, in);
1030        }
1031    };
1032
1033    template<> struct Serializer<float> {
1034        static void Serialize(uint32_t tag, float value, FlagsType<>, Writer &out, bool force = false)
1035        {
1036            if (!force && std::fpclassify(value) == FP_ZERO) {
1037                return;
1038            }
1039            SerialDetail::WriteTagWriteType(tag, WireType::FIXED32, out);
1040            SerialDetail::WriteFixed(value, out);
1041        }
1042
1043        static void SerializePacked(float value, FlagsType<>, Writer &out)
1044        {
1045            SerialDetail::WriteFixed(value, out);
1046        }
1047
1048        static bool Parse(WireType wire_type, float &value, FlagsType<>, Reader &in)
1049        {
1050            if (wire_type != WireType::FIXED32) {
1051                return false;
1052            }
1053            return SerialDetail::ReadFixed(value, in);
1054        }
1055
1056        static bool ParsePacked(float &value, FlagsType<>, Reader &in)
1057        {
1058            return SerialDetail::ReadFixed(value, in);
1059        }
1060    };
1061
1062    template<> struct Serializer<bool> {
1063        static void Serialize(uint32_t tag, bool value, FlagsType<>, Writer &out, bool force = false)
1064        {
1065            Serializer<uint32_t>::Serialize(tag, value ? 1 : 0, FlagsType(), out, force);
1066        }
1067
1068        static void SerializePacked(bool value, FlagsType<>, Writer &out)
1069        {
1070            Serializer<uint32_t>::SerializePacked(value ? 1 : 0, FlagsType(), out);
1071        }
1072
1073        static bool Parse(WireType wire_type, bool &value, FlagsType<>, Reader &in)
1074        {
1075            uint32_t intermedaite_value;
1076            if (Serializer<uint32_t>::Parse(wire_type, intermedaite_value, FlagsType<>(), in)) {
1077                value = static_cast<bool>(intermedaite_value);
1078                return true;
1079            }
1080            return false;
1081        }
1082
1083        static bool ParsePacked(bool &value, FlagsType<>, Reader &in)
1084        {
1085            uint32_t intermedaite_value;
1086            if (Serializer<uint32_t>::ParsePacked(intermedaite_value, FlagsType<>(), in)) {
1087                value = static_cast<bool>(intermedaite_value);
1088                return true;
1089            }
1090            return false;
1091        }
1092    };
1093
1094    template<class T> struct Serializer<T, std::enable_if_t<std::is_enum_v<T>>> {
1095        using U = std::underlying_type_t<T>;
1096
1097        static void Serialize(uint32_t tag, T value, FlagsType<>, Writer &out, bool force = false)
1098        {
1099            Serializer<U>::Serialize(tag, static_cast<U>(value), FlagsType<>(), out, force);
1100        }
1101
1102        static void SerializePacked(T value, FlagsType<>, Writer &out)
1103        {
1104            Serializer<U>::SerializePacked(static_cast<U>(value), FlagsType<>(), out);
1105        }
1106
1107        static bool Parse(WireType wire_type, T &value, FlagsType<>, Reader &in)
1108        {
1109            U intermedaite_value;
1110            if (Serializer<U>::Parse(wire_type, intermedaite_value, FlagsType<>(), in)) {
1111                value = static_cast<T>(intermedaite_value);
1112                return true;
1113            }
1114            return false;
1115        }
1116
1117        static bool ParsePacked(T &value, FlagsType<>, Reader &in)
1118        {
1119            U intermedaite_value;
1120            if (Serializer<U>::ParsePacked(intermedaite_value, FlagsType<>(), in)) {
1121                value = static_cast<T>(intermedaite_value);
1122                return true;
1123            }
1124            return false;
1125        }
1126    };
1127
1128    template<> struct Serializer<std::string> {
1129        static void Serialize(uint32_t tag, const std::string &value, FlagsType<>, Writer &out, bool force = false)
1130        {
1131            (void)force;
1132            SerialDetail::WriteTagWriteType(tag, WireType::LENGTH_DELIMETED, out);
1133            SerialDetail::WriteVarint(value.size(), out);
1134            out.Write(value.data(), value.size());
1135        }
1136
1137        static bool Parse(WireType wire_type, std::string &value, FlagsType<>, Reader &in)
1138        {
1139            if (wire_type != WireType::LENGTH_DELIMETED) {
1140                return false;
1141            }
1142            size_t size;
1143            if (SerialDetail::ReadVarint(size, in)) {
1144                value.resize(size);
1145                if (in.Read(value.data(), size) == size) {
1146                    return true;
1147                }
1148            }
1149            return false;
1150        }
1151    };
1152
1153    template<class T> struct Serializer<std::vector<T>> {
1154        template<uint32_t Flags>
1155        static void Serialize(uint32_t tag, const std::vector<T> &value, FlagsType<Flags>, Writer &out)
1156        {
1157            SerialDetail::WriteRepeated<Flags, T>(tag, value.begin(), value.end(), out);
1158        }
1159
1160        template<uint32_t Flags>
1161        static bool Parse(WireType wire_type, std::vector<T> &value, FlagsType<Flags>, Reader &in)
1162        {
1163            return SerialDetail::ReadRepeated<Flags, T>(wire_type, std::back_inserter(value), in);
1164        }
1165    };
1166
1167    template<class T> struct Serializer<std::optional<T>> {
1168        template<uint32_t Flags>
1169        static void Serialize(uint32_t tag, const std::optional<T> &value, FlagsType<Flags>, Writer &out)
1170        {
1171            if (!value.has_value()) {
1172                return;
1173            }
1174            Serializer<T>::Serialize(tag, *value, FlagsType<Flags>(), out);
1175        }
1176
1177        template<uint32_t Flags>
1178        static bool Parse(WireType wire_type, std::optional<T> &value, FlagsType<Flags>, Reader &in)
1179        {
1180            return Serializer<T>::Parse(wire_type, value.emplace(), FlagsType<Flags>(), in);
1181        }
1182    };
1183
1184    template<class... T> struct Serializer<std::variant<T...>> {
1185        template<size_t Index, uint32_t Flags>
1186        static void SerializeOneof(uint32_t tag, const std::variant<T...> &value, FlagsType<Flags>, Writer &out)
1187        {
1188            if (value.index() != Index)
1189                return;
1190
1191            Serializer<std::variant_alternative_t<Index, std::variant<T...>>>::Serialize(
1192                tag, std::get<Index>(value), FlagsType<Flags>(), out);
1193        }
1194
1195        template<size_t Index, uint32_t Flags>
1196        static bool ParseOneof(WireType wire_type, std::variant<T...> &value, FlagsType<Flags>, Reader &in)
1197        {
1198            return Serializer<std::variant_alternative_t<Index, std::variant<T...>>>::Parse(
1199                wire_type, value.template emplace<Index>(), FlagsType<Flags>(), in);
1200        }
1201    };
1202
1203    template<class Key, class Value> struct Serializer<std::map<Key, Value>> {
1204        template<uint32_t KeyFlags, uint32_t ValueFlags>
1205        static void SerializeMap(
1206            uint32_t tag, const std::map<Key, Value> &value, FlagsType<KeyFlags>, FlagsType<ValueFlags>, Writer &out)
1207        {
1208            SerialDetail::WriteMap<KeyFlags, ValueFlags>(tag, value, out);
1209        }
1210
1211        template<uint32_t KeyFlags, uint32_t ValueFlags>
1212        static bool ParseMap(
1213            WireType wire_type, std::map<Key, Value> &value, FlagsType<KeyFlags>, FlagsType<ValueFlags>, Reader &in)
1214        {
1215            return SerialDetail::ReadMap<KeyFlags, ValueFlags>(wire_type, value, in);
1216        }
1217    };
1218
1219    struct StringWriter : public Writer {
1220        StringWriter(std::string &out)
1221            : _out(out)
1222        {
1223        }
1224
1225        void Write(const void *bytes, size_t size) override
1226        {
1227            _out.append(reinterpret_cast<const char *>(bytes), size);
1228        }
1229
1230    private:
1231        std::string &_out;
1232    };
1233
1234    struct StringReader : public Reader {
1235        StringReader(const std::string &in)
1236            : _in(in), _pos(0)
1237        {
1238        }
1239
1240        size_t Read(void *bytes, size_t size) override
1241        {
1242            size_t readSize = std::min(size, _in.size() - _pos);
1243            if (memcpy_s(bytes, size, _in.data() + _pos, readSize) != EOK) {
1244                return readSize;
1245            }
1246            _pos += readSize;
1247            return readSize;
1248        }
1249
1250    private:
1251        const std::string &_in;
1252        size_t _pos;
1253    };
1254    // mytype begin, just support base type, but really use protobuf raw type(uint32)
1255    template<> struct Serializer<uint8_t> {
1256        static void Serialize(uint32_t tag, uint8_t value, FlagsType<>, Writer &out, bool force = false)
1257        {
1258            Serializer<uint32_t>::Serialize(tag, value, FlagsType(), out, force);
1259        }
1260
1261        static void SerializePacked(uint8_t value, FlagsType<>, Writer &out)
1262        {
1263            Serializer<uint32_t>::SerializePacked(value, FlagsType(), out);
1264        }
1265
1266        static bool Parse(WireType wire_type, uint8_t &value, FlagsType<>, Reader &in)
1267        {
1268            uint32_t intermedaite_value;
1269            if (Serializer<uint32_t>::Parse(wire_type, intermedaite_value, FlagsType<>(), in)) {
1270                value = static_cast<uint8_t>(intermedaite_value);
1271                return true;
1272            }
1273            return false;
1274        }
1275
1276        static bool ParsePacked(uint8_t &value, FlagsType<>, Reader &in)
1277        {
1278            uint32_t intermedaite_value;
1279            if (Serializer<uint32_t>::ParsePacked(intermedaite_value, FlagsType<>(), in)) {
1280                value = static_cast<uint8_t>(intermedaite_value);
1281                return true;
1282            }
1283            return false;
1284        }
1285    };
1286    template<> struct Serializer<uint16_t> {
1287        static void Serialize(uint32_t tag, uint16_t value, FlagsType<>, Writer &out, bool force = false)
1288        {
1289            Serializer<uint32_t>::Serialize(tag, value, FlagsType(), out, force);
1290        }
1291
1292        static void SerializePacked(uint16_t value, FlagsType<>, Writer &out)
1293        {
1294            Serializer<uint32_t>::SerializePacked(value, FlagsType(), out);
1295        }
1296
1297        static bool Parse(WireType wire_type, uint16_t &value, FlagsType<>, Reader &in)
1298        {
1299            uint32_t intermedaite_value;
1300            if (Serializer<uint32_t>::Parse(wire_type, intermedaite_value, FlagsType<>(), in)) {
1301                value = static_cast<uint16_t>(intermedaite_value);
1302                return true;
1303            }
1304            return false;
1305        }
1306
1307        static bool ParsePacked(uint16_t &value, FlagsType<>, Reader &in)
1308        {
1309            uint32_t intermedaite_value;
1310            if (Serializer<uint32_t>::ParsePacked(intermedaite_value, FlagsType<>(), in)) {
1311                value = static_cast<uint16_t>(intermedaite_value);
1312                return true;
1313            }
1314            return false;
1315        }
1316    };
1317    // mytype finish
1318
1319    template<class T> std::string SerializeToString(const T &value)
1320    {
1321        std::string out;
1322        StringWriter stringOut(out);
1323        SerialDetail::WriteMessage(value, MessageType<T>(), stringOut);
1324        return out;
1325    }
1326
1327    template<class T> bool ParseFromString(T &value, const std::string &in)
1328    {
1329        StringReader stringIn(in);
1330        return SerialDetail::ReadMessage(value, MessageType<T>(), stringIn);
1331    }
1332}
1333// clang-format on
1334}  // Hdc
1335#endif  // HDC_SERIAL_STRUCT_DEFINE_H
1336