22 template<
typename... X>
27 using ContractedTypes = std::tuple<X...>;
35 virtual ~CtcBase() =
default;
42 virtual void contract(X&... x)
const = 0;
44 virtual void contract_tube(SlicedTube<X>&... x)
const
46 auto tdomain = std::get<0>(std::make_tuple(x...));
47 for(
auto it = tdomain.begin() ; it != tdomain.end() ; it++)
48 contract((x(it)->codomain())...);
51 virtual std::shared_ptr<CtcBase<X...>> copy()
const = 0;
58 template<
typename C,
typename... X>
59 class Ctc :
public CtcBase<X...>
67 virtual std::shared_ptr<CtcBase<X...>> copy()
const
69 return std::make_shared<C>(*
dynamic_cast<const C*
>(
this));
73 template<
class C,
class... X>
74 concept IsCtcBaseOrPtr = (std::is_base_of_v<CtcBase<X...>,C>
75 || std::is_same_v<std::shared_ptr<CtcBase<X...>>,C>);
77 template<
class C,
class... X>
78 concept IsCtcBase = std::is_base_of_v<CtcBase<X...>,C>;
82 requires (IsCtcBase<C,Interval>) || (IsCtcBase<C,IntervalVector>)
83 struct is_interval_based<C> : std::false_type {};
86 requires (IsCtcBase<C,Interval>) || (IsCtcBase<C,IntervalVector>)
87 struct is_ctc<C> : std::true_type {};
90 requires (IsCtcBase<C,Interval>) || (IsCtcBase<C,IntervalVector>)
91 struct is_sep<C> : std::false_type {};