2020-07-08 15:01:33 +02:00
|
|
|
/* Apache License, Version 2.0 */
|
|
|
|
|
2020-06-09 11:58:47 +02:00
|
|
|
#include "BLI_span.hh"
|
|
|
|
#include "BLI_strict_flags.h"
|
|
|
|
#include "BLI_vector.hh"
|
|
|
|
#include "testing/testing.h"
|
|
|
|
|
2020-07-23 15:23:55 +02:00
|
|
|
namespace blender::tests {
|
2020-06-09 11:58:47 +02:00
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, FromSmallVector)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
Vector<int> a = {1, 2, 3};
|
|
|
|
Span<int> a_span = a;
|
2020-07-20 12:16:20 +02:00
|
|
|
EXPECT_EQ(a_span.size(), 3);
|
2020-06-09 11:58:47 +02:00
|
|
|
EXPECT_EQ(a_span[0], 1);
|
|
|
|
EXPECT_EQ(a_span[1], 2);
|
|
|
|
EXPECT_EQ(a_span[2], 3);
|
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, AddConstToPointer)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
int a = 0;
|
|
|
|
std::vector<int *> vec = {&a};
|
|
|
|
Span<int *> span = vec;
|
|
|
|
Span<const int *> const_span = span;
|
2020-07-20 12:16:20 +02:00
|
|
|
EXPECT_EQ(const_span.size(), 1);
|
2020-06-09 11:58:47 +02:00
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, IsReferencing)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
int array[] = {3, 5, 8};
|
|
|
|
MutableSpan<int> span(array, ARRAY_SIZE(array));
|
2020-07-20 12:16:20 +02:00
|
|
|
EXPECT_EQ(span.size(), 3);
|
2020-06-09 11:58:47 +02:00
|
|
|
EXPECT_EQ(span[1], 5);
|
|
|
|
array[1] = 10;
|
|
|
|
EXPECT_EQ(span[1], 10);
|
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, DropBack)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
Vector<int> a = {4, 5, 6, 7};
|
|
|
|
auto slice = Span<int>(a).drop_back(2);
|
2020-07-20 12:16:20 +02:00
|
|
|
EXPECT_EQ(slice.size(), 2);
|
2020-06-09 11:58:47 +02:00
|
|
|
EXPECT_EQ(slice[0], 4);
|
|
|
|
EXPECT_EQ(slice[1], 5);
|
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, DropBackAll)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
Vector<int> a = {4, 5, 6, 7};
|
|
|
|
auto slice = Span<int>(a).drop_back(a.size());
|
2020-07-20 12:16:20 +02:00
|
|
|
EXPECT_EQ(slice.size(), 0);
|
2020-06-09 11:58:47 +02:00
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, DropFront)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
Vector<int> a = {4, 5, 6, 7};
|
|
|
|
auto slice = Span<int>(a).drop_front(1);
|
2020-07-20 12:16:20 +02:00
|
|
|
EXPECT_EQ(slice.size(), 3);
|
2020-06-09 11:58:47 +02:00
|
|
|
EXPECT_EQ(slice[0], 5);
|
|
|
|
EXPECT_EQ(slice[1], 6);
|
|
|
|
EXPECT_EQ(slice[2], 7);
|
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, DropFrontAll)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
Vector<int> a = {4, 5, 6, 7};
|
|
|
|
auto slice = Span<int>(a).drop_front(a.size());
|
2020-07-20 12:16:20 +02:00
|
|
|
EXPECT_EQ(slice.size(), 0);
|
2020-06-09 11:58:47 +02:00
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, TakeFront)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
Vector<int> a = {4, 5, 6, 7};
|
|
|
|
auto slice = Span<int>(a).take_front(2);
|
2020-07-20 12:16:20 +02:00
|
|
|
EXPECT_EQ(slice.size(), 2);
|
2020-06-09 11:58:47 +02:00
|
|
|
EXPECT_EQ(slice[0], 4);
|
|
|
|
EXPECT_EQ(slice[1], 5);
|
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, TakeBack)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
Vector<int> a = {5, 6, 7, 8};
|
|
|
|
auto slice = Span<int>(a).take_back(2);
|
2020-07-20 12:16:20 +02:00
|
|
|
EXPECT_EQ(slice.size(), 2);
|
2020-06-09 11:58:47 +02:00
|
|
|
EXPECT_EQ(slice[0], 7);
|
|
|
|
EXPECT_EQ(slice[1], 8);
|
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, Slice)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
Vector<int> a = {4, 5, 6, 7};
|
|
|
|
auto slice = Span<int>(a).slice(1, 2);
|
2020-07-20 12:16:20 +02:00
|
|
|
EXPECT_EQ(slice.size(), 2);
|
2020-06-09 11:58:47 +02:00
|
|
|
EXPECT_EQ(slice[0], 5);
|
|
|
|
EXPECT_EQ(slice[1], 6);
|
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, SliceEmpty)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
Vector<int> a = {4, 5, 6, 7};
|
|
|
|
auto slice = Span<int>(a).slice(2, 0);
|
2020-07-20 12:16:20 +02:00
|
|
|
EXPECT_EQ(slice.size(), 0);
|
2020-06-09 11:58:47 +02:00
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, SliceRange)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
Vector<int> a = {1, 2, 3, 4, 5};
|
|
|
|
auto slice = Span<int>(a).slice(IndexRange(2, 2));
|
2020-07-20 12:16:20 +02:00
|
|
|
EXPECT_EQ(slice.size(), 2);
|
2020-06-09 11:58:47 +02:00
|
|
|
EXPECT_EQ(slice[0], 3);
|
|
|
|
EXPECT_EQ(slice[1], 4);
|
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, Contains)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
Vector<int> a = {4, 5, 6, 7};
|
|
|
|
Span<int> a_span = a;
|
|
|
|
EXPECT_TRUE(a_span.contains(4));
|
|
|
|
EXPECT_TRUE(a_span.contains(5));
|
|
|
|
EXPECT_TRUE(a_span.contains(6));
|
|
|
|
EXPECT_TRUE(a_span.contains(7));
|
|
|
|
EXPECT_FALSE(a_span.contains(3));
|
|
|
|
EXPECT_FALSE(a_span.contains(8));
|
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, Count)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
Vector<int> a = {2, 3, 4, 3, 3, 2, 2, 2, 2};
|
|
|
|
Span<int> a_span = a;
|
2020-07-20 12:16:20 +02:00
|
|
|
EXPECT_EQ(a_span.count(1), 0);
|
|
|
|
EXPECT_EQ(a_span.count(2), 5);
|
|
|
|
EXPECT_EQ(a_span.count(3), 3);
|
|
|
|
EXPECT_EQ(a_span.count(4), 1);
|
|
|
|
EXPECT_EQ(a_span.count(5), 0);
|
2020-06-09 11:58:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
static void test_ref_from_initializer_list(Span<int> span)
|
|
|
|
{
|
2020-07-20 12:16:20 +02:00
|
|
|
EXPECT_EQ(span.size(), 4);
|
2020-06-09 11:58:47 +02:00
|
|
|
EXPECT_EQ(span[0], 3);
|
|
|
|
EXPECT_EQ(span[1], 6);
|
|
|
|
EXPECT_EQ(span[2], 8);
|
|
|
|
EXPECT_EQ(span[3], 9);
|
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, FromInitializerList)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
test_ref_from_initializer_list({3, 6, 8, 9});
|
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, FromVector)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
std::vector<int> a = {1, 2, 3, 4};
|
|
|
|
Span<int> a_span(a);
|
2020-07-20 12:16:20 +02:00
|
|
|
EXPECT_EQ(a_span.size(), 4);
|
2020-06-09 11:58:47 +02:00
|
|
|
EXPECT_EQ(a_span[0], 1);
|
|
|
|
EXPECT_EQ(a_span[1], 2);
|
|
|
|
EXPECT_EQ(a_span[2], 3);
|
|
|
|
EXPECT_EQ(a_span[3], 4);
|
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, FromArray)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
std::array<int, 2> a = {5, 6};
|
|
|
|
Span<int> a_span(a);
|
2020-07-20 12:16:20 +02:00
|
|
|
EXPECT_EQ(a_span.size(), 2);
|
2020-06-09 11:58:47 +02:00
|
|
|
EXPECT_EQ(a_span[0], 5);
|
|
|
|
EXPECT_EQ(a_span[1], 6);
|
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, Fill)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
std::array<int, 5> a = {4, 5, 6, 7, 8};
|
|
|
|
MutableSpan<int> a_span(a);
|
|
|
|
a_span.fill(1);
|
|
|
|
EXPECT_EQ(a[0], 1);
|
|
|
|
EXPECT_EQ(a[1], 1);
|
|
|
|
EXPECT_EQ(a[2], 1);
|
|
|
|
EXPECT_EQ(a[3], 1);
|
|
|
|
EXPECT_EQ(a[4], 1);
|
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, FillIndices)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
std::array<int, 5> a = {0, 0, 0, 0, 0};
|
|
|
|
MutableSpan<int> a_span(a);
|
|
|
|
a_span.fill_indices({0, 2, 3}, 1);
|
|
|
|
EXPECT_EQ(a[0], 1);
|
|
|
|
EXPECT_EQ(a[1], 0);
|
|
|
|
EXPECT_EQ(a[2], 1);
|
|
|
|
EXPECT_EQ(a[3], 1);
|
|
|
|
EXPECT_EQ(a[4], 0);
|
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, SizeInBytes)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
std::array<int, 10> a;
|
|
|
|
Span<int> a_span(a);
|
2020-07-20 12:16:20 +02:00
|
|
|
EXPECT_EQ(a_span.size_in_bytes(), (int64_t)sizeof(a));
|
|
|
|
EXPECT_EQ(a_span.size_in_bytes(), 40);
|
2020-06-09 11:58:47 +02:00
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, FirstLast)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
std::array<int, 4> a = {6, 7, 8, 9};
|
|
|
|
Span<int> a_span(a);
|
|
|
|
EXPECT_EQ(a_span.first(), 6);
|
|
|
|
EXPECT_EQ(a_span.last(), 9);
|
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, FirstLast_OneElement)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
int a = 3;
|
|
|
|
Span<int> a_span(&a, 1);
|
|
|
|
EXPECT_EQ(a_span.first(), 3);
|
|
|
|
EXPECT_EQ(a_span.last(), 3);
|
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, Get)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
std::array<int, 3> a = {5, 6, 7};
|
|
|
|
Span<int> a_span(a);
|
|
|
|
EXPECT_EQ(a_span.get(0, 42), 5);
|
|
|
|
EXPECT_EQ(a_span.get(1, 42), 6);
|
|
|
|
EXPECT_EQ(a_span.get(2, 42), 7);
|
|
|
|
EXPECT_EQ(a_span.get(3, 42), 42);
|
|
|
|
EXPECT_EQ(a_span.get(4, 42), 42);
|
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, ContainsPtr)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
std::array<int, 3> a = {5, 6, 7};
|
|
|
|
int other = 10;
|
|
|
|
Span<int> a_span(a);
|
|
|
|
EXPECT_TRUE(a_span.contains_ptr(&a[0] + 0));
|
|
|
|
EXPECT_TRUE(a_span.contains_ptr(&a[0] + 1));
|
|
|
|
EXPECT_TRUE(a_span.contains_ptr(&a[0] + 2));
|
|
|
|
EXPECT_FALSE(a_span.contains_ptr(&a[0] + 3));
|
|
|
|
EXPECT_FALSE(a_span.contains_ptr(&a[0] - 1));
|
|
|
|
EXPECT_FALSE(a_span.contains_ptr(&other));
|
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, FirstIndex)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
std::array<int, 5> a = {4, 5, 4, 2, 5};
|
|
|
|
Span<int> a_span(a);
|
|
|
|
|
2020-07-20 12:16:20 +02:00
|
|
|
EXPECT_EQ(a_span.first_index(4), 0);
|
|
|
|
EXPECT_EQ(a_span.first_index(5), 1);
|
|
|
|
EXPECT_EQ(a_span.first_index(2), 3);
|
2020-06-09 11:58:47 +02:00
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, CastSameSize)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
int value = 0;
|
|
|
|
std::array<int *, 4> a = {&value, nullptr, nullptr, nullptr};
|
|
|
|
Span<int *> a_span = a;
|
|
|
|
Span<float *> new_a_span = a_span.cast<float *>();
|
|
|
|
|
2020-07-20 12:16:20 +02:00
|
|
|
EXPECT_EQ(a_span.size(), 4);
|
|
|
|
EXPECT_EQ(new_a_span.size(), 4);
|
2020-06-09 11:58:47 +02:00
|
|
|
|
|
|
|
EXPECT_EQ(a_span[0], &value);
|
|
|
|
EXPECT_EQ(new_a_span[0], (float *)&value);
|
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, CastSmallerSize)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
std::array<uint32_t, 4> a = {3, 4, 5, 6};
|
|
|
|
Span<uint32_t> a_span = a;
|
|
|
|
Span<uint16_t> new_a_span = a_span.cast<uint16_t>();
|
|
|
|
|
2020-07-20 12:16:20 +02:00
|
|
|
EXPECT_EQ(a_span.size(), 4);
|
|
|
|
EXPECT_EQ(new_a_span.size(), 8);
|
2020-06-09 11:58:47 +02:00
|
|
|
}
|
|
|
|
|
2020-06-10 14:50:29 +02:00
|
|
|
TEST(span, CastLargerSize)
|
2020-06-09 11:58:47 +02:00
|
|
|
{
|
|
|
|
std::array<uint16_t, 4> a = {4, 5, 6, 7};
|
|
|
|
Span<uint16_t> a_span = a;
|
|
|
|
Span<uint32_t> new_a_span = a_span.cast<uint32_t>();
|
|
|
|
|
2020-07-20 12:16:20 +02:00
|
|
|
EXPECT_EQ(a_span.size(), 4);
|
|
|
|
EXPECT_EQ(new_a_span.size(), 2);
|
2020-06-09 11:58:47 +02:00
|
|
|
}
|
2020-06-30 16:46:46 +02:00
|
|
|
|
2020-07-13 10:51:46 +02:00
|
|
|
TEST(span, VoidPointerSpan)
|
|
|
|
{
|
|
|
|
int a;
|
|
|
|
float b;
|
|
|
|
double c;
|
|
|
|
|
2020-07-20 12:16:20 +02:00
|
|
|
auto func1 = [](Span<void *> span) { EXPECT_EQ(span.size(), 3); };
|
2020-07-13 10:51:46 +02:00
|
|
|
func1({&a, &b, &c});
|
|
|
|
}
|
|
|
|
|
2020-07-23 17:54:31 +02:00
|
|
|
TEST(span, CopyFrom)
|
|
|
|
{
|
|
|
|
std::array<int, 4> src = {5, 6, 7, 8};
|
|
|
|
std::array<int, 4> dst = {1, 2, 3, 4};
|
|
|
|
|
|
|
|
EXPECT_EQ(dst[2], 3);
|
|
|
|
MutableSpan(dst).copy_from(src);
|
|
|
|
EXPECT_EQ(dst[0], 5);
|
|
|
|
EXPECT_EQ(dst[1], 6);
|
|
|
|
EXPECT_EQ(dst[2], 7);
|
|
|
|
EXPECT_EQ(dst[3], 8);
|
|
|
|
}
|
|
|
|
|
2020-07-23 15:23:55 +02:00
|
|
|
} // namespace blender::tests
|