-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathblock_view.cpp
More file actions
120 lines (102 loc) · 3.71 KB
/
Copy pathblock_view.cpp
File metadata and controls
120 lines (102 loc) · 3.71 KB
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
110
111
112
113
114
115
116
117
118
119
120
// Copyright (C) 2018 Jonathan Müller <jonathanmueller.dev@gmail.com>
// This file is subject to the license terms in the LICENSE file
// found in the top-level directory of this distribution.
#include <foonathan/array/block_view.hpp>
#include <catch.hpp>
using namespace foonathan::array;
namespace
{
template <typename T>
void test_block_view(const block_view<T>& view, const memory_block& expected)
{
REQUIRE(view.empty() == expected.empty());
REQUIRE(view.size() == expected.size() / sizeof(T));
REQUIRE(view.data() == to_pointer<T>(expected.begin()));
REQUIRE(view.data_end() == to_pointer<T>(expected.end()));
REQUIRE(view.begin().operator->() == view.data());
REQUIRE(view.end().operator->() == view.data_end());
REQUIRE(view.block().begin() == expected.begin());
REQUIRE(view.block().end() == expected.end());
}
template <typename T>
void test_block_view(const block_view<const T>& view, const memory_block& expected)
{
REQUIRE(view.empty() == expected.empty());
REQUIRE(view.size() == expected.size() / sizeof(T));
REQUIRE(view.data() == to_pointer<T>(expected.begin()));
REQUIRE(view.data_end() == to_pointer<T>(expected.end()));
REQUIRE(view.begin().operator->() == view.data());
REQUIRE(view.end().operator->() == view.data_end());
}
} // namespace
TEST_CASE("block_view", "[view]")
{
int array[] = {1, 2, 3};
auto block = memory_block(to_raw_pointer(array), 3 * sizeof(int));
SECTION("empty")
{
block_view<int> view;
test_block_view(view, memory_block());
}
SECTION("memory_block")
{
block_view<int> view(block);
test_block_view(view, block);
}
SECTION("data + size")
{
block_view<int> view(array, 3);
test_block_view(view, block);
view = make_block_view(array, 3);
test_block_view(view, block);
}
SECTION("begin + end")
{
block_view<int> view(array, array + 3);
test_block_view(view, block);
view = make_block_view(array, array + 3);
test_block_view(view, block);
}
SECTION("array")
{
REQUIRE((std::is_same<block_value_type<decltype(array)>, int>::value));
REQUIRE((std::is_same<block_value_type<const int[4]>, const int>::value));
block_view<int> view(array);
test_block_view(view, block);
view = make_block_view(array);
test_block_view(view, block);
}
SECTION("initializer_list")
{
REQUIRE((std::is_same<block_value_type<std::initializer_list<int>>, const int>::value));
block_view<const int> view = {1, 2, 3};
// can't use test_block_view as I don't know where it points to
REQUIRE(view.size() == 3u);
REQUIRE(view.data()[1] == 2);
}
SECTION("custom")
{
struct custom_block
{
using value_type = int;
operator block_view<int>()
{
return block_view<int>(memory_block());
}
operator block_view<const int>() const
{
return block_view<const int>(memory_block());
}
};
custom_block cust_block;
const custom_block ccust_block{};
REQUIRE((std::is_same<block_value_type<custom_block>, int>::value));
block_view<int> view(cust_block);
test_block_view(view, memory_block());
REQUIRE((std::is_same<block_value_type<const custom_block>, const int>::value));
block_view<const int> cview(cust_block);
test_block_view(cview, memory_block());
cview = block_view<const int>(ccust_block);
test_block_view(cview, memory_block());
}
}