86 template <std::size_t N, std::size_t ...Is>
89 template <std::size_t ... Is>
96 template <
typename T,
typename ... Ts>
103 virtual void visit(
const T& t) = 0;
111 virtual void visit(
const T& t) = 0;
117 template <
typename T,
typename ... Ts>
struct get_index;
119 template <
typename T,
typename ... Ts>
120 struct get_index<T, T, Ts...> : std::integral_constant<std::size_t, 0> {};
122 template <
typename T,
typename Tail,
typename ... Ts>
124 std::integral_constant < std::size_t, 1 + get_index<T, Ts...>::value > {};
129 template <
typename T,
template <
typename...>
class C,
typename ... Ts>
133 template <std::
size_t I>
136 template <
typename T, std::
size_t N>
137 static constexpr
auto get(
const T& a,
const std::array<std::size_t, N>& index)
147 template <
typename T, std::
size_t N>
148 static constexpr
auto get(
const T& a,
const std::array<std::size_t, N>& index)
157 template <
typename IVisitor,
typename C,
typename...Ts>
struct IVisitorImpl;
159 template <
typename IVisitor,
typename C,
typename T,
typename...Ts>
162 virtual void visit(
const T& t)
override { C::visit(t); }
165 template <
typename IVisitor,
typename C,
typename T>
168 virtual void visit(
const T& t)
override { C::visit(t); }
172 template <
typename IVisitor,
typename C>
175 template <
typename ... Ts,
typename C>
183 template <
typename Ret,
typename F,
typename Arg>
187 template <
typename...Ts>
191 static Ret
call(F&f,
const Arg& arg)
197 template <std::size_t ... Is>
200 using RetTuple = std::tuple<
const Ts&...>;
205 return f(
reinterpret_cast<typename std::tuple_element<Is, RetTuple>::type
>(std::get<Is>(arg))...);
210 template <std::size_t N,
typename Tuple,
typename...Ts>
213 template <
typename...Ts,
typename...Ts2>
216 using RetType = std::array<Ret (*)(F&,
const Arg&),
sizeof...(Ts)>;
224 template <std::size_t N,
typename ...Ts,
typename...Ts2>
227 template <
typename T>
229 using T0 =
typename std::tuple_element<0, std::tuple<Ts...>>::type;
230 using RetType = std::array<decltype(RecType<T0>::build()),
sizeof...(Ts)>;
238 template <std::
size_t N,
typename VisitorTuple>
239 static constexpr
auto get()
246 template <
typename Ret,
typename IVisitor,
typename F, std::
size_t N>
254 template <
typename T>
262 std::size_t* index =
nullptr;
265 template <std::
size_t I,
typename Tuple>
270 visitor.setIndexPtr(index[I]);
272 std::get<I>(t).accept(visitor);
275 template <
typename Tuple, std::size_t ... Is>
278 const int dummy[] = {(set_index<Is>(t), 0)...};
279 static_cast<void>(dummy);
281 template
get<
sizeof...(Is),
typename IVisitor::tuple_type>();
283 return (*func)(f, t);
289 template <
typename Ret,
typename Visitor,
typename F,
typename ... Ts>
292 constexpr std::size_t size =
sizeof...(Ts);
303 geo::Vector, geo::Circle, geo::Arc, geo::Area, geo::Ellipse,
304 entity::CADEntity, entity::Point, entity::Line, entity::Arc, entity::Circle, entity::Ellipse,
305 entity::LWPolyline, entity::Image
typename std::tuple_element< 0, std::tuple< Ts...>>::type T0
virtual void visit(const T &t) override
void set_index(const Tuple &t)
Ret visitorDispatcher(F &&f, Ts &...args)
static Ret call(F &f, const Arg &arg)
void setIndexPtr(std::size_t &index)
virtual void visit(const T &t) override
DECLARE_SHORT_SHARED_PTR(Document)
static constexpr RetType build()
static constexpr RetType build()
static Ret call_helper(F &f, const Arg &arg, index_sequence< Is...>)
void visit(const T &) const
std::array< Ret(*)(F &, const Arg &), sizeof...(Ts)> RetType
std::tuple< T > tuple_type
std::tuple< T, Ts...> tuple_type
IVisitorTs< lc::Visitable, geo::Vector, geo::Circle, geo::Arc, geo::Area, geo::Ellipse, entity::CADEntity, entity::Point, entity::Line, entity::Arc, entity::Circle, entity::Ellipse, entity::LWPolyline, entity::Image > GeoEntityVisitor
std::array< decltype(RecType< T0 >::build()), sizeof...(Ts)> RetType
std::array< std::size_t, N > index