-
Notifications
You must be signed in to change notification settings - Fork 99
/
serialize.h
86 lines (67 loc) · 2.81 KB
/
serialize.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#pragma once
#include "library/sp.h"
#include "library/strings.h"
#include <stdexcept>
#include <vector>
namespace OpenApoc
{
class SerializationNode
{
public:
virtual SerializationNode *addNode(const UString &name, const UString &value = "") = 0;
virtual SerializationNode *addSection(const UString &name) = 0;
// Opt versions may return nullptr (they're 'optional'), Req gets throw an exception if
// missing
virtual SerializationNode *getNodeReq(const UString &name);
virtual SerializationNode *getNodeOpt(const UString &name) = 0;
virtual SerializationNode *getNextSiblingReq(const UString &name);
virtual SerializationNode *getNextSiblingOpt(const UString &name) = 0;
virtual SerializationNode *getSectionReq(const UString &name);
virtual SerializationNode *getSectionOpt(const UString &name) = 0;
SerializationNode *getNode(const UString &name) { return this->getNodeOpt(name); }
SerializationNode *getNextSibling(const UString &name) { return this->getNextSiblingOpt(name); }
SerializationNode *getSection(const UString &name) { return this->getSectionOpt(name); }
virtual UString getName() = 0;
virtual void setName(const UString &str) = 0;
virtual UString getValue() = 0;
virtual void setValue(const UString &str) = 0;
virtual unsigned int getValueUInt() = 0;
virtual void setValueUInt(unsigned int i) = 0;
virtual unsigned char getValueUChar() = 0;
virtual void setValueUChar(unsigned char c) = 0;
virtual int getValueInt() = 0;
virtual void setValueInt(int i) = 0;
virtual unsigned long long getValueUInt64() = 0;
virtual void setValueUInt64(unsigned long long i) = 0;
virtual long long getValueInt64() = 0;
virtual void setValueInt64(long long i) = 0;
virtual float getValueFloat() = 0;
virtual void setValueFloat(float f) = 0;
virtual bool getValueBool() = 0;
virtual void setValueBool(bool b) = 0;
// std::vector<bool> is handled specially
virtual std::vector<bool> getValueBoolVector() = 0;
virtual void setValueBoolVector(const std::vector<bool> &v) = 0;
virtual UString getFullPath() = 0;
virtual const UString &getPrefix() const = 0;
virtual ~SerializationNode() = default;
};
class SerializationArchive
{
public:
static up<SerializationArchive> createArchive();
static up<SerializationArchive> readArchive(const UString &path);
virtual SerializationNode *newRoot(const UString &prefix, const UString &name) = 0;
virtual SerializationNode *getRoot(const UString &prefix, const UString &name) = 0;
virtual bool write(const UString &path, bool pack = true, bool pretty = false) = 0;
virtual ~SerializationArchive() = default;
};
class SerializationException : public std::runtime_error
{
public:
SerializationException(const UString &description, SerializationNode *node)
: std::runtime_error(UString(description + " " + node->getFullPath()).cStr())
{
}
};
} // namespace OpenApoc