All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
value.h
Go to the documentation of this file.
1//
2// Copyright 2016 Pixar
3//
4// Licensed under the terms set forth in the LICENSE.txt file available at
5// https://openusd.org/license.
6//
7#ifndef PXR_BASE_JS_VALUE_H
8#define PXR_BASE_JS_VALUE_H
9
11
12#include "pxr/pxr.h"
13#include "pxr/base/js/api.h"
14#include "pxr/base/js/types.h"
15
16#include <algorithm>
17#include <cstdint>
18#include <memory>
19#include <string>
20#include <type_traits>
21#include <vector>
22
23PXR_NAMESPACE_OPEN_SCOPE
24
25// Value API Version
26// 1 (or undefined) - Initial version.
27// 2 - Changed Get{Array,Object} to GetJs{Array,Object}.
28#define JS_VALUE_API_VERSION 2
29
45{
46public:
48 enum Type {
49 ObjectType,
50 ArrayType,
51 StringType,
52 BoolType,
53 IntType,
54 RealType,
55 NullType
56 };
57
59 JS_API JsValue();
60
62 JS_API JsValue(const JsObject& value);
63
65 JS_API JsValue(JsObject&& value);
66
68 JS_API JsValue(const JsArray& value);
69
71 JS_API JsValue(JsArray&& value);
72
74 JS_API explicit JsValue(const char* value);
75
77 JS_API explicit JsValue(const std::string& value);
78
80 JS_API explicit JsValue(std::string&& value);
81
83 JS_API explicit JsValue(bool value);
84
86 JS_API explicit JsValue(int value);
87
89 JS_API explicit JsValue(int64_t value);
90
92 JS_API explicit JsValue(uint64_t value);
93
95 JS_API explicit JsValue(double value);
96
100 JS_API const JsObject& GetJsObject() const;
101
105 JS_API const JsArray& GetJsArray() const;
106
110 JS_API const std::string& GetString() const;
111
114 JS_API bool GetBool() const;
115
120 JS_API int GetInt() const;
121
125 JS_API int64_t GetInt64() const;
126
130 JS_API uint64_t GetUInt64() const;
131
134 JS_API double GetReal() const;
135
144 template <typename T,
145 typename ReturnType = typename std::conditional<
146 std::is_same<T, JsObject>::value ||
147 std::is_same<T, JsArray>::value ||
148 std::is_same<T, std::string>::value,
149 const T&, T>::type>
150 ReturnType Get() const {
151 return _Get(static_cast<T*>(nullptr));
152 }
153
160 template <typename T>
161 std::vector<T> GetArrayOf() const;
162
164 JS_API Type GetType() const;
165
167 JS_API std::string GetTypeName() const;
168
170 JS_API bool IsObject() const;
171
173 JS_API bool IsArray() const;
174
176 JS_API bool IsString() const;
177
179 JS_API bool IsBool() const;
180
182 JS_API bool IsInt() const;
183
185 JS_API bool IsReal() const;
186
188 JS_API bool IsUInt64() const;
189
192 template <typename T>
193 bool Is() const {
194 return _Is(static_cast<T*>(nullptr));
195 }
196
199 template <typename T>
200 bool IsArrayOf() const;
201
203 JS_API bool IsNull() const;
204
206 JS_API explicit operator bool() const;
207
210 JS_API bool operator==(const JsValue& other) const;
211
214 JS_API bool operator!=(const JsValue& other) const;
215
216private:
217 template <typename T>
218 struct _InvalidTypeHelper : public std::false_type { };
219
220 template <class T>
221 T _Get(T*) const {
222 static_assert(_InvalidTypeHelper<T>::value,
223 "Invalid type for JsValue");
224 return T();
225 }
226
227 const JsObject& _Get(JsObject*) const { return GetJsObject(); }
228 const JsArray& _Get(JsArray*) const { return GetJsArray(); }
229 const std::string& _Get(std::string*) const { return GetString(); }
230 bool _Get(bool*) const { return GetBool(); }
231 int _Get(int*) const { return GetInt(); }
232 int64_t _Get(int64_t*) const { return GetInt64(); }
233 uint64_t _Get(uint64_t*) const { return GetUInt64(); }
234 double _Get(double*) const { return GetReal(); }
235
236 template <class T>
237 bool _Is(T*) const {
238 static_assert(_InvalidTypeHelper<T>::value,
239 "Invalid type for JsValue");
240 return false;
241 }
242
243 bool _Is(JsObject*) const { return IsObject(); }
244 bool _Is(JsArray*) const { return IsArray(); }
245 bool _Is(std::string*) const { return IsString(); }
246 bool _Is(bool*) const { return IsBool(); }
247 bool _Is(int*) const { return IsInt(); }
248 bool _Is(int64_t*) const { return IsInt(); }
249 bool _Is(uint64_t*) const { return IsUInt64(); }
250 bool _Is(double*) const { return IsReal(); }
251
252 struct _Holder;
253 std::shared_ptr<_Holder> _holder;
254};
255
256template <typename T>
257inline std::vector<T> JsValue::GetArrayOf() const
258{
259 const JsArray& array = GetJsArray();
260 std::vector<T> result(array.size());
261 std::transform(array.begin(), array.end(), result.begin(),
262 [](const JsValue& v) { return v.Get<T>(); });
263 return result;
264}
265
266template <typename T>
267inline bool JsValue::IsArrayOf() const
268{
269 if (!IsArray()) {
270 return false;
271 }
272 const JsArray& array = GetJsArray();
273 return std::all_of(array.begin(), array.end(),
274 [](const JsValue& v) { return v.Is<T>(); });
275}
276
277PXR_NAMESPACE_CLOSE_SCOPE
278
279#endif // PXR_BASE_JS_VALUE_H
A discriminated union type for JSON values.
Definition: value.h:45
JS_API int64_t GetInt64() const
Returns the 64-bit integer held by this value.
JS_API JsValue(int64_t value)
Constructs a value holding a 64-bit signed integer.
Type
Type held by this JSON value.
Definition: value.h:48
JS_API JsValue(int value)
Constructs a value holding a signed integer.
JS_API JsValue(const JsObject &value)
Constructs a value holding the given object.
JS_API bool IsInt() const
Returns true if this value is holding an integer type.
JS_API JsValue(const std::string &value)
Constructs a value holding the given std::string.
ReturnType Get() const
Returns the value corresponding to the C++ type specified in the template parameter if it is holding ...
Definition: value.h:150
JS_API bool IsReal() const
Returns true if this value is holding a real type.
JS_API JsValue(const JsArray &value)
Constructs a value holding the given array.
JS_API const JsArray & GetJsArray() const
Returns the array held by this value.
JS_API JsValue(std::string &&value)
Constructs a value holding the given std::string rvalue reference.
JS_API bool IsUInt64() const
Returns true if this value is holding a 64-bit unsigned integer.
JS_API bool IsObject() const
Returns true if this value is holding an object type.
JS_API Type GetType() const
Returns the type of this value.
JS_API std::string GetTypeName() const
Returns a display name for the type of this value.
JS_API double GetReal() const
Returns the double held by this value.
JS_API uint64_t GetUInt64() const
Returns the 64-bit unsigned integer held by this value.
JS_API bool operator!=(const JsValue &other) const
Returns true if values are of different type, or the underlying held values are not equal.
bool Is() const
Returns true if this value is holding a type that corresponds to the C++ type specified as the templa...
Definition: value.h:193
JS_API JsValue(uint64_t value)
Constructs a value holding a 64-bit unsigned integer.
std::vector< T > GetArrayOf() const
Returns a vector holding the elements of this value's array that correspond to the C++ type specified...
Definition: value.h:257
JS_API JsValue(double value)
Constructs a value holding a double.
JS_API JsValue(bool value)
Constructs a value holding a bool.
JS_API const JsObject & GetJsObject() const
Returns the object held by this value.
JS_API JsValue(JsArray &&value)
Constructs a value holding the given array rvalue reference.
JS_API JsValue(JsObject &&value)
Constructs a value holding the given object rvalue reference.
JS_API bool IsNull() const
Returns true if this value is null, false otherwise.
JS_API bool GetBool() const
Returns the bool held by this value.
JS_API bool operator==(const JsValue &other) const
Returns true of both values hold the same type and the underlying held values are equal.
JS_API JsValue(const char *value)
Constructs a value holding the given char array as a std::string.
JS_API bool IsBool() const
Returns true if this value is holding a boolean type.
JS_API const std::string & GetString() const
Returns the string held by this value.
bool IsArrayOf() const
Returns true if this value is holding an array whose elements all correspond to the C++ type specifie...
Definition: value.h:267
JS_API int GetInt() const
Returns the integer held by this value.
JS_API bool IsString() const
Returns true if this value is holding a string type.
JS_API JsValue()
Constructs a null value.
JS_API bool IsArray() const
Returns true if this value is holding an array type.