span_test.cc 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include <gtest/gtest.h>
  4. #include <stddef.h>
  5. #include <algorithm>
  6. #include <array>
  7. #include <iterator>
  8. #include <list>
  9. #include <string>
  10. #include <type_traits>
  11. #include <vector>
  12. #include "opentelemetry/nostd/span.h"
  13. using opentelemetry::nostd::span;
  14. TEST(SpanTest, DefaultConstruction)
  15. {
  16. span<int> s1;
  17. EXPECT_EQ(s1.data(), nullptr);
  18. EXPECT_EQ(s1.size(), 0);
  19. EXPECT_TRUE(s1.empty());
  20. span<int, 0> s2;
  21. EXPECT_EQ(s2.data(), nullptr);
  22. EXPECT_EQ(s2.size(), 0);
  23. EXPECT_TRUE(s2.empty());
  24. EXPECT_FALSE((std::is_default_constructible<span<int, 1>>::value));
  25. }
  26. TEST(SpanTest, Assignment)
  27. {
  28. std::array<int, 3> array1 = {1, 2, 3};
  29. std::array<int, 3> array2 = {1, 2, 3};
  30. span<int> s1{array1.data(), array1.size()};
  31. span<int, 3> s2{array1.data(), array1.size()};
  32. span<int> s3;
  33. s3 = s1;
  34. EXPECT_EQ(s3.data(), array1.data());
  35. EXPECT_EQ(s3.size(), array1.size());
  36. span<int, 3> s4{array2};
  37. s4 = s2;
  38. EXPECT_EQ(s4.data(), array1.data());
  39. EXPECT_EQ(s4.size(), array1.size());
  40. }
  41. TEST(SpanTest, PointerCountConstruction)
  42. {
  43. std::array<int, 3> array = {1, 2, 3};
  44. span<int> s1{array.data(), array.size()};
  45. EXPECT_EQ(s1.data(), array.data());
  46. EXPECT_EQ(s1.size(), array.size());
  47. span<int, 3> s2{array.data(), array.size()};
  48. EXPECT_EQ(s2.data(), array.data());
  49. EXPECT_EQ(s2.size(), array.size());
  50. }
  51. TEST(SpanTest, RangeConstruction)
  52. {
  53. int array[] = {1, 2, 3};
  54. span<int> s1{std::begin(array), std::end(array)};
  55. EXPECT_EQ(s1.data(), array);
  56. EXPECT_EQ(s1.size(), 3);
  57. span<int, 3> s2{std::begin(array), std::end(array)};
  58. EXPECT_EQ(s2.data(), array);
  59. EXPECT_EQ(s2.size(), 3);
  60. }
  61. TEST(SpanTest, ArrayConstruction)
  62. {
  63. int array1[] = {1, 2, 3};
  64. std::array<int, 3> array2 = {1, 2, 3};
  65. span<int> s1{array1};
  66. EXPECT_EQ(s1.data(), array1);
  67. EXPECT_EQ(s1.size(), 3);
  68. span<int> s2{array2};
  69. EXPECT_EQ(s2.data(), array2.data());
  70. EXPECT_EQ(s2.size(), array2.size());
  71. span<int, 3> s3{array1};
  72. EXPECT_EQ(s3.data(), array1);
  73. EXPECT_EQ(s3.size(), 3);
  74. span<int, 3> s4{array2};
  75. EXPECT_EQ(s4.data(), array2.data());
  76. EXPECT_EQ(s4.size(), array2.size());
  77. EXPECT_FALSE((std::is_constructible<span<int, 2>, int(&)[3]>::value));
  78. }
  79. TEST(SpanTest, ContainerConstruction)
  80. {
  81. std::vector<int> v = {1, 2, 3};
  82. span<int> s1{v};
  83. EXPECT_EQ(s1.data(), v.data());
  84. EXPECT_EQ(s1.size(), v.size());
  85. span<int, 3> s2{v.data(), 3};
  86. EXPECT_EQ(s2.data(), v.data());
  87. EXPECT_EQ(s2.size(), v.size());
  88. EXPECT_FALSE((std::is_constructible<span<int>, std::vector<double>>::value));
  89. EXPECT_FALSE((std::is_constructible<span<int>, std::list<int>>::value));
  90. }
  91. TEST(SpanTest, OtherSpanConstruction)
  92. {
  93. std::array<int, 3> array = {1, 2, 3};
  94. span<int> s1{array.data(), array.size()};
  95. span<int, 3> s2{array.data(), array.size()};
  96. span<int> s3{s1};
  97. EXPECT_EQ(s3.data(), array.data());
  98. EXPECT_EQ(s3.size(), array.size());
  99. span<int> s4{s2};
  100. EXPECT_EQ(s4.data(), array.data());
  101. EXPECT_EQ(s4.size(), array.size());
  102. span<const int> s5{s1};
  103. EXPECT_EQ(s5.data(), array.data());
  104. EXPECT_EQ(s5.size(), array.size());
  105. EXPECT_FALSE((std::is_constructible<span<int>, span<const int>>::value));
  106. EXPECT_FALSE((std::is_constructible<span<int>, span<double>>::value));
  107. span<int, 3> s6{s2};
  108. EXPECT_EQ(s6.data(), array.data());
  109. EXPECT_EQ(s6.size(), array.size());
  110. span<const int, 3> s7{s2};
  111. EXPECT_EQ(s7.data(), array.data());
  112. EXPECT_EQ(s7.size(), array.size());
  113. EXPECT_FALSE((std::is_constructible<span<int, 3>, span<int, 4>>::value));
  114. EXPECT_FALSE((std::is_constructible<span<int, 3>, span<double, 3>>::value));
  115. }
  116. TEST(SpanTest, BracketOperator)
  117. {
  118. std::array<int, 2> array = {1, 2};
  119. span<int> s1{array.data(), array.size()};
  120. EXPECT_EQ(s1[0], 1);
  121. EXPECT_EQ(s1[1], 2);
  122. span<int, 2> s2{array.data(), array.size()};
  123. EXPECT_EQ(s2[0], 1);
  124. EXPECT_EQ(s2[1], 2);
  125. }
  126. TEST(SpanTest, Iteration)
  127. {
  128. std::array<int, 3> array = {1, 2, 3};
  129. span<int> s1{array.data(), array.size()};
  130. EXPECT_EQ(std::distance(s1.begin(), s1.end()), static_cast<ptrdiff_t>(array.size()));
  131. EXPECT_TRUE(std::equal(s1.begin(), s1.end(), array.begin()));
  132. span<int, 3> s2{array.data(), array.size()};
  133. EXPECT_EQ(std::distance(s2.begin(), s2.end()), static_cast<ptrdiff_t>(array.size()));
  134. EXPECT_TRUE(std::equal(s2.begin(), s2.end(), array.begin()));
  135. }