@@ -44,7 +44,7 @@ class PacketValue<> {
4444 virtual void copy_to (void * data) = 0;
4545};
4646
47- template <class Type > requires NotContainer<Type>
47+ template <class Type > requires NotContainer<Type>
4848class PacketValue <Type>: public PacketValue<> {
4949public:
5050 using value_type = Type;
@@ -119,3 +119,64 @@ class PacketValue<string> : public PacketValue<>{
119119template <class Type > requires Container<Type>
120120PacketValue (Type)->PacketValue<Type>;
121121#endif
122+
123+ template <class Type ,size_t N>
124+ class PacketValue <Type(&)[N]>: public PacketValue<> {
125+ public:
126+ using value_type = Type;
127+ Type (*src )[N] = nullptr ;
128+ PacketValue () = default ;
129+ PacketValue (Type(*src)[N]): src(src) {}
130+ ~PacketValue () = default ;
131+ void * get_pointer () override {
132+ return src;
133+ }
134+ size_t get_size () override {
135+ return N*sizeof (Type);
136+ }
137+ void parse (void * data) override {
138+ memcpy (src, data, get_size ());
139+ }
140+ void copy_to (void * data) override {
141+ memcpy (data, src, get_size ());
142+ }
143+ };
144+
145+ #if __cpp_deduction_guides >= 201606
146+ template <class Type ,size_t N>
147+ PacketValue (Type(*)[N])->PacketValue<Type(&)[N]>;
148+ #endif
149+
150+
151+ template <class Type ,size_t N>
152+ class PacketValue <Type*(&)[N]>: public PacketValue<> {
153+ public:
154+ using value_type = Type*;
155+ Type*(*src )[N] = nullptr ;
156+ PacketValue () = default ;
157+ PacketValue (Type*(*src)[N]): src(src) {}
158+ ~PacketValue () = default ;
159+ void * get_pointer () override {
160+ return src;
161+ }
162+ size_t get_size () override {
163+ return N*sizeof (Type);
164+ }
165+ void parse (void * data) override {
166+ for (Type* i : *src) {
167+ *i = *(Type*)data;
168+ data += sizeof (Type);
169+ }
170+ }
171+ void copy_to (void * data) override {
172+ for (Type* i : *src) {
173+ *(Type*)data = *i;
174+ data += sizeof (Type);
175+ }
176+ }
177+ };
178+
179+ #if __cpp_deduction_guides >= 201606
180+ template <class Type ,size_t N>
181+ PacketValue (Type*(*)[N])->PacketValue<Type*(&)[N]>;
182+ #endif
0 commit comments