From 51cc4c5fb079c665d0698d4d7b9f80bc7d093600 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EB=B0=95=EC=A2=85=ED=98=84/=EB=8F=99=EC=9E=91=EC=A0=9C?= =?utf8?q?=EC=96=B4Lab=28SR=29/Senior=20Engineer/=EC=82=BC=EC=84=B1?= =?utf8?q?=EC=A0=84=EC=9E=90?= Date: Wed, 2 May 2018 19:50:38 +0900 Subject: [PATCH] [nncc.core] Add 'Iterable' class (#189) This commit adds 'Iterable' class which faciliates the use of 'iterate' method based on lambda. This commit also revises 'tensor::IndexRange' class using newly introduced 'Iterable' class. Signed-off-by: Jonghyun Park --- libs/core/include/nncc/core/ADT/Iterable.h | 37 ++++++++++++++++++++++ .../core/include/nncc/core/ADT/tensor/IndexRange.h | 5 +++ .../src/nncc/core/ADT/tensor/IndexRange.test.cpp | 17 ++++++---- 3 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 libs/core/include/nncc/core/ADT/Iterable.h diff --git a/libs/core/include/nncc/core/ADT/Iterable.h b/libs/core/include/nncc/core/ADT/Iterable.h new file mode 100644 index 0000000..2fcc541 --- /dev/null +++ b/libs/core/include/nncc/core/ADT/Iterable.h @@ -0,0 +1,37 @@ +#ifndef __NNCC_CORE_ADT_ITERABLE_H__ +#define __NNCC_CORE_ADT_ITERABLE_H__ + +namespace nncc +{ +namespace core +{ +namespace ADT +{ + +template class Iterable +{ +public: + Iterable(const T *ptr) : _ptr{ptr} + { + // DO NOTHING + } + +public: + const T &get(void) const { return *_ptr; } + +private: + const T *const _ptr; +}; + +template +const Iterable &operator<<(const Iterable &it, Callable cb) +{ + it.get().iterate(cb); + return it; +} + +} // namespace ADT +} // namespace core +} // namespace nncc + +#endif // __NNCC_CORE_ADT_ITERABLE_H__ diff --git a/libs/core/include/nncc/core/ADT/tensor/IndexRange.h b/libs/core/include/nncc/core/ADT/tensor/IndexRange.h index f28f3d0..df0bf7f 100644 --- a/libs/core/include/nncc/core/ADT/tensor/IndexRange.h +++ b/libs/core/include/nncc/core/ADT/tensor/IndexRange.h @@ -4,6 +4,8 @@ #include "nncc/core/ADT/tensor/Index.h" #include "nncc/core/ADT/tensor/Shape.h" +#include "nncc/core/ADT/Iterable.h" + #include namespace nncc @@ -26,6 +28,9 @@ public: public: void iterate(const std::function &) const; +public: + Iterable iterate(void) const { return Iterable{this}; } + private: const Shape _shape; }; diff --git a/libs/core/src/nncc/core/ADT/tensor/IndexRange.test.cpp b/libs/core/src/nncc/core/ADT/tensor/IndexRange.test.cpp index 556d64c..f15efe7 100644 --- a/libs/core/src/nncc/core/ADT/tensor/IndexRange.test.cpp +++ b/libs/core/src/nncc/core/ADT/tensor/IndexRange.test.cpp @@ -60,9 +60,10 @@ TEST(ADT_TENSOR_INDEX_RANGE, iterate_empty_range) uint32_t count = 0; - auto f = [&count](const nncc::core::ADT::tensor::Index &) { ++count; }; + using nncc::core::ADT::tensor::Index; + using nncc::core::ADT::tensor::IndexRange; - nncc::core::ADT::tensor::IndexRange{shape}.iterate(f); + nncc::core::ADT::tensor::IndexRange{shape}.iterate() << [&count](const Index &) { ++count; }; ASSERT_EQ(count, 0); } @@ -79,11 +80,13 @@ TEST(ADT_TENSOR_INDEX_RANGE, iterate_full_range) count.fill(0); - nncc::core::ADT::tensor::IndexRange{shape}.iterate( - [&count](const nncc::core::ADT::tensor::Index &i) { - ASSERT_EQ(i.rank(), 2); - count.at(i.at(0) * 4 + i.at(1)) += 1; - }); + using nncc::core::ADT::tensor::Index; + using nncc::core::ADT::tensor::IndexRange; + + IndexRange{shape}.iterate() << [&count](const Index &i) { + ASSERT_EQ(i.rank(), 2); + count.at(i.at(0) * 4 + i.at(1)) += 1; + }; ASSERT_TRUE(std::all_of(count.begin(), count.end(), [](uint32_t n) { return n == 1; })); } -- 2.7.4