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"
53 template<
typename List>
56 this->insertArcImplementations<List>();
59 template<
typename List>
62 this->insertArcImplementations<List>();
69 virtual ~
ArcMap() =
default;
77 template<
typename ArcTraits>
81 auto it = m_data.find(arcTypeName);
82 if (it == m_data.end())
89 template<
typename ArcTraits>
93 auto it = m_data.find(arcTypeName);
94 if (it == m_data.end())
98 return dynamic_cast<ArcImplementation<ArcTraits>*
>(it->second.get());
101 template<
typename ImplementationType>
104 auto it = m_data.find(declaredType);
105 if (it == m_data.end())
109 return dynamic_cast<ImplementationType*
>(it->second.get());
112 template<
typename ImplementationType>
115 auto it = m_data.find(declaredType);
116 if (it == m_data.end())
120 return dynamic_cast<ImplementationType*
>(it->second.get());
131 template<
typename Tuple,
typename Functor,
typename... Args>
134 ArcMap::invokeFunctors<0, Tuple, Functor>(std::forward<Args>(args)...);
137 template<
typename Tuple,
typename Functor,
typename... Args>
138 void invoke(Args&&... args)
140 ArcMap::invokeFunctors<0, Tuple, Functor>(std::forward<Args>(args)...);
153 template<
typename Functor,
typename... Args>
157 for (
const auto& baseArc : this->runtimeBaseTypes())
159 for (
const auto& arcTypeName : this->runtimeTypeNames(baseArc))
161 f(arcTypeName, *this->at<ArcImplementationBase>(arcTypeName), std::forward<Args>(args)...);
167 template<
typename Functor,
typename... Args>
168 void invokeRuntime(Args&&... args)
171 for (
const auto& baseArc : this->runtimeBaseTypes())
173 for (
const auto& arcTypeName : this->runtimeTypeNames(baseArc))
175 f(arcTypeName, *this->at<ArcImplementationBase>(arcTypeName), std::forward<Args>(args)...);
182 const std::set<smtk::string::Token>&
types()
const {
return m_types; }
203 bool insertRuntimeArcType(
206 std::unordered_set<smtk::string::Token> fromNodeSpecs,
207 std::unordered_set<smtk::string::Token> toNodeSpecs,
214 std::unordered_set<smtk::string::Token> runtimeBaseTypes()
const;
219 const std::unordered_set<smtk::string::Token>& runtimeTypeNames(
223 template<
typename ArcImplementationType>
226 auto it = m_data.find(arcType);
227 if (it == m_data.end())
231 return *
dynamic_cast<ArcImplementationType*
>(it->second.get());
234 template<
typename ArcImplementationType>
237 auto it = m_data.find(arcType);
238 if (it == m_data.end())
242 return *
dynamic_cast<ArcImplementationType*
>(it->second.get());
246 template<
typename Type>
247 void insertArcImplementation()
250 auto arcData = std::make_shared<ArcImplementation<Type>>();
251 if (m_data.emplace(arcTypeName, arcData).second)
253 m_types.insert(arcTypeName);
258 template<
typename Entry,
typename Functor,
typename... Args>
259 void invokeFunctor(Args&&... args)
const
262 f(this->at<Entry>(), std::forward<Args>(args)...);
266 template<
typename Entry,
typename Functor,
typename... Args>
267 void invokeFunctor(Args&&... args)
270 f(this->at<Entry>(), std::forward<Args>(args)...);
273 template<
typename Tuple>
274 void insertArcImplementations()
276 ArcMap::insertArcImplementations<0, Tuple>();
280 template<std::
size_t I,
typename Tuple>
281 inline typename std::enable_if<I != std::tuple_size<Tuple>::value>::type
282 insertArcImplementations()
284 this->insertArcImplementation<typename std::tuple_element<I, Tuple>::type>();
285 ArcMap::insertArcImplementations<I + 1, Tuple>();
288 template<std::
size_t I,
typename Tuple>
289 inline typename std::enable_if<I == std::tuple_size<Tuple>::value>::type
290 insertArcImplementations()
295 template<std::size_t I,
typename Tuple,
typename Functor,
typename... Args>
296 inline typename std::enable_if<I != std::tuple_size<Tuple>::value>::type invokeFunctors(
297 Args&&... args)
const
299 this->invokeFunctor<typename std::tuple_element<I, Tuple>::type, Functor>(
300 std::forward<Args>(args)...);
301 ArcMap::invokeFunctors<I + 1, Tuple, Functor>(std::forward<Args>(args)...);
305 template<std::size_t I,
typename Tuple,
typename Functor,
typename... Args>
306 inline typename std::enable_if<I != std::tuple_size<Tuple>::value>::type invokeFunctors(
309 this->invokeFunctor<typename std::tuple_element<I, Tuple>::type, Functor>(
310 std::forward<Args>(args)...);
311 ArcMap::invokeFunctors<I + 1, Tuple, Functor>(std::forward<Args>(args)...);
315 template<std::size_t I,
typename Tuple,
typename Functor,
typename... Args>
316 inline typename std::enable_if<I == std::tuple_size<Tuple>::value>::type invokeFunctors(
322 std::unordered_map<smtk::string::Token, std::shared_ptr<ArcImplementationBase>> m_data;
325 std::unordered_map<smtk::string::Token, std::unordered_set<smtk::string::Token>> m_runtimeArcs;
327 std::set<smtk::string::Token> m_types;
333 #endif // smtk_graph_ArcMap_h