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