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 =
typename E::linear_iterator;
542 using const_linear_iterator =
typename E::const_linear_iterator;
544 using bool_load_type =
typename E::bool_load_type;
546 static constexpr layout_type static_layout = E::static_layout;
552 template <
class... Args>
553 auto operator()(Args... args) ->
decltype(std::declval<E>()(args...))
555 return m_ptr->operator()(args...);
558 XTENSOR_FORWARD_CONST_METHOD(shape)
559 XTENSOR_FORWARD_CONST_METHOD(dimension)
560 XTENSOR_FORWARD_CONST_METHOD(size)
561 XTENSOR_FORWARD_CONST_METHOD(layout)
562 XTENSOR_FORWARD_CONST_METHOD(is_contiguous)
564 XTENSOR_FORWARD_ITERATOR_METHOD(begin)
565 XTENSOR_FORWARD_ITERATOR_METHOD(end)
566 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(begin)
567 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(end)
568 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(cbegin)
569 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(cend)
571 XTENSOR_FORWARD_ITERATOR_METHOD(rbegin)
572 XTENSOR_FORWARD_ITERATOR_METHOD(rend)
573 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(rbegin)
574 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(rend)
575 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(crbegin)
576 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(crend)
578 XTENSOR_FORWARD_METHOD(linear_begin)
579 XTENSOR_FORWARD_METHOD(linear_end)
580 XTENSOR_FORWARD_CONST_METHOD(linear_begin)
581 XTENSOR_FORWARD_CONST_METHOD(linear_end)
582 XTENSOR_FORWARD_CONST_METHOD(linear_cbegin)
583 XTENSOR_FORWARD_CONST_METHOD(linear_cend)
585 XTENSOR_FORWARD_METHOD(linear_rbegin)
586 XTENSOR_FORWARD_METHOD(linear_rend)
587 XTENSOR_FORWARD_CONST_METHOD(linear_rbegin)
588 XTENSOR_FORWARD_CONST_METHOD(linear_rend)
589 XTENSOR_FORWARD_CONST_METHOD(linear_crbegin)
590 XTENSOR_FORWARD_CONST_METHOD(linear_crend)
592 template <
class T = E>
593 std::enable_if_t<has_strides<T>::value,
const inner_strides_type&> strides()
const
595 return m_ptr->strides();
598 template <
class T = E>
599 std::enable_if_t<has_strides<T>::value,
const inner_strides_type&> backstrides()
const
601 return m_ptr->backstrides();
604 template <
class T = E>
605 std::enable_if_t<has_data_interface<T>::value, pointer> data()
noexcept
607 return m_ptr->data();
610 template <
class T = E>
611 std::enable_if_t<has_data_interface<T>::value, pointer> data()
const noexcept
613 return m_ptr->data();
616 template <
class T = E>
617 std::enable_if_t<has_data_interface<T>::value, size_type> data_offset()
const noexcept
619 return m_ptr->data_offset();
622 template <
class T = E>
623 std::enable_if_t<has_data_interface<T>::value,
typename T::storage_type&> storage()
noexcept
625 return m_ptr->storage();
628 template <
class T = E>
629 std::enable_if_t<has_data_interface<T>::value,
const typename T::storage_type&> storage()
const noexcept
631 return m_ptr->storage();
635 reference element(It first, It last)
637 return m_ptr->element(first, last);
641 const_reference element(It first, It last)
const
643 return m_ptr->element(first, last);
647 bool broadcast_shape(S& shape,
bool reuse_cache =
false)
const
649 return m_ptr->broadcast_shape(shape, reuse_cache);
653 bool has_linear_assign(
const S& strides)
const noexcept
655 return m_ptr->has_linear_assign(strides);
659 auto stepper_begin(
const S& shape)
noexcept ->
decltype(std::declval<E>().stepper_begin(shape))
661 return m_ptr->stepper_begin(shape);
665 auto stepper_end(
const S& shape,
layout_type l)
noexcept
666 ->
decltype(std::declval<E>().stepper_end(shape, l))
668 return m_ptr->stepper_end(shape, l);
672 auto stepper_begin(
const S& shape)
const noexcept
673 ->
decltype(std::declval<const E>().stepper_begin(shape))
675 return static_cast<const E*
>(m_ptr.get())->stepper_begin(shape);
679 auto stepper_end(
const S& shape,
layout_type l)
const noexcept
680 ->
decltype(std::declval<const E>().stepper_end(shape, l))
682 return static_cast<const E*
>(m_ptr.get())->stepper_end(shape, l);
687 std::shared_ptr<E> m_ptr;