19 template<
typename X=IntervalVector>
20 class CtcInter :
public Ctc<CtcInter<X>,X>
24 explicit CtcInter(Index n)
25 : Ctc<CtcInter<X>,X>(n)
27 if constexpr(std::is_same_v<X,Interval>)
34 requires (IsCtcBaseOrPtr<C,X> && !std::is_same_v<CtcInter<X>,C>)
36 : Ctc<CtcInter<X>,X>(size_of(c)), _ctcs(c)
39 template<
typename... C>
40 requires (IsCtcBaseOrPtr<C,X> && ...)
41 CtcInter(
const C&... c)
42 : Ctc<CtcInter<X>,X>(size_first_item(c...)), _ctcs(c...)
44 assert_release(all_same_size(c...));
47 void contract(X& x)
const
49 for(
const auto& ci : _ctcs)
58 requires std::is_base_of_v<CtcBase<X>,C>
59 CtcInter<X>& operator&=(
const C& c)
61 assert_release(c.size() == this->size());
62 _ctcs.push_object_back(c);
66 CtcInter<X>& operator&=(
const std::shared_ptr<CtcBase<X>>& c)
68 assert_release(c->size() == this->size());
75 Collection<CtcBase<X>> _ctcs;
78 template<
typename C1,
typename C2>
79 requires (std::is_same_v<typename C1::ContractedType,typename C2::ContractedType>
80 && std::is_base_of_v<CtcBase<typename C1::ContractedType>,C1>
81 && std::is_base_of_v<CtcBase<typename C1::ContractedType>,C2>)
82 inline CtcInter<typename C1::ContractedType>
operator&(
const C1& c1,
const C2& c2)
84 return CtcInter<typename C1::ContractedType>(c1,c2);
88 requires std::is_base_of_v<CtcBase<IntervalVector>,C2>
89 inline CtcInter<IntervalVector> operator&(
const IntervalVector& c1,
const C2& c2)
91 assert_release(c1.size() == c2.size());
92 return CtcInter<IntervalVector>(CtcWrapper(c1),c2);
96 requires std::is_base_of_v<CtcBase<IntervalVector>,C1>
97 inline CtcInter<IntervalVector> operator&(
const C1& c1,
const IntervalVector& c2)
99 assert_release(c1.size() == c2.size());
100 return CtcInter<IntervalVector>(c1,CtcWrapper(c2));