39 class xoptional_assembly_base :
private xiterable<D>
43 using self_type = xoptional_assembly_base<D>;
44 using derived_type = D;
47 using raw_value_expression =
typename inner_types::raw_value_expression;
48 using base_value_type =
typename raw_value_expression::value_type;
49 using base_reference =
typename raw_value_expression::reference;
50 using base_const_reference =
typename raw_value_expression::const_reference;
52 using raw_flag_expression =
typename inner_types::raw_flag_expression;
53 using flag_type =
typename raw_flag_expression::value_type;
54 using flag_reference =
typename raw_flag_expression::reference;
55 using flag_const_reference =
typename raw_flag_expression::const_reference;
57 using storage_type =
typename inner_types::storage_type;
59 using value_type =
typename storage_type::value_type;
60 using reference =
typename storage_type::reference;
61 using const_reference =
typename storage_type::const_reference;
62 using pointer =
typename storage_type::pointer;
63 using const_pointer =
typename storage_type::const_pointer;
64 using size_type =
typename raw_value_expression::size_type;
65 using difference_type =
typename raw_value_expression::difference_type;
66 using simd_value_type = xt_simd::simd_type<value_type>;
67 using bool_load_type = xt::bool_load_type<value_type>;
69 using shape_type =
typename raw_value_expression::shape_type;
70 using strides_type =
typename raw_value_expression::strides_type;
71 using backstrides_type =
typename raw_value_expression::backstrides_type;
73 using inner_shape_type =
typename raw_value_expression::inner_shape_type;
74 using inner_strides_type =
typename raw_value_expression::inner_strides_type;
75 using inner_backstrides_type =
typename raw_value_expression::inner_backstrides_type;
78 using stepper =
typename iterable_base::stepper;
79 using const_stepper =
typename iterable_base::const_stepper;
81 static constexpr layout_type static_layout = raw_value_expression::static_layout;
82 static constexpr bool contiguous_layout = raw_value_expression::contiguous_layout;
85 using value_expression = raw_value_expression&;
86 using flag_expression = raw_flag_expression&;
87 using const_value_expression =
const raw_value_expression&;
88 using const_flag_expression =
const raw_flag_expression&;
90 template <layout_type L>
91 using layout_iterator =
typename iterable_base::template layout_iterator<L>;
92 template <layout_type L>
93 using const_layout_iterator =
typename iterable_base::template const_layout_iterator<L>;
94 template <layout_type L>
95 using reverse_layout_iterator =
typename iterable_base::template reverse_layout_iterator<L>;
96 template <layout_type L>
97 using const_reverse_layout_iterator =
typename iterable_base::template const_reverse_layout_iterator<L>;
99 template <
class S, layout_type L>
100 using broadcast_iterator =
typename iterable_base::template broadcast_iterator<S, L>;
101 template <
class S, layout_type L>
102 using const_broadcast_iterator =
typename iterable_base::template const_broadcast_iterator<S, L>;
103 template <
class S, layout_type L>
104 using reverse_broadcast_iterator =
typename iterable_base::template reverse_broadcast_iterator<S, L>;
105 template <
class S, layout_type L>
106 using const_reverse_broadcast_iterator =
typename iterable_base::template const_reverse_broadcast_iterator<S, L>;
108 using linear_iterator =
typename storage_type::iterator;
109 using const_linear_iterator =
typename storage_type::const_iterator;
110 using reverse_linear_iterator =
typename storage_type::reverse_iterator;
111 using const_reverse_linear_iterator =
typename storage_type::const_reverse_iterator;
113 using iterator =
typename iterable_base::iterator;
114 using const_iterator =
typename iterable_base::const_iterator;
115 using reverse_iterator =
typename iterable_base::reverse_iterator;
116 using const_reverse_iterator =
typename iterable_base::const_reverse_iterator;
118 size_type
size() const noexcept;
120 const inner_shape_type&
shape() const noexcept;
121 size_type
shape(size_type index) const;
122 const inner_strides_type&
strides() const noexcept;
125 template <class S = shape_type>
127 template <class S = shape_type>
129 template <class S = shape_type>
132 template <class S = shape_type>
139 bool is_contiguous() const noexcept;
144 template <class... Args>
145 reference operator()(Args... args);
147 template <class... Args>
148 const_reference operator()(Args... args) const;
150 template <class... Args>
151 reference at(Args... args);
153 template <class... Args>
154 const_reference at(Args... args) const;
156 template <class... Args>
157 reference unchecked(Args... args);
159 template <class... Args>
160 const_reference unchecked(Args... args) const;
163 disable_integral_t<S, reference> operator[](const S& index);
165 reference operator[](std::initializer_list<I> index);
166 reference operator[](size_type i);
169 disable_integral_t<S, const_reference> operator[](const S& index) const;
171 const_reference operator[](std::initializer_list<I> index) const;
172 const_reference operator[](size_type i) const;
174 template <class... Args>
175 reference periodic(Args... args);
177 template <class... Args>
178 const_reference periodic(Args... args) const;
186 reference
flat(size_type args);
187 const_reference
flat(size_type args) const;
190 reference element(It first, It last);
192 const_reference element(It first, It last) const;
194 template <class... Args>
197 storage_type& storage() noexcept;
198 const storage_type& storage() const noexcept;
200 value_type* data() noexcept;
201 const value_type* data() const noexcept;
202 const size_type data_offset() const noexcept;
210 using iterable_base::begin;
211 using iterable_base::cbegin;
212 using iterable_base::cend;
213 using iterable_base::crbegin;
214 using iterable_base::crend;
215 using iterable_base::end;
216 using iterable_base::rbegin;
217 using iterable_base::rend;
219 linear_iterator linear_begin() noexcept;
220 linear_iterator linear_end() noexcept;
222 const_linear_iterator linear_begin() const noexcept;
223 const_linear_iterator linear_end() const noexcept;
224 const_linear_iterator linear_cbegin() const noexcept;
225 const_linear_iterator linear_cend() const noexcept;
227 reverse_linear_iterator linear_rbegin() noexcept;
228 reverse_linear_iterator linear_rend() noexcept;
230 const_reverse_linear_iterator linear_rbegin() const noexcept;
231 const_reverse_linear_iterator linear_rend() const noexcept;
232 const_reverse_linear_iterator linear_crbegin() const noexcept;
233 const_reverse_linear_iterator linear_crend() const noexcept;
236 stepper stepper_begin(const S&
shape) noexcept;
241 const_stepper stepper_begin(const S&
shape) const noexcept;
246 const_value_expression
value() const noexcept;
253 xoptional_assembly_base() = default;
254 ~xoptional_assembly_base() = default;
256 xoptional_assembly_base(const xoptional_assembly_base&) = default;
257 xoptional_assembly_base& operator=(const xoptional_assembly_base&) = default;
259 xoptional_assembly_base(xoptional_assembly_base&&) = default;
260 xoptional_assembly_base& operator=(xoptional_assembly_base&&) = default;
264 derived_type& derived_cast() noexcept;
265 const derived_type& derived_cast() const noexcept;
276 class xoptional_assembly_stepper
280 using self_type = xoptional_assembly_stepper<D, is_const>;
281 using assembly_type =
typename D::assembly_type;
282 using value_type =
typename assembly_type::value_type;
283 using reference = std::
284 conditional_t<is_const, typename assembly_type::const_reference, typename assembly_type::reference>;
285 using pointer = std::conditional_t<is_const, typename assembly_type::const_pointer, typename assembly_type::pointer>;
286 using size_type =
typename assembly_type::size_type;
287 using difference_type =
typename assembly_type::difference_type;
288 using raw_value_expression =
typename assembly_type::raw_value_expression;
289 using raw_flag_expression =
typename assembly_type::raw_flag_expression;
290 using value_stepper = std::
291 conditional_t<is_const, typename raw_value_expression::const_stepper, typename raw_value_expression::stepper>;
292 using flag_stepper = std::
293 conditional_t<is_const, typename raw_flag_expression::const_stepper, typename raw_flag_expression::stepper>;
295 xoptional_assembly_stepper(value_stepper vs, flag_stepper fs)
noexcept;
298 void step(size_type dim);
299 void step_back(size_type dim);
300 void step(size_type dim, size_type n);
301 void step_back(size_type dim, size_type n);
302 void reset(size_type dim);
303 void reset_back(size_type dim);