Implement iterator for SAJSON backend(W.I.P).
diff --git a/tiny_gltf.h b/tiny_gltf.h
index d7592e1..9f79989 100644
--- a/tiny_gltf.h
+++ b/tiny_gltf.h
@@ -1540,6 +1540,11 @@
#include "sajson.h"
+// Serialization is not available for sajson backend.
+#ifdef TINYGLTF_ENABLE_SERIALIZER
+#undef TINYGLTF_ENABLE_SERIALIZER
+#endif
+
#else
// Default = nlohmann json
@@ -1683,7 +1688,57 @@
#elif defined(TINYGLTF_USE_SAJSON)
using json = sajson::value;
-using JsonDocument = sajson::document;
+using JsonDocument = json;
+
+// TODO(syoyo): Implement
+// muda
+
+class sajson_const_iterator
+{
+ public:
+ sajson_const_iterator() = default;
+ sajson_const_iterator(const sajson::value &v) : _v(v) {
+ }
+
+ sajson_const_iterator(const sajson_const_iterator &rhs) = default;
+ sajson_const_iterator &operator=(const sajson_const_iterator &rhs) = default;
+
+ std::string key() const {
+ }
+
+ sajson::value &value() {
+ return _v;
+ }
+
+ sajson::value *begin() {
+ return &_v;
+ }
+
+ bool operator!=(sajson_const_iterator &rhs) {
+ // TODO
+ assert(0);
+ return false;
+ }
+
+ sajson_const_iterator &operator++() {
+ // TODO
+ assert(0);
+ return (*this);
+ }
+
+ sajson::value &operator*() {
+ return _v;
+ }
+
+ private:
+ // `sajson::value` itself is a small struct, so having a copy of it
+ // does not affect performance and memory consumption.
+ sajson::value _v;
+
+};
+
+using json_const_iterator = sajson_const_iterator;
+using json_const_array_iterator = json_const_iterator;
#else // nlohmann JSON
using nlohmann::json;
@@ -3034,10 +3089,13 @@
#endif
}
-#if !defined(TINYGLTF_USE_SAJSON)
json_const_array_iterator ArrayBegin(const json &o) {
#ifdef TINYGLTF_USE_RAPIDJSON
return o.Begin();
+#elif TINYGLTF_USE_SAJSON
+ // TODO(syoyo): Implement
+ assert(0);
+ return json_const_array_iterator(o);
#else
return o.begin();
#endif
@@ -3046,11 +3104,14 @@
json_const_array_iterator ArrayEnd(const json &o) {
#ifdef TINYGLTF_USE_RAPIDJSON
return o.End();
+#elif TINYGLTF_USE_SAJSON
+ // TODO(syoyo): Implement
+ assert(0);
+ return json_const_array_iterator(o);
#else
return o.end();
#endif
}
-#endif
bool IsObject(const json &o) {
#ifdef TINYGLTF_USE_RAPIDJSON
@@ -3062,10 +3123,14 @@
#endif
}
-#if !defined(TINYGLTF_USE_SAJSON)
json_const_iterator ObjectBegin(const json &o) {
#ifdef TINYGLTF_USE_RAPIDJSON
return o.MemberBegin();
+#elif defined(TINYGLTF_USE_SAJSON)
+ assert(o.get_type() == sajson::TYPE_OBJECT);
+ // TODO(syoyo): Implement
+ assert(0);
+ return json_const_iterator(o);
#else
return o.begin();
#endif
@@ -3074,16 +3139,23 @@
json_const_iterator ObjectEnd(const json &o) {
#ifdef TINYGLTF_USE_RAPIDJSON
return o.MemberEnd();
+#elif defined(TINYGLTF_USE_SAJSON)
+ assert(o.get_type() == sajson::TYPE_OBJECT);
+ // TODO(syoyo): Implement
+ assert(0);
+ return json_const_iterator(o);
#else
return o.end();
#endif
}
-#endif
-#if !defined(TINYGLTF_USE_SAJSON)
const char *GetKey(json_const_iterator &it) {
#ifdef TINYGLTF_USE_RAPIDJSON
return it->name.GetString();
+#elif defined(TINYGLTF_USE_SAJSON)
+ // TODO(syoyo): Implement
+ assert(0);
+ return nullptr;
#else
return it.key().c_str();
#endif
@@ -3096,6 +3168,10 @@
}
it = o.FindMember(member);
return it != o.MemberEnd();
+#elif defined(TINYGLTF_USE_SAJSON)
+ // TODO(syoyo): Implement
+ assert(0);
+ return false;
#else
it = o.find(member);
return it != o.end();
@@ -3105,11 +3181,14 @@
const json &GetValue(json_const_iterator &it) {
#ifdef TINYGLTF_USE_RAPIDJSON
return it->value;
+#elif defined(TINYGLTF_USE_SAJSON)
+ // TODO(syoyo): Implement
+ assert(0);
+ return it.value();
#else
return it.value();
#endif
}
-#endif
std::string JsonToString(const json &o, int spacing = -1) {
#ifdef TINYGLTF_USE_RAPIDJSON
@@ -3184,7 +3263,10 @@
break;
// all types are covered, so no `case default`
}
-#else
+#elif defined(TINYGLTF_USE_SAJSON)
+ // TODO
+ assert(0);
+#else // json.hpp
switch (o.type()) {
case json::value_t::object: {
Value::Object value_object;
@@ -3267,6 +3349,11 @@
if (isBoolean) {
boolValue = value.GetBool();
}
+#elif defined(TINYGLTF_USE_SAJSON)
+ isBoolean = value.is_boolean();
+ if (isBoolean) {
+ boolValue = value.get_boolean_value();
+ }
#else
isBoolean = value.is_boolean();
if (isBoolean) {
@@ -3356,6 +3443,11 @@
uValue = value.GetUint64();
isUValue = true;
}
+#elif defined(TINYGLTF_USE_SAJSON)
+ isUValue = value.get_type() == sajson::TYPE_INTEGER;
+ if (isUValue) {
+ uValue = value.get_integer_value();
+ }
#else
isUValue = value.is_number_unsigned();
if (isUValue) {
@@ -6134,10 +6226,13 @@
// 19. Parse Extras
ParseExtrasProperty(&model->extras, v);
+#if !defined(TINYGLTF_USE_SAJSON)
+ // TODO(syoyo): Support SAJSON backend
if (store_original_json_for_extras_and_extensions_) {
model->extras_json_string = JsonToString(v["extras"]);
model->extensions_json_string = JsonToString(v["extensions"]);
}
+#endif
return true;
}