kodi
Variant.h
1 /*
2  * Copyright (C) 2005-2018 Team Kodi
3  * This file is part of Kodi - https://kodi.tv
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  * See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include <map>
12 #include <stdint.h>
13 #include <string>
14 #include <string_view>
15 #include <variant>
16 #include <vector>
17 #include <wchar.h>
18 
19 int64_t str2int64(std::string_view, int64_t fallback = 0);
20 int64_t str2int64(std::wstring_view, int64_t fallback = 0);
21 uint64_t str2uint64(std::string_view, uint64_t fallback = 0);
22 uint64_t str2uint64(std::wstring_view, uint64_t fallback = 0);
23 double str2double(std::string_view, double fallback = 0.0);
24 double str2double(std::wstring_view, double fallback = 0.0);
25 
26 #ifdef TARGET_WINDOWS_STORE
27 #pragma pack(push)
28 #pragma pack(8)
29 #endif
30 
31 class CVariant
32 {
33 public:
34  // Keep in sync with m_data!
35  enum VariantType
36  {
37  VariantTypeNull,
38  VariantTypeConstNull,
39  VariantTypeInteger,
40  VariantTypeUnsignedInteger,
41  VariantTypeBoolean,
42  VariantTypeDouble,
43  VariantTypeString,
44  VariantTypeWideString,
45  VariantTypeArray,
46  VariantTypeObject
47  };
48 
49  CVariant();
50  CVariant(VariantType type);
51  CVariant(int integer);
52  CVariant(int64_t integer);
53  CVariant(unsigned int unsignedinteger);
54  CVariant(uint64_t unsignedinteger);
55  CVariant(double value);
56  CVariant(float value);
57  CVariant(bool boolean);
58  CVariant(const char *str);
59  CVariant(const char *str, unsigned int length);
60  CVariant(const std::string &str);
61  CVariant(std::string &&str);
62  CVariant(const wchar_t *str);
63  CVariant(const wchar_t *str, unsigned int length);
64  CVariant(const std::wstring &str);
65  CVariant(std::wstring &&str);
66  CVariant(const std::vector<std::string> &strArray);
67  CVariant(std::vector<std::string>&& strArray);
68  CVariant(const std::map<std::string, std::string> &strMap);
69  CVariant(std::map<std::string, std::string>&& strMap);
70  CVariant(const std::map<std::string, CVariant> &variantMap);
71  CVariant(std::map<std::string, CVariant>&& variantMap);
72  CVariant(const CVariant &variant);
73  CVariant(CVariant&& rhs) noexcept;
74  ~CVariant();
75 
76 
77 
78  bool isInteger() const;
79  bool isSignedInteger() const;
80  bool isUnsignedInteger() const;
81  bool isBoolean() const;
82  bool isString() const;
83  bool isWideString() const;
84  bool isDouble() const;
85  bool isArray() const;
86  bool isObject() const;
87  bool isNull() const;
88 
89  VariantType type() const;
90 
91  int64_t asInteger(int64_t fallback = 0) const;
92  int32_t asInteger32(int32_t fallback = 0) const;
93  uint64_t asUnsignedInteger(uint64_t fallback = 0u) const;
94  uint32_t asUnsignedInteger32(uint32_t fallback = 0u) const;
95  bool asBoolean(bool fallback = false) const;
96  std::string asString(std::string_view = "") const&;
97  std::string asString(std::string_view = "") &&;
98  std::wstring asWideString(std::wstring_view = L"") const&;
99  std::wstring asWideString(std::wstring_view = L"") &&;
100  double asDouble(double fallback = 0.0) const;
101  float asFloat(float fallback = 0.0f) const;
102 
103  CVariant& operator[](const std::string& key) &;
104  const CVariant& operator[](const std::string& key) const&;
105  CVariant operator[](const std::string& key) &&;
106  CVariant& operator[](unsigned int position) &;
107  const CVariant& operator[](unsigned int position) const&;
108  CVariant operator[](unsigned int position) &&;
109 
110  CVariant &operator=(const CVariant &rhs);
111  CVariant& operator=(CVariant&& rhs) noexcept;
112  bool operator==(const CVariant &rhs) const;
113  bool operator!=(const CVariant &rhs) const { return !(*this == rhs); }
114 
115  void reserve(size_t length);
116  void push_back(const CVariant &variant);
117  void push_back(CVariant &&variant);
118  void append(const CVariant &variant);
119  void append(CVariant &&variant);
120 
121  const char *c_str() const;
122 
123  void swap(CVariant& rhs) noexcept;
124 
125 private:
126  typedef std::vector<CVariant> VariantArray;
127  typedef std::map<std::string, CVariant> VariantMap;
128 
129 public:
130  typedef VariantArray::iterator iterator_array;
131  typedef VariantArray::const_iterator const_iterator_array;
132 
133  typedef VariantMap::iterator iterator_map;
134  typedef VariantMap::const_iterator const_iterator_map;
135 
136  iterator_array begin_array();
137  const_iterator_array begin_array() const;
138  iterator_array end_array();
139  const_iterator_array end_array() const;
140 
141  iterator_map begin_map();
142  const_iterator_map begin_map() const;
143  iterator_map end_map();
144  const_iterator_map end_map() const;
145 
146  unsigned int size() const;
147  bool empty() const;
148  void clear();
149  void erase(const std::string &key);
150  void erase(unsigned int position);
151 
152  bool isMember(const std::string &key) const;
153 
154  static CVariant ConstNullVariant;
155 
156 private:
157  void cleanup();
158 
159  struct Null
160  {
161  bool operator==(const Null&) const { return true; }
162  };
163  struct ConstNull
164  {
165  bool operator==(const ConstNull&) const { return true; }
166  };
167 
168  // Keep in sync with VariantType
169  std::variant<Null,
170  ConstNull,
171  int64_t,
172  uint64_t,
173  bool,
174  double,
175  std::string,
176  std::wstring,
177  VariantArray,
178  VariantMap>
179  m_data;
180 
181  static VariantArray EMPTY_ARRAY;
182  static VariantMap EMPTY_MAP;
183 };
184 
185 #ifdef TARGET_WINDOWS_STORE
186 #pragma pack(pop)
187 #endif
188 
Definition: Variant.h:31