11 #ifndef smtk_resource_query_Container_h
12 #define smtk_resource_query_Container_h
14 #include "smtk/CoreExports.h"
16 #include "smtk/resource/query/BadTypeError.h"
19 #include <unordered_map>
37 template<
typename Type>
40 return (m_container.find(
typeid(Type).hash_code()) != m_container.end());
43 bool contains(
const std::size_t index)
const
45 return (m_container.find(index) != m_container.end());
48 template<
typename Type>
49 const Type& get()
const
51 return static_cast<Type&
>(get(
typeid(Type).hash_code()));
57 template<
typename Type>
58 typename std::enable_if<std::is_default_constructible<Type>::value, Type&>::type get() noexcept
60 auto search = m_container.find(
typeid(Type).hash_code());
61 if (search == m_container.end())
64 m_container.emplace(std::make_pair(
typeid(Type).hash_code(), std::unique_ptr<T>(
new Type)))
68 return static_cast<Type&
>(*(search->second));
73 template<
typename Type>
74 typename std::enable_if<!std::is_default_constructible<Type>::value, Type&>::type get()
76 auto search = m_container.find(
typeid(Type).hash_code());
77 if (search == m_container.end())
82 return static_cast<Type&
>(*(search->second));
85 const T& get(
const std::size_t& index)
const
87 auto search = m_container.find(index);
88 if (search == m_container.end())
93 return *(search->second);
96 T& get(
const std::size_t& index)
98 auto search = m_container.find(index);
99 if (search == m_container.end())
104 return *(search->second);
107 const std::unordered_map<std::size_t, std::unique_ptr<T>>& data()
const {
return m_container; }
108 std::unordered_map<std::size_t, std::unique_ptr<T>>& data() {
return m_container; }
111 std::unordered_map<std::size_t, std::unique_ptr<T>> m_container;