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
24namespace pjson
25{
26 class value_variant;
27 class document;
28}
29//------------------------------------------------------------------------------
30namespace IO
31{
33{
35public:
37 JsonReader();
39 virtual ~JsonReader();
40
42 virtual bool Open();
44 virtual void Close();
45
47 bool HasNode(const Util::String& path);
48
50 void SetToRoot();
52 bool SetToNode(const Util::String& path);
53
55 bool SetToFirstChild(const Util::String& name = "");
57 bool SetToNextChild();
59 bool SetToParent();
60
63
65 bool IsArray() const;
67 bool IsObject() const;
69 bool HasChildren() const;
71 SizeT CurrentSize() const;
73 bool HasAttr(const char* attr) const;
76
79
81 Util::String GetString(const char* attr = 0) const;
83 Util::StringAtom GetStringAtom(const char* attr = 0) const;
85 bool GetBool(const char* attr = 0) const;
87 int GetInt(const char* attr = 0) const;
89 uint GetUInt(const char* attr = 0) const;
91 float GetFloat(const char* attr = 0) const;
93 Math::vec2 GetVec2(const char* attr = 0) const;
95 Math::vec3 GetVec3(const char* attr = 0) const;
97 Math::vec4 GetVec4(const char* attr = 0) const;
99 Math::mat4 GetMat4(const char* attr = 0) const;
101 Math::transform44 GetTransform44(const char* attr = 0) const;
103 template<typename T> void Get(T& target, const char* attr = 0);
105 template<unsigned int N> void Get(Util::BitField<N>& target, const char* attr = 0);
106
108 Util::String GetOptString(const char* attr, const Util::String& defaultValue) const;
110 bool GetOptBool(const char* attr, bool defaultValue) const;
112 int GetOptInt(const char* attr, int defaultValue) const;
114 float GetOptFloat(const char* attr, float defaultValue) const;
116 Math::vec2 GetOptVec2(const char* attr, const Math::vec2& defaultValue) const;
118 Math::vec4 GetOptVec4(const char* attr, const Math::vec4& defaultValue) const;
120 Math::mat4 GetOptMat4(const char* attr, const Math::mat4& defaultValue) const;
122 Math::transform44 GetOptTransform44(const char* attr, const Math::transform44& defaultValue) const;
123
125 template<typename T> bool GetOpt(T& target, const char* attr = 0);
127 template<typename T> bool GetOpt(T& target, const char* attr, const T& _default);
128
129private:
131 const pjson::value_variant* GetChild(const char * key = 0) const;
132
133 pjson::document* document;
134 const pjson::value_variant* curNode;
138 // 0 terminated buffer containing the raw json file
139 char * buffer = nullptr;
140};
141
142template<> void JsonReader::Get<bool>(bool& ret, const char* attr);
143template<> void JsonReader::Get<Util::Array<uint32_t>>(Util::Array<uint32_t>& ret, const char* attr);
144template<> void JsonReader::Get<Util::Array<int>>(Util::Array<int>& ret, const char* attr);
145template<> void JsonReader::Get<int64_t>(int64_t& ret, const char* attr);
146template<> void JsonReader::Get<int32_t>(int32_t& ret, const char* attr);
147template<> void JsonReader::Get<int16_t>(int16_t& ret, const char* attr);
148template<> void JsonReader::Get<int8_t>(int8_t& ret, const char* attr);
149template<> void JsonReader::Get<char>(char& ret, const char* attr);
150template<> void JsonReader::Get<Math::mat4>(Math::mat4& ret, const char* attr);
151template<> void JsonReader::Get<Math::int2>(Math::int2& ret, const char* attr);
152template<> void JsonReader::Get<Math::vector>(Math::vector& ret, const char* attr);
153template<> void JsonReader::Get<Math::vec4>(Math::vec4& ret, const char* attr);
154template<> void JsonReader::Get<Math::vec3>(Math::vec3& ret, const char* attr);
155template<> void JsonReader::Get<Math::vec2>(Math::vec2& ret, const char* attr);
156template<> void JsonReader::Get<uint32_t>(uint32_t& ret, const char* attr);
157template<> void JsonReader::Get<uint16_t>(uint16_t& ret, const char* attr);
158template<> void JsonReader::Get<uint8_t>(uint8_t& ret, const char* attr);
159template<> void JsonReader::Get<float>(float& ret, const char* attr);
160template<> void JsonReader::Get<double>(double& ret, const char* attr);
161template<> void JsonReader::Get<Util::Variant>(Util::Variant& ret, const char* attr);
162template<> void JsonReader::Get<Util::String>(Util::String& ret, const char* attr);
163template<> void JsonReader::Get<Util::FourCC>(Util::FourCC& ret, const char* attr);
164template<> void JsonReader::Get<Util::StringAtom>(Util::StringAtom& ret, const char* attr);
165template<> void JsonReader::Get<Util::Array<float>>(Util::Array<float>& ret, const char* attr);
166template<> void JsonReader::Get<Util::Array<Util::String>>(Util::Array<Util::String>& ret, const char* attr);
167template<> bool JsonReader::GetOpt<bool>(bool& ret, const char* attr);
168template<> bool JsonReader::GetOpt<int>(int& ret, const char* attr);
169template<> bool JsonReader::GetOpt<uint16_t>(uint16_t& ret, const char* attr);
170template<> bool JsonReader::GetOpt<uint32_t>(uint32_t& ret, const char* attr);
171template<> bool JsonReader::GetOpt<float>(float& ret, const char* attr);
172template<> bool JsonReader::GetOpt<double>(double& ret, const char* attr);
173template<> bool JsonReader::GetOpt<Math::vec4>(Math::vec4& ret, const char* attr);
174template<> bool JsonReader::GetOpt<Math::quat>(Math::quat& ret, const char* attr);
175template<> bool JsonReader::GetOpt<Math::mat4>(Math::mat4& ret, const char* attr);
176template<> bool JsonReader::GetOpt<Util::String>(Util::String& ret, const char* attr);
177template<> bool JsonReader::GetOpt<Util::Array<int>>(Util::Array<int>& target, const char* attr);
178template<> bool JsonReader::GetOpt<Util::Array<uint32_t>>(Util::Array<uint32_t>& target, const char* attr);
179template<> bool JsonReader::GetOpt<Util::Array<float>>(Util::Array<float>& target, const char* attr);
180template<> bool JsonReader::GetOpt<Util::Array<Util::String>>(Util::Array<Util::String>& target, const char* attr);
181
182//------------------------------------------------------------------------------
185template<typename T>
186inline bool
187JsonReader::GetOpt(T& target, const char* attr)
188{
189 if (this->HasAttr(attr))
190 {
191 this->Get(target, attr);
192 return true;
193 }
194 return false;
195}
196
197//------------------------------------------------------------------------------
200template<typename T>
201inline bool
202JsonReader::GetOpt(T& target, const char* attr, const T& defaultVal)
203{
204 if (!this->GetOpt<T>(target, attr))
205 {
206 target = defaultVal;
207 return false;
208 }
209 return true;
210}
211
212//------------------------------------------------------------------------------
215template<unsigned int N>
216inline void
217JsonReader::Get(Util::BitField<N>& ret, const char* attr)
218{
220 this->Get<Util::Array<int>>(arr);
221
222 unsigned int count = arr.Size();
223 n_assert(count <= N);
224 for (unsigned int i = 0; i < count; i++)
225 {
226 ret.SetBit(arr[i]);
227 }
228}
229
230} // namespace IO
231//------------------------------------------------------------------------------
bool GetOptBool(const char *attr, bool defaultValue) const
get optional bool attribute value from current node
Definition jsonreader.cc:665
float GetFloat(const char *attr=0) const
get float attribute value from current node
Definition jsonreader.cc:529
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:337
Util::Stack< const pjson::value_variant * > parents
Definition jsonreader.h:136
virtual void Close()
end reading from the stream
Definition jsonreader.cc:95
Util::String GetCurrentNodeName() const
get name of current node
Definition jsonreader.cc:419
Math::vec4 GetVec4(const char *attr=0) const
get vec4 attribute value from current node
Definition jsonreader.cc:580
__DeclareClass(JsonReader)
bool GetOpt(T &target, const char *attr=0)
generic getter for optional items
Definition jsonreader.h:187
pjson::document * document
Definition jsonreader.h:133
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:737
float GetOptFloat(const char *attr, float defaultValue) const
get optional float attribute value from current node
Definition jsonreader.cc:701
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:499
Math::transform44 GetTransform44(const char *attr=0) const
get transform44 attribute value from current node
Definition jsonreader.cc:624
bool HasChildren() const
check if current node has children (json object or array)
Definition jsonreader.cc:360
virtual ~JsonReader()
destructor
Definition jsonreader.cc:37
Util::Array< Util::String > GetAttrs() const
return names of all attrs on current node
Definition jsonreader.cc:402
int GetOptInt(const char *attr, int defaultValue) const
get optional int attribute value from current node
Definition jsonreader.cc:683
Math::transform44 GetOptTransform44(const char *attr, const Math::transform44 &defaultValue) const
get transform44 attribute value from current node
Definition jsonreader.cc:773
Math::vec2 GetVec2(const char *attr=0) const
get vec2 attribute value from current node
Definition jsonreader.cc:545
Util::String GetOptString(const char *attr, const Util::String &defaultValue) const
get optional string attribute value from current node
Definition jsonreader.cc:647
Math::vec2 GetOptVec2(const char *attr, const Math::vec2 &defaultValue) const
get vec2 attribute value from current node
Definition jsonreader.cc:719
Util::Stack< IndexT > parentIdx
Definition jsonreader.h:137
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:454
uint GetUInt(const char *attr=0) const
get unsigned int attribute value from current node
Definition jsonreader.cc:514
const pjson::value_variant * GetChild(const char *key=0) const
Definition jsonreader.cc:432
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:558
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:388
const pjson::value_variant * curNode
Definition jsonreader.h:134
SizeT CurrentSize() const
children count
Definition jsonreader.cc:372
Math::mat4 GetMat4(const char *attr=0) const
get mat4 attribute value from current node
Definition jsonreader.cc:602
bool IsObject() const
check if current node is an object (can have keys)
Definition jsonreader.cc:349
Util::StringAtom GetStringAtom(const char *attr=0) const
get stringatom attribute value from current node
Definition jsonreader.cc:469
Math::mat4 GetOptMat4(const char *attr, const Math::mat4 &defaultValue) const
get optional mat4 attribute value from current node
Definition jsonreader.cc:755
IndexT childIdx
Definition jsonreader.h:135
char * buffer
Definition jsonreader.h:139
bool GetBool(const char *attr=0) const
get bool attribute value from current node
Definition jsonreader.cc:484
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:60
const SizeT Size() const
get number of elements in array
Definition array.h:880
Implements large bit field.
Definition bitfield.h:24
constexpr void SetBit(const uint64_t bitIndex)
set a bit by index
Definition bitfield.h:215
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:31
#define n_assert(exp)
Definition debug.h:50
Instances of wrapped stream classes.
Definition multiplayerfeatureunit.cc:289
Definition jsonreader.h:25
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