1
0
mirror of https://github.com/sendyne/cppreg.git synced 2025-05-09 15:14:05 +00:00

FIX FOR LOOP IMPLEMENTATION AND ADD RANGE LOOP

* Fixes a typo in the for_loop implementation.
* Add a range_loop implementation to help with indexed register pack.
This commit is contained in:
Nicolas Clauvelin 2018-03-13 11:01:34 -04:00
parent 49d19f1b20
commit ee48bbd261

View File

@ -160,8 +160,9 @@ namespace cppreg {
*/
template <typename... T>
struct PackIndexing {
using tuple_t = typename std::tuple<T...>;
template <std::size_t N>
using regs = typename std::tuple_element<N, std::tuple<T...>>::type;
using regs = typename std::tuple_element<N, tuple_t>::type;
};
@ -179,17 +180,17 @@ namespace cppreg {
*
* This will call Op for the range [start, end).
*/
template <template <std::size_t> class Op, typename T = void>
template <typename Op, typename T = void>
inline static void loop(
typename std::enable_if<start < end, T>::type* = nullptr
) {
Op<start>()();
Op().template operator()<start>();
if (start < end)
for_loop<start + 1, end>::template iterate<Op>();
for_loop<start + 1, end>::template loop<Op>();
};
//! Loop method closure.
template <template <std::size_t> class Op, typename T = void>
template <typename Op, typename T = void>
inline static void loop(
typename std::enable_if<start >= end, T>::type* = nullptr
) {};
@ -197,6 +198,16 @@ namespace cppreg {
};
//! Template range loop implementation.
/**
* @tparam IndexedPack Indexed pack type.
*/
template <typename IndexedPack>
struct range_loop : for_loop<
0, std::tuple_size<typename IndexedPack::tuple_t>::value
> {};
}