11 #ifndef smtk_graph_ArcMap_h
12 #define smtk_graph_ArcMap_h
16 #include "smtk/graph/ArcImplementation.h"
17 #include "smtk/graph/Directionality.h"
19 #include "smtk/resource/query/BadTypeError.h"
21 #include "smtk/string/Token.h"
23 #include "smtk/common/CompilerInformation.h"
24 #include "smtk/common/RuntimeTypeContainer.h"
57 template<
typename List>
60 this->insertArcImplementations<List>();
63 template<
typename List>
66 this->insertArcImplementations<List>();
73 virtual ~
ArcMap() =
default;
81 template<
typename ArcTraits>
85 auto it = m_data.find(arcTypeName);
86 if (it == m_data.end())
93 template<
typename ArcTraits>
97 auto it = m_data.find(arcTypeName);
98 if (it == m_data.end())
102 return dynamic_cast<ArcImplementation<ArcTraits>*
>(it->second.get());
105 template<
typename ImplementationType>
108 auto it = m_data.find(declaredType);
109 if (it == m_data.end())
113 return dynamic_cast<ImplementationType*
>(it->second.get());
116 template<
typename ImplementationType>
119 auto it = m_data.find(declaredType);
120 if (it == m_data.end())
124 return dynamic_cast<ImplementationType*
>(it->second.get());
135 template<
typename Tuple,
typename Functor,
typename... Args>
138 ArcMap::invokeFunctors<0, Tuple, Functor>(std::forward<Args>(args)...);
141 template<
typename Tuple,
typename Functor,
typename... Args>
142 void invoke(Args&&... args)
144 ArcMap::invokeFunctors<0, Tuple, Functor>(std::forward<Args>(args)...);
157 template<
typename Functor,
typename... Args>
161 for (
const auto& baseArc : this->runtimeBaseTypes())
163 for (
const auto& arcTypeName : this->runtimeTypeNames(baseArc))
165 f(arcTypeName, *this->at<ArcImplementationBase>(arcTypeName), std::forward<Args>(args)...);
171 template<
typename Functor,
typename... Args>
172 void invokeRuntime(Args&&... args)
175 for (
const auto& baseArc : this->runtimeBaseTypes())
177 for (
const auto& arcTypeName : this->runtimeTypeNames(baseArc))
179 f(arcTypeName, *this->at<ArcImplementationBase>(arcTypeName), std::forward<Args>(args)...);
186 const std::set<smtk::string::Token>&
types()
const {
return m_types; }
207 bool insertRuntimeArcType(
210 std::unordered_set<smtk::string::Token> fromNodeSpecs,
211 std::unordered_set<smtk::string::Token> toNodeSpecs,
218 std::unordered_set<smtk::string::Token> runtimeBaseTypes()
const;
223 const std::unordered_set<smtk::string::Token>& runtimeTypeNames(
227 template<
typename ArcImplementationType>
230 auto it = m_data.find(arcType);
231 if (it == m_data.end())
235 return *
dynamic_cast<ArcImplementationType*
>(it->second.get());
238 template<
typename ArcImplementationType>
241 auto it = m_data.find(arcType);
242 if (it == m_data.end())
246 return *
dynamic_cast<ArcImplementationType*
>(it->second.get());
261 virtual void copyArcs(
268 template<
typename Type>
269 void insertArcImplementation()
272 auto arcData = std::make_shared<ArcImplementation<Type>>();
273 if (m_data.emplace(arcTypeName, arcData).second)
275 m_types.insert(arcTypeName);
280 template<
typename Entry,
typename Functor,
typename... Args>
281 void invokeFunctor(Args&&... args)
const
284 f(this->at<Entry>(), std::forward<Args>(args)...);
288 template<
typename Entry,
typename Functor,
typename... Args>
289 void invokeFunctor(Args&&... args)
292 f(this->at<Entry>(), std::forward<Args>(args)...);
295 template<
typename Tuple>
296 void insertArcImplementations()
298 ArcMap::insertArcImplementations<0, Tuple>();
302 template<std::
size_t I,
typename Tuple>
303 inline typename std::enable_if<I != std::tuple_size<Tuple>::value>::type
304 insertArcImplementations()
306 this->insertArcImplementation<typename std::tuple_element<I, Tuple>::type>();
307 ArcMap::insertArcImplementations<I + 1, Tuple>();
310 template<std::
size_t I,
typename Tuple>
311 inline typename std::enable_if<I == std::tuple_size<Tuple>::value>::type
312 insertArcImplementations()
317 template<std::size_t I,
typename Tuple,
typename Functor,
typename... Args>
318 inline typename std::enable_if<I != std::tuple_size<Tuple>::value>::type invokeFunctors(
319 Args&&... args)
const
321 this->invokeFunctor<typename std::tuple_element<I, Tuple>::type, Functor>(
322 std::forward<Args>(args)...);
323 ArcMap::invokeFunctors<I + 1, Tuple, Functor>(std::forward<Args>(args)...);
327 template<std::size_t I,
typename Tuple,
typename Functor,
typename... Args>
328 inline typename std::enable_if<I != std::tuple_size<Tuple>::value>::type invokeFunctors(
331 this->invokeFunctor<typename std::tuple_element<I, Tuple>::type, Functor>(
332 std::forward<Args>(args)...);
333 ArcMap::invokeFunctors<I + 1, Tuple, Functor>(std::forward<Args>(args)...);
337 template<std::size_t I,
typename Tuple,
typename Functor,
typename... Args>
338 inline typename std::enable_if<I == std::tuple_size<Tuple>::value>::type invokeFunctors(
344 std::unordered_map<smtk::string::Token, std::shared_ptr<ArcImplementationBase>> m_data;
347 std::unordered_map<smtk::string::Token, std::unordered_set<smtk::string::Token>> m_runtimeArcs;
349 std::set<smtk::string::Token> m_types;
355 #endif // smtk_graph_ArcMap_h