changed: update version strings for beta4
[xbmc.git] / xbmc / utils / Variant.cpp
blob1035d83b76cd2b1401a635ee8b7ebd3f1999f748
1 /*
2 * Copyright (C) 2005-2010 Team XBMC
3 * http://www.xbmc.org
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)
8 * any later version.
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
21 #include "Variant.h"
22 #include "PlatformDefs.h"
23 #include <string.h>
25 using namespace std;
27 CVariant CVariant::ConstNullVariant = CVariant::VariantTypeConstNull;
29 CVariant::CVariant(VariantType type)
31 m_type = type;
33 if (isString())
34 m_data.string = NULL;
35 else if (isArray())
36 m_data.array = new VariantArray();
37 else if (isObject())
38 m_data.map = new VariantMap();
39 else
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;
82 *this = variant;
85 CVariant::~CVariant()
87 if (isString() && m_data.string)
89 delete m_data.string;
90 m_data.string = NULL;
92 else if (isArray() && m_data.array)
94 delete m_data.array;
95 m_data.array = NULL;
97 else if (isObject() && m_data.map)
99 delete m_data.map;
100 m_data.map = NULL;
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
141 if (isInteger())
142 return m_data.integer;
143 else
144 return fallback;
147 uint64_t CVariant::asUnsignedInteger(uint64_t fallback) const
149 if (isUnsignedInteger())
150 return m_data.unsignedinteger;
151 else
152 return fallback;
155 bool CVariant::asBoolean(bool fallback) const
157 if (isBoolean())
158 return m_data.boolean;
159 else
160 return fallback;
163 const char *CVariant::asString(const char *fallback) const
165 if (isString())
166 return m_data.string->c_str();
167 else
168 return fallback;
171 CVariant &CVariant::operator[](string key)
173 if (m_type == VariantTypeNull)
175 m_type = VariantTypeObject;
176 m_data.map = new VariantMap();
179 if (isObject())
180 return (*m_data.map)[key];
181 else
182 return ConstNullVariant;
185 CVariant &CVariant::operator[](unsigned int position)
187 if (isArray() && size() > position)
188 return (*m_data.array)[position];
189 else
190 return ConstNullVariant;
193 CVariant &CVariant::operator=(const CVariant &rhs)
195 if (m_type == VariantTypeConstNull)
196 return *this;
198 m_type = rhs.m_type;
200 switch (m_type)
202 case VariantTypeInteger:
203 m_data.integer = rhs.m_data.integer;
204 break;
205 case VariantTypeUnsignedInteger:
206 m_data.integer = rhs.m_data.unsignedinteger;
207 break;
208 case VariantTypeBoolean:
209 m_data.boolean = rhs.m_data.boolean;
210 break;
211 case VariantTypeString:
212 m_data.string = new string(rhs.m_data.string->c_str());
213 break;
214 case VariantTypeArray:
215 m_data.array = new VariantArray(rhs.m_data.array->begin(), rhs.m_data.array->end());
216 break;
217 case VariantTypeObject:
218 m_data.map = new VariantMap(rhs.m_data.map->begin(), rhs.m_data.map->end());
219 break;
220 default:
221 break;
224 return *this;
227 void CVariant::push_back(CVariant variant)
229 if (m_type == VariantTypeNull)
231 m_type = VariantTypeArray;
232 m_data.array = new VariantArray();
235 if (isArray())
236 m_data.array->push_back(variant);
239 unsigned int CVariant::size() const
241 if (isObject())
242 return m_data.map->size();
243 else if (isArray())
244 return m_data.array->size();
245 else
246 return 0;
249 bool CVariant::empty() const
251 if (isObject())
252 return m_data.map->empty();
253 else if (isArray())
254 return m_data.array->empty();
255 else
256 return true;
259 void CVariant::clear()
261 if (isObject())
262 m_data.map->clear();
263 else if (isArray())
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();
274 else if (isObject())
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);
290 #include <stdio.h>
292 void CVariant::debug()
294 internaldebug();
295 printf("\n");
298 void CVariant::internaldebug()
300 switch (m_type)
302 case VariantTypeInteger:
303 printf("int: %"PRIu64"", m_data.integer);
304 break;
305 case VariantTypeUnsignedInteger:
306 printf("uint: %"PRIu64"", m_data.unsignedinteger);
307 break;
308 case VariantTypeBoolean:
309 printf("bool: %s", m_data.boolean ? "true" : "false");
310 break;
311 case VariantTypeString:
312 printf("string: \"%s\"", m_data.string->c_str());
313 break;
314 case VariantTypeArray:
315 printf("array: [");
316 for (unsigned int i = 0; i < size(); i++)
318 (*m_data.array)[i].internaldebug();
319 if (i < size() - 1)
320 printf(", ");
322 printf("]");
323 break;
324 case VariantTypeObject:
325 printf("map: [");
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();
330 printf("' ");
332 printf("]");
333 break;
334 default:
335 break;