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