IdManager fix

This commit is contained in:
Nekotekina 2017-01-31 15:57:32 +03:00
parent 35b7cf4c98
commit 6433eebe1e

View file

@ -275,11 +275,13 @@ class idm
return nullptr; return nullptr;
} }
if (const auto ptr = &vec[index]) auto& data = vec[index];
if (data.second)
{ {
if (std::is_same<T, Type>::value || ptr->first.type() == get_type<Type>()) if (std::is_same<T, Type>::value || data.first.type() == get_type<Type>())
{ {
return ptr; return &data;
} }
} }
@ -305,7 +307,11 @@ class idm
{ {
// Get object, store it // Get object, store it
place->second = provider(); place->second = provider();
return place;
if (place->second)
{
return place;
}
} }
return nullptr; return nullptr;
@ -365,15 +371,15 @@ public:
// Add a new ID for an object returned by provider() // Add a new ID for an object returned by provider()
template <typename T, typename Made = T, typename F, typename = std::result_of_t<F()>> template <typename T, typename Made = T, typename F, typename = std::result_of_t<F()>>
static inline std::shared_ptr<Made> import(F&& provider) static inline u32 import(F&& provider)
{ {
if (auto pair = create_id<T, Made>(std::forward<F>(provider))) if (auto pair = create_id<T, Made>(std::forward<F>(provider)))
{ {
id_manager::on_init<Made>::func(static_cast<Made*>(pair->second.get()), pair->second); id_manager::on_init<Made>::func(static_cast<Made*>(pair->second.get()), pair->second);
return {pair->second, static_cast<Made*>(pair->second.get())}; return pair->first;
} }
return nullptr; return id_manager::id_traits<Made>::invalid;
} }
// Check the ID // Check the ID
@ -386,7 +392,7 @@ public:
} }
// Check the ID, access object under shared lock // Check the ID, access object under shared lock
template <typename T, typename Get = T, typename F, typename FRT = std::result_of_t<F(T&)>, typename = std::enable_if_t<std::is_void<FRT>::value>> template <typename T, typename Get = T, typename F, typename FRT = std::result_of_t<F(Get&)>, typename = std::enable_if_t<std::is_void<FRT>::value>>
static inline explicit_bool_t check(u32 id, F&& func, int = 0) static inline explicit_bool_t check(u32 id, F&& func, int = 0)
{ {
reader_lock lock(id_manager::g_mutex); reader_lock lock(id_manager::g_mutex);
@ -403,7 +409,7 @@ public:
} }
// Check the ID, access object under reader lock, propagate return value // Check the ID, access object under reader lock, propagate return value
template <typename T, typename Get = T, typename F, typename FRT = std::result_of_t<F(T&)>, typename = std::enable_if_t<!std::is_void<FRT>::value>> template <typename T, typename Get = T, typename F, typename FRT = std::result_of_t<F(Get&)>, typename = std::enable_if_t<!std::is_void<FRT>::value>>
static inline return_pair<bool, FRT> check(u32 id, F&& func) static inline return_pair<bool, FRT> check(u32 id, F&& func)
{ {
reader_lock lock(id_manager::g_mutex); reader_lock lock(id_manager::g_mutex);
@ -435,7 +441,7 @@ public:
} }
// Get the object, access object under reader lock // Get the object, access object under reader lock
template <typename T, typename Get = T, typename F, typename FRT = std::result_of_t<F(T&)>, typename = std::enable_if_t<std::is_void<FRT>::value>> template <typename T, typename Get = T, typename F, typename FRT = std::result_of_t<F(Get&)>, typename = std::enable_if_t<std::is_void<FRT>::value>>
static inline auto get(u32 id, F&& func, int = 0) static inline auto get(u32 id, F&& func, int = 0)
{ {
using result_type = std::shared_ptr<Get>; using result_type = std::shared_ptr<Get>;
@ -457,7 +463,7 @@ public:
} }
// Get the object, access object under reader lock, propagate return value // Get the object, access object under reader lock, propagate return value
template <typename T, typename Get = T, typename F, typename FRT = std::result_of_t<F(T&)>, typename = std::enable_if_t<!std::is_void<FRT>::value>> template <typename T, typename Get = T, typename F, typename FRT = std::result_of_t<F(Get&)>, typename = std::enable_if_t<!std::is_void<FRT>::value>>
static inline auto get(u32 id, F&& func) static inline auto get(u32 id, F&& func)
{ {
using result_type = return_pair<Get, FRT>; using result_type = return_pair<Get, FRT>;
@ -721,10 +727,14 @@ public:
{ {
ptr = provider(); ptr = provider();
pair.first = id_manager::typeinfo::get_stop<T>(); if (ptr)
pair.second = ptr; {
pair.first = id_manager::typeinfo::get_stop<T>();
pair.second = ptr;
}
} }
else
if (!ptr)
{ {
return nullptr; return nullptr;
} }
@ -746,10 +756,18 @@ public:
auto& pair = g_vec[get_type<T>()]; auto& pair = g_vec[get_type<T>()];
ptr = provider(); ptr = provider();
old = std::move(pair.second);
pair.first = id_manager::typeinfo::get_stop<T>(); if (ptr)
pair.second = ptr; {
old = std::move(pair.second);
pair.first = id_manager::typeinfo::get_stop<T>();
pair.second = ptr;
}
else
{
return nullptr;
}
} }
if (old) if (old)