11 #ifndef smtk_graph_ArcMap_h
12 #define smtk_graph_ArcMap_h
16 #include "smtk/common/CompilerInformation.h"
17 #include "smtk/common/TypeContainer.h"
19 #include "smtk/graph/ArcImplementation.h"
20 #include "smtk/string/Token.h"
46 template<
typename List>
49 this->insertArcImplementations<List>();
52 template<
typename List>
55 this->insertArcImplementations<List>();
62 ~
ArcMap()
override =
default;
70 template<
typename ArcTraits>
75 const auto& arcObject = this->get<ArcImplementation<ArcTraits>>();
81 template<
typename ArcTraits>
86 auto& arcObject = this->get<ArcImplementation<ArcTraits>>();
100 template<
typename Tuple,
typename Functor,
typename... Args>
103 ArcMap::invokeFunctors<0, Tuple, Functor>(std::forward<Args>(args)...);
106 template<
typename Tuple,
typename Functor,
typename... Args>
107 void invoke(Args&&... args)
109 ArcMap::invokeFunctors<0, Tuple, Functor>(std::forward<Args>(args)...);
114 const std::set<smtk::string::Token>&
types()
const {
return m_types; }
117 template<
typename Type>
118 void insertArcImplementation()
121 if (this->insert(arcObject))
124 m_types.insert(arcTypeName);
129 template<
typename Entry,
typename Functor,
typename... Args>
130 void invokeFunctor(Args&&... args)
const
133 f(this->at<Entry>(), std::forward<Args>(args)...);
137 template<
typename Entry,
typename Functor,
typename... Args>
138 void invokeFunctor(Args&&... args)
141 f(this->at<Entry>(), std::forward<Args>(args)...);
144 template<
typename Tuple>
145 void insertArcImplementations()
147 ArcMap::insertArcImplementations<0, Tuple>();
151 template<std::
size_t I,
typename Tuple>
152 inline typename std::enable_if<I != std::tuple_size<Tuple>::value>::type
153 insertArcImplementations()
155 this->insertArcImplementation<typename std::tuple_element<I, Tuple>::type>();
156 ArcMap::insertArcImplementations<I + 1, Tuple>();
159 template<std::
size_t I,
typename Tuple>
160 inline typename std::enable_if<I == std::tuple_size<Tuple>::value>::type
161 insertArcImplementations()
166 template<std::size_t I,
typename Tuple,
typename Functor,
typename... Args>
167 inline typename std::enable_if<I != std::tuple_size<Tuple>::value>::type invokeFunctors(
168 Args&&... args)
const
170 this->invokeFunctor<typename std::tuple_element<I, Tuple>::type, Functor>(
171 std::forward<Args>(args)...);
172 ArcMap::invokeFunctors<I + 1, Tuple, Functor>(std::forward<Args>(args)...);
176 template<std::size_t I,
typename Tuple,
typename Functor,
typename... Args>
177 inline typename std::enable_if<I != std::tuple_size<Tuple>::value>::type invokeFunctors(
180 this->invokeFunctor<typename std::tuple_element<I, Tuple>::type, Functor>(
181 std::forward<Args>(args)...);
182 ArcMap::invokeFunctors<I + 1, Tuple, Functor>(std::forward<Args>(args)...);
186 template<std::size_t I,
typename Tuple,
typename Functor,
typename... Args>
187 inline typename std::enable_if<I == std::tuple_size<Tuple>::value>::type invokeFunctors(
192 std::set<smtk::string::Token> m_types;
198 #endif // smtk_graph_ArcMap_h