Skip to content

Commit 7781852

Browse files
committed
Removed impl functions in favor of std::apply
1 parent 9a37673 commit 7781852

File tree

1 file changed

+35
-108
lines changed

1 file changed

+35
-108
lines changed

include/xtensor/core/xfunction.hpp

Lines changed: 35 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)