BLI: support equality operator on Span and Vector

This is quite convenient sometimes and is available for `std::vector` as well.
This commit is contained in:
Jacques Lucke 2021-03-17 16:38:49 +01:00
parent bf620020f1
commit e9eb08fea1
3 changed files with 40 additions and 0 deletions

View File

@ -417,6 +417,19 @@ template<typename T> class Span {
return Span<NewT>(reinterpret_cast<const NewT *>(data_), new_size);
}
friend bool operator==(const Span<T> a, const Span<T> b)
{
if (a.size() != b.size()) {
return false;
}
return std::equal(a.begin(), a.end(), b.begin());
}
friend bool operator!=(const Span<T> a, const Span<T> b)
{
return !(a == b);
}
/**
* A debug utility to print the content of the Span. Every element will be printed on a
* separate line using the given callback.

View File

@ -879,6 +879,16 @@ class Vector {
return IndexRange(this->size());
}
friend bool operator==(const Vector &a, const Vector &b)
{
return a.as_span() == b.as_span();
}
friend bool operator!=(const Vector &a, const Vector &b)
{
return !(a == b);
}
/**
* Print some debug information about the vector.
*/

View File

@ -404,4 +404,21 @@ TEST(span, ImplicitConversions)
BLI_STATIC_ASSERT((!std::is_convertible_v<Span<int *>, MutableSpan<const int *>>), "");
}
TEST(span, Comparison)
{
std::array<int, 3> a = {3, 4, 5};
std::array<int, 4> b = {3, 4, 5, 6};
EXPECT_FALSE(Span(a) == Span(b));
EXPECT_FALSE(Span(b) == Span(a));
EXPECT_TRUE(Span(a) == Span(b).take_front(3));
EXPECT_TRUE(Span(a) == Span(a));
EXPECT_TRUE(Span(b) == Span(b));
EXPECT_TRUE(Span(a) != Span(b));
EXPECT_TRUE(Span(b) != Span(a));
EXPECT_FALSE(Span(a) != Span(b).take_front(3));
EXPECT_FALSE(Span(a) != Span(a));
}
} // namespace blender::tests