diff --git a/include/xtensor/xstrided_view.hpp b/include/xtensor/xstrided_view.hpp index 566d00d2e..40076de70 100644 --- a/include/xtensor/xstrided_view.hpp +++ b/include/xtensor/xstrided_view.hpp @@ -160,7 +160,7 @@ namespace xt using iterator = typename C::iterator; }; - template + template struct get_linear_iterator().linear_begin())>> : std::true_type { using iterator = typename C::linear_iterator; @@ -172,7 +172,7 @@ namespace xt using iterator = typename C::const_iterator; }; - template + template struct get_const_linear_iterator().linear_cbegin())>> : std::true_type { using iterator = typename C::const_linear_iterator; @@ -181,7 +181,8 @@ namespace xt using linear_iterator = typename get_linear_iterator::iterator; using const_linear_iterator = typename get_const_linear_iterator::iterator; using reverse_linear_iterator = std::reverse_iterator::iterator>; - using const_reverse_linear_iterator = std::reverse_iterator::iterator>; + using const_reverse_linear_iterator = std::reverse_iterator< + typename get_const_linear_iterator::iterator>; using iterable_base = select_iterable_base_t; using inner_shape_type = typename base_type::inner_shape_type; @@ -538,14 +539,15 @@ namespace xt inline auto xstrided_view::linear_cbegin() const -> const_linear_iterator { return xtl::mpl::static_if::value>( - [&](auto self) - { - return self(this->storage()).linear_cbegin() + static_cast(data_offset()); - }, - [&](auto self) - { - return self(this->storage()).cbegin() + static_cast(data_offset()); - }); + [&](auto self) + { + return self(this->storage()).linear_cbegin() + static_cast(data_offset()); + }, + [&](auto self) + { + return self(this->storage()).cbegin() + static_cast(data_offset()); + } + ); } template diff --git a/include/xtensor/xstrided_view_base.hpp b/include/xtensor/xstrided_view_base.hpp index 1b78863f7..e115fe01c 100644 --- a/include/xtensor/xstrided_view_base.hpp +++ b/include/xtensor/xstrided_view_base.hpp @@ -96,7 +96,8 @@ namespace xt using linear_iterator = decltype(std::declval>().linear_begin()); using const_linear_iterator = decltype(std::declval>().linear_cbegin()); - using reverse_linear_iterator = decltype(std::declval>().linear_rbegin()); + using reverse_linear_iterator = decltype(std::declval>().linear_rbegin() + ); using const_reverse_linear_iterator = decltype(std::declval>().linear_crbegin()); @@ -134,7 +135,6 @@ namespace xt template struct is_linear_flat_expression_adaptor : std::false_type { - }; template @@ -143,10 +143,11 @@ namespace xt }; template - struct provides_data_interface - : xtl::conjunction>, xtl::negation>, xtl::negation>> + struct provides_data_interface : xtl::conjunction< + has_data_interface>, + xtl::negation>, + xtl::negation>> { - }; } @@ -304,9 +305,10 @@ namespace xt template struct flat_adaptor_getter { - using type = std::conditional_t>::value && !force, - linear_flat_expression_adaptor, L>, - flat_expression_adaptor, L>>; + using type = std::conditional_t< + detail::has_linear_iterator>::value && !force, + linear_flat_expression_adaptor, L>, + flat_expression_adaptor, L>>; using reference = std::add_lvalue_reference_t; template @@ -635,7 +637,7 @@ namespace xt */ template inline auto xstrided_view_base::storage() const noexcept -> const storage_type& - { + { return m_storage; } @@ -850,22 +852,20 @@ namespace xt return index; } - template + template inline linear_flat_expression_adaptor::linear_flat_expression_adaptor(CT* e) - : - flat_expression_adaptor(e), - m_e(e) + : flat_expression_adaptor(e) + , m_e(e) { } template template inline linear_flat_expression_adaptor::linear_flat_expression_adaptor(CT* e, FST&& strides) - : flat_expression_adaptor(e, strides) + : flat_expression_adaptor(e, strides) , m_e(e) , m_strides(xtl::forward_sequence(strides)) { - } template