515 using base_class = xexpression<xshared_expression<E>>;
517 using value_type =
typename E::value_type;
518 using reference =
typename E::reference;
519 using const_reference =
typename E::const_reference;
520 using pointer =
typename E::pointer;
521 using const_pointer =
typename E::const_pointer;
522 using size_type =
typename E::size_type;
523 using difference_type =
typename E::difference_type;
525 using inner_shape_type =
typename E::inner_shape_type;
526 using shape_type =
typename E::shape_type;
528 using strides_type =
typename std::
530 using backstrides_type =
typename std::
532 using inner_strides_type =
typename std::
534 using inner_backstrides_type =
typename std::conditional_t<
536 detail::expr_inner_backstrides_type<E>,
538 using storage_type =
typename std::
539 conditional_t<container_expression<E>, detail::expr_storage_type<E>,
make_invalid_type<>>::type;
541 using stepper =
typename E::stepper;
542 using const_stepper =
typename E::const_stepper;
544 using linear_iterator =
decltype(xt::linear_begin(std::declval<E&>()));
545 using const_linear_iterator =
decltype(xt::linear_begin(std::declval<const E&>()));
546 using reverse_linear_iterator = std::reverse_iterator<linear_iterator>;
547 using const_reverse_linear_iterator = std::reverse_iterator<const_linear_iterator>;
549 using bool_load_type =
typename E::bool_load_type;
551 static constexpr layout_type static_layout = E::static_layout;
557 template <
class... Args>
558 auto operator()(Args... args) ->
decltype(std::declval<E>()(args...))
560 return m_ptr->operator()(args...);
563 XTENSOR_FORWARD_CONST_METHOD(shape)
564 XTENSOR_FORWARD_CONST_METHOD(dimension)
565 XTENSOR_FORWARD_CONST_METHOD(size)
566 XTENSOR_FORWARD_CONST_METHOD(layout)
567 XTENSOR_FORWARD_CONST_METHOD(is_contiguous)
569 XTENSOR_FORWARD_ITERATOR_METHOD(begin)
570 XTENSOR_FORWARD_ITERATOR_METHOD(end)
571 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(begin)
572 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(end)
573 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(cbegin)
574 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(cend)
576 XTENSOR_FORWARD_ITERATOR_METHOD(rbegin)
577 XTENSOR_FORWARD_ITERATOR_METHOD(rend)
578 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(rbegin)
579 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(rend)
580 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(crbegin)
581 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(crend)
583 linear_iterator linear_begin()
noexcept
585 return xt::linear_begin(*m_ptr);
588 linear_iterator linear_end()
noexcept
590 return xt::linear_end(*m_ptr);
593 const_linear_iterator linear_begin()
const noexcept
595 return xt::linear_begin(*m_ptr);
598 const_linear_iterator linear_end()
const noexcept
600 return xt::linear_end(*m_ptr);
603 const_linear_iterator linear_cbegin()
const noexcept
605 return xt::linear_begin(*m_ptr);
608 const_linear_iterator linear_cend()
const noexcept
610 return xt::linear_end(*m_ptr);
613 reverse_linear_iterator linear_rbegin()
noexcept
615 return reverse_linear_iterator(linear_end());
618 reverse_linear_iterator linear_rend()
noexcept
620 return reverse_linear_iterator(linear_begin());
623 const_reverse_linear_iterator linear_rbegin()
const noexcept
625 return const_reverse_linear_iterator(linear_end());
628 const_reverse_linear_iterator linear_rend()
const noexcept
630 return const_reverse_linear_iterator(linear_begin());
633 const_reverse_linear_iterator linear_crbegin()
const noexcept
635 return const_reverse_linear_iterator(linear_cend());
638 const_reverse_linear_iterator linear_crend()
const noexcept
640 return const_reverse_linear_iterator(linear_cbegin());
643 template <
class T = E>
644 std::enable_if_t<strided_expression<T>,
const inner_strides_type&> strides()
const
646 return m_ptr->strides();
649 template <
class T = E>
650 std::enable_if_t<strided_expression<T>,
const inner_strides_type&> backstrides()
const
652 return m_ptr->backstrides();
655 template <
class T = E>
656 std::enable_if_t<data_interface_expression<T>, pointer> data()
noexcept
658 return m_ptr->data();
661 template <
class T = E>
662 std::enable_if_t<data_interface_expression<T>, pointer> data()
const noexcept
664 return m_ptr->data();
667 template <
class T = E>
668 std::enable_if_t<data_interface_expression<T>, size_type> data_offset()
const noexcept
670 return m_ptr->data_offset();
673 template <
class T = E>
674 std::enable_if_t<data_interface_expression<T>,
typename T::storage_type&> storage()
noexcept
676 return m_ptr->storage();
679 template <
class T = E>
680 std::enable_if_t<data_interface_expression<T>,
const typename T::storage_type&> storage()
const noexcept
682 return m_ptr->storage();
686 reference element(It first, It last)
688 return m_ptr->element(first, last);
692 const_reference element(It first, It last)
const
694 return m_ptr->element(first, last);
698 bool broadcast_shape(S& shape,
bool reuse_cache =
false)
const
700 return m_ptr->broadcast_shape(shape, reuse_cache);
704 bool has_linear_assign(
const S& strides)
const noexcept
706 return m_ptr->has_linear_assign(strides);
710 auto stepper_begin(
const S& shape)
noexcept ->
decltype(std::declval<E>().stepper_begin(shape))
712 return m_ptr->stepper_begin(shape);
716 auto stepper_end(
const S& shape,
layout_type l)
noexcept
717 ->
decltype(std::declval<E>().stepper_end(shape, l))
719 return m_ptr->stepper_end(shape, l);
723 auto stepper_begin(
const S& shape)
const noexcept
724 ->
decltype(std::declval<const E>().stepper_begin(shape))
726 return static_cast<const E*
>(m_ptr.get())->stepper_begin(shape);
730 auto stepper_end(
const S& shape,
layout_type l)
const noexcept
731 ->
decltype(std::declval<const E>().stepper_end(shape, l))
733 return static_cast<const E*
>(m_ptr.get())->stepper_end(shape, l);
738 std::shared_ptr<E> m_ptr;