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