1#ifndef OBJECT_CONTAINER_HPP_25SOHVUH
2#define OBJECT_CONTAINER_HPP_25SOHVUH
20 object(obj.release()),
21 deleter([](
void* ptr) { std::default_delete<T>()(
static_cast<T*
>(ptr)); })
31 std::function<void(
void*)> deleter;
33 using container_type = std::map<std::type_index, object_handle>;
46 bool empty()
const {
return m_container.empty(); }
48 std::size_t size()
const {
return m_container.size(); }
50 void clear() { m_container.clear(); }
55 m_container.erase(std::type_index(
typeid(T)));
62 auto found = m_container.find(std::type_index(
typeid(T)));
63 if (found != m_container.end()) {
64 result =
static_cast<T*
>(found->second.object);
72 const T* result =
nullptr;
73 auto found = m_container.find(std::type_index(
typeid(T)));
74 if (found != m_container.end()) {
75 result =
static_cast<const T*
>(found->second.object);
81 bool insert(std::unique_ptr<T> obj)
83 static_assert(std::is_object<T>() && !std::is_const<T>(),
84 "Only non-const objects are supported by ObjectContainer");
85 return m_container.emplace(std::type_index(
typeid(T)), std::move(obj)).second;
91 static_assert(std::is_default_constructible<T>(),
92 "Only default constructible types are accessible through ObjectContainer::get");
93 T* result = find<T>();
95 std::unique_ptr<T> obj {
new T() };
97 if (!insert(std::move(obj)))
105 container_type m_container;