Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/marian-nmt/intgemm/intgemm.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMateusz Chudyk <mateuszchudyk@gmail.com>2020-04-02 16:35:09 +0300
committerGitHub <noreply@github.com>2020-04-02 16:35:09 +0300
commit12078cfe5f758256303d540eb1e768dad3ccc591 (patch)
treeb16779d1e7b3fc9c7b8c0f2da0a720c5badcc838
parent6779e6aac623422a66ddc02c4fb1ba73927fdad2 (diff)
parent0540b99ebdc65421904bb5fe41eb364041cf0283 (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.cc6
-rw-r--r--utils.h9
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);
diff --git a/utils.h b/utils.h
index 94b16d3..0cda979 100644
--- a/utils.h
+++ b/utils.h
@@ -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)...);