513 using base_class = xexpression<xshared_expression<E>>;
515 using value_type =
typename E::value_type;
516 using reference =
typename E::reference;
517 using const_reference =
typename E::const_reference;
518 using pointer =
typename E::pointer;
519 using const_pointer =
typename E::const_pointer;
520 using size_type =
typename E::size_type;
521 using difference_type =
typename E::difference_type;
523 using inner_shape_type =
typename E::inner_shape_type;
524 using shape_type =
typename E::shape_type;
526 using strides_type = xtl::mpl::
528 using backstrides_type = xtl::mpl::
530 using inner_strides_type = xtl::mpl::
532 using inner_backstrides_type = xtl::mpl::
534 using storage_type = xtl::mpl::eval_if_t<has_storage_type<E>, detail::expr_storage_type<E>,
make_invalid_type<>>;
536 using stepper =
typename E::stepper;
537 using const_stepper =
typename E::const_stepper;
539 using linear_iterator =
typename E::linear_iterator;
540 using const_linear_iterator =
typename E::const_linear_iterator;
542 using bool_load_type =
typename E::bool_load_type;
544 static constexpr layout_type static_layout = E::static_layout;
550 template <
class... Args>
551 auto operator()(Args... args) ->
decltype(std::declval<E>()(args...))
553 return m_ptr->operator()(args...);
556 XTENSOR_FORWARD_CONST_METHOD(shape)
557 XTENSOR_FORWARD_CONST_METHOD(dimension)
558 XTENSOR_FORWARD_CONST_METHOD(size)
559 XTENSOR_FORWARD_CONST_METHOD(layout)
560 XTENSOR_FORWARD_CONST_METHOD(is_contiguous)
562 XTENSOR_FORWARD_ITERATOR_METHOD(begin)
563 XTENSOR_FORWARD_ITERATOR_METHOD(end)
564 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(begin)
565 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(end)
566 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(cbegin)
567 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(cend)
569 XTENSOR_FORWARD_ITERATOR_METHOD(rbegin)
570 XTENSOR_FORWARD_ITERATOR_METHOD(rend)
571 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(rbegin)
572 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(rend)
573 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(crbegin)
574 XTENSOR_FORWARD_CONST_ITERATOR_METHOD(crend)
576 XTENSOR_FORWARD_METHOD(linear_begin)
577 XTENSOR_FORWARD_METHOD(linear_end)
578 XTENSOR_FORWARD_CONST_METHOD(linear_begin)
579 XTENSOR_FORWARD_CONST_METHOD(linear_end)
580 XTENSOR_FORWARD_CONST_METHOD(linear_cbegin)
581 XTENSOR_FORWARD_CONST_METHOD(linear_cend)
583 XTENSOR_FORWARD_METHOD(linear_rbegin)
584 XTENSOR_FORWARD_METHOD(linear_rend)
585 XTENSOR_FORWARD_CONST_METHOD(linear_rbegin)
586 XTENSOR_FORWARD_CONST_METHOD(linear_rend)
587 XTENSOR_FORWARD_CONST_METHOD(linear_crbegin)
588 XTENSOR_FORWARD_CONST_METHOD(linear_crend)
590 template <
class T = E>
591 std::enable_if_t<has_strides<T>::value,
const inner_strides_type&> strides()
const
593 return m_ptr->strides();
596 template <
class T = E>
597 std::enable_if_t<has_strides<T>::value,
const inner_strides_type&> backstrides()
const
599 return m_ptr->backstrides();
602 template <
class T = E>
603 std::enable_if_t<has_data_interface<T>::value, pointer> data()
noexcept
605 return m_ptr->data();
608 template <
class T = E>
609 std::enable_if_t<has_data_interface<T>::value, pointer> data()
const noexcept
611 return m_ptr->data();
614 template <
class T = E>
615 std::enable_if_t<has_data_interface<T>::value, size_type> data_offset()
const noexcept
617 return m_ptr->data_offset();
620 template <
class T = E>
621 std::enable_if_t<has_data_interface<T>::value,
typename T::storage_type&> storage()
noexcept
623 return m_ptr->storage();
626 template <
class T = E>
627 std::enable_if_t<has_data_interface<T>::value,
const typename T::storage_type&> storage()
const noexcept
629 return m_ptr->storage();
633 reference element(It first, It last)
635 return m_ptr->element(first, last);
639 const_reference element(It first, It last)
const
641 return m_ptr->element(first, last);
645 bool broadcast_shape(S& shape,
bool reuse_cache =
false)
const
647 return m_ptr->broadcast_shape(shape, reuse_cache);
651 bool has_linear_assign(
const S& strides)
const noexcept
653 return m_ptr->has_linear_assign(strides);
657 auto stepper_begin(
const S& shape)
noexcept ->
decltype(std::declval<E>().stepper_begin(shape))
659 return m_ptr->stepper_begin(shape);
663 auto stepper_end(
const S& shape,
layout_type l)
noexcept
664 ->
decltype(std::declval<E>().stepper_end(shape, l))
666 return m_ptr->stepper_end(shape, l);
670 auto stepper_begin(
const S& shape)
const noexcept
671 ->
decltype(std::declval<const E>().stepper_begin(shape))
673 return static_cast<const E*
>(m_ptr.get())->stepper_begin(shape);
677 auto stepper_end(
const S& shape,
layout_type l)
const noexcept
678 ->
decltype(std::declval<const E>().stepper_end(shape, l))
680 return static_cast<const E*
>(m_ptr.get())->stepper_end(shape, l);
685 std::shared_ptr<E> m_ptr;