26 virtual ~Serializable() =
default;
29 virtual void operator << (
class SerCounter &worker) = 0;
30 virtual void operator << (
class SerChecker &worker) = 0;
31 virtual void operator << (
class SerResetter &worker) = 0;
32 virtual void operator << (
class SerReader &worker) = 0;
33 virtual void operator << (
class SerWriter &worker) = 0;
46 isize load(
const u8 *buffer);
49 isize save(u8 *buffer);
57inline u8 read8(
const u8 *& buf)
59 u8 result = R8BE(buf);
64inline u16 read16(
const u8 *& buf)
66 u16 result = R16BE(buf);
71inline u32 read32(
const u8 *& buf)
73 u32 result = R32BE(buf);
78inline u64 read64(
const u8 *& buf)
82 return ((u64)hi << 32) | lo;
85inline double readDouble(
const u8 *& buf)
88 for (isize i = 0; i < 8; i++) ((u8 *)&result)[i] = read8(buf);
92inline string readString(
const u8 *& buf)
95 string result = string((
const char *)buf, len);
100inline void write8(u8 *& buf, u8 value)
106inline void write16(u8 *& buf, u16 value)
112inline void write32(u8 *& buf, u32 value)
118inline void write64(u8 *& buf, u64 value)
120 write32(buf, (u32)(value >> 32));
121 write32(buf, (u32)(value));
124inline void writeDouble(u8 *& buf,
double value)
126 for (isize i = 0; i < 8; i++) write8(buf, ((u8 *)&value)[i]);
129inline void writeString(u8 *& buf,
string value)
131 auto len = value.length();
132 write8(buf, u8(len));
133 value.copy((
char *)buf, len);
142#define COUNT(type,size) \
143auto& operator<<(type& v) \
149#define COUNT8(type) static_assert(sizeof(type) == 1); COUNT(type,1)
150#define COUNT16(type) static_assert(sizeof(type) == 2); COUNT(type,2)
151#define COUNT64(type) static_assert(sizeof(type) <= 8); COUNT(type,8)
152#define COUNTD(type) static_assert(sizeof(type) <= 8); COUNT(type,8)
160 SerCounter() { count = 0; }
164 COUNT8(
const signed char)
165 COUNT8(
const unsigned char)
167 COUNT16(
const unsigned short)
169 COUNT64(
const unsigned int)
171 COUNT64(
const unsigned long)
172 COUNT64(
const long long)
173 COUNT64(
const unsigned long long)
178 auto& operator<<(util::Allocator<T> &a)
184 auto& operator<<(
string &v)
186 auto len = v.length();
187 count += 1 + isize(len);
192 auto& operator<<(std::vector <T> &v)
195 for(usize i = 0; i < len; i++) *
this << v[i];
200 template <
class T, isize N>
201 SerCounter& operator<<(T (&v)[N])
203 for(isize i = 0; i < N; ++i) {
209 template <
class E,
class = std::enable_if_t<std::is_enum<E>{}>>
210 SerCounter& operator<<(E &v)
212 count +=
sizeof(long);
216 template <std::derived_from<Serializable> T>
217 SerCounter& operator<<(T &v)
230auto& operator<<(type& v) \
232hash = util::fnvIt64(hash, (u64)v); \
242 SerChecker() { hash = util::fnvInit64(); }
246 CHECK(
const signed char)
247 CHECK(
const unsigned char)
249 CHECK(
const unsigned short)
251 CHECK(
const unsigned int)
253 CHECK(
const unsigned long)
254 CHECK(
const long long)
255 CHECK(
const unsigned long long)
260 auto& operator<<(util::Allocator<T> &a)
262 hash = util::fnvIt64(hash, a.fnv64());
266 auto& operator<<(
string &v)
268 auto len = v.length();
269 for (usize i = 0; i < len; i++) {
270 hash = util::fnvIt64(hash, v[i]);
276 auto& operator<<(std::vector <T> &v)
278 isize len = isize(v.size());
279 for (isize i = 0; i < len; i++) {
285 template <
class T, isize N>
286 SerChecker& operator<<(T (&v)[N])
288 for(isize i = 0; i < N; ++i) {
294 template <
class E,
class = std::enable_if_t<std::is_enum<E>{}>>
295 SerChecker& operator<<(E &v)
297 hash = util::fnvIt64(hash, v);
301 template <std::derived_from<Serializable> T>
302 SerChecker& operator<<(T &v)
314#define DESERIALIZE(type,function) \
315SerReader& operator<<(type& v) \
317v = (type)function(ptr); \
321#define DESERIALIZE8(type) static_assert(sizeof(type) == 1); DESERIALIZE(type,read8)
322#define DESERIALIZE16(type) static_assert(sizeof(type) == 2); DESERIALIZE(type,read16)
323#define DESERIALIZE64(type) static_assert(sizeof(type) <= 8); DESERIALIZE(type,read64)
324#define DESERIALIZED(type) static_assert(sizeof(type) <= 8); DESERIALIZE(type,readDouble)
332 SerReader(
const u8 *p) : ptr(p)
338 DESERIALIZE8(
signed char)
339 DESERIALIZE8(
unsigned char)
341 DESERIALIZE16(
unsigned short)
343 DESERIALIZE64(
unsigned int)
345 DESERIALIZE64(
unsigned long)
346 DESERIALIZE64(
long long)
347 DESERIALIZE64(
unsigned long long)
352 auto& operator<<(util::Allocator<T> &a)
356 a.init(ptr, isize(len));
361 auto& operator<<(
string &v)
368 auto& operator<<(std::vector <T> &v)
374 for (isize i = 0; i < len; i++) {
381 template <
class T, isize N>
382 SerReader& operator<<(T (&v)[N])
384 for(isize i = 0; i < N; ++i) {
390 void copy(
void *dst, isize n)
392 std::memcpy(dst, (
void *)ptr, n);
396 template <
class E,
class = std::enable_if_t<std::is_enum<E>{}>>
397 SerReader& operator<<(E &v)
403 template <std::derived_from<Serializable> T>
404 SerReader& operator<<(T &v)
416#define SERIALIZE(type,function,cast) \
417SerWriter& operator<<(type& v) \
419function(ptr, (cast)v); \
423#define SERIALIZE8(type) static_assert(sizeof(type) == 1); SERIALIZE(type,write8,u8)
424#define SERIALIZE16(type) static_assert(sizeof(type) == 2); SERIALIZE(type,write16,u16)
425#define SERIALIZE64(type) static_assert(sizeof(type) <= 8); SERIALIZE(type,write64,u64)
426#define SERIALIZED(type) static_assert(sizeof(type) <= 8); SERIALIZE(type,writeDouble,double)
434 SerWriter(u8 *p) : ptr(p)
438 SERIALIZE8(
const bool)
439 SERIALIZE8(
const char)
440 SERIALIZE8(
const signed char)
441 SERIALIZE8(
const unsigned char)
442 SERIALIZE16(
const short)
443 SERIALIZE16(
const unsigned short)
444 SERIALIZE64(
const int)
445 SERIALIZE64(
const unsigned int)
446 SERIALIZE64(
const long)
447 SERIALIZE64(
const unsigned long)
448 SERIALIZE64(
const long long)
449 SERIALIZE64(
const unsigned long long)
450 SERIALIZED(
const float)
451 SERIALIZED(
const double)
454 auto& operator<<(util::Allocator<T> &a)
456 *
this << i64(a.size);
462 auto& operator<<(
const string &v)
469 auto& operator<<(std::vector <T> &v)
473 for (usize i = 0; i < len; i++) {
479 template <
class T, isize N>
480 SerWriter& operator<<(T (&v)[N])
482 for(isize i = 0; i < N; ++i) {
488 template <
class E,
class = std::enable_if_t<std::is_enum<E>{}>>
489 SerWriter& operator<<(E &v)
491 write64(ptr, (
long)v);
495 template <std::derived_from<Serializable> T>
496 SerWriter& operator<<(T &v)
502 void copy(
const void *src, isize n)
504 std::memcpy((
void *)ptr, src, n);
515SerResetter & operator<<(type& v) \
526 virtual ~SerResetter() =
default;
535 RESET(
unsigned short)
541 RESET(
unsigned long long)
546 auto& operator<<(util::Allocator<T> &a)
552 auto& operator<<(
string &v)
559 auto& operator<<(std::vector <T> &v)
565 template <
class T, isize N>
566 SerResetter & operator<<(T (&v)[N])
568 for(isize i = 0; i < N; ++i) {
574 template <
class E,
class = std::enable_if_t<std::is_enum<E>{}>>
575 SerResetter& operator<<(E &v)
581 template <std::derived_from<Serializable> T>
582 SerResetter & operator<<(T &v)
589class SerSoftResetter :
public SerResetter
592 SerSoftResetter() { }
595class SerHardResetter :
public SerResetter
598 SerHardResetter() { }
602static constexpr bool isSoftResetter(T &worker) {
604 auto &
id =
typeid(worker);
605 return id ==
typeid(SerSoftResetter);
609static constexpr bool isHardResetter(T &worker) {
611 auto &
id =
typeid(worker);
612 return id ==
typeid(SerHardResetter);
616static constexpr bool isResetter(T &worker) {
617 return isSoftResetter(worker) || isHardResetter(worker);
621static constexpr bool isChecker(T &worker) {
622 return typeid(worker) ==
typeid(SerChecker);
627#define SERIALIZERS(fn) \
628void operator << (SerChecker &worker) override { fn(worker); } \
629void operator << (SerCounter &worker) override { fn(worker); } \
630void operator << (SerResetter &worker) override { fn(worker); } \
631void operator << (SerReader &worker) override { fn(worker); } \
632void operator << (SerWriter &worker) override { fn(worker); }
634#define CARTRIDGE_SERIALIZERS(fn) \
635void operator << (SerChecker &worker) override { Cartridge::operator<<(worker); fn(worker); } \
636void operator << (SerCounter &worker) override { Cartridge::operator<<(worker); fn(worker); } \
637void operator << (SerResetter &worker) override { Cartridge::operator<<(worker); fn(worker); } \
638void operator << (SerReader &worker) override { Cartridge::operator<<(worker); fn(worker); } \
639void operator << (SerWriter &worker) override { Cartridge::operator<<(worker); fn(worker); }
641#define CLONE(x) x = other.x;
642#define CLONE_ARRAY(x) std::copy(std::begin(other.x), std::end(other.x), std::begin(x));
VirtualC64 project namespace.
Definition CmdQueue.cpp:16