21 template<
typename... X>
26 using ContractedTypes = std::tuple<X...>;
34 virtual ~CtcBase() =
default;
41 virtual void contract(X&... x)
const = 0;
43 virtual std::shared_ptr<CtcBase<X...>> copy()
const = 0;
50 template<
typename C,
typename... X>
51 class Ctc :
public CtcBase<X...>
59 virtual std::shared_ptr<CtcBase<X...>> copy()
const
61 return std::make_shared<C>(*
dynamic_cast<const C*
>(
this));
65 template<
class C,
class... X>
66 concept IsCtcBaseOrPtr = (std::is_base_of_v<CtcBase<X...>,C>
67 || std::is_same_v<std::shared_ptr<CtcBase<X...>>,C>);
69 template<
class C,
class... X>
70 concept IsCtcBase = std::is_base_of_v<CtcBase<X...>,C>;
74 requires (IsCtcBase<C,Interval>) || (IsCtcBase<C,IntervalVector>)
75 struct is_interval_based<C> : std::false_type {};
78 requires (IsCtcBase<C,Interval>) || (IsCtcBase<C,IntervalVector>)
79 struct is_ctc<C> : std::true_type {};
82 requires (IsCtcBase<C,Interval>) || (IsCtcBase<C,IntervalVector>)
83 struct is_sep<C> : std::false_type {};