diff options
-rw-r--r-- | src/world.cpp | 25 | ||||
-rw-r--r-- | src/world.hpp | 27 |
2 files changed, 26 insertions, 26 deletions
diff --git a/src/world.cpp b/src/world.cpp index d1c5dd43..edab80b6 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -2,6 +2,8 @@ #include "chunk.hpp" #include "object.hpp" #include "critter.hpp" +#include "scenery.hpp" +#include "light.hpp" #include "compat/shared-ptr-wrapper.hpp" #include "compat/int-hash.hpp" #include "compat/exception.hpp" @@ -263,4 +265,27 @@ shared_ptr_wrapper<critter> world::ensure_player_character(object_id& id_, critt return ret; } +template<typename T> +std::shared_ptr<T> world::find_object(object_id id) +{ + static_assert(std::is_base_of_v<object, T>); + // make it a dependent name so that including "src/object.hpp" isn't needed + using U = std::conditional_t<std::is_same_v<T, object>, T, object>; + if (std::shared_ptr<U> ptr = find_object_(id); !ptr) + return {}; + else if constexpr(std::is_same_v<T, object>) + return ptr; + else + { + if (!(ptr->type() == object_type_<T>::value)) [[unlikely]] + throw_on_wrong_object_type(id, ptr->type(), object_type_<T>::value); + return static_pointer_cast<T>(move(ptr)); + } +} + +template std::shared_ptr<object> world::find_object(object_id id); +template std::shared_ptr<critter> world::find_object(object_id id); +template std::shared_ptr<scenery> world::find_object(object_id id); +template std::shared_ptr<light> world::find_object(object_id id); + } // namespace floormat diff --git a/src/world.hpp b/src/world.hpp index 0a15cb03..e805ae1f 100644 --- a/src/world.hpp +++ b/src/world.hpp @@ -44,6 +44,7 @@ private: explicit world(size_t capacity); + void do_make_object(const std::shared_ptr<object>& e, global_coords pos, bool sorted); // todo! replace 2nd arg with chunk& void do_kill_object(object_id id); std::shared_ptr<object> find_object_(object_id id); @@ -86,14 +87,6 @@ public: do_make_object(std::static_pointer_cast<object>(ret), pos, sorted); return ret; } - void do_make_object(const std::shared_ptr<object>& e, global_coords pos, bool sorted); // todo! replace 2nd arg with chunk& - -#if 0 - template<typename T, typename... Xs> std::shared_ptr<object> make_unconnected_object(Xs&&... xs) - { - return std::shared_ptr<T>(new T{0, operator[](chunk_coords_{}), {}, forward<Xs>(xs)...}); - } -#endif template<typename T = object> std::shared_ptr<T> find_object(object_id id); @@ -116,22 +109,4 @@ public: world(world&& w) noexcept; }; -template<typename T> -std::shared_ptr<T> world::find_object(object_id id) -{ - static_assert(std::is_base_of_v<object, T>); - // make it a dependent name so that including "src/object.hpp" isn't needed - using U = std::conditional_t<std::is_same_v<T, object>, T, object>; - if (std::shared_ptr<U> ptr = find_object_(id); !ptr) - return {}; - else if constexpr(std::is_same_v<T, object>) - return ptr; - else - { - if (!(ptr->type() == object_type_<T>::value)) [[unlikely]] - throw_on_wrong_object_type(id, ptr->type(), object_type_<T>::value); - return static_pointer_cast<T>(move(ptr)); - } -} - } // namespace floormat |