15541e6bcSGuillaume Chatelet //===-- Unittests for span ------------------------------------------------===//
25541e6bcSGuillaume Chatelet //
35541e6bcSGuillaume Chatelet // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45541e6bcSGuillaume Chatelet // See https://llvm.org/LICENSE.txt for license information.
55541e6bcSGuillaume Chatelet // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65541e6bcSGuillaume Chatelet //
75541e6bcSGuillaume Chatelet //===----------------------------------------------------------------------===//
85541e6bcSGuillaume Chatelet
95541e6bcSGuillaume Chatelet #include "src/__support/CPP/array.h"
105541e6bcSGuillaume Chatelet #include "src/__support/CPP/span.h"
11af1315c2SSiva Chandra Reddy #include "test/UnitTest/Test.h"
125541e6bcSGuillaume Chatelet
13*b6bc9d72SGuillaume Chatelet using LIBC_NAMESPACE::cpp::array;
14*b6bc9d72SGuillaume Chatelet using LIBC_NAMESPACE::cpp::span;
155541e6bcSGuillaume Chatelet
TEST(LlvmLibcSpanTest,InitializeEmpty)165541e6bcSGuillaume Chatelet TEST(LlvmLibcSpanTest, InitializeEmpty) {
175541e6bcSGuillaume Chatelet span<int> s;
185541e6bcSGuillaume Chatelet ASSERT_EQ(s.size(), size_t(0));
195541e6bcSGuillaume Chatelet ASSERT_TRUE(s.empty());
205541e6bcSGuillaume Chatelet ASSERT_TRUE(s.data() == nullptr);
215541e6bcSGuillaume Chatelet }
225541e6bcSGuillaume Chatelet
TEST(LlvmLibcSpanTest,InitializeSingleton)235541e6bcSGuillaume Chatelet TEST(LlvmLibcSpanTest, InitializeSingleton) {
245541e6bcSGuillaume Chatelet int a = 42;
255541e6bcSGuillaume Chatelet span<int> s(&a, 1);
265541e6bcSGuillaume Chatelet ASSERT_EQ(s.size(), size_t(1));
275541e6bcSGuillaume Chatelet ASSERT_FALSE(s.empty());
285541e6bcSGuillaume Chatelet ASSERT_TRUE(s.data() == &a);
295541e6bcSGuillaume Chatelet ASSERT_EQ(s.front(), 42);
305541e6bcSGuillaume Chatelet ASSERT_EQ(s.back(), 42);
315541e6bcSGuillaume Chatelet }
325541e6bcSGuillaume Chatelet
TEST(LlvmLibcSpanTest,InitializeCArray)335541e6bcSGuillaume Chatelet TEST(LlvmLibcSpanTest, InitializeCArray) {
345541e6bcSGuillaume Chatelet int a[] = {1, 2, 3};
355541e6bcSGuillaume Chatelet span<int> s(a);
365541e6bcSGuillaume Chatelet ASSERT_EQ(s.size(), size_t(3));
375541e6bcSGuillaume Chatelet ASSERT_FALSE(s.empty());
385541e6bcSGuillaume Chatelet ASSERT_TRUE(s.data() == &a[0]);
395541e6bcSGuillaume Chatelet ASSERT_EQ(s.front(), 1);
405541e6bcSGuillaume Chatelet ASSERT_EQ(s.back(), 3);
415541e6bcSGuillaume Chatelet ASSERT_EQ(s[0], 1);
425541e6bcSGuillaume Chatelet ASSERT_EQ(s[1], 2);
435541e6bcSGuillaume Chatelet ASSERT_EQ(s[2], 3);
445541e6bcSGuillaume Chatelet }
455541e6bcSGuillaume Chatelet
TEST(LlvmLibcSpanTest,InitializeArray)465541e6bcSGuillaume Chatelet TEST(LlvmLibcSpanTest, InitializeArray) {
475541e6bcSGuillaume Chatelet array<int, 3> a = {1, 2, 3};
485541e6bcSGuillaume Chatelet span<int> s(a);
495541e6bcSGuillaume Chatelet ASSERT_EQ(s.size(), size_t(3));
505541e6bcSGuillaume Chatelet ASSERT_FALSE(s.empty());
515541e6bcSGuillaume Chatelet ASSERT_TRUE(s.data() == &a[0]);
525541e6bcSGuillaume Chatelet ASSERT_EQ(s.front(), 1);
535541e6bcSGuillaume Chatelet ASSERT_EQ(s.back(), 3);
545541e6bcSGuillaume Chatelet ASSERT_EQ(s[0], 1);
555541e6bcSGuillaume Chatelet ASSERT_EQ(s[1], 2);
565541e6bcSGuillaume Chatelet ASSERT_EQ(s[2], 3);
575541e6bcSGuillaume Chatelet }
585541e6bcSGuillaume Chatelet
TEST(LlvmLibcSpanTest,InitializeViewFormMutableSingleton)59f890f80dSGuillaume Chatelet TEST(LlvmLibcSpanTest, InitializeViewFormMutableSingleton) {
60f890f80dSGuillaume Chatelet int a = 42;
61f890f80dSGuillaume Chatelet span<const int> s(&a, 1);
62f890f80dSGuillaume Chatelet ASSERT_EQ(s.size(), size_t(1));
63f890f80dSGuillaume Chatelet ASSERT_TRUE(s.data() == &a);
64f890f80dSGuillaume Chatelet }
65f890f80dSGuillaume Chatelet
TEST(LlvmLibcSpanTest,InitializeViewFormMutableCArray)66f890f80dSGuillaume Chatelet TEST(LlvmLibcSpanTest, InitializeViewFormMutableCArray) {
67f890f80dSGuillaume Chatelet int a[] = {1, 2, 3};
68f890f80dSGuillaume Chatelet span<const int> s(a);
69f890f80dSGuillaume Chatelet ASSERT_EQ(s.size(), size_t(3));
70f890f80dSGuillaume Chatelet ASSERT_EQ(s[0], 1);
71f890f80dSGuillaume Chatelet ASSERT_EQ(s[1], 2);
72f890f80dSGuillaume Chatelet ASSERT_EQ(s[2], 3);
73f890f80dSGuillaume Chatelet }
74f890f80dSGuillaume Chatelet
TEST(LlvmLibcSpanTest,InitializeViewFormMutableArray)75f890f80dSGuillaume Chatelet TEST(LlvmLibcSpanTest, InitializeViewFormMutableArray) {
76e5d51463SGuillaume Chatelet array<int, 3> a = {1, 2, 3};
77f890f80dSGuillaume Chatelet span<const int> s(a);
78f890f80dSGuillaume Chatelet ASSERT_EQ(s.size(), size_t(3));
79f890f80dSGuillaume Chatelet ASSERT_EQ(s[0], 1);
80f890f80dSGuillaume Chatelet ASSERT_EQ(s[1], 2);
81f890f80dSGuillaume Chatelet ASSERT_EQ(s[2], 3);
82f890f80dSGuillaume Chatelet }
83f890f80dSGuillaume Chatelet
TEST(LlvmLibcSpanTest,InitializeFromMutable)84f890f80dSGuillaume Chatelet TEST(LlvmLibcSpanTest, InitializeFromMutable) {
85f890f80dSGuillaume Chatelet span<int> s;
86f890f80dSGuillaume Chatelet span<const int> view(s);
87f890f80dSGuillaume Chatelet (void)view;
88f890f80dSGuillaume Chatelet }
89f890f80dSGuillaume Chatelet
TEST(LlvmLibcSpanTest,Assign)90f890f80dSGuillaume Chatelet TEST(LlvmLibcSpanTest, Assign) {
91f890f80dSGuillaume Chatelet span<int> s;
92f890f80dSGuillaume Chatelet span<int> other;
93f890f80dSGuillaume Chatelet other = s;
94f890f80dSGuillaume Chatelet }
95f890f80dSGuillaume Chatelet
TEST(LlvmLibcSpanTest,AssignFromMutable)96f890f80dSGuillaume Chatelet TEST(LlvmLibcSpanTest, AssignFromMutable) {
97f890f80dSGuillaume Chatelet span<int> s;
98f890f80dSGuillaume Chatelet span<const int> view;
99f890f80dSGuillaume Chatelet view = s;
100e5d51463SGuillaume Chatelet }
101e5d51463SGuillaume Chatelet
TEST(LlvmLibcSpanTest,Modify)1025541e6bcSGuillaume Chatelet TEST(LlvmLibcSpanTest, Modify) {
1035541e6bcSGuillaume Chatelet int a[] = {1, 2, 3};
1045541e6bcSGuillaume Chatelet span<int> s(a);
1055541e6bcSGuillaume Chatelet for (int &value : s)
1065541e6bcSGuillaume Chatelet ++value;
1075541e6bcSGuillaume Chatelet ASSERT_EQ(s.size(), size_t(3));
1085541e6bcSGuillaume Chatelet ASSERT_EQ(s[0], 2);
1095541e6bcSGuillaume Chatelet ASSERT_EQ(s[1], 3);
1105541e6bcSGuillaume Chatelet ASSERT_EQ(s[2], 4);
1115541e6bcSGuillaume Chatelet }
1125541e6bcSGuillaume Chatelet
TEST(LlvmLibcSpanTest,SubSpan)1135541e6bcSGuillaume Chatelet TEST(LlvmLibcSpanTest, SubSpan) {
1145541e6bcSGuillaume Chatelet int a[] = {1, 2, 3};
1155541e6bcSGuillaume Chatelet span<const int> s(a);
1165541e6bcSGuillaume Chatelet { // same span
1175541e6bcSGuillaume Chatelet const auto _ = s.subspan(0);
1185541e6bcSGuillaume Chatelet ASSERT_EQ(_.size(), size_t(3));
1195541e6bcSGuillaume Chatelet ASSERT_EQ(_[0], 1);
1205541e6bcSGuillaume Chatelet ASSERT_EQ(_[1], 2);
1215541e6bcSGuillaume Chatelet ASSERT_EQ(_[2], 3);
1225541e6bcSGuillaume Chatelet }
1235541e6bcSGuillaume Chatelet { // last element
1245541e6bcSGuillaume Chatelet const auto _ = s.subspan(2);
1255541e6bcSGuillaume Chatelet ASSERT_EQ(_.size(), size_t(1));
1265541e6bcSGuillaume Chatelet ASSERT_EQ(_[0], 3);
1275541e6bcSGuillaume Chatelet }
1285541e6bcSGuillaume Chatelet { // no element
1295541e6bcSGuillaume Chatelet const auto _ = s.subspan(3);
1305541e6bcSGuillaume Chatelet ASSERT_EQ(_.size(), size_t(0));
1315541e6bcSGuillaume Chatelet }
1325541e6bcSGuillaume Chatelet { // first element
1335541e6bcSGuillaume Chatelet const auto _ = s.subspan(0, 1);
1345541e6bcSGuillaume Chatelet ASSERT_EQ(_.size(), size_t(1));
1355541e6bcSGuillaume Chatelet ASSERT_EQ(_[0], 1);
1365541e6bcSGuillaume Chatelet }
1375541e6bcSGuillaume Chatelet }
1385541e6bcSGuillaume Chatelet
TEST(LlvmLibcSpanTest,FirstAndLastSubSpan)1395541e6bcSGuillaume Chatelet TEST(LlvmLibcSpanTest, FirstAndLastSubSpan) {
1405541e6bcSGuillaume Chatelet int a[] = {1, 2, 3};
1415541e6bcSGuillaume Chatelet span<const int> s(a);
1425541e6bcSGuillaume Chatelet
1435541e6bcSGuillaume Chatelet const auto first = s.first(2);
1445541e6bcSGuillaume Chatelet ASSERT_EQ(first.size(), size_t(2));
1455541e6bcSGuillaume Chatelet ASSERT_EQ(first[0], 1);
1465541e6bcSGuillaume Chatelet ASSERT_EQ(first[1], 2);
1475541e6bcSGuillaume Chatelet
1485541e6bcSGuillaume Chatelet const auto last = s.last(2);
1495541e6bcSGuillaume Chatelet ASSERT_EQ(last.size(), size_t(2));
1505541e6bcSGuillaume Chatelet ASSERT_EQ(last[0], 2);
1515541e6bcSGuillaume Chatelet ASSERT_EQ(last[1], 3);
1525541e6bcSGuillaume Chatelet }
153