diff --git a/Core/Game/SaveMap/SaveMap.cpp b/Core/Game/SaveMap/SaveMap.cpp index 01a6301..17a8c6c 100644 --- a/Core/Game/SaveMap/SaveMap.cpp +++ b/Core/Game/SaveMap/SaveMap.cpp @@ -7,18 +7,18 @@ extern std::vector factories; extern std::vector base_object_factories; -std::shared_ptr SaveMap::MakeObjectByName(const std::string& name) +ISave* SaveMap::MakeObjectByName(const std::string& name) { for (ObjectFactory& factory : base_object_factories) { if (name == factory.name) { - return std::shared_ptr(factory.factory()); + return factory.factory(); } } for (ObjectFactory& factory : factories) { if (name == factory.name) { - return std::shared_ptr(factory.factory()); + return factory.factory(); } } throw std::runtime_error("Object not found"); @@ -95,7 +95,7 @@ SaveMap::SaveMap(const std::string& json_data) end = object_json.find('\"', begin); std::string object_name = object_json.substr(begin, end - begin); - std::shared_ptr object_ptr = MakeObjectByName(object_name); + ISave* object_ptr = MakeObjectByName(object_name); object_ptr->load(std::make_shared(object_json)); save_objects[name.c_str() + 1] = object_ptr; @@ -169,10 +169,10 @@ SaveMap::SaveMap(const std::string& json_data) } } else if (name[1] == 'o') { - save_vector_objects[key] = std::vector>(); + save_vector_objects[key] = std::vector(); if (arr_data.length() == 2) continue; - std::vector>& vector_object = save_vector_objects[key]; + std::vector& vector_object = save_vector_objects[key]; size_t j = 1; while (j < arr_data.length()) @@ -196,7 +196,7 @@ SaveMap::SaveMap(const std::string& json_data) size_t end_name = object_json.find('\"', begin_name); std::string object_name = object_json.substr(begin_name, end_name - begin_name); - std::shared_ptr object_ptr = MakeObjectByName(object_name); + ISave* object_ptr = MakeObjectByName(object_name); object_ptr->load(std::make_shared(object_json)); vector_object.push_back(object_ptr); @@ -270,10 +270,10 @@ SaveMap::SaveMap(const std::string& json_data) } } else if (name[1] == 'o') { - save_list_objects[key] = std::list>(); + save_list_objects[key] = std::list(); if (arr_data.length() == 2) continue; - std::list>& list_object = save_list_objects[key]; + std::list& list_object = save_list_objects[key]; size_t j = 1; while (j < arr_data.length()) @@ -297,7 +297,7 @@ SaveMap::SaveMap(const std::string& json_data) size_t end_name = object_json.find('\"', begin_name); std::string object_name = object_json.substr(begin_name, end_name - begin_name); - std::shared_ptr object_ptr = MakeObjectByName(object_name); + ISave* object_ptr = MakeObjectByName(object_name); object_ptr->load(std::make_shared(object_json)); list_object.push_back(object_ptr); @@ -387,7 +387,7 @@ std::shared_ptr SaveMap::SaveString(const char* name, const std::string return std::shared_ptr(this); } -std::shared_ptr SaveMap::SaveObject(const char* name, std::shared_ptr object) noexcept +std::shared_ptr SaveMap::SaveObject(const char* name, ISave* object) noexcept { save_objects[name] = object; return std::shared_ptr(this); @@ -411,7 +411,7 @@ std::shared_ptr SaveMap::SaveVectorStrings(const char* name, std::vecto return std::shared_ptr(this); } -std::shared_ptr SaveMap::SaveVectorObject(const char* name, std::vector>&& value) noexcept +std::shared_ptr SaveMap::SaveVectorObject(const char* name, std::vector&& value) noexcept { save_vector_objects[name] = std::move(value); return std::shared_ptr(this); @@ -435,7 +435,7 @@ std::shared_ptr SaveMap::SaveListStrings(const char* name, std::list(this); } -std::shared_ptr SaveMap::SaveListObject(const char* name, std::list>&& value) noexcept +std::shared_ptr SaveMap::SaveListObject(const char* name, std::list&& value) noexcept { save_list_objects[name] = std::move(value); return std::shared_ptr(this); @@ -456,7 +456,7 @@ std::string SaveMap::GetString(const char* name) return save_string[name]; } -std::shared_ptr& SaveMap::GetObject(const char* name) +ISave* SaveMap::GetObject(const char* name) { return save_objects[name]; } @@ -476,7 +476,7 @@ std::vector SaveMap::GetVectorString(const char* name) return save_vector_strings[name]; } -std::vector>& SaveMap::GetVectorObject(const char* name) +std::vector& SaveMap::GetVectorObject(const char* name) { return save_vector_objects[name]; } @@ -496,7 +496,7 @@ std::list& SaveMap::GetListString(const char* name) return save_list_strings[name]; } -std::list>& SaveMap::GetListObject(const char* name) +std::list& SaveMap::GetListObject(const char* name) { return save_list_objects[name]; } diff --git a/Core/Game/SaveMap/SaveMap.hpp b/Core/Game/SaveMap/SaveMap.hpp index 0649c7e..efebe20 100644 --- a/Core/Game/SaveMap/SaveMap.hpp +++ b/Core/Game/SaveMap/SaveMap.hpp @@ -17,21 +17,21 @@ class SaveMap final std::unordered_map save_long; std::unordered_map save_double; std::unordered_map save_string; - std::unordered_map> save_objects; + std::unordered_map save_objects; // Массивы std::unordered_map> save_vector_integer; std::unordered_map> save_vector_double; - std::unordered_map>> save_vector_objects; + std::unordered_map> save_vector_objects; std::unordered_map> save_vector_strings; // Связаные списки std::unordered_map> save_list_integer; std::unordered_map> save_list_double; - std::unordered_map>> save_list_objects; + std::unordered_map> save_list_objects; std::unordered_map> save_list_strings; - static std::shared_ptr MakeObjectByName(const std::string& name); + static ISave* MakeObjectByName(const std::string& name); public: // Создаёт пустой объект для заполнения @@ -47,29 +47,29 @@ public: std::shared_ptr SaveInteger(const char* name, int value) noexcept; std::shared_ptr SaveDouble(const char* name, double value) noexcept; std::shared_ptr SaveString(const char* name, const std::string& value) noexcept; - std::shared_ptr SaveObject(const char* name, std::shared_ptr object) noexcept; + std::shared_ptr SaveObject(const char* name, ISave* object) noexcept; std::shared_ptr SaveVectorInteger(const char* name, std::vector&& value) noexcept; std::shared_ptr SaveVectorDouble(const char* name, std::vector&& value) noexcept; std::shared_ptr SaveVectorStrings(const char* name, std::vector&& value) noexcept; - std::shared_ptr SaveVectorObject(const char* name, std::vector>&& value) noexcept; + std::shared_ptr SaveVectorObject(const char* name, std::vector&& value) noexcept; std::shared_ptr SaveListInteger(const char* name, std::list&& value) noexcept; std::shared_ptr SaveListDouble(const char* name, std::list&& value) noexcept; std::shared_ptr SaveListStrings(const char* name, std::list&& value) noexcept; - std::shared_ptr SaveListObject(const char* name, std::list>&& value) noexcept; + std::shared_ptr SaveListObject(const char* name, std::list&& value) noexcept; // Методы получения значенй long long GetInteger(const char* name); double GetDouble(const char* name); std::string GetString(const char* name); - std::shared_ptr& GetObject(const char* name); + ISave* GetObject(const char* name); std::vector& GetVectorInteger(const char* name); std::vector& GetVectorDouble(const char* name); std::vector GetVectorString(const char* name); - std::vector>& GetVectorObject(const char* name); + std::vector& GetVectorObject(const char* name); std::list& GetListInteger(const char* name); std::list& GetListDouble(const char* name); std::list& GetListString(const char* name); - std::list>& GetListObject(const char* name); + std::list& GetListObject(const char* name); std::shared_ptr getParent() const { return parent_; } const std::string& getClassName() const { return class_name; } diff --git a/Tests/SaveMapTest.cpp b/Tests/SaveMapTest.cpp index acc2391..29fa958 100644 --- a/Tests/SaveMapTest.cpp +++ b/Tests/SaveMapTest.cpp @@ -17,7 +17,7 @@ public: } void load(std::shared_ptr save) override { - num = static_cast(save->GetInteger("num")); + num = save->GetInteger("num"); str = save->GetString("str"); dbl = save->GetDouble("dbl"); } @@ -99,6 +99,24 @@ TEST(SaveMapTest, check_load_with_custom_type) std::string json = "{\n" "\t\"Class name\": \"test class\",\n" + "\t\"iTestInt\": 123,\n" + "\t\"dTestDouble\": 123.56,\n" + "\t\"sTestString\": \"string str\",\n" + "\t\"viTestVectorInt\": [\n" + "\t\t1,\n" + "\t\t2,\n" + "\t\t3\n" + "\t],\n" + "\t\"vdTestVectorDouble\": [\n" + "\t\t1.2,\n" + "\t\t3.4,\n" + "\t\t5.6\n" + "\t],\n" + "\t\t\"vsTestVectorString\": [\n" + "\t\t\"str 1\",\n" + "\t\t\"2 str\",\n" + "\t\t\"str 3 str\"\n" + "\t],\n" "\t\"oCustomObject\": {\n" "\t\t\"Class name\": \"CustomObject\",\n" "\t\t\"inum\": 123,\n" @@ -120,17 +138,34 @@ TEST(SaveMapTest, check_load_with_custom_type) "}" "]" "}"; - SaveMap save_map(json); - - std::shared_ptr obj = reinterpret_cast&>(save_map.GetObject("CustomObject")); + std::vector test_vector_int = { 1, 2, 3 }; + std::vector test_vector_double = { 1.2, 3.4, 5.6 }; + std::vector test_vector_string = { "str 1", "2 str", "str 3 str" }; + SaveMap save_map(json); + + EXPECT_EQ(save_map.GetInteger("TestInt"), 123); + EXPECT_EQ(save_map.GetDouble("TestDouble"), 123.56); + EXPECT_EQ(save_map.GetString("TestString"), "string str"); + + EXPECT_EQ(save_map.GetVectorInteger("TestVectorInt").size(), 3); + EXPECT_EQ(save_map.GetVectorDouble("TestVectorDouble").size(), 3); + EXPECT_EQ(save_map.GetVectorString("TestVectorString").size(), 3); + for (auto i = 0; i < 3; i++) + { + EXPECT_EQ(test_vector_int[i], save_map.GetVectorInteger("TestVectorInt")[i]); + EXPECT_EQ(test_vector_double[i], save_map.GetVectorDouble("TestVectorDouble")[i]); + EXPECT_EQ(test_vector_string[i], save_map.GetVectorString("TestVectorString")[i]); + } + + CustomObject* obj = reinterpret_cast(save_map.GetObject("CustomObject")); CustomObject test_obj; test_obj.num = 123; test_obj.str = "str123"; test_obj.dbl = 123.45; - EXPECT_EQ(*obj.get(), test_obj); + EXPECT_EQ(*obj, test_obj); - std::vector> vec_obj = reinterpret_cast>&>(save_map.GetVectorObject("CustomObjects")); + std::vector vec_obj = reinterpret_cast&>(save_map.GetVectorObject("CustomObjects")); std::vector vec_obj_test = { new CustomObject, new CustomObject, @@ -143,6 +178,8 @@ TEST(SaveMapTest, check_load_with_custom_type) vec_obj_test[1]->dbl = 543.21; for (auto i = 0; i < 2; i++) { - EXPECT_EQ(*vec_obj[i].get(), *vec_obj_test[i]); + EXPECT_EQ(*vec_obj[i], *vec_obj_test[i]); + delete vec_obj[i]; + delete vec_obj_test[i]; } } \ No newline at end of file