Nebula
Loading...
Searching...
No Matches
jsonreader.h
Go to the documentation of this file.
1#pragma once
2//------------------------------------------------------------------------------
13#include "io/streamreader.h"
14#include "math/vec4.h"
15#include "math/vec2.h"
16#include "math/mat4.h"
17#include "util/stack.h"
18#include "util/array.h"
19#include "util/stringatom.h"
20#include "util/bitfield.h"
21#include "util/variant.h"
22#include "pjson/pjson.h"
23#include <array>
24
25namespace pjson
26{
27 class value_variant;
28 class document;
29}
30//------------------------------------------------------------------------------
31namespace IO
32{
34{
36public:
38 JsonReader();
40 virtual ~JsonReader();
41
43 virtual bool Open();
45 virtual void Close();
46
48 bool HasNode(const Util::String& path);
49
51 void SetToRoot();
53 bool SetToNode(const Util::String& path);
54
56 bool SetToFirstChild(const Util::String& name = "");
58 bool SetToNextChild();
60 bool SetToParent();
61
64
66 bool IsString() const;
68 bool IsArray() const;
70 bool IsObject() const;
72 bool HasChildren() const;
74 SizeT CurrentSize() const;
76 bool HasAttr(const char* attr) const;
79
82
84 Util::String GetString(const char* attr = 0) const;
86 Util::StringAtom GetStringAtom(const char* attr = 0) const;
88 bool GetBool(const char* attr = 0) const;
90 int GetInt(const char* attr = 0) const;
92 uint GetUInt(const char* attr = 0) const;
94 float GetFloat(const char* attr = 0) const;
96 Math::vec2 GetVec2(const char* attr = 0) const;
98 Math::vec3 GetVec3(const char* attr = 0) const;
100 Math::vec4 GetVec4(const char* attr = 0) const;
102 Math::mat4 GetMat4(const char* attr = 0) const;
104 Math::transform44 GetTransform44(const char* attr = 0) const;
106 template<typename T> void Get(T& target, const char* attr = 0);
108 template<typename T, size_t N> void Get(std::array<T, N>& target, const char* attr = 0);
110 template<unsigned int N> void Get(Util::BitField<N>& target, const char* attr = 0);
111
113 Util::String GetOptString(const char* attr, const Util::String& defaultValue) const;
115 bool GetOptBool(const char* attr, bool defaultValue) const;
117 int GetOptInt(const char* attr, int defaultValue) const;
119 float GetOptFloat(const char* attr, float defaultValue) const;
121 Math::vec2 GetOptVec2(const char* attr, const Math::vec2& defaultValue) const;
123 Math::vec4 GetOptVec4(const char* attr, const Math::vec4& defaultValue) const;
125 Math::mat4 GetOptMat4(const char* attr, const Math::mat4& defaultValue) const;
127 Math::transform44 GetOptTransform44(const char* attr, const Math::transform44& defaultValue) const;
128
130 template<typename T> bool GetOpt(T& target, const char* attr = 0);
132 template<typename T> bool GetOpt(T& target, const char* attr, const T& _default);
133
134private:
136 const pjson::value_variant* GetChild(const char * key = 0) const;
137
138 pjson::document* document;
139 const pjson::value_variant* curNode;
143 // 0 terminated buffer containing the raw json file
144 char * buffer = nullptr;
145};
146
147template<> void JsonReader::Get<bool>(bool& ret, const char* attr);
148template<> void JsonReader::Get<Util::Array<uint32_t>>(Util::Array<uint32_t>& ret, const char* attr);
149template<> void JsonReader::Get<Util::Array<int>>(Util::Array<int>& ret, const char* attr);
150template<> void JsonReader::Get<int64_t>(int64_t& ret, const char* attr);
151template<> void JsonReader::Get<int32_t>(int32_t& ret, const char* attr);
152template<> void JsonReader::Get<int16_t>(int16_t& ret, const char* attr);
153template<> void JsonReader::Get<int8_t>(int8_t& ret, const char* attr);
154template<> void JsonReader::Get<char>(char& ret, const char* attr);
155template<> void JsonReader::Get<Math::mat4>(Math::mat4& ret, const char* attr);
156template<> void JsonReader::Get<Math::int2>(Math::int2& ret, const char* attr);
157template<> void JsonReader::Get<Math::vector>(Math::vector& ret, const char* attr);
158template<> void JsonReader::Get<Math::vec4>(Math::vec4& ret, const char* attr);
159template<> void JsonReader::Get<Math::vec3>(Math::vec3& ret, const char* attr);
160template<> void JsonReader::Get<Math::vec2>(Math::vec2& ret, const char* attr);
161template<> void JsonReader::Get<uint32_t>(uint32_t& ret, const char* attr);
162template<> void JsonReader::Get<uint64_t>(uint64_t& ret, const char* attr);
163template<> void JsonReader::Get<uint16_t>(uint16_t& ret, const char* attr);
164template<> void JsonReader::Get<uint8_t>(uint8_t& ret, const char* attr);
165template<> void JsonReader::Get<float>(float& ret, const char* attr);
166template<> void JsonReader::Get<double>(double& ret, const char* attr);
167template<> void JsonReader::Get<Util::Variant>(Util::Variant& ret, const char* attr);
168template<> void JsonReader::Get<Util::String>(Util::String& ret, const char* attr);
169template<> void JsonReader::Get<Util::FourCC>(Util::FourCC& ret, const char* attr);
170template<> void JsonReader::Get<Util::StringAtom>(Util::StringAtom& ret, const char* attr);
171template<> void JsonReader::Get<Util::Array<float>>(Util::Array<float>& ret, const char* attr);
172template<> void JsonReader::Get<Util::Array<Util::String>>(Util::Array<Util::String>& ret, const char* attr);
173template<> bool JsonReader::GetOpt<bool>(bool& ret, const char* attr);
174template<> bool JsonReader::GetOpt<int>(int& ret, const char* attr);
175template<> bool JsonReader::GetOpt<uint16_t>(uint16_t& ret, const char* attr);
176template<> bool JsonReader::GetOpt<uint32_t>(uint32_t& ret, const char* attr);
177template<> bool JsonReader::GetOpt<float>(float& ret, const char* attr);
178template<> bool JsonReader::GetOpt<double>(double& ret, const char* attr);
179template<> bool JsonReader::GetOpt<Math::vec4>(Math::vec4& ret, const char* attr);
180template<> bool JsonReader::GetOpt<Math::quat>(Math::quat& ret, const char* attr);
181template<> bool JsonReader::GetOpt<Math::mat4>(Math::mat4& ret, const char* attr);
182template<> bool JsonReader::GetOpt<Util::String>(Util::String& ret, const char* attr);
183template<> bool JsonReader::GetOpt<Util::Array<int>>(Util::Array<int>& target, const char* attr);
184template<> bool JsonReader::GetOpt<Util::Array<uint32_t>>(Util::Array<uint32_t>& target, const char* attr);
185template<> bool JsonReader::GetOpt<Util::Array<float>>(Util::Array<float>& target, const char* attr);
186template<> bool JsonReader::GetOpt<Util::Array<Util::String>>(Util::Array<Util::String>& target, const char* attr);
187
188//------------------------------------------------------------------------------
191template<typename T>
192inline bool
193JsonReader::GetOpt(T& target, const char* attr)
194{
195 if (this->HasAttr(attr))
196 {
197 this->Get(target, attr);
198 return true;
199 }
200 return false;
201}
202
203//------------------------------------------------------------------------------
206template<typename T>
207inline bool
208JsonReader::GetOpt(T& target, const char* attr, const T& defaultVal)
209{
210 if (!this->GetOpt<T>(target, attr))
211 {
212 target = defaultVal;
213 return false;
214 }
215 return true;
216}
217
218//------------------------------------------------------------------------------
221template<typename T, size_t N>
222inline void
223JsonReader::Get(std::array<T, N>& ret, const char* attr)
224{
225 const pjson::value_variant* node = this->GetChild(attr);
226
227 n_assert(node->is_array());
228 n_assert(node->size() == N);
229
230 if constexpr (N > 0)
231 {
232 if (attr != nullptr)
233 {
234 this->SetToNode(attr);
235 }
236
237 bool validChild = this->SetToFirstChild();
238 n_assert(validChild);
239 for (size_t i = 0; i < N; i++)
240 {
241 this->Get<T>(ret[i]);
242 if (i + 1 < N)
243 {
244 validChild = this->SetToNextChild();
245 n_assert(validChild);
246 }
247 }
248 this->SetToParent();
249
250 if (attr != nullptr)
251 {
252 this->SetToParent();
253 }
254 }
255}
256
257//------------------------------------------------------------------------------
260template<unsigned int N>
261inline void
262JsonReader::Get(Util::BitField<N>& ret, const char* attr)
263{
265 this->Get<Util::Array<int>>(arr);
266
267 unsigned int count = arr.Size();
268 n_assert(count <= N);
269 for (unsigned int i = 0; i < count; i++)
270 {
271 ret.SetBit(arr[i]);
272 }
273}
274
275} // namespace IO
276//------------------------------------------------------------------------------
bool GetOptBool(const char *attr, bool defaultValue) const
get optional bool attribute value from current node
Definition jsonreader.cc:678
float GetFloat(const char *attr=0) const
get float attribute value from current node
Definition jsonreader.cc:542
bool SetToParent()
set current node to parent, return false if no parent exists
Definition jsonreader.cc:298
bool IsArray() const
check if current node is an array
Definition jsonreader.cc:350
Util::Stack< const pjson::value_variant * > parents
Definition jsonreader.h:141
virtual void Close()
end reading from the stream
Definition jsonreader.cc:95
Util::String GetCurrentNodeName() const
get name of current node
Definition jsonreader.cc:432
Math::vec4 GetVec4(const char *attr=0) const
get vec4 attribute value from current node
Definition jsonreader.cc:593
__DeclareClass(JsonReader)
bool GetOpt(T &target, const char *attr=0)
generic getter for optional items
Definition jsonreader.h:193
pjson::document * document
Definition jsonreader.h:138
bool SetToFirstChild(const Util::String &name="")
set current node to first child, false if none exists
Definition jsonreader.cc:232
bool SetToNode(const Util::String &path)
set current node as path, accepts / as separator and [number] to access array/object elements
Definition jsonreader.cc:172
JsonReader()
constructor
Definition jsonreader.cc:27
virtual bool Open()
begin reading from the stream
Definition jsonreader.cc:51
Math::vec4 GetOptVec4(const char *attr, const Math::vec4 &defaultValue) const
get optional vec4 attribute value from current node
Definition jsonreader.cc:750
float GetOptFloat(const char *attr, float defaultValue) const
get optional float attribute value from current node
Definition jsonreader.cc:714
void SetToRoot()
sets the current node to root
Definition jsonreader.cc:155
bool HasNode(const Util::String &path)
return true if node exists
Definition jsonreader.cc:113
int GetInt(const char *attr=0) const
get int attribute value from current node
Definition jsonreader.cc:512
Math::transform44 GetTransform44(const char *attr=0) const
get transform44 attribute value from current node
Definition jsonreader.cc:637
bool HasChildren() const
check if current node has children (json object or array)
Definition jsonreader.cc:373
virtual ~JsonReader()
destructor
Definition jsonreader.cc:37
Util::Array< Util::String > GetAttrs() const
return names of all attrs on current node
Definition jsonreader.cc:415
int GetOptInt(const char *attr, int defaultValue) const
get optional int attribute value from current node
Definition jsonreader.cc:696
Math::transform44 GetOptTransform44(const char *attr, const Math::transform44 &defaultValue) const
get transform44 attribute value from current node
Definition jsonreader.cc:786
Math::vec2 GetVec2(const char *attr=0) const
get vec2 attribute value from current node
Definition jsonreader.cc:558
Util::String GetOptString(const char *attr, const Util::String &defaultValue) const
get optional string attribute value from current node
Definition jsonreader.cc:660
bool IsString() const
check if current node is a string
Definition jsonreader.cc:337
Math::vec2 GetOptVec2(const char *attr, const Math::vec2 &defaultValue) const
get vec2 attribute value from current node
Definition jsonreader.cc:732
Util::Stack< IndexT > parentIdx
Definition jsonreader.h:142
void Get(T &target, const char *attr=0)
generic getter for extension types
Util::String GetString(const char *attr=0) const
get string attribute value from current node
Definition jsonreader.cc:467
uint GetUInt(const char *attr=0) const
get unsigned int attribute value from current node
Definition jsonreader.cc:527
const pjson::value_variant * GetChild(const char *key=0) const
Definition jsonreader.cc:445
bool SetToNextChild()
set to next child, false if none exists
Definition jsonreader.cc:271
Math::vec3 GetVec3(const char *attr=0) const
get vec4 attribute value from current node
Definition jsonreader.cc:571
Util::String GetChildNodeName(SizeT childIndex)
gets the childname of the child at index, or empty string if no child exists or has no name.
Definition jsonreader.cc:318
bool HasAttr(const char *attr) const
return true if matching attribute exists on current node
Definition jsonreader.cc:401
const pjson::value_variant * curNode
Definition jsonreader.h:139
SizeT CurrentSize() const
children count
Definition jsonreader.cc:385
Math::mat4 GetMat4(const char *attr=0) const
get mat4 attribute value from current node
Definition jsonreader.cc:615
bool IsObject() const
check if current node is an object (can have keys)
Definition jsonreader.cc:362
Util::StringAtom GetStringAtom(const char *attr=0) const
get stringatom attribute value from current node
Definition jsonreader.cc:482
Math::mat4 GetOptMat4(const char *attr, const Math::mat4 &defaultValue) const
get optional mat4 attribute value from current node
Definition jsonreader.cc:768
IndexT childIdx
Definition jsonreader.h:140
char * buffer
Definition jsonreader.h:144
bool GetBool(const char *attr=0) const
get bool attribute value from current node
Definition jsonreader.cc:497
StreamReader()
constructor
Definition streamreader.cc:16
A 4x4 matrix which is described by translation, rotation and scale.
Definition transform44.h:20
Nebula's dynamic array class.
Definition array.h:61
const SizeT Size() const
get number of elements in array
Definition array.h:913
Implements large bit field.
Definition bitfield.h:24
constexpr void SetBit(const uint64_t bitIndex)
set a bit by index
Definition bitfield.h:245
A four-character-code is a quasi-human-readable 32-bit-id.
Definition fourcc.h:19
Nebula's stack class (a FILO container).
Definition stack.h:19
A StringAtom.
Definition stringatom.h:22
An "any type" variable.
Definition variant.h:32
#define n_assert(exp)
Definition debug.h:50
Instances of wrapped stream classes.
Definition multiplayerfeatureunit.cc:324
Definition jsonreader.h:26
Definition scalar.h:85
A 4x4 single point precision float matrix.
Definition mat4.h:49
A quaternion is usually used to represent an orientation in 3D space.
Definition quat.h:30
A 2-component float vector class.
Definition vec2.h:21
A 3D vector.
Definition vec3.h:37
A 4D vector.
Definition vec4.h:24
A vector is a 3D direction in space.
Definition vector.h:22
Nebula's universal string class.
Definition String.cs:8
int SizeT
Definition types.h:42
unsigned int uint
Definition types.h:33
int IndexT
Definition types.h:41