--- /dev/null
+#ifndef __NNCC_CORE_ADT_ITERABLE_H__
+#define __NNCC_CORE_ADT_ITERABLE_H__
+
+namespace nncc
+{
+namespace core
+{
+namespace ADT
+{
+
+template <typename T> 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 <typename T, typename Callable>
+const Iterable<T> &operator<<(const Iterable<T> &it, Callable cb)
+{
+ it.get().iterate(cb);
+ return it;
+}
+
+} // namespace ADT
+} // namespace core
+} // namespace nncc
+
+#endif // __NNCC_CORE_ADT_ITERABLE_H__
#include "nncc/core/ADT/tensor/Index.h"
#include "nncc/core/ADT/tensor/Shape.h"
+#include "nncc/core/ADT/Iterable.h"
+
#include <functional>
namespace nncc
public:
void iterate(const std::function<void(const Index &)> &) const;
+public:
+ Iterable<IndexRange> iterate(void) const { return Iterable<IndexRange>{this}; }
+
private:
const Shape _shape;
};
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);
}
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; }));
}