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);