2 * Copyright (C) 2005-2010 Team XBMC
5 * This Program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
10 * This Program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with XBMC; see the file COPYING. If not, write to
17 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18 * http://www.gnu.org/copyleft/gpl.html
22 #include "PlatformDefs.h"
27 CVariant
CVariant::ConstNullVariant
= CVariant::VariantTypeConstNull
;
29 CVariant::CVariant(VariantType type
)
36 m_data
.array
= new VariantArray();
38 m_data
.map
= new VariantMap();
40 memset(&m_data
, 0, sizeof(m_data
));
43 CVariant::CVariant(int integer
)
45 m_type
= VariantTypeInteger
;
46 m_data
.integer
= integer
;
49 CVariant::CVariant(int64_t integer
)
51 m_type
= VariantTypeInteger
;
52 m_data
.integer
= integer
;
55 CVariant::CVariant(unsigned int unsignedinteger
)
57 m_type
= VariantTypeUnsignedInteger
;
58 m_data
.unsignedinteger
= unsignedinteger
;
61 CVariant::CVariant(uint64_t unsignedinteger
)
63 m_type
= VariantTypeUnsignedInteger
;
64 m_data
.unsignedinteger
= unsignedinteger
;
67 CVariant::CVariant(bool boolean
)
69 m_type
= VariantTypeBoolean
;
70 m_data
.boolean
= boolean
;
73 CVariant::CVariant(const char *str
)
75 m_type
= VariantTypeString
;
76 m_data
.string
= new string(str
);
79 CVariant::CVariant(const CVariant
&variant
)
81 m_type
= variant
.m_type
;
87 if (isString() && m_data
.string
)
92 else if (isArray() && m_data
.array
)
97 else if (isObject() && m_data
.map
)
104 bool CVariant::isInteger() const
106 return m_type
== VariantTypeInteger
;
109 bool CVariant::isUnsignedInteger() const
111 return m_type
== VariantTypeUnsignedInteger
;
114 bool CVariant::isBoolean() const
116 return m_type
== VariantTypeBoolean
;
119 bool CVariant::isString() const
121 return m_type
== VariantTypeString
;
124 bool CVariant::isArray() const
126 return m_type
== VariantTypeArray
;
129 bool CVariant::isObject() const
131 return m_type
== VariantTypeObject
;
134 bool CVariant::isNull() const
136 return m_type
== VariantTypeNull
|| m_type
== VariantTypeConstNull
;
139 int64_t CVariant::asInteger(int64_t fallback
) const
142 return m_data
.integer
;
147 uint64_t CVariant::asUnsignedInteger(uint64_t fallback
) const
149 if (isUnsignedInteger())
150 return m_data
.unsignedinteger
;
155 bool CVariant::asBoolean(bool fallback
) const
158 return m_data
.boolean
;
163 const char *CVariant::asString(const char *fallback
) const
166 return m_data
.string
->c_str();
171 CVariant
&CVariant::operator[](string key
)
173 if (m_type
== VariantTypeNull
)
175 m_type
= VariantTypeObject
;
176 m_data
.map
= new VariantMap();
180 return (*m_data
.map
)[key
];
182 return ConstNullVariant
;
185 CVariant
&CVariant::operator[](unsigned int position
)
187 if (isArray() && size() > position
)
188 return (*m_data
.array
)[position
];
190 return ConstNullVariant
;
193 CVariant
&CVariant::operator=(const CVariant
&rhs
)
195 if (m_type
== VariantTypeConstNull
)
202 case VariantTypeInteger
:
203 m_data
.integer
= rhs
.m_data
.integer
;
205 case VariantTypeUnsignedInteger
:
206 m_data
.integer
= rhs
.m_data
.unsignedinteger
;
208 case VariantTypeBoolean
:
209 m_data
.boolean
= rhs
.m_data
.boolean
;
211 case VariantTypeString
:
212 m_data
.string
= new string(rhs
.m_data
.string
->c_str());
214 case VariantTypeArray
:
215 m_data
.array
= new VariantArray(rhs
.m_data
.array
->begin(), rhs
.m_data
.array
->end());
217 case VariantTypeObject
:
218 m_data
.map
= new VariantMap(rhs
.m_data
.map
->begin(), rhs
.m_data
.map
->end());
227 void CVariant::push_back(CVariant variant
)
229 if (m_type
== VariantTypeNull
)
231 m_type
= VariantTypeArray
;
232 m_data
.array
= new VariantArray();
236 m_data
.array
->push_back(variant
);
239 unsigned int CVariant::size() const
242 return m_data
.map
->size();
244 return m_data
.array
->size();
249 bool CVariant::empty() const
252 return m_data
.map
->empty();
254 return m_data
.array
->empty();
259 void CVariant::clear()
264 m_data
.array
->clear();
267 void CVariant::erase(std::string key
)
269 if (m_type
== VariantTypeNull
)
271 m_type
= VariantTypeObject
;
272 m_data
.map
= new VariantMap();
275 m_data
.map
->erase(key
);
278 void CVariant::erase(unsigned int position
)
280 if (m_type
== VariantTypeNull
)
282 m_type
= VariantTypeArray
;
283 m_data
.array
= new VariantArray();
286 if (isArray() && position
< size())
287 m_data
.array
->erase(m_data
.array
->begin() + position
);
292 void CVariant::debug()
298 void CVariant::internaldebug()
302 case VariantTypeInteger
:
303 printf("int: %"PRIu64
"", m_data
.integer
);
305 case VariantTypeUnsignedInteger
:
306 printf("uint: %"PRIu64
"", m_data
.unsignedinteger
);
308 case VariantTypeBoolean
:
309 printf("bool: %s", m_data
.boolean
? "true" : "false");
311 case VariantTypeString
:
312 printf("string: \"%s\"", m_data
.string
->c_str());
314 case VariantTypeArray
:
316 for (unsigned int i
= 0; i
< size(); i
++)
318 (*m_data
.array
)[i
].internaldebug();
324 case VariantTypeObject
:
326 for (VariantMap::iterator itr
= m_data
.map
->begin(); itr
!= m_data
.map
->end(); itr
++)
328 printf("key='%s' value='", itr
->first
.c_str());
329 itr
->second
.internaldebug();