2 #ifndef SAMPLES_XML_RPC_XMLRPC_VALUE_H_ // NOLINT
3 #define SAMPLES_XML_RPC_XMLRPC_VALUE_H_
11 #define N(x) NLIB_EXI_LITERAL(x)
12 #define M(x) NLIB_EXI_UTF8(x)
13 typedef std::basic_string< ::nlib_ns::exi::ExiChar> StdString;
39 StdString* valueString;
40 XmlRpcArray* valueArray;
41 XmlRpcStruct* valueStruct;
43 ValueType m_ValueType;
49 m_ValueHolder.valueInt = 0;
51 ~XmlRpcValue() { this->Invalidate(); }
52 void SetInt(
const int& rhs) {
55 m_ValueHolder.valueInt = rhs;
57 void SetBool(
const bool& rhs) {
59 m_ValueType = BOOLEAN;
60 m_ValueHolder.valueBool = rhs;
62 void SetDouble(
const double& rhs) {
65 m_ValueHolder.valueDouble = rhs;
67 void SetString(
const StdString& rhs) {
70 m_ValueHolder.valueString =
new StdString(rhs);
75 m_ValueHolder.valueString =
new StdString(rhs);
81 ValueType GetValueType()
const {
return m_ValueType; }
83 int* AsInt() {
return (m_ValueType == INT) ? &m_ValueHolder.valueInt : NULL; }
84 const int* AsInt()
const {
return (m_ValueType == INT) ? &m_ValueHolder.valueInt : NULL; }
86 bool* AsBool() {
return (m_ValueType == BOOLEAN) ? &m_ValueHolder.valueBool : NULL; }
87 const bool* AsBool()
const {
88 return (m_ValueType == BOOLEAN) ? &m_ValueHolder.valueBool : NULL;
91 double* AsDouble() {
return (m_ValueType == DOUBLE) ? &m_ValueHolder.valueDouble : NULL; }
92 const double* AsDouble()
const {
93 return (m_ValueType == DOUBLE) ? &m_ValueHolder.valueDouble : NULL;
96 StdString* AsString() {
return (m_ValueType == STRING) ? m_ValueHolder.valueString : NULL; }
97 const StdString* AsString()
const {
98 return (m_ValueType == STRING) ? m_ValueHolder.valueString : NULL;
101 XmlRpcArray* AsArray() {
return (m_ValueType == ARRAY) ? m_ValueHolder.valueArray : NULL; }
102 const XmlRpcArray* AsArray()
const {
103 return (m_ValueType == ARRAY) ? m_ValueHolder.valueArray : NULL;
106 XmlRpcStruct* AsStruct() {
return (m_ValueType == STRUCT) ? m_ValueHolder.valueStruct : NULL; }
107 const XmlRpcStruct* AsStruct()
const {
108 return (m_ValueType == STRUCT) ? m_ValueHolder.valueStruct : NULL;
111 bool IsValid()
const {
return m_ValueType != NONE; }
112 bool IsNil()
const {
return m_ValueType == NIL; }
113 bool Read(nlib_ns::exi::XmlStreamReader* reader) {
114 if (nlib_ns::exi::XmlStreamReader::START_ELEMENT != reader->Next())
return false;
115 return this->Read_(reader);
117 void Write(nlib_ns::exi::XmlStreamWriter* writer)
const;
120 XmlRpcValue(
const XmlRpcValue& rhs);
121 XmlRpcValue& operator=(
const XmlRpcValue& rhs);
123 bool Read_(nlib_ns::exi::XmlStreamReader* reader);
125 friend class XmlRpcArray;
126 friend class XmlRpcStruct;
130 typedef std::vector<XmlRpcValue*> ArrayValue;
131 ArrayValue m_ArrayValue;
134 XmlRpcValue* Append() {
135 XmlRpcValue* p =
new XmlRpcValue();
136 m_ArrayValue.push_back(p);
139 std::size_t Size()
const {
return m_ArrayValue.size(); }
140 XmlRpcValue* Get(std::size_t idx) {
141 return idx < m_ArrayValue.size() ? m_ArrayValue[idx] : NULL;
143 const XmlRpcValue* Get(std::size_t idx)
const {
144 return idx < m_ArrayValue.size() ? m_ArrayValue[idx] : NULL;
146 XmlRpcValue* operator[](std::size_t idx) {
return this->Get(idx); }
147 const XmlRpcValue* operator[](std::size_t idx)
const {
return this->Get(idx); }
148 bool Read(nlib_ns::exi::XmlStreamReader* reader);
149 void Write(nlib_ns::exi::XmlStreamWriter* writer)
const;
154 XmlRpcArray(
const XmlRpcArray& rhs);
155 XmlRpcArray& operator=(
const XmlRpcArray& rhs);
157 friend class XmlRpcValue;
161 typedef std::map<StdString, XmlRpcValue*> StructValue;
162 StructValue m_StructValue;
165 XmlRpcValue& operator[](
const StdString& rhs);
166 XmlRpcValue* Insert(
const StdString& rhs) {
return &operator[](rhs); }
167 XmlRpcValue* Get(
const StdString& rhs)
const {
168 StructValue::const_iterator it = m_StructValue.find(rhs);
169 return it != m_StructValue.end() ? it->second : NULL;
171 bool HasMember(
const StdString& rhs)
const {
172 return m_StructValue.end() != m_StructValue.find(rhs);
174 bool Read(nlib_ns::exi::XmlStreamReader* reader);
175 void Write(nlib_ns::exi::XmlStreamWriter* writer)
const;
180 XmlRpcStruct(
const XmlRpcStruct& rhs);
181 XmlRpcStruct& operator=(
const XmlRpcStruct& rhs);
183 friend class XmlRpcValue;
186 #endif // SAMPLES_XML_RPC_XMLRPC_VALUE_H_ // NOLINT
bool Write(BinaryWriter *w, T x)
You can write user-defined class objects by specializing this function template.
Header that includes all the headers within the nn/nlib/exi directory.
bool Read(BinaryReader *r, T *x)
You can read to user-defined class objects by specializing this function template.
wchar_t ExiChar
A string-type typedef used internally by the XML parser.