20 template<
typename... X>
21 class CtcUnion :
public Ctc<CtcUnion<X...>,X...>
25 explicit CtcUnion(Index n)
26 : Ctc<CtcUnion<X...>,X...>(n)
28 if constexpr(std::is_same_v<X...,Interval>)
29 assert_release(n == 1);
33 requires (IsCtcBaseOrPtr<C,X...> && !std::is_same_v<CtcUnion<X...>,C>)
35 : Ctc<CtcUnion<X...>,X...>(size_of(c)), _ctcs(c)
38 template<
typename... C>
39 requires (IsCtcBaseOrPtr<C,X...> && ...)
40 CtcUnion(
const C&... c)
41 : Ctc<CtcUnion<X...>,X...>(size_first_item(c...)), _ctcs(c...)
43 assert_release(all_same_size(c...));
46 CtcUnion(
const Collection<CtcBase<X...>>& ctcs)
47 : Ctc<CtcUnion<X...>,X...>(ctcs.front()->size()), _ctcs(ctcs)
49 for(
const auto& ci : _ctcs)
52 assert_release(ci->size() == this->size());
57 requires IsCtcBaseOrPtr<C,X...>
58 CtcUnion(std::initializer_list<C> ctcs)
59 : CtcUnion(Collection<CtcBase<X...>>(ctcs))
67 void contract(X&... x)
const
69 const auto input = std::tuple<X...>(x...);
72 std::apply([](
auto&... xi)
74 (xi.set_empty(), ...);
77 auto accumulate_union = [&]<std::size_t... I>(
const std::tuple<X...>& y, std::index_sequence<I...>)
79 ((std::get<I>(result) |= std::get<I>(y)), ...);
82 for(
const auto& ci : _ctcs)
86 std::apply([&](
auto&... xi)
91 accumulate_union(saved, std::index_sequence_for<X...>{});
100 std::tie(x...) = result;
104 requires IsCtcBaseOrPtr<C,X...>
105 CtcUnion<X...>& operator|=(
const C& c)
107 assert_release(size_of(c) == this->size());
114 Collection<CtcBase<X...>> _ctcs;
118 class CtcUnion<> :
public CtcUnion<IntervalVector>
121 template<
typename Tuple>
124 template<
typename... T>
125 struct CtcUnionType<std::tuple<T...>> {
126 using Ctc = CtcUnion<T...>;
129 template<
typename C1,
typename C2>
130 typename CtcUnionType<typename C1::ContractedTypes>::Ctc operator|(
const C1& c1,
const C2& c2)
135 template<
typename C1,
typename C2>
136 typename CtcUnionType<typename C1::ContractedTypes>::Ctc operator|(
const std::shared_ptr<C1>& c1,
const std::shared_ptr<C2>& c2)
141 template<
typename C1,
typename C2>
142 typename CtcUnionType<typename C1::ContractedTypes>::Ctc operator|(
const std::shared_ptr<C1>& c1,
const C2& c2)
147 template<
typename C1,
typename C2>
148 typename CtcUnionType<typename C1::ContractedTypes>::Ctc operator|(
const C1& c1,
const std::shared_ptr<C2>& c2)
153 template<
typename C2>
154 requires std::is_base_of_v<CtcBase<IntervalVector>,C2>
155 inline CtcUnion<IntervalVector> operator|(
const IntervalVector& c1,
const C2& c2)
157 assert_release(c1.size() == c2.size());
158 return CtcUnion<IntervalVector>(CtcWrapper(c1),c2);
161 template<
typename C1>
162 requires std::is_base_of_v<CtcBase<IntervalVector>,C1>
163 inline CtcUnion<IntervalVector> operator|(
const C1& c1,
const IntervalVector& c2)
165 assert_release(c1.size() == c2.size());
166 return CtcUnion<IntervalVector>(c1,CtcWrapper(c2));
170 CtcUnion(Index) -> CtcUnion<IntervalVector>;
172 template<
typename... C>
173 requires (IsCtcBaseOrPtr<C,IntervalVector> && ...)
174 CtcUnion(
const C&...) -> CtcUnion<IntervalVector>;
177 CtcUnion(std::initializer_list<C>) -> CtcUnion<IntervalVector>;
Definition codac2_OctaSym.h:21
Eigen::Matrix< Interval,-1, 1 > IntervalVector
Alias for a dynamic-size column vector of intervals.
Definition codac2_IntervalVector.h:25