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 = xtl::mpl::
530 using backstrides_type = xtl::mpl::
532 using inner_strides_type = xtl::mpl::
534 using inner_backstrides_type = xtl::mpl::
536 using storage_type = xtl::mpl::eval_if_t<has_storage_type<E>, detail::expr_storage_type<E>,
make_invalid_type<>>;
538 using stepper =
typename E::stepper;
539 using const_stepper =
typename E::const_stepper;
541 using linear_iterator =
decltype(xt::linear_begin(std::declval<E&>()));
542 using const_linear_iterator =
decltype(xt::linear_begin(std::declval<const E&>()));
543 using reverse_linear_iterator = std::reverse_iterator<linear_iterator>;
544 using const_reverse_linear_iterator = std::reverse_iterator<const_linear_iterator>;
546 using bool_load_type =
typename E::bool_load_type;
548 static constexpr layout_type static_layout = E::static_layout;
554 template <
class... Args>
555 auto operator()(Args... args) ->
decltype(std::declval<E>()(args...))
557 return m_ptr->operator()(args...);
560 XTENSOR_FORWARD_CONST_METHOD(shape)
561 XTENSOR_FORWARD_CONST_METHOD(dimension)
562 XTENSOR_FORWARD_CONST_METHOD(size)
563 XTENSOR_FORWARD_CONST_METHOD(layout)
564 XTENSOR_FORWARD_CONST_METHOD(is_contiguous)
566 XTENSOR_FORWARD_ITERATOR_METHOD(begin)
567 XTENSOR_FORWARD_ITERATOR_METHOD(end)
568 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(begin)
569 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(end)
570 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(cbegin)
571 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(cend)
573 XTENSOR_FORWARD_ITERATOR_METHOD(rbegin)
574 XTENSOR_FORWARD_ITERATOR_METHOD(rend)
575 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(rbegin)
576 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(rend)
577 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(crbegin)
578 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(crend)
580 linear_iterator linear_begin()
noexcept
582 return xt::linear_begin(*m_ptr);
585 linear_iterator linear_end()
noexcept
587 return xt::linear_end(*m_ptr);
590 const_linear_iterator linear_begin()
const noexcept
592 return xt::linear_begin(*m_ptr);
595 const_linear_iterator linear_end()
const noexcept
597 return xt::linear_end(*m_ptr);
600 const_linear_iterator linear_cbegin()
const noexcept
602 return xt::linear_begin(*m_ptr);
605 const_linear_iterator linear_cend()
const noexcept
607 return xt::linear_end(*m_ptr);
610 reverse_linear_iterator linear_rbegin()
noexcept
612 return reverse_linear_iterator(linear_end());
615 reverse_linear_iterator linear_rend()
noexcept
617 return reverse_linear_iterator(linear_begin());
620 const_reverse_linear_iterator linear_rbegin()
const noexcept
622 return const_reverse_linear_iterator(linear_end());
625 const_reverse_linear_iterator linear_rend()
const noexcept
627 return const_reverse_linear_iterator(linear_begin());
630 const_reverse_linear_iterator linear_crbegin()
const noexcept
632 return const_reverse_linear_iterator(linear_cend());
635 const_reverse_linear_iterator linear_crend()
const noexcept
637 return const_reverse_linear_iterator(linear_cbegin());
640 template <
class T = E>
641 std::enable_if_t<has_strides<T>::value,
const inner_strides_type&> strides()
const
643 return m_ptr->strides();
646 template <
class T = E>
647 std::enable_if_t<has_strides<T>::value,
const inner_strides_type&> backstrides()
const
649 return m_ptr->backstrides();
652 template <
class T = E>
653 std::enable_if_t<has_data_interface<T>::value, pointer> data()
noexcept
655 return m_ptr->data();
658 template <
class T = E>
659 std::enable_if_t<has_data_interface<T>::value, pointer> data()
const noexcept
661 return m_ptr->data();
664 template <
class T = E>
665 std::enable_if_t<has_data_interface<T>::value, size_type> data_offset()
const noexcept
667 return m_ptr->data_offset();
670 template <
class T = E>
671 std::enable_if_t<has_data_interface<T>::value,
typename T::storage_type&> storage()
noexcept
673 return m_ptr->storage();
676 template <
class T = E>
677 std::enable_if_t<has_data_interface<T>::value,
const typename T::storage_type&> storage()
const noexcept
679 return m_ptr->storage();
683 reference element(It first, It last)
685 return m_ptr->element(first, last);
689 const_reference element(It first, It last)
const
691 return m_ptr->element(first, last);
695 bool broadcast_shape(S& shape,
bool reuse_cache =
false)
const
697 return m_ptr->broadcast_shape(shape, reuse_cache);
701 bool has_linear_assign(
const S& strides)
const noexcept
703 return m_ptr->has_linear_assign(strides);
707 auto stepper_begin(
const S& shape)
noexcept ->
decltype(std::declval<E>().stepper_begin(shape))
709 return m_ptr->stepper_begin(shape);
713 auto stepper_end(
const S& shape,
layout_type l)
noexcept
714 ->
decltype(std::declval<E>().stepper_end(shape, l))
716 return m_ptr->stepper_end(shape, l);
720 auto stepper_begin(
const S& shape)
const noexcept
721 ->
decltype(std::declval<const E>().stepper_begin(shape))
723 return static_cast<const E*
>(m_ptr.get())->stepper_begin(shape);
727 auto stepper_end(
const S& shape,
layout_type l)
const noexcept
728 ->
decltype(std::declval<const E>().stepper_end(shape, l))
730 return static_cast<const E*
>(m_ptr.get())->stepper_end(shape, l);
735 std::shared_ptr<E> m_ptr;