11 #ifndef smtk_project_Manager_h
12 #define smtk_project_Manager_h
14 #include "smtk/CoreExports.h"
19 #include "smtk/operation/Manager.h"
21 #include "smtk/project/Container.h"
22 #include "smtk/project/Metadata.h"
23 #include "smtk/project/MetadataContainer.h"
24 #include "smtk/project/MetadataObserver.h"
25 #include "smtk/project/Observer.h"
27 #include "smtk/resource/Manager.h"
30 #include <type_traits>
45 static std::shared_ptr<Manager> create(
49 return smtk::shared_ptr<Manager>(
new Manager(resourceManager, operationManager));
58 typename ResourcesTuple = std::tuple<>,
59 typename OperationsTuple = std::tuple<>>
60 bool registerProject(
const std::string& version =
"0.0.0");
66 const std::string& name,
67 const std::set<std::string>& resources = {},
68 const std::set<std::string>& operations = {},
69 const std::string& version =
"0.0.0");
75 bool unregisterProject(
const std::string&);
77 template<
typename ProjectType>
78 bool unregisterProject();
81 template<
typename OperationType>
82 bool registerOperation();
86 template<
typename Tuple>
89 return Manager::registerOperations<0, Tuple>();
94 bool registered(
const std::string&)
const;
96 template<
typename ProjectType>
97 bool registered()
const;
100 bool unregisterOperation(
const std::string&);
101 bool unregisterOperation(
const smtk::operation::Operation::Index&);
102 template<
typename OperationType>
103 bool unregisterOperation();
106 template<
typename Tuple>
107 bool unregisterOperations()
109 return Manager::unregisterOperations<0, Tuple>();
113 ProjectPtr create(
const std::string&,
const std::shared_ptr<smtk::common::Managers>& =
nullptr);
116 const std::shared_ptr<smtk::common::Managers>& =
nullptr);
117 template<
typename ProjectType>
118 smtk::shared_ptr<ProjectType> create(
const std::shared_ptr<smtk::common::Managers>& =
nullptr);
125 const std::shared_ptr<smtk::common::Managers>& =
nullptr);
129 const std::shared_ptr<smtk::common::Managers>& =
nullptr);
130 template<
typename ProjectType>
131 smtk::shared_ptr<ProjectType> create(
133 const std::shared_ptr<smtk::common::Managers>& =
nullptr);
139 template<
typename ProjectType>
141 template<
typename ProjectType>
147 ConstProjectPtr get(
const std::string&)
const;
148 template<
typename ProjectType>
149 smtk::shared_ptr<ProjectType> get(
const std::string&);
150 template<
typename ProjectType>
151 smtk::shared_ptr<const ProjectType> get(
const std::string&)
const;
155 std::set<ProjectPtr> find(
const std::string&);
157 template<
typename ProjectType>
158 std::set<smtk::shared_ptr<ProjectType>> find();
167 template<
typename ProjectType>
168 bool add(
const smtk::shared_ptr<ProjectType>&);
180 const Container& projects()
const {
return m_projects; }
187 const Observers& observers()
const {
return m_observers; }
201 template<std::
size_t I,
typename Tuple>
202 inline typename std::enable_if<I != std::tuple_size<Tuple>::value,
bool>::type
205 bool registered = this->registerOperation<typename std::tuple_element<I, Tuple>::type>();
206 return registered && Manager::registerOperations<I + 1, Tuple>();
209 template<std::
size_t I,
typename Tuple>
210 inline typename std::enable_if<I == std::tuple_size<Tuple>::value,
bool>::type
216 template<std::
size_t I,
typename Tuple>
217 inline typename std::enable_if<I != std::tuple_size<Tuple>::value,
bool>::type
218 unregisterOperations()
220 bool unregistered = this->unregisterOperation<typename std::tuple_element<I, Tuple>::type>();
221 return unregistered && Manager::unregisterOperations<I + 1, Tuple>();
224 template<std::
size_t I,
typename Tuple>
225 inline typename std::enable_if<I == std::tuple_size<Tuple>::value,
bool>::type
226 unregisterOperations()
241 Metadata::Observers m_metadataObservers;
243 std::weak_ptr<smtk::resource::Manager> m_resourceManager;
244 std::weak_ptr<smtk::operation::Manager> m_operationManager;
251 template<std::
size_t I,
typename Tuple>
252 inline typename std::enable_if<I != std::tuple_size<Tuple>::value>::type tupleToTypeNames(
253 std::set<std::string>& typeNames)
256 return tupleToTypeNames<I + 1, Tuple>(typeNames);
259 template<std::
size_t I,
typename Tuple>
260 inline typename std::enable_if<I == std::tuple_size<Tuple>::value>::type tupleToTypeNames(
261 std::set<std::string>& )
266 template<
typename Tuple>
267 std::set<std::string> tupleToTypeNames()
269 std::set<std::string> typeNames;
270 tupleToTypeNames<0, Tuple>(typeNames);
275 template<
typename ProjectType,
typename ResourcesTuple,
typename OperationsTuple>
279 smtk::common::typeName<ProjectType>(),
280 std::type_index(
typeid(ProjectType)).hash_code(),
282 Project::Ptr project = ProjectType::create();
286 detail::tupleToTypeNames<ResourcesTuple>(),
287 detail::tupleToTypeNames<OperationsTuple>(),
291 template<
typename ProjectType>
292 bool Manager::registered()
const
294 return this->registered(std::type_index(
typeid(ProjectType)).hash_code());
297 template<
typename OperationType>
304 auto op = OperationType::create();
305 op->setProjectManager(shared_from_this());
306 auto specification = op->specification();
309 smtk::common::typeName<OperationType>(),
310 std::type_index(
typeid(OperationType)).hash_code(),
312 []() {
return OperationType::create(); }));
315 template<
typename OperationType>
316 bool Manager::unregisterOperation()
318 return this->unregisterOperation(std::type_index(
typeid(OperationType)).hash_code());
321 template<
typename ProjectType>
322 std::shared_ptr<ProjectType> Manager::create(
const std::shared_ptr<smtk::common::Managers>& m)
324 return std::static_pointer_cast<ProjectType>(
325 this->create(std::type_index(
typeid(ProjectType)).hash_code(), m));
328 template<
typename ProjectType>
329 std::shared_ptr<ProjectType> Manager::create(
331 const std::shared_ptr<smtk::common::Managers>& m)
333 return std::static_pointer_cast<ProjectType>(
334 this->create(std::type_index(
typeid(ProjectType)).hash_code(),
id, m));
337 template<
typename ProjectType>
340 return std::static_pointer_cast<ProjectType>(this->
get(
id));
343 template<
typename ProjectType>
346 return std::static_pointer_cast<const ProjectType>(this->
get(
id));
349 template<
typename ProjectType>
350 std::shared_ptr<ProjectType>
Manager::get(
const std::string& url)
352 return std::static_pointer_cast<ProjectType>(this->
get(url));
355 template<
typename ProjectType>
356 std::shared_ptr<const ProjectType>
Manager::get(
const std::string& url)
const
358 return std::static_pointer_cast<const ProjectType>(this->
get(url));
361 template<
typename ProjectType>
362 std::set<std::shared_ptr<ProjectType>> Manager::find()
364 std::set<std::shared_ptr<Project>> tmp = this->
find(smtk::common::typeName<ProjectType>());
365 std::set<std::shared_ptr<ProjectType>>
projects;
366 for (
const auto& project : tmp)
368 projects.insert(std::static_pointer_cast<ProjectType>(project));
373 template<
typename ProjectType>
376 return this->
add(std::type_index(
typeid(ProjectType)).hash_code(), project);