blob: 1f4b1e2685308fa7a09434a93fe9f018737095a7 [file] [log] [blame]
Brian Silvermana6f7ce02018-07-07 15:04:00 -07001///////////////////////////////////////////////////////////////////////////////
2//
3// Copyright (c) 2015 Microsoft Corporation. All rights reserved.
4//
5// This code is licensed under the MIT License (MIT).
6//
7// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
8// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
9// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
10// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
11// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
12// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
13// THE SOFTWARE.
14//
15///////////////////////////////////////////////////////////////////////////////
16
17#include <catch/catch.hpp> // for AssertionHandler, StringRef, TEST_CASE
18
19#include <gsl/multi_span> // for static_bounds, static_bounds_dynamic_range_t
20
21#include <cstddef> // for ptrdiff_t, size_t
22
23namespace gsl {
24struct fail_fast;
25} // namespace gsl
26
27using namespace std;
28using namespace gsl;
29
30namespace
31{
32void use(std::ptrdiff_t&) {}
33}
34
35TEST_CASE("basic_bounds")
36{
37 for (auto point : static_bounds<dynamic_range, 3, 4>{2}) {
38 for (decltype(point)::size_type j = 0;
39 j < static_cast<decltype(point)::size_type>(decltype(point)::rank); j++)
40 {
41 use(j);
42 use(point[static_cast<std::size_t>(j)]);
43 }
44 }
45}
46
47TEST_CASE("bounds_basic")
48{
49 static_bounds<3, 4, 5> b;
50 const auto a = b.slice();
51 (void) a;
52 static_bounds<4, dynamic_range, 2> x{4};
53 x.slice().slice();
54}
55
56TEST_CASE("arrayview_iterator")
57{
58 static_bounds<4, dynamic_range, 2> bounds{3};
59
60 const auto itr = bounds.begin();
61 (void) itr;
62#ifdef CONFIRM_COMPILATION_ERRORS
63 multi_span<int, 4, dynamic_range, 2> av(nullptr, bounds);
64
65 auto itr2 = av.cbegin();
66
67 for (auto& v : av) {
68 v = 4;
69 }
70 fill(av.begin(), av.end(), 0);
71#endif
72}
73
74TEST_CASE("bounds_convertible")
75{
76 static_bounds<7, 4, 2> b1;
77 static_bounds<7, dynamic_range, 2> b2 = b1;
78 (void) b2;
79#ifdef CONFIRM_COMPILATION_ERRORS
80 static_bounds<7, dynamic_range, 1> b4 = b2;
81#endif
82
83 static_bounds<dynamic_range, dynamic_range, dynamic_range> b3 = b1;
84 static_bounds<7, 4, 2> b4 = b3;
85 (void) b4;
86
87 static_bounds<dynamic_range> b11;
88
89 static_bounds<dynamic_range> b5;
90 static_bounds<34> b6;
91
92 b5 = static_bounds<20>();
93 CHECK_THROWS_AS(b6 = b5, fail_fast);
94 b5 = static_bounds<34>();
95 b6 = b5;
96
97 CHECK(b5 == b6);
98 CHECK(b5.size() == b6.size());
99}