@@ -355,24 +355,6 @@ namespace xt
355355
356356 private:
357357
358- template <std::size_t ... I>
359- layout_type layout_impl (std::index_sequence<I...>) const noexcept ;
360-
361- template <std::size_t ... I, class ... Args>
362- const_reference access_impl (std::index_sequence<I...>, Args... args) const ;
363-
364- template <std::size_t ... I, class ... Args>
365- const_reference unchecked_impl (std::index_sequence<I...>, Args... args) const ;
366-
367- template <std::size_t ... I, class It >
368- const_reference element_access_impl (std::index_sequence<I...>, It first, It last) const ;
369-
370- template <std::size_t ... I>
371- const_reference data_element_impl (std::index_sequence<I...>, size_type i) const ;
372-
373- template <class align , class requested_type , std::size_t N, std::size_t ... I>
374- auto load_simd_impl (std::index_sequence<I...>, size_type i) const ;
375-
376358 template <class Func , std::size_t ... I>
377359 const_stepper build_stepper (Func&& f, std::index_sequence<I...>) const noexcept ;
378360
@@ -437,9 +419,6 @@ namespace xt
437419
438420 using data_type = std::tuple<decltype (xt::linear_begin(std::declval<const std::decay_t <CT>>()))...>;
439421
440- template <std::size_t ... I>
441- reference deref_impl (std::index_sequence<I...>) const ;
442-
443422 template <std::size_t ... I>
444423 difference_type
445424 tuple_max_diff (std::index_sequence<I...>, const data_type& lhs, const data_type& rhs) const ;
@@ -499,13 +478,6 @@ namespace xt
499478 void step_leading ();
500479
501480 private:
502-
503- template <std::size_t ... I>
504- reference deref_impl (std::index_sequence<I...>) const ;
505-
506- template <class T , std::size_t ... I>
507- simd_return_type<T> step_simd_impl (std::index_sequence<I...>);
508-
509481 const xfunction_type* p_f;
510482 std::tuple<typename std::decay_t <CT>::const_stepper...> m_st;
511483 };
@@ -593,7 +565,9 @@ namespace xt
593565 template <class F , class ... CT>
594566 inline layout_type xfunction<F, CT...>::layout() const noexcept
595567 {
596- return layout_impl (std::make_index_sequence<sizeof ...(CT)>());
568+ return std::apply ([&](auto &... e){
569+ return compute_layout (e.layout ()...);
570+ }, m_e);
597571 }
598572
599573 template <class F , class ... CT>
@@ -628,7 +602,13 @@ namespace xt
628602 {
629603 // The static cast prevents the compiler from instantiating the template methods with signed integers,
630604 // leading to warning about signed/unsigned conversions in the deeper layers of the access methods
631- return access_impl (std::make_index_sequence<sizeof ...(CT)>(), static_cast <size_type>(args)...);
605+
606+ return std::apply ([&](auto &... e){
607+ XTENSOR_TRY (check_index (shape (), args...));
608+ XTENSOR_CHECK_DIMENSION (shape (), args...);
609+ return m_f (e (args...)...);
610+
611+ }, m_e);
632612 }
633613
634614 /* *
@@ -643,7 +623,9 @@ namespace xt
643623 template <class F , class ... CT>
644624 inline auto xfunction<F, CT...>::flat(size_type index) const -> const_reference
645625 {
646- return data_element_impl (std::make_index_sequence<sizeof ...(CT)>(), index);
626+ return std::apply ([&](auto &... e){
627+ return m_f (e.data_element (index)...);
628+ }, m_e);
647629 }
648630
649631 /* *
@@ -671,7 +653,9 @@ namespace xt
671653 {
672654 // The static cast prevents the compiler from instantiating the template methods with signed integers,
673655 // leading to warning about signed/unsigned conversions in the deeper layers of the access methods
674- return unchecked_impl (std::make_index_sequence<sizeof ...(CT)>(), static_cast <size_type>(args)...);
656+ return std::apply ([&](const auto &... e){
657+ return m_f (e.unchecked (static_cast <size_type>(args)...)...);
658+ }, m_e);
675659 }
676660
677661 /* *
@@ -685,7 +669,10 @@ namespace xt
685669 template <class It >
686670 inline auto xfunction<F, CT...>::element(It first, It last) const -> const_reference
687671 {
688- return element_access_impl (std::make_index_sequence<sizeof ...(CT)>(), first, last);
672+ std::apply ([&](auto &... e){
673+ XTENSOR_TRY (check_element_index (shape (), first, last));
674+ return m_f (e.element (first, last)...);
675+ }, m_e);
689676 }
690677
691678 // @}
@@ -819,7 +806,9 @@ namespace xt
819806 template <class F , class ... CT>
820807 inline auto xfunction<F, CT...>::data_element(size_type i) const -> const_reference
821808 {
822- return data_element_impl (std::make_index_sequence<sizeof ...(CT)>(), i);
809+ return std::apply ([&](auto &... e){
810+ return m_f (e.data_element (i)...);
811+ }, m_e);
823812 }
824813
825814 template <class F , class ... CT>
@@ -833,7 +822,9 @@ namespace xt
833822 template <class align , class requested_type , std::size_t N>
834823 inline auto xfunction<F, CT...>::load_simd(size_type i) const -> simd_return_type<requested_type>
835824 {
836- return load_simd_impl<align, requested_type, N>(std::make_index_sequence<sizeof ...(CT)>(), i);
825+ return std::apply ([&](auto &... e){
826+ return m_f.simd_apply ((e.template load_simd <align, requested_type>(i))...);
827+ },m_e);
837828 }
838829
839830 template <class F , class ... CT>
@@ -848,55 +839,6 @@ namespace xt
848839 return m_f;
849840 }
850841
851- template <class F , class ... CT>
852- template <std::size_t ... I>
853- inline layout_type xfunction<F, CT...>::layout_impl(std::index_sequence<I...>) const noexcept
854- {
855- return compute_layout (std::get<I>(m_e).layout ()...);
856- }
857-
858- template <class F , class ... CT>
859- template <std::size_t ... I, class ... Args>
860- inline auto xfunction<F, CT...>::access_impl(std::index_sequence<I...>, Args... args) const
861- -> const_reference
862- {
863- XTENSOR_TRY (check_index (shape (), args...));
864- XTENSOR_CHECK_DIMENSION (shape (), args...);
865- return m_f (std::get<I>(m_e)(args...)...);
866- }
867-
868- template <class F , class ... CT>
869- template <std::size_t ... I, class ... Args>
870- inline auto xfunction<F, CT...>::unchecked_impl(std::index_sequence<I...>, Args... args) const
871- -> const_reference
872- {
873- return m_f (std::get<I>(m_e).unchecked (args...)...);
874- }
875-
876- template <class F , class ... CT>
877- template <std::size_t ... I, class It >
878- inline auto xfunction<F, CT...>::element_access_impl(std::index_sequence<I...>, It first, It last) const
879- -> const_reference
880- {
881- XTENSOR_TRY (check_element_index (shape (), first, last));
882- return m_f ((std::get<I>(m_e).element (first, last))...);
883- }
884-
885- template <class F , class ... CT>
886- template <std::size_t ... I>
887- inline auto xfunction<F, CT...>::data_element_impl(std::index_sequence<I...>, size_type i) const
888- -> const_reference
889- {
890- return m_f ((std::get<I>(m_e).data_element (i))...);
891- }
892-
893- template <class F , class ... CT>
894- template <class align , class requested_type , std::size_t N, std::size_t ... I>
895- inline auto xfunction<F, CT...>::load_simd_impl(std::index_sequence<I...>, size_type i) const
896- {
897- return m_f.simd_apply ((std::get<I>(m_e).template load_simd <align, requested_type>(i))...);
898- }
899-
900842 template <class F , class ... CT>
901843 template <class Func , std::size_t ... I>
902844 inline auto xfunction<F, CT...>::build_stepper(Func&& f, std::index_sequence<I...>) const noexcept
@@ -987,7 +929,9 @@ namespace xt
987929 template <class F , class ... CT>
988930 inline auto xfunction_iterator<F, CT...>::operator *() const -> reference
989931 {
990- return deref_impl (std::make_index_sequence<sizeof ...(CT)>());
932+ return std::apply ([&](auto &... it){
933+ return (p_f->m_f )(*it...);
934+ }, m_it);
991935 }
992936
993937 template <class F , class ... CT>
@@ -1010,13 +954,6 @@ namespace xt
1010954 return std::get<index>(m_it) < std::get<index>(rhs.m_it );
1011955 }
1012956
1013- template <class F , class ... CT>
1014- template <std::size_t ... I>
1015- inline auto xfunction_iterator<F, CT...>::deref_impl(std::index_sequence<I...>) const -> reference
1016- {
1017- return (p_f->m_f )(*std::get<I>(m_it)...);
1018- }
1019-
1020957 template <class F , class ... CT>
1021958 template <std::size_t ... I>
1022959 inline auto xfunction_iterator<F, CT...>::tuple_max_diff(
@@ -1140,28 +1077,18 @@ namespace xt
11401077 template <class F , class ... CT>
11411078 inline auto xfunction_stepper<F, CT...>::operator *() const -> reference
11421079 {
1143- return deref_impl (std::make_index_sequence<sizeof ...(CT)>());
1144- }
1145-
1146- template <class F , class ... CT>
1147- template <std::size_t ... I>
1148- inline auto xfunction_stepper<F, CT...>::deref_impl(std::index_sequence<I...>) const -> reference
1149- {
1150- return (p_f->m_f )(*std::get<I>(m_st)...);
1151- }
1152-
1153- template <class F , class ... CT>
1154- template <class T , std::size_t ... I>
1155- inline auto xfunction_stepper<F, CT...>::step_simd_impl(std::index_sequence<I...>) -> simd_return_type<T>
1156- {
1157- return (p_f->m_f .simd_apply )(std::get<I>(m_st).template step_simd <T>()...);
1080+ return std::apply ([&](auto &... e){
1081+ return (p_f->m_f )(*e...);
1082+ }, m_st);
11581083 }
11591084
11601085 template <class F , class ... CT>
11611086 template <class T >
11621087 inline auto xfunction_stepper<F, CT...>::step_simd() -> simd_return_type<T>
11631088 {
1164- return step_simd_impl<T>(std::make_index_sequence<sizeof ...(CT)>());
1089+ return std::apply ([&](auto &... st){
1090+ return (p_f->m_f .simd_apply )(st.template step_simd <T>()...);
1091+ }, m_st);
11651092 }
11661093
11671094 template <class F , class ... CT>
0 commit comments