[Bf-blender-cvs] [844745da773] functions: Simple range iterator with tests
Jacques Lucke
noreply at git.blender.org
Fri Apr 19 13:57:14 CEST 2019
Commit: 844745da773b3c9924a18ab5dad8c9f453bf6598
Author: Jacques Lucke
Date: Fri Apr 19 13:56:49 2019 +0200
Branches: functions
https://developer.blender.org/rB844745da773b3c9924a18ab5dad8c9f453bf6598
Simple range iterator with tests
===================================================================
A source/blender/blenlib/BLI_range.hpp
M source/blender/blenlib/CMakeLists.txt
A tests/gtests/blenlib/BLI_range_test.cc
M tests/gtests/blenlib/CMakeLists.txt
===================================================================
diff --git a/source/blender/blenlib/BLI_range.hpp b/source/blender/blenlib/BLI_range.hpp
new file mode 100644
index 00000000000..0959b0f0743
--- /dev/null
+++ b/source/blender/blenlib/BLI_range.hpp
@@ -0,0 +1,62 @@
+#pragma once
+
+#include "BLI_utildefines.h"
+
+namespace BLI {
+
+template<typename T> class Range {
+ private:
+ T m_start = 0;
+ T m_one_after_last = 0;
+
+ public:
+ Range() = default;
+
+ Range(T start, T one_after_last) : m_start(start), m_one_after_last(one_after_last)
+ {
+ BLI_assert(start <= one_after_last);
+ }
+
+ class RangeIterator {
+ private:
+ const Range &m_range;
+ T m_current;
+
+ public:
+ RangeIterator(const Range &range, T current) : m_range(range), m_current(current)
+ {
+ }
+
+ RangeIterator &operator++()
+ {
+ m_current++;
+ return *this;
+ }
+
+ bool operator!=(const RangeIterator &iterator) const
+ {
+ return m_current != iterator.m_current;
+ }
+
+ T operator*() const
+ {
+ return m_current;
+ }
+ };
+
+ RangeIterator begin() const
+ {
+ return RangeIterator(*this, m_start);
+ }
+
+ RangeIterator end() const
+ {
+ return RangeIterator(*this, m_one_after_last);
+ }
+
+ uint size() const
+ {
+ return m_one_after_last - m_start;
+ }
+};
+} // namespace BLI
diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt
index eb5c23ecc65..b303794276e 100644
--- a/source/blender/blenlib/CMakeLists.txt
+++ b/source/blender/blenlib/CMakeLists.txt
@@ -241,6 +241,7 @@ set(SRC
BLI_multimap.hpp
BLI_multipool.hpp
BLI_optional.hpp
+ BLI_range.hpp
BLI_shared.hpp
BLI_small_vector.hpp
BLI_small_map.hpp
diff --git a/tests/gtests/blenlib/BLI_range_test.cc b/tests/gtests/blenlib/BLI_range_test.cc
new file mode 100644
index 00000000000..e8d66cc1854
--- /dev/null
+++ b/tests/gtests/blenlib/BLI_range_test.cc
@@ -0,0 +1,49 @@
+#include "testing/testing.h"
+#include "BLI_range.hpp"
+#include "BLI_small_vector.hpp"
+
+using IntRange = BLI::Range<int>;
+using IntVector = BLI::SmallVector<int>;
+
+TEST(range, DefaultConstructor)
+{
+ IntRange range;
+ EXPECT_EQ(range.size(), 0);
+
+ IntVector vector;
+ for (int value : range) {
+ vector.append(value);
+ }
+ EXPECT_EQ(vector.size(), 0);
+}
+
+TEST(range, SingleElementRange)
+{
+ IntRange range(4, 5);
+ EXPECT_EQ(range.size(), 1);
+ EXPECT_EQ(*range.begin(), 4);
+
+ IntVector vector;
+ for (int value : range) {
+ vector.append(value);
+ }
+
+ EXPECT_EQ(vector.size(), 1);
+ EXPECT_EQ(vector[0], 4);
+}
+
+TEST(range, MultipleElementRange)
+{
+ IntRange range(6, 10);
+ EXPECT_EQ(range.size(), 4);
+
+ IntVector vector;
+ for (int value : range) {
+ vector.append(value);
+ }
+
+ EXPECT_EQ(vector.size(), 4);
+ for (uint i = 0; i < 4; i++) {
+ EXPECT_EQ(vector[i], i + 6);
+ }
+}
diff --git a/tests/gtests/blenlib/CMakeLists.txt b/tests/gtests/blenlib/CMakeLists.txt
index 92b5a13a3eb..3da56bd460d 100644
--- a/tests/gtests/blenlib/CMakeLists.txt
+++ b/tests/gtests/blenlib/CMakeLists.txt
@@ -60,6 +60,7 @@ BLENDER_TEST(BLI_multimap "bf_blenlib")
BLENDER_TEST(BLI_optional "bf_blenlib")
BLENDER_TEST(BLI_path_util "${BLI_path_util_extra_libs}")
BLENDER_TEST(BLI_polyfill_2d "bf_blenlib")
+BLENDER_TEST(BLI_range "bf_blenlib")
BLENDER_TEST(BLI_shared "bf_blenlib")
BLENDER_TEST(BLI_small_vector "bf_blenlib")
BLENDER_TEST(BLI_small_set "bf_blenlib")
More information about the Bf-blender-cvs
mailing list