11 #ifndef smtk_project_ResourceContainer_h
12 #define smtk_project_ResourceContainer_h
14 #include "smtk/CoreExports.h"
17 #include "smtk/common/Deprecation.h"
20 #include "smtk/project/Tags.h"
22 #include "smtk/resource/Container.h"
44 typedef boost::multi_index_container<
46 boost::multi_index::indexed_by<
47 boost::multi_index::ordered_unique<
48 boost::multi_index::tag<IdTag>,
49 boost::multi_index::global_fun<
52 &smtk::resource::detail::id>>,
53 boost::multi_index::ordered_non_unique<
54 boost::multi_index::tag<IndexTag>,
55 boost::multi_index::global_fun<
57 smtk::resource::Resource::Index,
58 &smtk::resource::detail::index>>,
59 boost::multi_index::ordered_non_unique<
60 boost::multi_index::tag<NameTag>,
61 boost::multi_index::global_fun<
64 &smtk::resource::detail::name>>,
65 boost::multi_index::ordered_non_unique<
66 boost::multi_index::tag<LocationTag>,
67 boost::multi_index::global_fun<
70 &smtk::resource::detail::location>>,
71 boost::multi_index::ordered_non_unique<
72 boost::multi_index::tag<RoleTag>,
73 boost::multi_index::global_fun<
76 &smtk::project::detail::role>>>>
79 using iterator =
typename Container::iterator;
80 using const_iterator =
typename Container::const_iterator;
84 static constexpr
const char*
const role_name =
"project_role";
90 bool registerResource(
const std::string&);
91 bool registerResource(
const smtk::resource::Resource::Index&);
92 template<
typename ResourceType>
93 bool registerResource();
96 bool registerResources(
const std::set<std::string>&);
100 bool unregisterResource(
const std::string&);
101 bool unregisterResource(
const smtk::resource::Resource::Index&);
102 template<
typename ResourceType>
103 bool unregisterResource();
109 template<
typename ResourceType>
111 template<
typename ResourceType>
118 template<
typename ResourceType>
119 smtk::shared_ptr<ResourceType> get(
const std::string&);
120 template<
typename ResourceType>
121 smtk::shared_ptr<const ResourceType> get(
const std::string&)
const;
126 std::set<smtk::resource::ResourcePtr> findByRole(
const std::string&);
127 std::set<smtk::resource::ConstResourcePtr> findByRole(
const std::string&)
const;
128 template<
typename ResourceType>
129 std::set<smtk::shared_ptr<ResourceType>> findByRole(
const std::string&);
130 template<
typename ResourceType>
131 std::set<smtk::shared_ptr<const ResourceType>> findByRole(
const std::string&)
const;
136 std::set<smtk::resource::ResourcePtr> find(
const std::string&)
const;
137 std::set<smtk::resource::ResourcePtr> find(
const smtk::resource::Resource::Index&)
const;
138 template<
typename ResourceType>
139 std::set<smtk::shared_ptr<ResourceType>> find()
const;
145 const smtk::resource::Resource::Index&,
147 std::string role = std::string());
148 template<
typename ResourceType>
149 bool add(
const smtk::shared_ptr<ResourceType>&,
const std::string& role = std::string());
158 const std::set<std::string>&
types()
const {
return m_types; }
159 std::set<std::string>& types() {
return m_types; }
161 std::shared_ptr<smtk::resource::Manager> manager()
const {
return m_manager.lock(); }
162 void setManager(
const std::weak_ptr<smtk::resource::Manager>& manager) { m_manager = manager; }
164 const_iterator begin()
const {
return m_resources.begin(); }
165 iterator begin() {
return m_resources.begin(); }
167 const_iterator end()
const {
return m_resources.end(); }
168 iterator end() {
return m_resources.end(); }
170 bool empty()
const {
return m_resources.empty(); }
171 std::size_t size()
const {
return m_resources.size(); }
172 void clear() { m_resources.clear(); }
178 std::weak_ptr<smtk::resource::Manager> m_manager;
179 std::set<std::string> m_types;
181 int m_undefinedRoleCounter;
184 template<
typename ResourceType>
185 bool ResourceContainer::registerResource()
190 template<
typename ResourceType>
191 bool ResourceContainer::unregisterResource()
196 template<
typename ResourceType>
199 return smtk::static_pointer_cast<ResourceType>(this->
get(
id));
202 template<
typename ResourceType>
205 return smtk::static_pointer_cast<const ResourceType>(this->
get(
id));
208 template<
typename ResourceType>
211 return smtk::static_pointer_cast<ResourceType>(this->
get(url));
214 template<
typename ResourceType>
217 return smtk::static_pointer_cast<const ResourceType>(this->
get(url));
220 template<
typename ResourceType>
223 std::set<smtk::shared_ptr<ResourceType>> cast_set;
224 for (
const auto& resourceptr : this->
findByRole(role))
226 auto castedResource = smtk::dynamic_pointer_cast<ResourceType>(resourceptr);
227 if (castedResource !=
nullptr)
229 cast_set.insert(castedResource);
235 template<
typename ResourceType>
237 const std::string& role)
const
239 std::set<smtk::shared_ptr<ResourceType>> cast_set;
240 for (
auto resourceptr : this->
findByRole(role))
242 auto castedResource = smtk::dynamic_pointer_cast<const ResourceType>(resourceptr);
243 if (castedResource !=
nullptr)
245 cast_set.insert(castedResource);
251 template<
typename ResourceType>
252 std::set<smtk::shared_ptr<ResourceType>> ResourceContainer::find()
const
254 std::set<smtk::shared_ptr<ResourceType>> cast_set;
255 for (
const auto& resourceptr : this->find(
typeid(ResourceType).hash_code()))
257 cast_set.insert(std::dynamic_pointer_cast<ResourceType>(resourceptr));
262 template<
typename ResourceType>
265 return this->
add(std::type_index(
typeid(ResourceType)).hash_code(), resource, role);