Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/lynx/newstate.h
2 views
1
#ifndef NEWSTATE_H
2
#define NEWSTATE_H
3
4
#include <cstring>
5
#include <cstddef>
6
7
class NewState
8
{
9
public:
10
virtual void Save(const void *ptr, size_t size, const char *name) = 0;
11
virtual void Load(void *ptr, size_t size, const char *name) = 0;
12
virtual void EnterSection(const char *name) { }
13
virtual void ExitSection(const char *name) { }
14
};
15
16
class NewStateDummy : public NewState
17
{
18
private:
19
long length;
20
public:
21
NewStateDummy();
22
long GetLength() { return length; }
23
void Rewind() { length = 0; }
24
virtual void Save(const void *ptr, size_t size, const char *name);
25
virtual void Load(void *ptr, size_t size, const char *name);
26
};
27
28
class NewStateExternalBuffer : public NewState
29
{
30
private:
31
char *const buffer;
32
long length;
33
const long maxlength;
34
public:
35
NewStateExternalBuffer(char *buffer, long maxlength);
36
long GetLength() { return length; }
37
void Rewind() { length = 0; }
38
bool Overflow() { return length > maxlength; }
39
virtual void Save(const void *ptr, size_t size, const char *name);
40
virtual void Load(void *ptr, size_t size, const char *name);
41
};
42
43
struct FPtrs
44
{
45
void (*Save_)(const void *ptr, size_t size, const char *name);
46
void (*Load_)(void *ptr, size_t size, const char *name);
47
void (*EnterSection_)(const char *name);
48
void (*ExitSection_)(const char *name);
49
};
50
51
class NewStateExternalFunctions : public NewState
52
{
53
private:
54
void (*Save_)(const void *ptr, size_t size, const char *name);
55
void (*Load_)(void *ptr, size_t size, const char *name);
56
void (*EnterSection_)(const char *name);
57
void (*ExitSection_)(const char *name);
58
public:
59
NewStateExternalFunctions(const FPtrs *ff);
60
virtual void Save(const void *ptr, size_t size, const char *name);
61
virtual void Load(void *ptr, size_t size, const char *name);
62
virtual void EnterSection(const char *name);
63
virtual void ExitSection(const char *name);
64
};
65
66
// defines and explicitly instantiates
67
#define SYNCFUNC(x)\
68
template void x::SyncState<false>(NewState *ns);\
69
template void x::SyncState<true>(NewState *ns);\
70
template<bool isReader>void x::SyncState(NewState *ns)
71
72
// N = normal variable
73
// P = pointer to fixed size data
74
// S = "sub object"
75
// T = "ptr to sub object"
76
// R = pointer, store its offset from some other pointer
77
// E = general purpose cased value "enum"
78
79
80
// first line is default value in converted enum; last line is default value in argument x
81
#define EBS(x,d) do { int _ttmp = (d); if (isReader) ns->Load(&_ttmp, sizeof(_ttmp), #x); if (0)
82
#define EVS(x,v,n) else if (!isReader && (x) == (v)) _ttmp = (n); else if (isReader && _ttmp == (n)) (x) = (v)
83
#define EES(x,d) else if (isReader) (x) = (d); if (!isReader) ns->Save(&_ttmp, sizeof(_ttmp), #x); } while (0)
84
85
#define RSS(x,b) do { if (isReader)\
86
{ ptrdiff_t _ttmp; ns->Load(&_ttmp, sizeof(_ttmp), #x); (x) = (_ttmp == (ptrdiff_t)0xdeadbeef ? 0 : (b) + _ttmp); }\
87
else\
88
{ ptrdiff_t _ttmp = (x) == 0 ? 0xdeadbeef : (x) - (b); ns->Save(&_ttmp, sizeof(_ttmp), #x); } } while (0)
89
90
#define PSS(x,s) do { if (isReader) ns->Load((x), (s), #x); else ns->Save((x), (s), #x); } while (0)
91
92
#define NSS(x) do { if (isReader) ns->Load(&(x), sizeof(x), #x); else ns->Save(&(x), sizeof(x), #x); } while (0)
93
94
#define SSS(x) do { ns->EnterSection(#x); (x).SyncState<isReader>(ns); ns->ExitSection(#x); } while (0)
95
96
#define TSS(x) do { ns->EnterSection(#x); (x)->SyncState<isReader>(ns); ns->ExitSection(#x); } while (0)
97
98
#endif
99
100