From 137522cefa6057ac3a212240911fe01cc00671c5 Mon Sep 17 00:00:00 2001 From: Jiga228 Date: Fri, 17 Oct 2025 21:39:30 +0700 Subject: [PATCH] Move to object_ptr --- Core/Game/Actors/Actor.cpp | 16 ++++++++-------- Core/Game/Actors/Actor.hpp | 9 ++++----- Core/Game/SaveMap/SaveMap.cpp | 26 +++++++++++++------------- Core/Game/SaveMap/SaveMap.hpp | 19 ++++++++++--------- Core/Game/World/World.cpp | 6 ++---- Core/Game/World/World.hpp | 5 +++-- Core/Types/object_ptr.hpp | 13 ++++++++++++- Tests/SaveMapTest.cpp | 12 ++++++------ 8 files changed, 58 insertions(+), 48 deletions(-) diff --git a/Core/Game/Actors/Actor.cpp b/Core/Game/Actors/Actor.cpp index dce154a..8269f6e 100644 --- a/Core/Game/Actors/Actor.cpp +++ b/Core/Game/Actors/Actor.cpp @@ -16,17 +16,17 @@ Actor::Actor() std::shared_ptr Actor::save() { return std::make_shared("Actor") - ->SaveObject("loc", &loc) - ->SaveObject("rot", &rot) - ->SaveObject("scale", &scale) + ->SaveObject("loc", static_cast>(loc)) + ->SaveObject("rot", static_cast>(rot)) + ->SaveObject("scale", UType::object_ptr(scale)) ->SaveListStrings("tags", std::move(tags)); } void Actor::load(std::shared_ptr save) { - loc = *reinterpret_cast(save->GetObject("loc")); - rot = *reinterpret_cast(save->GetObject("rot")); - scale = *reinterpret_cast(save->GetObject("scale")); + loc = static_cast>(save->GetObject("loc")); + rot = static_cast>(save->GetObject("rot")); + scale = static_cast>(save->GetObject("scale")); tags = std::move(save->GetListString("tags")); } @@ -41,13 +41,13 @@ void Actor::Tick(double delta_time) void Actor::SetActorLocate(const Vector3D& loc) noexcept { - this->loc = loc; + *this->loc = loc; OnSetActorLocate.Call(loc); } void Actor::SetActorRotate(const Vector3D& rot) noexcept { - this->rot = rot; + *this->rot = rot; OnSetActorRotate.Call(rot); } diff --git a/Core/Game/Actors/Actor.hpp b/Core/Game/Actors/Actor.hpp index 5901a48..bf93162 100644 --- a/Core/Game/Actors/Actor.hpp +++ b/Core/Game/Actors/Actor.hpp @@ -7,6 +7,7 @@ #include "Game/SaveMap/ISave.h" #include "Delegate/Delegate.h" #include "Math/Vector.hpp" +#include "Types/object_ptr.hpp" class World; GENERATE_META(Actor) @@ -15,9 +16,7 @@ class Actor : public ISave, public IRTTI { World* world_; - Vector3D loc; - Vector3D rot; - Vector3D scale; + UType::object_ptr loc, rot, scale; std::list tags; @@ -42,14 +41,14 @@ public: * Вызывает делегат OnSetActorLocate */ void SetActorLocate(const Vector3D& loc) noexcept; - inline const Vector3D& GetActorLocate() const { return loc; } + inline const UType::object_ptr GetActorLocate() const { return loc; } /* * Изменяет ориентацию в пространстве * Вызывает делегат OnSetActorRotate */ void SetActorRotate(const Vector3D& rot) noexcept; - inline const Vector3D& GetActorRotate() const { return rot; } + inline const UType::object_ptr GetActorRotate() const { return rot; } void AddTag(const std::string& tag) noexcept; void RemoveTag(const std::string& tag) noexcept; diff --git a/Core/Game/SaveMap/SaveMap.cpp b/Core/Game/SaveMap/SaveMap.cpp index 17a8c6c..dc148f1 100644 --- a/Core/Game/SaveMap/SaveMap.cpp +++ b/Core/Game/SaveMap/SaveMap.cpp @@ -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); - ISave* object_ptr = MakeObjectByName(object_name); + UType::object_ptr 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); - ISave* object_ptr = MakeObjectByName(object_name); + UType::object_ptr 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); - ISave* object_ptr = MakeObjectByName(object_name); + UType::object_ptr 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, ISave* object) noexcept +std::shared_ptr SaveMap::SaveObject(const char* name, UType::object_ptr 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]; } -ISave* SaveMap::GetObject(const char* name) +UType::object_ptr 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 efebe20..d3d2549 100644 --- a/Core/Game/SaveMap/SaveMap.hpp +++ b/Core/Game/SaveMap/SaveMap.hpp @@ -1,6 +1,7 @@ #pragma once #include "ISave.h" +#include "Types/object_ptr.hpp" #include #include @@ -17,18 +18,18 @@ 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 ISave* MakeObjectByName(const std::string& name); @@ -47,29 +48,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, ISave* object) noexcept; + std::shared_ptr SaveObject(const char* name, UType::object_ptr 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); - ISave* GetObject(const char* name); + UType::object_ptr 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/Core/Game/World/World.cpp b/Core/Game/World/World.cpp index b14731b..09482dd 100644 --- a/Core/Game/World/World.cpp +++ b/Core/Game/World/World.cpp @@ -8,8 +8,6 @@ World::World(GameInstance& game_instance) : game_instance(game_instance) World::~World() { - for (auto& actor : actors) - delete actor; actors.clear(); } @@ -28,13 +26,13 @@ void World::Tick(double delta_time) std::shared_ptr World::save() { std::shared_ptr save = std::make_shared("World"); - save->SaveListObject("Actors", std::move(reinterpret_cast&>(actors))); + save->SaveListObject("Actors", std::move(reinterpret_cast>&>(actors))); return save; } void World::load(std::shared_ptr save) { - actors = std::move(reinterpret_cast&>(save->GetListObject("Actors"))); + actors = std::move(reinterpret_cast>&>(save->GetListObject("Actors"))); for (auto& i : actors) i->world_ = this; diff --git a/Core/Game/World/World.hpp b/Core/Game/World/World.hpp index df899e8..f936e07 100644 --- a/Core/Game/World/World.hpp +++ b/Core/Game/World/World.hpp @@ -7,6 +7,7 @@ #include "RTTI.h" #include "Game/Actors/Actor.hpp" #include "Game/Actors/Mesh/Mesh.hpp" +#include "Types/object_ptr.hpp" class GameInstance; @@ -16,7 +17,7 @@ class World : public ISave GameInstance& game_instance; // Actors only - std::list actors; + std::list> actors; public: World(GameInstance& game_instance); @@ -38,7 +39,7 @@ public: Container list; for (auto i = actors.cbegin(); i != actors.cend(); ++i) { - if (T* cast_object = RTTI::dyn_cast(*i)) + if (T* cast_object = RTTI::dyn_cast((*i).get())) list.push_back(cast_object); } return list; diff --git a/Core/Types/object_ptr.hpp b/Core/Types/object_ptr.hpp index 1e144b5..3b8414b 100644 --- a/Core/Types/object_ptr.hpp +++ b/Core/Types/object_ptr.hpp @@ -111,7 +111,7 @@ static void add_owner(object_ptr& ptr) { std::atomic ptr_; public: - object_ptr(Ty* ptr = nullptr) + explicit object_ptr(Ty* ptr = nullptr) { ptr_.store(ptr); if (ptr) counter::add_owner(*this); @@ -158,6 +158,17 @@ static void add_owner(object_ptr& ptr) Ty& operator*() const noexcept { return *ptr_; } Ty* operator->() const noexcept { return ptr_.load(); } operator bool() const noexcept { return ptr_.load() != nullptr; } + object_ptr& operator=(const object_ptr& ptr) + { + reset(ptr); + return *this; + } + + template + explicit operator object_ptr() const noexcept + { + return object_ptr(reinterpret_cast(ptr_.load())); + } friend class counter; }; diff --git a/Tests/SaveMapTest.cpp b/Tests/SaveMapTest.cpp index 29fa958..a69874b 100644 --- a/Tests/SaveMapTest.cpp +++ b/Tests/SaveMapTest.cpp @@ -17,7 +17,7 @@ public: } void load(std::shared_ptr save) override { - num = save->GetInteger("num"); + num = static_cast(save->GetInteger("num")); str = save->GetString("str"); dbl = save->GetDouble("dbl"); } @@ -158,14 +158,14 @@ TEST(SaveMapTest, check_load_with_custom_type) EXPECT_EQ(test_vector_string[i], save_map.GetVectorString("TestVectorString")[i]); } - CustomObject* obj = reinterpret_cast(save_map.GetObject("CustomObject")); + UType::object_ptr obj = static_cast>(save_map.GetObject("CustomObject")); CustomObject test_obj; test_obj.num = 123; test_obj.str = "str123"; test_obj.dbl = 123.45; - EXPECT_EQ(*obj, test_obj); + EXPECT_EQ(*obj.get(), 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, @@ -178,8 +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], *vec_obj_test[i]); - delete vec_obj[i]; + EXPECT_EQ(*vec_obj[i].get(), *vec_obj_test[i]); + vec_obj[i].destroy(); delete vec_obj_test[i]; } } \ No newline at end of file