File: span.cpp

package info (click to toggle)
actor-framework 0.18.7-1~exp1
  • links: PTS
  • area: main
  • in suites: experimental
  • size: 8,740 kB
  • sloc: cpp: 85,162; sh: 491; python: 187; makefile: 11
file content (109 lines) | stat: -rw-r--r-- 3,072 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// This file is part of CAF, the C++ Actor Framework. See the file LICENSE in
// the main distribution directory for license terms and copyright or visit
// https://github.com/actor-framework/actor-framework/blob/master/LICENSE.

#define CAF_SUITE span

#include "caf/span.hpp"

#include "core-test.hpp"

#include <algorithm>

using namespace caf;

namespace {

using i8_list = std::vector<int8_t>;

using i16_list = std::vector<int16_t>;

template <class T, class U>
bool equal(const T& xs, const U& ys) {
  return xs.size() == ys.size() && std::equal(xs.begin(), xs.end(), ys.begin());
}

struct fixture {
  i8_list chars{'a', 'b', 'c', 'd', 'e', 'f'};

  i8_list rchars{'f', 'e', 'd', 'c', 'b', 'a'};

  i16_list shorts{1, 2, 4, 8, 16, 32, 64};

  i16_list rshorts{64, 32, 16, 8, 4, 2, 1};
};

} // namespace

BEGIN_FIXTURE_SCOPE(fixture)

CAF_TEST(default construction) {
  span<int> xs;
  CHECK_EQ(xs.size(), 0u);
  CHECK_EQ(xs.empty(), true);
  CHECK_EQ(xs.data(), nullptr);
  CHECK_EQ(xs.size_bytes(), 0u);
  CHECK_EQ(xs.begin(), xs.end());
  CHECK_EQ(xs.cbegin(), xs.cend());
  CHECK_EQ(xs.rbegin(), xs.rend());
  CHECK_EQ(xs.crbegin(), xs.crend());
  CHECK_EQ(as_bytes(xs).size_bytes(), 0u);
  CHECK_EQ(as_writable_bytes(xs).size_bytes(), 0u);
}

CAF_TEST(iterators) {
  auto xs = make_span(chars);
  CHECK(std::equal(xs.begin(), xs.end(), chars.begin()));
  CHECK(std::equal(xs.rbegin(), xs.rend(), rchars.begin()));
  auto ys = make_span(shorts);
  CHECK(std::equal(ys.begin(), ys.end(), shorts.begin()));
  CHECK(std::equal(ys.rbegin(), ys.rend(), rshorts.begin()));
}

CAF_TEST(subspans) {
  auto xs = make_span(chars);
  CHECK(equal(xs.first(6), xs));
  CHECK(equal(xs.last(6), xs));
  CHECK(equal(xs.subspan(0, 6), xs));
  CHECK(equal(xs.first(3), i8_list({'a', 'b', 'c'})));
  CHECK(equal(xs.last(3), i8_list({'d', 'e', 'f'})));
  CHECK(equal(xs.subspan(2, 2), i8_list({'c', 'd'})));
}

CAF_TEST(free iterator functions) {
  auto xs = make_span(chars);
  CHECK(xs.begin() == begin(xs));
  CHECK(xs.cbegin() == cbegin(xs));
  CHECK(xs.end() == end(xs));
  CHECK(xs.cend() == cend(xs));
}

CAF_TEST(as bytes) {
  auto xs = make_span(chars);
  auto ys = make_span(shorts);
  CHECK_EQ(as_bytes(xs).size(), chars.size());
  CHECK_EQ(as_bytes(ys).size(), shorts.size() * 2);
  CHECK_EQ(as_writable_bytes(xs).size(), chars.size());
  CHECK_EQ(as_writable_bytes(ys).size(), shorts.size() * 2);
}

CAF_TEST(make_span) {
  auto xs = make_span(chars);
  auto ys = make_span(chars.data(), chars.size());
  auto zs = make_span(chars.data(), chars.data() + chars.size());
  CHECK(std::equal(xs.begin(), xs.end(), chars.begin()));
  CHECK(std::equal(ys.begin(), ys.end(), chars.begin()));
  CHECK(std::equal(zs.begin(), zs.end(), chars.begin()));
  CHECK(end(xs) == end(ys));
  CHECK(end(ys) == end(zs));
  CHECK(begin(xs) == begin(ys));
  CHECK(begin(ys) == begin(zs));
}

CAF_TEST(spans are convertible from compatible containers) {
  std::vector<int> xs{1, 2, 3};
  span<const int> ys{xs};
  CHECK(std::equal(xs.begin(), xs.end(), ys.begin()));
}

END_FIXTURE_SCOPE()