[Bf-blender-cvs] [fce3694f0d4] functions: new ChunkedRange

Jacques Lucke noreply at git.blender.org
Mon Jul 8 17:56:50 CEST 2019


Commit: fce3694f0d4c257b7ecfcd8b947e64124f3f7ae5
Author: Jacques Lucke
Date:   Mon Jul 8 12:42:13 2019 +0200
Branches: functions
https://developer.blender.org/rBfce3694f0d4c257b7ecfcd8b947e64124f3f7ae5

new ChunkedRange

===================================================================

M	source/blender/blenlib/BLI_range.hpp
M	tests/gtests/blenlib/BLI_range_test.cc

===================================================================

diff --git a/source/blender/blenlib/BLI_range.hpp b/source/blender/blenlib/BLI_range.hpp
index 24fc3b42531..9c1d8ebefd4 100644
--- a/source/blender/blenlib/BLI_range.hpp
+++ b/source/blender/blenlib/BLI_range.hpp
@@ -65,6 +65,11 @@ template<typename T> class Range {
     return m_start + index;
   }
 
+  friend bool operator==(Range<T> a, Range<T> b)
+  {
+    return a.m_start == b.m_start && a.m_one_after_last == b.m_one_after_last;
+  }
+
   uint size() const
   {
     return m_one_after_last - m_start;
@@ -92,6 +97,11 @@ template<typename T> class Range {
     return m_one_after_last - 1;
   }
 
+  T one_after_last() const
+  {
+    return m_one_after_last;
+  }
+
   bool contains(T value) const
   {
     return value >= m_start && value < m_one_after_last;
@@ -107,4 +117,33 @@ template<typename T> class Range {
     return values;
   }
 };
+
+template<typename T> class ChunkedRange {
+ private:
+  Range<T> m_total_range;
+  uint m_chunk_size;
+  uint m_chunk_amount;
+
+ public:
+  ChunkedRange(Range<T> total_range, uint chunk_size)
+      : m_total_range(total_range),
+        m_chunk_size(chunk_size),
+        m_chunk_amount(std::ceil(m_total_range.size() / (float)m_chunk_size))
+  {
+  }
+
+  uint chunks() const
+  {
+    return m_chunk_amount;
+  }
+
+  Range<T> chunk_range(uint index) const
+  {
+    BLI_assert(index < m_chunk_amount);
+    T start = m_total_range[index * m_chunk_size];
+    T one_after_last = std::min<T>(start + m_chunk_size, m_total_range.one_after_last());
+    return Range<T>(start, one_after_last);
+  }
+};
+
 }  // namespace BLI
diff --git a/tests/gtests/blenlib/BLI_range_test.cc b/tests/gtests/blenlib/BLI_range_test.cc
index 0a5fb2fa233..b55a5b8a335 100644
--- a/tests/gtests/blenlib/BLI_range_test.cc
+++ b/tests/gtests/blenlib/BLI_range_test.cc
@@ -3,6 +3,7 @@
 #include "BLI_small_vector.hpp"
 
 using IntRange = BLI::Range<int>;
+using ChunkedIntRange = BLI::ChunkedRange<int>;
 using IntVector = BLI::SmallVector<int>;
 
 TEST(range, DefaultConstructor)
@@ -106,3 +107,38 @@ TEST(range, Last)
   IntRange range = IntRange(5, 8);
   EXPECT_EQ(range.last(), 7);
 }
+
+TEST(range, OneAfterEnd)
+{
+  IntRange range = IntRange(5, 8);
+  EXPECT_EQ(range.one_after_last(), 8);
+}
+
+TEST(chunked_range, ChunksExact)
+{
+  IntRange range = IntRange(10, 50);
+  ChunkedIntRange chunked_range(range, 10);
+  EXPECT_EQ(chunked_range.chunks(), 4);
+
+  EXPECT_EQ(chunked_range.chunk_range(0), IntRange(10, 20));
+  EXPECT_EQ(chunked_range.chunk_range(1), IntRange(20, 30));
+  EXPECT_EQ(chunked_range.chunk_range(2), IntRange(30, 40));
+  EXPECT_EQ(chunked_range.chunk_range(3), IntRange(40, 50));
+}
+
+TEST(chunked_range, ChunksMore)
+{
+  IntRange range = IntRange(25, 40);
+  ChunkedIntRange chunked_range(range, 10);
+  EXPECT_EQ(chunked_range.chunks(), 2);
+
+  EXPECT_EQ(chunked_range.chunk_range(0), IntRange(25, 35));
+  EXPECT_EQ(chunked_range.chunk_range(1), IntRange(35, 40));
+}
+
+TEST(chunked_range, ChunksZero)
+{
+  IntRange range = IntRange(20, 20);
+  ChunkedIntRange chunked_range(range, 10);
+  EXPECT_EQ(chunked_range.chunks(), 0);
+}



More information about the Bf-blender-cvs mailing list