[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