24 template<
typename... X>
29 using ContractedTypes = std::tuple<X...>;
37 virtual ~CtcBase() =
default;
44 virtual void contract(X&... x)
const = 0;
46 virtual void contract(SlicedTube<X>&... x)
const;
49 virtual void contract_tube(SlicedTube<X>&... x)
const;
52 virtual std::shared_ptr<CtcBase<X...>> copy()
const = 0;
59 template<
typename C,
typename... X>
60 class Ctc :
public CtcBase<X...>
68 virtual std::shared_ptr<CtcBase<X...>> copy()
const
70 return std::make_shared<C>(*
dynamic_cast<const C*
>(
this));
74 template<
class C,
class... X>
75 concept IsCtcBaseOrPtr = (std::is_base_of_v<CtcBase<X...>,C>
76 || std::is_same_v<std::shared_ptr<CtcBase<X...>>,C>);
78 template<
class C,
class... X>
79 concept IsCtcBase = std::is_base_of_v<CtcBase<X...>,C>;
83 requires (IsCtcBase<C,Interval>) || (IsCtcBase<C,IntervalVector>)
84 struct is_interval_based<C> : std::false_type {};
87 requires (IsCtcBase<C,Interval>) || (IsCtcBase<C,IntervalVector>)
88 struct is_ctc<C> : std::true_type {};
91 requires (IsCtcBase<C,Interval>) || (IsCtcBase<C,IntervalVector>)
92 struct is_sep<C> : std::false_type {};
95 requires IsCtcBaseOrPtr<C,IntervalVector>
96 const CtcBase<IntervalVector>& ctc(
const C& c)
98 if constexpr(std::is_base_of_v<CtcBase<IntervalVector>,C>)
Definition codac2_OctaSym.h:21