@@ -108,7 +108,13 @@ struct bind_front_t {
108108
109109 // bind_front_t(multi::index idx, Proj& proj) : idx_{idx}, proj_{proj} {}
110110 template <class ... Args>
111- BOOST_MULTI_HD constexpr auto operator ()(Args&&... rest) const noexcept { return proj_ (idx_, std::forward<Args>(rest)...); }
111+ BOOST_MULTI_HD constexpr auto operator ()(Args&&... rest) const & noexcept { return proj_ (idx_, std::forward<Args>(rest)...); }
112+
113+ template <class ... Args>
114+ BOOST_MULTI_HD constexpr auto operator ()(Args&&... rest)& noexcept { return proj_ (idx_, std::forward<Args>(rest)...); }
115+
116+ template <class ... Args>
117+ BOOST_MULTI_HD constexpr auto operator ()(Args&&... rest)&& noexcept { return proj_ (idx_, std::forward<Args>(rest)...); }
112118};
113119
114120template <dimensionality_type D, class Proj >
@@ -419,6 +425,18 @@ class restriction : std::conditional_t<std::is_reference_v<Proj>, detail::non_co
419425 }
420426 }
421427
428+ BOOST_MULTI_HD constexpr auto operator [](index idx) & -> decltype (auto ) {
429+ // assert( extent().contains(idx) );
430+ if constexpr (D != 1 ) {
431+ // auto ll = [idx, proj = proj_](auto... rest) { return proj(idx, rest...); };
432+ // return restriction<D - 1, decltype(ll)>(extents_t<D - 1>(xs_.base().tail()), ll);
433+ // return [idx, proj = proj_](auto... rest) noexcept { return proj(idx, rest...); } ^ extents_t<D - 1>(xs_.base().tail());
434+ return bind_front_t <Proj>{idx, proj_} ^ extents_t <D - 1 >(xs_.base ().tail ());
435+ } else {
436+ return proj_ (idx);
437+ }
438+ }
439+
422440 BOOST_MULTI_HD constexpr auto operator [](index idx) const & -> decltype (auto ) {
423441 // assert( extent().contains(idx) );
424442 if constexpr (D != 1 ) {
0 commit comments