[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