This document is for a version of USD that is under development. See this page for the current release.
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.