20 class Slice :
public SliceBase,
27 explicit Slice(
const SlicedTubeBase& tube,
const std::list<TSlice>::iterator& it_tslice,
const T& codomain)
28 : SliceBase(tube, it_tslice), T(codomain)
31 Slice(
const Slice& s,
const SlicedTubeBase& tube)
32 : SliceBase(tube, s._it_tslice), T(s.codomain())
37 Slice(
const Slice& s) =
delete;
38 Slice& operator=(
const Slice&) =
delete;
39 Slice(Slice&&) =
delete;
40 Slice& operator=(Slice&&) =
delete;
42 inline const SlicedTube<T>& tube()
const
44 return static_cast<const SlicedTube<T>&
>(_tube);
47 inline virtual std::shared_ptr<SliceBase> copy()
const
49 return std::make_shared<Slice>(*
this, this->_tube);
52 inline Index size()
const
54 return this->T::size();
62 inline const T& codomain()
const
64 return (
const T&)(*this);
67 inline bool is_gate()
const
69 return t0_tf().is_degenerated();
72 inline std::shared_ptr<const Slice<T>> prev_slice()
const
74 return std::static_pointer_cast<const Slice<T>>(
75 this->SliceBase::prev_slice());
78 inline std::shared_ptr<Slice<T>> prev_slice()
80 return std::const_pointer_cast<Slice<T>>(
81 static_cast<const Slice<T>&
>(*this).prev_slice());
84 inline std::shared_ptr<const Slice<T>> next_slice()
const
86 return std::static_pointer_cast<const Slice<T>>(
87 this->SliceBase::next_slice());
90 inline std::shared_ptr<Slice<T>> next_slice()
92 return std::const_pointer_cast<Slice<T>>(
93 static_cast<const Slice<T>&
>(*this).next_slice());
96 inline T input_gate()
const
103 if(prev_slice()->is_gate())
104 return prev_slice()->codomain();
106 return codomain() & prev_slice()->codomain();
110 inline T output_gate()
const
117 if(next_slice()->is_gate())
118 return next_slice()->codomain();
120 return codomain() & next_slice()->codomain();
124 std::pair<T,T> enclosed_bounds(
const Interval& t)
const
126 T x = *
this; x.set_empty();
127 auto bounds = std::make_pair(x,x);
129 if(t.lb() < t0_tf().lb() || t.ub() > t0_tf().ub())
131 x.init(Interval(-oo,0));
133 x.init(Interval(0,oo));
137 if(t.contains(t0_tf().lb()))
139 bounds.first |= input_gate().lb();
140 bounds.second |= input_gate().ub();
143 if(t.contains(t0_tf().ub()))
145 bounds.first |= output_gate().lb();
146 bounds.second |= output_gate().ub();
149 if(t.is_subset(t0_tf()) && t != t0_tf().lb() && t != t0_tf().ub())
151 bounds.first |= this->lb();
152 bounds.second |= this->ub();
158 inline void set(
const T& x)
169 inline void set_empty()
174 inline bool operator==(
const Slice& x)
const
176 return codomain() == x.codomain();
179 friend inline std::ostream& operator<<(std::ostream& os,
const Slice& x)
182 <<
"↦" << x.codomain()
189 template<
typename T_>
190 friend class SlicedTube;
192 inline void set(
const T& x,
bool propagate)
194 assert_release(x.size() == this->size());
197 update_adjacent_codomains();
200 inline void set_empty(
bool propagate)
202 this->T::set_empty();
204 update_adjacent_codomains();
207 inline void update_adjacent_codomains()
211 assert(prev_slice()->size() == this->size());
213 codomain() &= prev_slice()->codomain();
214 else if(prev_slice()->is_gate())
215 prev_slice()->codomain() &= codomain();
220 assert(next_slice()->size() == this->size());
222 codomain() &= next_slice()->codomain();
223 else if(next_slice()->is_gate())
224 next_slice()->codomain() &= codomain();