Var(const char * tag,T & var,X item_xmlize)1 template <class T, class X> XmlIO XmlIO::Var(const char *tag, T& var, X item_xmlize)
2 {
3 XmlIO n(*this, tag);
4 if(IsLoading() && n.Node().GetCount() == 0 && n.Node().GetAttrCount() == 0)
5 return *this;
6 item_xmlize(n, var);
7 return *this;
8 }
9
operator ()(const char * tag,T & var)10 template <class T> XmlIO XmlIO::operator()(const char *tag, T& var) {
11 return Var(tag, var, [](XmlIO& io, T& var) { Xmlize(io, var); });
12 }
13
Array(const char * tag,T & var,X item_xmlize,const char * itemtag)14 template <class T, class X> XmlIO XmlIO::Array(const char *tag, T& var, X item_xmlize, const char *itemtag)
15 {
16 XmlIO n(*this, tag);
17 if(IsLoading() && n.Node().GetCount() == 0 && n.Node().GetAttrCount() == 0)
18 return *this;
19 XmlizeContainer(n, itemtag, var, item_xmlize);
20 return *this;
21 }
22
List(const char * tag,const char * itemtag,T & var)23 template <class T> XmlIO XmlIO::List(const char *tag, const char *itemtag, T& var) {
24 return Array(tag, var, [](XmlIO& io, ValueTypeOf<T>& data) { Xmlize(io, data); }, itemtag);
25 }
26
operator ()(const char * tag,T & var,const D & def)27 template <class T, class D> XmlIO XmlIO::operator()(const char *tag, T& var, const D& def)
28 {
29 XmlIO n(*this, tag);
30 if(IsLoading() && n.Node().GetCount() == 0 && n.Node().GetAttrCount() == 0)
31 var = def;
32 else
33 Xmlize(n, var);
34 return *this;
35 }
36
List(const char * tag,const char * itemtag,T & var,const D & def)37 template <class T, class D> XmlIO XmlIO::List(const char *tag, const char *itemtag, T& var, const D& def)
38 {
39 XmlIO n(*this, tag);
40 if(IsLoading() && n.Node().GetCount() == 0 && n.Node().GetAttrCount() == 0)
41 var = def;
42 else
43 Xmlize(n, itemtag, var);
44 return *this;
45 }
46
47 template <class T, class X>
XmlizeContainer(XmlIO & xml,const char * tag,T & data,X item_xmlize)48 void XmlizeContainer(XmlIO& xml, const char *tag, T& data, X item_xmlize)
49 {
50 if(xml.IsStoring())
51 for(int i = 0; i < data.GetCount(); i++) {
52 XmlIO io = xml.Add(tag);
53 item_xmlize(io, data[i]);
54 }
55 else {
56 data.Clear();
57 for(int i = 0; i < xml->GetCount(); i++)
58 if(xml->Node(i).IsTag(tag)) {
59 XmlIO io = xml.At(i);
60 item_xmlize(io, data.Add());
61 }
62 }
63 }
64
65 template<class T>
XmlizeContainer(XmlIO & xml,const char * tag,T & data)66 void XmlizeContainer(XmlIO& xml, const char *tag, T& data)
67 {
68 XmlizeContainer(xml, tag, data, [](XmlIO& xml, ValueTypeOf<T>& data) { Xmlize(xml, data); });
69 }
70
71 template<class K, class V, class T>
XmlizeMap(XmlIO & xml,const char * keytag,const char * valuetag,T & data)72 void XmlizeMap(XmlIO& xml, const char *keytag, const char *valuetag, T& data)
73 {
74 if(xml.IsStoring()) {
75 for(int i = 0; i < data.GetCount(); i++)
76 if(!data.IsUnlinked(i)) {
77 XmlIO k = xml.Add(keytag);
78 XmlizeStore(k, data.GetKey(i));
79 XmlIO v = xml.Add(valuetag);
80 XmlizeStore(v, data[i]);
81 }
82 }
83 else {
84 data.Clear();
85 int i = 0;
86 while(i < xml->GetCount() - 1 && xml->Node(i).IsTag(keytag) && xml->Node(i + 1).IsTag(valuetag)) {
87 K key;
88 XmlIO k = xml.At(i++);
89 Xmlize(k, key);
90 XmlIO v = xml.At(i++);
91 Xmlize(v, data.Add(key));
92 }
93 }
94 }
95
96 template<class K, class V, class T>
XmlizeSortedMap(XmlIO & xml,const char * keytag,const char * valuetag,T & data)97 void XmlizeSortedMap(XmlIO& xml, const char *keytag, const char *valuetag, T& data)
98 {
99 if(xml.IsStoring()) {
100 for(int i = 0; i < data.GetCount(); i++) {
101 XmlIO k = xml.Add(keytag);
102 XmlizeStore(k, data.GetKey(i));
103 XmlIO v = xml.Add(valuetag);
104 XmlizeStore(v, data[i]);
105 }
106 }
107 else {
108 data.Clear();
109 int i = 0;
110 while(i < xml->GetCount() - 1 && xml->Node(i).IsTag(keytag) && xml->Node(i + 1).IsTag(valuetag)) {
111 K key;
112 XmlIO k = xml.At(i++);
113 Xmlize(k, key);
114 XmlIO v = xml.At(i++);
115 Xmlize(v, data.Add(key));
116 }
117 }
118 }
119
120 template<class K, class T>
XmlizeIndex(XmlIO & xml,const char * keytag,T & data)121 void XmlizeIndex(XmlIO& xml, const char *keytag, T& data)
122 {
123 if(xml.IsStoring()) {
124 for(int i = 0; i < data.GetCount(); i++)
125 if(!data.IsUnlinked(i)) {
126 XmlIO io = xml.Add(keytag);
127 XmlizeStore(io, data[i]);
128 }
129 }
130 else {
131 data.Clear();
132 int i = 0;
133 while(i < xml->GetCount() && xml->Node(i).IsTag(keytag)) {
134 K k;
135 XmlIO io = xml.At(i++);
136 Xmlize(io, k);
137 data.Add(k);
138 }
139 }
140 }
141