diff options
author | Mateusz Chudyk <mateuszchudyk@gmail.com> | 2020-04-02 16:35:09 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-02 16:35:09 +0300 |
commit | 12078cfe5f758256303d540eb1e768dad3ccc591 (patch) | |
tree | b16779d1e7b3fc9c7b8c0f2da0a720c5badcc838 | |
parent | 6779e6aac623422a66ddc02c4fb1ba73927fdad2 (diff) | |
parent | 0540b99ebdc65421904bb5fe41eb364041cf0283 (diff) |
Merge pull request #76 from kpu/static-loop-empty-iterator
Add support for empty iterator to static loop
-rw-r--r-- | test/utils_test.cc | 6 | ||||
-rw-r--r-- | utils.h | 9 |
2 files changed, 10 insertions, 5 deletions
diff --git a/test/utils_test.cc b/test/utils_test.cc index 9c2fb06..0281802 100644 --- a/test/utils_test.cc +++ b/test/utils_test.cc @@ -41,6 +41,12 @@ struct StaticLoopTest { } }; +TEST_CASE("Static loop (N = 0)",) { + Index result = 128; + StaticLoop<StaticLoopTest, MakeStaticLoopIterator<0>>(result); + CHECK(result == 128); +} + TEST_CASE("Static loop (N = 1)",) { Index result = 128; StaticLoop<StaticLoopTest, MakeStaticLoopIterator<1>>(result); @@ -141,7 +141,7 @@ public: /* * Last iterator */ - using last = StaticLoopIterator<total_iterations - 1, Ns...>; + using end = StaticLoopIterator<total_iterations, Ns...>; }; /* @@ -188,12 +188,11 @@ using MakeStaticLoopIterator = StaticLoopIterator<0, Ns...>; * [4, 1] Test 1 * */ -template <typename Body, typename StaticLoopIterator, typename std::enable_if<std::is_same<StaticLoopIterator, typename StaticLoopIterator::last>::value>::type* = nullptr, typename... Args> -__attribute__((always_inline)) static inline void StaticLoop(Args&&... args) { - Body::template body<StaticLoopIterator>(std::forward<Args>(args)...); +template <typename Body, typename StaticLoopIterator, typename std::enable_if<std::is_same<StaticLoopIterator, typename StaticLoopIterator::end>::value>::type* = nullptr, typename... Args> +__attribute__((always_inline)) static inline void StaticLoop(Args&&...) { } -template <typename Body, typename StaticLoopIterator, typename std::enable_if<!std::is_same<StaticLoopIterator, typename StaticLoopIterator::last>::value>::type* = nullptr, typename... Args> +template <typename Body, typename StaticLoopIterator, typename std::enable_if<!std::is_same<StaticLoopIterator, typename StaticLoopIterator::end>::value>::type* = nullptr, typename... Args> __attribute__((always_inline)) static inline void StaticLoop(Args&&... args) { Body::template body<StaticLoopIterator>(std::forward<Args>(args)...); StaticLoop<Body, typename StaticLoopIterator::next>(std::forward<Args>(args)...); |