diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index 3e4bacfc..ff77e76a 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -92,7 +92,7 @@ void ContentLoader::fixPackIndices() { if (fs::is_regular_file(indexFile)) { root = files::read_json(indexFile); } else { - root = std::make_shared(); + root = dynamic::create_map(); } bool modified = false; diff --git a/src/data/dynamic.cpp b/src/data/dynamic.cpp index 3649480b..228e044a 100644 --- a/src/data/dynamic.cpp +++ b/src/data/dynamic.cpp @@ -77,13 +77,13 @@ List& List::put(const Value& value) { } List& List::putList() { - auto arr = std::make_shared(); + auto arr = create_list(); put(arr); return *arr; } Map& List::putMap() { - auto map = std::make_shared(); + auto map = create_map(); put(map); return *map; } @@ -209,13 +209,13 @@ void Map::remove(const std::string& key) { } List& Map::putList(std::string key) { - auto arr = std::make_shared(); + auto arr = create_list(); put(key, arr); return *arr; } Map& Map::putMap(std::string key) { - auto obj = std::make_shared(); + auto obj = create_map(); put(key, obj); return *obj; } @@ -227,3 +227,11 @@ bool Map::has(const std::string& key) const { size_t Map::size() const { return values.size(); } + +List_sptr dynamic::create_list(std::initializer_list values) { + return std::make_shared(values); +} + +Map_sptr dynamic::create_map(std::initializer_list> entries) { + return std::make_shared(entries); +} diff --git a/src/data/dynamic.hpp b/src/data/dynamic.hpp index e1a019dd..3fa49d8b 100644 --- a/src/data/dynamic.hpp +++ b/src/data/dynamic.hpp @@ -35,10 +35,16 @@ namespace dynamic { integer_t >; + List_sptr create_list(std::initializer_list values={}); + Map_sptr create_map(std::initializer_list> entries={}); + class List { public: std::vector values; + List() {} + List(std::vector values) : values(std::move(values)) {} + std::string str(size_t index) const; number_t num(size_t index) const; integer_t integer(size_t index) const; @@ -74,6 +80,10 @@ namespace dynamic { public: std::unordered_map values; + Map() {} + Map(std::unordered_map values) + : values(std::move(values)) {}; + template T get(const std::string& key) const { if (!has(key)) { diff --git a/src/frontend/menu.cpp b/src/frontend/menu.cpp index 3796f88c..06b805c2 100644 --- a/src/frontend/menu.cpp +++ b/src/frontend/menu.cpp @@ -45,7 +45,7 @@ gui::page_loader_func menus::create_page_loader(Engine* engine) { auto argstr = query.substr(index+1); name = query.substr(0, index); - auto map = std::make_shared(); + auto map = create_map(); auto filename = "query for "+name; BasicParser parser(filename, argstr); while (parser.hasNext()) { diff --git a/src/logic/EngineController.cpp b/src/logic/EngineController.cpp index 6681942a..20776f0a 100644 --- a/src/logic/EngineController.cpp +++ b/src/logic/EngineController.cpp @@ -72,7 +72,7 @@ static void show_content_missing( std::shared_ptr lut ) { using namespace dynamic; - auto root = std::make_shared(); + auto root = create_map(); auto& contentEntries = root->putList("content"); for (auto& entry : lut->getMissingContent()) { std::string contentName = contenttype_name(entry.type); diff --git a/src/logic/scripting/lua/LuaState.cpp b/src/logic/scripting/lua/LuaState.cpp index df24d65c..d35120a5 100644 --- a/src/logic/scripting/lua/LuaState.cpp +++ b/src/logic/scripting/lua/LuaState.cpp @@ -327,7 +327,7 @@ dynamic::Value lua::LuaState::tovalue(int idx) { int len = lua_objlen(L, idx); if (len) { // array - auto list = std::make_shared(); + auto list = create_list(); for (int i = 1; i <= len; i++) { lua_rawgeti(L, idx, i); list->put(tovalue(-1)); @@ -336,7 +336,7 @@ dynamic::Value lua::LuaState::tovalue(int idx) { return list; } else { // table - auto map = std::make_shared(); + auto map = create_map(); lua_pushvalue(L, idx); lua_pushnil(L); while (lua_next(L, -2)) {