10cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh///////////////////////////////////////////////////////////////////////////////
20cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh//
30cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh// Copyright (c) 2015 Microsoft Corporation. All rights reserved.
40cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh//
50cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh// This code is licensed under the MIT License (MIT).
60cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh//
70cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
80cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
90cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
100cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
110cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
120cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
130cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh// THE SOFTWARE.
140cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh//
15a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh///////////////////////////////////////////////////////////////////////////////
16a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
17b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh#include <catch/catch.hpp>
18ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago
19222c2d85fd2ab37128f5cf00d5267489ea2a8625Galik#include <gsl/multi_span>
205f26ddac70f05766070b5b62ecabb7086f0df7c2Anna Gringauze
210cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#include <iostream>
220cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#include <list>
230cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#include <map>
240cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#include <memory>
25a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#include <string>
26a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#include <vector>
27a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
28a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntoshusing namespace std;
29ef626fd33a2f22ac917394995270da225dbc3c5fNeil MacIntoshusing namespace gsl;
30a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
310cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntoshnamespace
320cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh{
330cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntoshstruct BaseClass
34a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh{
350cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh};
360cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntoshstruct DerivedClass : BaseClass
370cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh{
380cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh};
39a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh}
40a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
41b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("default_constructor")
42a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh{
430cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    {
44b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s;
45b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 0 && s.data() == nullptr));
460cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
47b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int> cs;
48b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((cs.length() == 0 && cs.data() == nullptr));
49b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
50a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
51b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
52b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 0> s;
53b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 0 && s.data() == nullptr));
54a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
55b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int, 0> cs;
56b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((cs.length() == 0 && cs.data() == nullptr));
57b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
58a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
59b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
60a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
61b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 1> s;
62b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 1 && s.data() == nullptr)); // explains why it can't compile
63a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#endif
64b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
65a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
66b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
67b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s{};
68b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 0 && s.data() == nullptr));
690cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
70b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int> cs{};
71b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((cs.length() == 0 && cs.data() == nullptr));
720cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
73b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
740cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
75b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("from_nullptr_constructor")
76b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
770cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    {
78b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s = nullptr;
79b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 0 && s.data() == nullptr));
800cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
81b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int> cs = nullptr;
82b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((cs.length() == 0 && cs.data() == nullptr));
83b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
840cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
85b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
86b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 0> s = nullptr;
87b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 0 && s.data() == nullptr));
880cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
89b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int, 0> cs = nullptr;
90b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((cs.length() == 0 && cs.data() == nullptr));
91b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
920cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
93b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
94a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
95b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 1> s = nullptr;
96b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 1 && s.data() == nullptr)); // explains why it can't compile
97a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#endif
98b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
990cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
100b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
101b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s{nullptr};
102b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 0 && s.data() == nullptr));
1030cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
104b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int> cs{nullptr};
105b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((cs.length() == 0 && cs.data() == nullptr));
106b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
1070cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
108b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
109b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int*> s{nullptr};
110b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 0 && s.data() == nullptr));
1110cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
112b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int*> cs{nullptr};
113b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((cs.length() == 0 && cs.data() == nullptr));
1140cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
115b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
1160cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
117b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("from_nullptr_length_constructor")
118b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
1190cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    {
120b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s{nullptr, 0};
121b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 0 && s.data() == nullptr));
1220cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
123b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int> cs{nullptr, 0};
124b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((cs.length() == 0 && cs.data() == nullptr));
125b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
1260cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
127b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
128b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 0> s{nullptr, 0};
129b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 0 && s.data() == nullptr));
1300cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
131b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int, 0> cs{nullptr, 0};
132b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((cs.length() == 0 && cs.data() == nullptr));
133b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
134a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
135b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
136a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
137b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 1> s{nullptr, 0};
138b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 1 && s.data() == nullptr)); // explains why it can't compile
139a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#endif
140b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
1410cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
142b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
143b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto workaround_macro = []() { multi_span<int> s{nullptr, 1}; };
144b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(workaround_macro(), fail_fast);
1450cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
146b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto const_workaround_macro = []() { multi_span<const int> cs{nullptr, 1}; };
147b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(const_workaround_macro(), fail_fast);
148b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
1490cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
150b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
151b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto workaround_macro = []() { multi_span<int, 0> s{nullptr, 1}; };
152b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(workaround_macro(), fail_fast);
1530cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
154b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto const_workaround_macro = []() { multi_span<const int, 0> s{nullptr, 1}; };
155b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(const_workaround_macro(), fail_fast);
156b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
1570cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
158b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
159b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int*> s{nullptr, 0};
160b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 0 && s.data() == nullptr));
1610cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
162b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int*> cs{nullptr, 0};
163b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((cs.length() == 0 && cs.data() == nullptr));
1640cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
165b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
1660cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
167b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("from_element_constructor")
168b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
169b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    int i = 5;
170a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
171b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
172b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s = i;
173b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 1 && s.data() == &i));
174b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s[0] == 5);
1750cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
176b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int> cs = i;
177b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((cs.length() == 1 && cs.data() == &i));
178b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(cs[0] == 5);
179b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
180a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
181b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
182a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
183b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        const j = 1;
184b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 0> s = j;
185a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#endif
186b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
187a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
188b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
189a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
190b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 0> s = i;
191b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 0 && s.data() == &i));
1928aa42487225a537ddedac668ec14e179bb481935Anna Gringauze#endif
193b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
1940cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
195b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
196b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 1> s = i;
197b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 1 && s.data() == &i));
198b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s[0] == 5);
199b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
2000cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
201b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
2020cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
203b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 2> s = i;
204b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 2 && s.data() == &i));
2058aa42487225a537ddedac668ec14e179bb481935Anna Gringauze#endif
206b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
2070cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
208b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
2090cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
210b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto get_a_temp = []() -> int { return 4; };
211b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto use_a_span = [](multi_span<int> s) { (void) s; };
212b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        use_a_span(get_a_temp());
2138aa42487225a537ddedac668ec14e179bb481935Anna Gringauze#endif
2140cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
215b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
2160cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
217b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("from_pointer_length_constructor")
218b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
219b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    int arr[4] = {1, 2, 3, 4};
2200cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
221b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
222b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s{&arr[0], 2};
223b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 2 && s.data() == &arr[0]));
224b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s[0] == 1 && s[1] == 2));
225b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
2260cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
227b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
228b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 2> s{&arr[0], 2};
229b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 2 && s.data() == &arr[0]));
230b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s[0] == 1 && s[1] == 2));
231b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
2320cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
233b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
234b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        int* p = nullptr;
235b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s{p, 0};
236b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 0 && s.data() == nullptr));
2370cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
2380cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
2390cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    {
240b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        int* p = nullptr;
241b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto workaround_macro = [=]() { multi_span<int> s{p, 2}; };
242b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(workaround_macro(), fail_fast);
243b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
244b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
2450cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
246b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("from_pointer_pointer_constructor")
247b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
248b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    int arr[4] = {1, 2, 3, 4};
2490cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
250b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
251b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s{&arr[0], &arr[2]};
252b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 2 && s.data() == &arr[0]));
253b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s[0] == 1 && s[1] == 2));
254b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
2550cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
256b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
257b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 2> s{&arr[0], &arr[2]};
258b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 2 && s.data() == &arr[0]));
259b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s[0] == 1 && s[1] == 2));
260b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
2610cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
262b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
263b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s{&arr[0], &arr[0]};
264b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 0 && s.data() == &arr[0]));
265b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
2660cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
267b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
268b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 0> s{&arr[0], &arr[0]};
269b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 0 && s.data() == &arr[0]));
270b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
2710cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
272b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
273b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto workaround_macro = [&]() { multi_span<int> s{&arr[1], &arr[0]}; };
274b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(workaround_macro(), fail_fast);
275b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
2760cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
277b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
278b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        int* p = nullptr;
279b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto workaround_macro = [&]() { multi_span<int> s{&arr[0], p}; };
280b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(workaround_macro(), fail_fast);
281b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
2820cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
283b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
284b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        int* p = nullptr;
285b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto workaround_macro = [&]() { multi_span<int> s{p, p}; };
286b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(workaround_macro(), fail_fast);
2870cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
2880cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
2890cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    {
290b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        int* p = nullptr;
291b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto workaround_macro = [&]() { multi_span<int> s{&arr[0], p}; };
292b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(workaround_macro(), fail_fast);
293b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
294b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
2950cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
296b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("from_array_constructor")
297b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
298b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    int arr[5] = {1, 2, 3, 4, 5};
2990cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
300b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
301b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s{arr};
302b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 5 && s.data() == &arr[0]));
303b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
3040cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
305b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
306b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 5> s{arr};
307b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 5 && s.data() == &arr[0]));
308b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
309b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
310b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
31117ed5c3664ff8b20a4d4da91f75ebb1b58653e07Anna Gringauze#ifdef CONFIRM_COMPILATION_ERRORS
312b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 6> s{arr};
31317ed5c3664ff8b20a4d4da91f75ebb1b58653e07Anna Gringauze#endif
314b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
3150cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
316b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
317b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 0> s{arr};
318b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 0 && s.data() == &arr[0]));
319b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
3200cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
321b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    int arr2d[2][3] = {1, 2, 3, 4, 5, 6};
3220cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
323b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
324b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s{arr2d};
325b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 6 && s.data() == &arr2d[0][0]));
326b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s[0] == 1 && s[5] == 6));
327b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
3280cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
329b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
330b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 0> s{arr2d};
331b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 0 && s.data() == &arr2d[0][0]));
332b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
33317ed5c3664ff8b20a4d4da91f75ebb1b58653e07Anna Gringauze
334b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
33517ed5c3664ff8b20a4d4da91f75ebb1b58653e07Anna Gringauze#ifdef CONFIRM_COMPILATION_ERRORS
336b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 5> s{arr2d};
337546f8cc1306ec69cc3a8f292785658da8caf157aAnna Gringauze#endif
338b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
33917ed5c3664ff8b20a4d4da91f75ebb1b58653e07Anna Gringauze
340b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
341b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 6> s{arr2d};
342b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 6 && s.data() == &arr2d[0][0]));
343b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s[0] == 1 && s[5] == 6));
344b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
34517ed5c3664ff8b20a4d4da91f75ebb1b58653e07Anna Gringauze
346b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
34717ed5c3664ff8b20a4d4da91f75ebb1b58653e07Anna Gringauze#ifdef CONFIRM_COMPILATION_ERRORS
348b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 7> s{arr2d};
34917ed5c3664ff8b20a4d4da91f75ebb1b58653e07Anna Gringauze#endif
350b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
3510cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
352b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
353b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int[3]> s{arr2d[0]};
354b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 1 && s.data() == &arr2d[0]));
355b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
3560cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
357b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
358b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 2, 3> s{arr2d};
359b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 6 && s.data() == &arr2d[0][0]));
360b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto workaround_macro = [&]() { return s[{1, 2}] == 6; };
361b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(workaround_macro());
362b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
3630cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
364b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
36517ed5c3664ff8b20a4d4da91f75ebb1b58653e07Anna Gringauze#ifdef CONFIRM_COMPILATION_ERRORS
366b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 3, 3> s{arr2d};
36717ed5c3664ff8b20a4d4da91f75ebb1b58653e07Anna Gringauze#endif
368b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
3690cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
370b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    int arr3d[2][3][2] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
3710cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
372b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
373b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s{arr3d};
374b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 12 && s.data() == &arr3d[0][0][0]));
375b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s[0] == 1 && s[11] == 12));
376b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
3770cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
378b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
379b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 0> s{arr3d};
380b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 0 && s.data() == &arr3d[0][0][0]));
381b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
3820cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
383b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
38417ed5c3664ff8b20a4d4da91f75ebb1b58653e07Anna Gringauze#ifdef CONFIRM_COMPILATION_ERRORS
385b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 11> s{arr3d};
38617ed5c3664ff8b20a4d4da91f75ebb1b58653e07Anna Gringauze#endif
387b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
38817ed5c3664ff8b20a4d4da91f75ebb1b58653e07Anna Gringauze
389b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
390b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 12> s{arr3d};
391b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 12 && s.data() == &arr3d[0][0][0]));
392b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s[0] == 1 && s[5] == 6));
393b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
3945f26ddac70f05766070b5b62ecabb7086f0df7c2Anna Gringauze
395b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
3965f26ddac70f05766070b5b62ecabb7086f0df7c2Anna Gringauze#ifdef CONFIRM_COMPILATION_ERRORS
397b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 13> s{arr3d};
3985f26ddac70f05766070b5b62ecabb7086f0df7c2Anna Gringauze#endif
399b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
4000cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
401b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
402b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int[3][2]> s{arr3d[0]};
403b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 1 && s.data() == &arr3d[0]));
404b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
4050cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
406b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
407b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 3, 2, 2> s{arr3d};
408b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 12 && s.data() == &arr3d[0][0][0]));
409b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto workaround_macro = [&]() { return s[{2, 1, 0}] == 11; };
410b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(workaround_macro());
411b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
4120cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
413b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
4140cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
415b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 3, 3, 3> s{arr3d};
416546f8cc1306ec69cc3a8f292785658da8caf157aAnna Gringauze#endif
4170cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
418b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
419b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
420b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("from_dynamic_array_constructor")
421b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
422b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    double(*arr)[3][4] = new double[100][3][4];
4230cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
4240cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    {
425b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<double, dynamic_range, 3, 4> s(arr, 10);
426b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 120 && s.data() == &arr[0][0][0]));
427b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(s[10][3][4], fail_fast);
428b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
4290cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
430b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
431b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<double, dynamic_range, 4, 3> s(arr, 10);
432b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 120 && s.data() == &arr[0][0][0]));
433b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
4340cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
435b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
436b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<double> s(arr, 10);
437b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 120 && s.data() == &arr[0][0][0]));
438b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
43917ed5c3664ff8b20a4d4da91f75ebb1b58653e07Anna Gringauze
440b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
441b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<double, dynamic_range, 3, 4> s(arr, 0);
442b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 0 && s.data() == &arr[0][0][0]));
443b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
444a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
445b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    delete[] arr;
446b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
447a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
448b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("from_std_array_constructor")
449b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
450b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    std::array<int, 4> arr = {1, 2, 3, 4};
451a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
4520cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    {
453b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s{arr};
454b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.size() == narrow_cast<ptrdiff_t>(arr.size()) && s.data() == arr.data()));
455a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
456b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int> cs{arr};
457b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((cs.size() == narrow_cast<ptrdiff_t>(arr.size()) && cs.data() == arr.data()));
458b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
459a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
460b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
461b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 4> s{arr};
462b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.size() == narrow_cast<ptrdiff_t>(arr.size()) && s.data() == arr.data()));
463a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
464b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int, 4> cs{arr};
465b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((cs.size() == narrow_cast<ptrdiff_t>(arr.size()) && cs.data() == arr.data()));
466b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
467a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
468b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
469b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 2> s{arr};
470b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.size() == 2 && s.data() == arr.data()));
471a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
472b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int, 2> cs{arr};
473b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((cs.size() == 2 && cs.data() == arr.data()));
474b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
475a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
476b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
477b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 0> s{arr};
478b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.size() == 0 && s.data() == arr.data()));
479a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
480b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int, 0> cs{arr};
481b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((cs.size() == 0 && cs.data() == arr.data()));
482b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
4830cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
484b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    // TODO This is currently an unsupported scenario. We will come back to it as we revise
485b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    // the multidimensional interface and what transformations between dimensionality look like
486b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    //{
487b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    //    multi_span<int, 2, 2> s{arr};
488b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    //    CHECK(s.size() == narrow_cast<ptrdiff_t>(arr.size()) && s.data() == arr.data());
489b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    //}
4900cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
491b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
492a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
493b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 5> s{arr};
494a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#endif
495b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
4960cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
497b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
498a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
499b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto get_an_array = []() { return std::array<int, 4>{1, 2, 3, 4}; };
500b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto take_a_span = [](multi_span<int> s) { (void) s; };
501b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        // try to take a temporary std::array
502b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        take_a_span(get_an_array());
503a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#endif
5040cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
505b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
5060cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
507b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("from_const_std_array_constructor")
508b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
509b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    const std::array<int, 4> arr = {1, 2, 3, 4};
51005e6b6dd4ba8164a72d6968d238840340afdddb8Neil MacIntosh
511b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
512b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int> s{arr};
513b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.size() == narrow_cast<ptrdiff_t>(arr.size()) && s.data() == arr.data()));
514b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
51505e6b6dd4ba8164a72d6968d238840340afdddb8Neil MacIntosh
516b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
517b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int, 4> s{arr};
518b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.size() == narrow_cast<ptrdiff_t>(arr.size()) && s.data() == arr.data()));
519b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
520a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
521b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
522b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int, 2> s{arr};
523b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.size() == 2 && s.data() == arr.data()));
524b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
525a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
526b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
527b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int, 0> s{arr};
528b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.size() == 0 && s.data() == arr.data()));
529b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
530a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
531b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    // TODO This is currently an unsupported scenario. We will come back to it as we revise
532b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    // the multidimensional interface and what transformations between dimensionality look like
533b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    //{
534b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    //    multi_span<int, 2, 2> s{arr};
535b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    //    CHECK(s.size() == narrow_cast<ptrdiff_t>(arr.size()) && s.data() == arr.data());
536b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    //}
537a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
538b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
5390cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
540b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int, 5> s{arr};
5410cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#endif
542b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
543a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
544b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
5450cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
546b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto get_an_array = []() -> const std::array<int, 4> { return {1, 2, 3, 4}; };
547b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto take_a_span = [](multi_span<const int> s) { (void) s; };
548b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        // try to take a temporary std::array
549b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        take_a_span(get_an_array());
5500cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#endif
5510cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
552b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
553a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
554b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("from_container_constructor")
555b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
556b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    std::vector<int> v = {1, 2, 3};
557b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    const std::vector<int> cv = v;
558a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
559b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
560b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s{v};
561b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.size() == narrow_cast<std::ptrdiff_t>(v.size()) && s.data() == v.data()));
562a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
563b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int> cs{v};
564b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((cs.size() == narrow_cast<std::ptrdiff_t>(v.size()) && cs.data() == v.data()));
565b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
566a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
567b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    std::string str = "hello";
568b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    const std::string cstr = "hello";
569a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
570b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
571a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
572b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<char> s{str};
573b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.size() == narrow_cast<std::ptrdiff_t>(str.size()) && s.data() == str.data()));
574a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#endif
575b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const char> cs{str};
576b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((cs.size() == narrow_cast<std::ptrdiff_t>(str.size()) && cs.data() == str.data()));
577b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
5780cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
579b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
580a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
581b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<char> s{cstr};
582a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#endif
583b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const char> cs{cstr};
584b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((cs.size() == narrow_cast<std::ptrdiff_t>(cstr.size()) &&
585b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh               cs.data() == cstr.data()));
586b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
587a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
588b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
589a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
590b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto get_temp_vector = []() -> std::vector<int> { return {}; };
591b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto use_span = [](multi_span<int> s) { (void) s; };
592b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        use_span(get_temp_vector());
593a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#endif
594b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
595a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
596b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
5970cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
598b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto get_temp_string = []() -> std::string { return {}; };
599b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto use_span = [](multi_span<char> s) { (void) s; };
600b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        use_span(get_temp_string());
6010cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#endif
602b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
603a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
604b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
605a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
606b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto get_temp_vector = []() -> const std::vector<int> { return {}; };
607b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto use_span = [](multi_span<const char> s) { (void) s; };
608b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        use_span(get_temp_vector());
609a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#endif
610b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
6110cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
612b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
613a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
614b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto get_temp_string = []() -> const std::string { return {}; };
615b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto use_span = [](multi_span<const char> s) { (void) s; };
616b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        use_span(get_temp_string());
617a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh#endif
618b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
619a9dcbe04ff330ef8297191d19951d4a313b2115aNeil MacIntosh
620b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
6210cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
622b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        std::map<int, int> m;
623b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s{m};
6240cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#endif
6250cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
626b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
6270cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
628b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("from_convertible_span_constructor")
629b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
6300cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
631b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    multi_span<int, 7, 4, 2> av1(nullptr, b1);
6320cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
633b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    auto f = [&]() { multi_span<int, 7, 4, 2> av1(nullptr); };
634b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    CHECK_THROWS_AS(f(), fail_fast);
6350cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#endif
6360cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
6370cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
638b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    static_bounds<std::size_t, 7, dynamic_range, 2> b12(b11);
639b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    b12 = b11;
640b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    b11 = b12;
6410cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
642b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    multi_span<int, dynamic_range> av1 = nullptr;
643b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    multi_span<int, 7, dynamic_range, 2> av2(av1);
644b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    multi_span<int, 7, 4, 2> av2(av1);
6450cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#endif
6460cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
647b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    multi_span<DerivedClass> avd;
6480cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
649b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    multi_span<BaseClass> avb = avd;
6500cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#endif
651b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    multi_span<const DerivedClass> avcd = avd;
652b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    (void) avcd;
653b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
6540cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
655b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("copy_move_and_assignment")
656b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
657b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    multi_span<int> s1;
658b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    CHECK(s1.empty());
6590cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
660b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    int arr[] = {3, 4, 5};
6610cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
662b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    multi_span<const int> s2 = arr;
663b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    CHECK((s2.length() == 3 && s2.data() == &arr[0]));
6640cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
665b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    s2 = s1;
666b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    CHECK(s2.empty());
6670cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
668b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    auto get_temp_span = [&]() -> multi_span<int> { return {&arr[1], 2}; };
669b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    auto use_span = [&](multi_span<const int> s) {
670b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s.length() == 2 && s.data() == &arr[1]));
671b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    };
672b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    use_span(get_temp_span());
6730cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
674b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    s1 = get_temp_span();
675b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    CHECK((s1.length() == 2 && s1.data() == &arr[1]));
676b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
6770cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
678b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshtemplate <class Bounds>
679b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshvoid fn(const Bounds&)
680b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
681b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    static_assert(Bounds::static_size == 60, "static bounds is wrong size");
682b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
683b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("as_multi_span_reshape")
684b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
685b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    int a[3][4][5];
686b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    auto av = as_multi_span(a);
687b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    fn(av.bounds());
688b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    auto av2 = as_multi_span(av, dim<60>());
689b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    auto av3 = as_multi_span(av2, dim<3>(), dim<4>(), dim<5>());
690b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    auto av4 = as_multi_span(av3, dim<4>(), dim(3), dim<5>());
691b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    auto av5 = as_multi_span(av4, dim<3>(), dim<4>(), dim<5>());
692b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    auto av6 = as_multi_span(av5, dim<12>(), dim(5));
6930cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
694b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    fill(av6.begin(), av6.end(), 1);
6950cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
696b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    auto av7 = as_bytes(av6);
6970cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
698b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    auto av8 = as_multi_span<int>(av7);
6990cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
700b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    CHECK(av8.size() == av6.size());
701b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    for (auto i = 0; i < av8.size(); i++) {
702b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av8[i] == 1);
7030cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
704b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
7050cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
706b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("first")
707b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
708b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    int arr[5] = {1, 2, 3, 4, 5};
7090cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
710b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
711b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 5> av = arr;
712b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((av.first<2>().bounds() == static_bounds<2>()));
713b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.first<2>().length() == 2);
714b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.first(2).length() == 2);
715b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
7160cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
717b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
718b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 5> av = arr;
719b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((av.first<0>().bounds() == static_bounds<0>()));
720b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.first<0>().length() == 0);
721b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.first(0).length() == 0);
722b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
7230cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
724b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
725b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 5> av = arr;
726b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((av.first<5>().bounds() == static_bounds<5>()));
727b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.first<5>().length() == 5);
728b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.first(5).length() == 5);
729b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
7300cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
731b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
732b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 5> av = arr;
7330cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
734b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.first<6>().bounds() == static_bounds<6>());
735b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.first<6>().length() == 6);
736b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.first<-1>().length() == -1);
7370cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#endif
738b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(av.first(6).length(), fail_fast);
7390cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
7400cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
7410cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    {
742b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, dynamic_range> av;
743b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((av.first<0>().bounds() == static_bounds<0>()));
744b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.first<0>().length() == 0);
745b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.first(0).length() == 0);
746b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
747b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
7480cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
749b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("last")
750b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
751b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    int arr[5] = {1, 2, 3, 4, 5};
7520cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
753b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
754b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 5> av = arr;
755b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((av.last<2>().bounds() == static_bounds<2>()));
756b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.last<2>().length() == 2);
757b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.last(2).length() == 2);
758b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
7590cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
760b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
761b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 5> av = arr;
762b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((av.last<0>().bounds() == static_bounds<0>()));
763b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.last<0>().length() == 0);
764b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.last(0).length() == 0);
765b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
766b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
767b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
768b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 5> av = arr;
769b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((av.last<5>().bounds() == static_bounds<5>()));
770b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.last<5>().length() == 5);
771b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.last(5).length() == 5);
772b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
7730cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
774b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
775b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 5> av = arr;
7760cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
777b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((av.last<6>().bounds() == static_bounds<6>()));
778b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.last<6>().length() == 6);
7790cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#endif
780b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(av.last(6).length(), fail_fast);
7810cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
7820cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
7830cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    {
784b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, dynamic_range> av;
785b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((av.last<0>().bounds() == static_bounds<0>()));
786b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.last<0>().length() == 0);
787b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.last(0).length() == 0);
788b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
789b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
7900cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
791b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("subspan")
792b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
793b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    int arr[5] = {1, 2, 3, 4, 5};
7940cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
795b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
796b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 5> av = arr;
797b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((av.subspan<2, 2>().bounds() == static_bounds<2>()));
798b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((av.subspan<2, 2>().length() == 2));
799b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.subspan(2, 2).length() == 2);
800b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.subspan(2, 3).length() == 3);
801b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
8020cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
803b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
804b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 5> av = arr;
805b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((av.subspan<0, 0>().bounds() == static_bounds<0>()));
806b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((av.subspan<0, 0>().length() == 0));
807b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.subspan(0, 0).length() == 0);
808b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
8090cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
810b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
811b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 5> av = arr;
812b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((av.subspan<0, 5>().bounds() == static_bounds<5>()));
813b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((av.subspan<0, 5>().length() == 5));
814b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.subspan(0, 5).length() == 5);
815b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(av.subspan(0, 6).length(), fail_fast);
816b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(av.subspan(1, 5).length(), fail_fast);
817b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
8180cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
819b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
820b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 5> av = arr;
821b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((av.subspan<5, 0>().bounds() == static_bounds<0>()));
822b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((av.subspan<5, 0>().length() == 0));
823b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.subspan(5, 0).length() == 0);
824b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(av.subspan(6, 0).length(), fail_fast);
825b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
8260cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
827b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
828b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, dynamic_range> av;
829b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((av.subspan<0, 0>().bounds() == static_bounds<0>()));
830b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((av.subspan<0, 0>().length() == 0));
831b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.subspan(0, 0).length() == 0);
832b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS((av.subspan<1, 0>().length()), fail_fast);
833b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
8340cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
835b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
836b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> av;
837b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.subspan(0).length() == 0);
838b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(av.subspan(1).length(), fail_fast);
839b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
8400cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
841b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
842b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> av = arr;
843b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.subspan(0).length() == 5);
844b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.subspan(1).length() == 4);
845b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.subspan(4).length() == 1);
846b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.subspan(5).length() == 0);
847b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(av.subspan(6).length(), fail_fast);
848b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto av2 = av.subspan(1);
849b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        for (int i = 0; i < 4; ++i) CHECK(av2[i] == i + 2);
8500cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
8510cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
8520cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    {
853b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 5> av = arr;
854b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.subspan(0).length() == 5);
855b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.subspan(1).length() == 4);
856b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.subspan(4).length() == 1);
857b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av.subspan(5).length() == 0);
858b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(av.subspan(6).length(), fail_fast);
859b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto av2 = av.subspan(1);
860b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        for (int i = 0; i < 4; ++i) CHECK(av2[i] == i + 2);
861b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
862b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
8630cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
864b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("rank")
865b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
866b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    int arr[2] = {1, 2};
8670cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
868b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
869b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s;
870b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s.rank() == 1);
871b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
8720cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
873b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
874b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 2> s = arr;
875b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s.rank() == 1);
8760cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
8770cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
878b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    int arr2d[1][1] = {};
8790cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    {
880b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 1, 1> s = arr2d;
881b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s.rank() == 2);
882b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
883b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
884b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
885b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("extent")
886b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
887b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
888b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s;
889b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s.extent() == 0);
890b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s.extent(0) == 0);
891b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(s.extent(1), fail_fast);
8920cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
893b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s.extent<1>() == 0);
8940cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#endif
8950cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
8960cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
8970cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    {
898b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 0> s;
899b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s.extent() == 0);
900b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s.extent(0) == 0);
901b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(s.extent(1), fail_fast);
902b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
9039523c1842e1c919aff9eac38111fc58b99e3b0c0Neil MacIntosh
904b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
905b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        int arr2d[1][2] = {};
9069523c1842e1c919aff9eac38111fc58b99e3b0c0Neil MacIntosh
907b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 1, 2> s = arr2d;
908b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s.extent() == 1);
909b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s.extent<0>() == 1);
910b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s.extent<1>() == 2);
911b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s.extent(0) == 1);
912b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s.extent(1) == 2);
913b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(s.extent(3), fail_fast);
9140cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
9150cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
9160cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    {
917b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        int arr2d[1][2] = {};
9180cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
919b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 0, 2> s = arr2d;
920b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s.extent() == 0);
921b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s.extent<0>() == 0);
922b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s.extent<1>() == 2);
923b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s.extent(0) == 0);
924b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s.extent(1) == 2);
925b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(s.extent(3), fail_fast);
926b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
927b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
9280cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
929b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("operator_function_call")
930b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
931b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    int arr[4] = {1, 2, 3, 4};
9320cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
933b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
934b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s = arr;
935b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s(0) == 1);
936b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(s(5), fail_fast);
937b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
9380cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
939b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    int arr2d[2][3] = {1, 2, 3, 4, 5, 6};
9400cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
941b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
942b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 2, 3> s = arr2d;
943b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s(0, 0) == 1);
944b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s(0, 1) == 2);
945b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s(1, 2) == 6);
946b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
9470cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
948b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    int arr3d[2][2][2] = {1, 2, 3, 4, 5, 6, 7, 8};
9490cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
950b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
951b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 2, 2, 2> s = arr3d;
952b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s(0, 0, 0) == 1);
953b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s(1, 1, 1) == 8);
9540cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
955b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
9560cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
957b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("comparison_operators")
958b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
9590cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    {
960b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        int arr[10][2];
961b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto s1 = as_multi_span(arr);
962b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const int, dynamic_range, 2> s2 = s1;
963b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
964b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s1 == s2);
965b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
966b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 20> s3 = as_multi_span(s1, dim(20));
967b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK((s3 == s2 && s3 == s1));
968b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
969b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
970b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
971b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s1 = nullptr;
972b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s2 = nullptr;
973b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s1 == s2);
974b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s1 != s2));
975b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s1 < s2));
976b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s1 <= s2);
977b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s1 > s2));
978b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s1 >= s2);
979b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s2 == s1);
980b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s2 != s1));
981b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s2 < s1));
982b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s2 <= s1);
983b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s2 > s1));
984b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s2 >= s1);
985b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
986b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
987b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
988b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        int arr[] = {2, 1}; // bigger
989b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
990b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s1 = nullptr;
991b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s2 = arr;
992b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
993b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s1 != s2);
994b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s2 != s1);
995b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s1 == s2));
996b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s2 == s1));
997b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s1 < s2);
998b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s2 < s1));
999b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s1 <= s2);
1000b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s2 <= s1));
1001b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s2 > s1);
1002b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s1 > s2));
1003b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s2 >= s1);
1004b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s1 >= s2));
1005b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
1006b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
1007b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
1008b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        int arr1[] = {1, 2};
1009b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        int arr2[] = {1, 2};
1010b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s1 = arr1;
1011b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s2 = arr2;
1012b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
1013b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s1 == s2);
1014b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s1 != s2));
1015b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s1 < s2));
1016b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s1 <= s2);
1017b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s1 > s2));
1018b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s1 >= s2);
1019b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s2 == s1);
1020b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s2 != s1));
1021b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s2 < s1));
1022b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s2 <= s1);
1023b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s2 > s1));
1024b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s2 >= s1);
1025b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
1026b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
1027b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
1028b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        int arr[] = {1, 2, 3};
1029b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
1030b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s1 = {&arr[0], 2}; // shorter
1031b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s2 = arr;          // longer
1032b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
1033b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s1 != s2);
1034b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s2 != s1);
1035b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s1 == s2));
1036b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s2 == s1));
1037b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s1 < s2);
1038b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s2 < s1));
1039b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s1 <= s2);
1040b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s2 <= s1));
1041b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s2 > s1);
1042b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s1 > s2));
1043b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s2 >= s1);
1044b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s1 >= s2));
1045b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
1046b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
1047b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
1048b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        int arr1[] = {1, 2}; // smaller
1049b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        int arr2[] = {2, 1}; // bigger
1050b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
1051b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s1 = arr1;
1052b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> s2 = arr2;
1053b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
1054b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s1 != s2);
1055b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s2 != s1);
1056b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s1 == s2));
1057b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s2 == s1));
1058b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s1 < s2);
1059b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s2 < s1));
1060b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s1 <= s2);
1061b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s2 <= s1));
1062b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s2 > s1);
1063b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s1 > s2));
1064b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(s2 >= s1);
1065b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(!(s1 >= s2));
1066b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
1067b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
10680cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1069b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("basics")
1070b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
1071b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    auto ptr = as_multi_span(new int[10], 10);
1072b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    fill(ptr.begin(), ptr.end(), 99);
1073b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    for (int num : ptr) {
1074b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(num == 99);
10750cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
10760cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1077b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    delete[] ptr.data();
1078b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
10790cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1080b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("bounds_checks")
1081b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
1082b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    int arr[10][2];
1083b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    auto av = as_multi_span(arr);
10840cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1085b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    fill(begin(av), end(av), 0);
10860cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1087b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    av[2][0] = 1;
1088b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    av[1][1] = 3;
10890cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1090b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    // out of bounds
1091b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    CHECK_THROWS_AS(av[1][3] = 3, fail_fast);
1092b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    CHECK_THROWS_AS((av[{1, 3}] = 3), fail_fast);
109322c27854529b1e5c5da2b4845ffac764f208326dKrzysztof Wrzalik
1094b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    CHECK_THROWS_AS(av[10][2], fail_fast);
1095b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    CHECK_THROWS_AS((av[{10, 2}]), fail_fast);
109622c27854529b1e5c5da2b4845ffac764f208326dKrzysztof Wrzalik
1097b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    CHECK_THROWS_AS(av[-1][0], fail_fast);
1098b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    CHECK_THROWS_AS((av[{-1, 0}]), fail_fast);
10990cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1100b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    CHECK_THROWS_AS(av[0][-1], fail_fast);
1101b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    CHECK_THROWS_AS((av[{0, -1}]), fail_fast);
1102b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
1103b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
1104b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshvoid overloaded_func(multi_span<const int, dynamic_range, 3, 5> exp, int expected_value)
1105b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
1106b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    for (auto val : exp) {
1107b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(val == expected_value);
11080cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
1109b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
11100cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1111b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshvoid overloaded_func(multi_span<const char, dynamic_range, 3, 5> exp, char expected_value)
1112b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
1113b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    for (auto val : exp) {
1114b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(val == expected_value);
11150cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
1116b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
11170cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1118b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshvoid fixed_func(multi_span<int, 3, 3, 5> exp, int expected_value)
1119b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
1120b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    for (auto val : exp) {
1121b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(val == expected_value);
11220cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
1123b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
11240cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1125b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("span_parameter_test")
1126b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
1127b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    auto data = new int[4][3][5];
11280cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1129b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    auto av = as_multi_span(data, 4);
11300cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1131b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    CHECK(av.size() == 60);
11320cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1133b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    fill(av.begin(), av.end(), 34);
11340cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1135b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    int count = 0;
1136b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    for_each(av.rbegin(), av.rend(), [&](int val) { count += val; });
1137b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    CHECK(count == 34 * 60);
1138b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    overloaded_func(av, 34);
11390cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1140b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    overloaded_func(as_multi_span(av, dim(4), dim(3), dim(5)), 34);
11410cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1142b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    // fixed_func(av, 34);
1143b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    delete[] data;
1144b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
11450cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1146b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("md_access")
1147b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
1148b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    auto width = 5, height = 20;
11490cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1150b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    auto imgSize = width * height;
1151b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    auto image_ptr = new int[static_cast<std::size_t>(imgSize)][3];
11520cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1153b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    // size check will be done
1154b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    auto image_view =
1155b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        as_multi_span(as_multi_span(image_ptr, imgSize), dim(height), dim(width), dim<3>());
11560cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1157b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    iota(image_view.begin(), image_view.end(), 1);
11580cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1159b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    int expected = 0;
1160b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    for (auto i = 0; i < height; i++) {
1161b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        for (auto j = 0; j < width; j++) {
1162b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh            CHECK(expected + 1 == image_view[i][j][0]);
1163b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh            CHECK(expected + 2 == image_view[i][j][1]);
1164b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh            CHECK(expected + 3 == image_view[i][j][2]);
11650cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1166b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh            auto val = image_view[{i, j, 0}];
1167b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh            CHECK(expected + 1 == val);
1168b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh            val = image_view[{i, j, 1}];
1169b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh            CHECK(expected + 2 == val);
1170b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh            val = image_view[{i, j, 2}];
1171b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh            CHECK(expected + 3 == val);
11720cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1173b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh            expected += 3;
11740cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh        }
11750cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
1176b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
11770cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1178b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("as_multi_span")
1179b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
11800cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    {
1181b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        int* arr = new int[150];
11820cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1183b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto av = as_multi_span(arr, dim<10>(), dim(3), dim<5>());
11840cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1185b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        fill(av.begin(), av.end(), 24);
1186b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        overloaded_func(av, 24);
11870cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1188b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        delete[] arr;
11890cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1190b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        array<int, 15> stdarr{0};
1191b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto av2 = as_multi_span(stdarr);
1192b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        overloaded_func(as_multi_span(av2, dim(1), dim<3>(), dim<5>()), 0);
11930cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1194b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        string str = "ttttttttttttttt"; // size = 15
1195b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto t = str.data();
1196b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        (void) t;
1197b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto av3 = as_multi_span(str);
1198b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        overloaded_func(as_multi_span(av3, dim(1), dim<3>(), dim<5>()), 't');
1199b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
12000cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1201b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
1202b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        string str;
1203b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<char> strspan = as_multi_span(str);
1204b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        (void) strspan;
1205b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        const string cstr;
1206b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<const char> cstrspan = as_multi_span(cstr);
1207b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        (void) cstrspan;
1208b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
12090cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1210b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
1211b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        int a[3][4][5];
1212b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto av = as_multi_span(a);
1213b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        const int(*b)[4][5];
1214b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        b = a;
1215b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto bv = as_multi_span(b, 3);
12160cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1217b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(av == bv);
12180cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1219b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        const std::array<double, 3> arr = {0.0, 0.0, 0.0};
1220b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto cv = as_multi_span(arr);
1221b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        (void) cv;
12220cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1223b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        vector<float> vec(3);
1224b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto dv = as_multi_span(vec);
1225b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        (void) dv;
12260cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
12270cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
1228b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        auto dv2 = as_multi_span(std::move(vec));
12290cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#endif
12300cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
1231b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
12320cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1233b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("empty_spans")
1234b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
12350cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    {
1236b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int, 0> empty_av(nullptr);
12370cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1238b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(empty_av.bounds().index_bounds() == index<1>{0});
1239b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(empty_av[0], fail_fast);
1240b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(empty_av.begin()[0], fail_fast);
1241b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(empty_av.cbegin()[0], fail_fast);
1242b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        for (auto& v : empty_av) {
1243b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh            (void) v;
1244b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh            CHECK(false);
12450cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh        }
12460cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
12470cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
12480cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    {
1249b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        multi_span<int> empty_av = {};
1250b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(empty_av.bounds().index_bounds() == index<1>{0});
1251b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(empty_av[0], fail_fast);
1252b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(empty_av.begin()[0], fail_fast);
1253b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(empty_av.cbegin()[0], fail_fast);
1254b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        for (auto& v : empty_av) {
1255b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh            (void) v;
1256b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh            CHECK(false);
12570cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh        }
1258b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
1259b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
12600cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1261b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("index_constructor")
1262b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
1263b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    auto arr = new int[8];
1264b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    for (int i = 0; i < 4; ++i) {
1265b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        arr[2 * i] = 4 + i;
1266b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        arr[2 * i + 1] = i;
1267b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
12680cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1269b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    multi_span<int, dynamic_range> av(arr, 8);
12700cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1271b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    ptrdiff_t a[1] = {0};
1272b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    index<1> i = a;
12730cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1274b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    CHECK(av[i] == 4);
12750cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1276b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    auto av2 = as_multi_span(av, dim<4>(), dim(2));
1277b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    ptrdiff_t a2[2] = {0, 1};
1278b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    index<2> i2 = a2;
12790cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1280b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    CHECK(av2[i2] == 0);
1281b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    CHECK(av2[0][i] == 4);
1282b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
1283b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    delete[] arr;
1284b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh}
1285b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
1286b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("index_constructors")
1287b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh{
1288b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
1289b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        // components of the same type
1290b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        index<3> i1(0, 1, 2);
1291b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(i1[0] == 0);
1292b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
1293b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        // components of different types
1294b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        std::size_t c0 = 0;
1295b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        std::size_t c1 = 1;
1296b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        index<3> i2(c0, c1, 2);
1297b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(i2[0] == 0);
1298b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
1299b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        // from array
1300b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        index<3> i3 = {0, 1, 2};
1301b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(i3[0] == 0);
1302b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
1303b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        // from other index of the same size type
1304b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        index<3> i4 = i3;
1305b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(i4[0] == 0);
1306b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
1307b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        // default
1308b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        index<3> i7;
1309b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(i7[0] == 0);
1310b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh
1311b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        // default
1312b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        index<3> i9 = {};
1313b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(i9[0] == 0);
13140cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
13150cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1316b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
1317b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        // components of the same type
1318b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        index<1> i1(0);
1319b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(i1[0] == 0);
13200cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1321b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        // components of different types
1322b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        std::size_t c0 = 0;
1323b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        index<1> i2(c0);
1324b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(i2[0] == 0);
13250cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1326b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        // from array
1327b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        index<1> i3 = {0};
1328b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(i3[0] == 0);
13290cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1330b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        // from int
1331b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        index<1> i4 = 0;
1332b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(i4[0] == 0);
13330cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1334b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        // from other index of the same size type
1335b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        index<1> i5 = i3;
1336b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(i5[0] == 0);
13370cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1338b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        // default
1339b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        index<1> i8;
1340b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(i8[0] == 0);
13410cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1342b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        // default
1343b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        index<1> i9 = {};
1344b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK(i9[0] == 0);
1345b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
13460cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1347b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    #ifdef CONFIRM_COMPILATION_ERRORS
1348b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    {
1349ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    index<3> i1(0, 1);
1350ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    index<3> i2(0, 1, 2, 3);
1351ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    index<3> i3 = {0};
1352ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    index<3> i4 = {0, 1, 2, 3};
1353ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    index<1> i5 = {0, 1};
1354b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    }
1355b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    #endif
1356ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago}
13570cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1358b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("index_operations")
1359ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago{
1360ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    ptrdiff_t a[3] = {0, 1, 2};
1361ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    ptrdiff_t b[3] = {3, 4, 5};
1362ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    index<3> i = a;
1363ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    index<3> j = b;
13640cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1365ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    CHECK(i[0] == 0);
1366ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    CHECK(i[1] == 1);
1367ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    CHECK(i[2] == 2);
13680cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1369ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1370ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        index<3> k = i + j;
13710cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1372ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(i[0] == 0);
1373ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(i[1] == 1);
1374ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(i[2] == 2);
1375ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(k[0] == 3);
1376ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(k[1] == 5);
1377ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(k[2] == 7);
1378ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
13790cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1380ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1381ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        index<3> k = i * 3;
13820cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1383ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(i[0] == 0);
1384ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(i[1] == 1);
1385ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(i[2] == 2);
1386ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(k[0] == 0);
1387ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(k[1] == 3);
1388ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(k[2] == 6);
13890cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
13900cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
13910cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    {
1392ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        index<3> k = 3 * i;
13930cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
13940cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh        CHECK(i[0] == 0);
13950cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh        CHECK(i[1] == 1);
13960cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh        CHECK(i[2] == 2);
1397ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(k[0] == 0);
1398ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(k[1] == 3);
1399ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(k[2] == 6);
1400ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
14010cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1402ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1403ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        index<2> k = details::shift_left(i);
14040cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1405ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(i[0] == 0);
1406ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(i[1] == 1);
1407ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(i[2] == 2);
1408ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(k[0] == 1);
1409ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(k[1] == 2);
1410ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
1411ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago}
14120cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1413ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiagovoid iterate_second_column(multi_span<int, dynamic_range, dynamic_range> av)
1414ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago{
1415ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    auto length = av.size() / 2;
14160cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1417ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    // view to the second column
1418ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    auto section = av.section({0, 1}, {length, 1});
14190cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1420ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    CHECK(section.size() == length);
1421ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    for (auto i = 0; i < section.size(); ++i) {
1422ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(section[i][0] == av[i][1]);
1423ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
14240cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1425ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    for (auto i = 0; i < section.size(); ++i) {
1426ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        auto idx = index<2>{i, 0}; // avoid braces inside the CHECK macro
1427ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(section[idx] == av[i][1]);
1428ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
14290cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1430ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    CHECK(section.bounds().index_bounds()[0] == length);
1431ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    CHECK(section.bounds().index_bounds()[1] == 1);
1432ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    for (auto i = 0; i < section.bounds().index_bounds()[0]; ++i) {
1433ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        for (auto j = 0; j < section.bounds().index_bounds()[1]; ++j) {
1434ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago            auto idx = index<2>{i, j}; // avoid braces inside the CHECK macro
1435ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago            CHECK(section[idx] == av[i][1]);
14360cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh        }
14370cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
14380cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1439ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    auto check_sum = 0;
1440ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    for (auto i = 0; i < length; ++i) {
1441ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        check_sum += av[i][1];
1442ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
14430cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1444ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1445ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        auto idx = 0;
1446ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        auto sum = 0;
1447ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        for (auto num : section) {
1448ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago            CHECK(num == av[idx][1]);
1449ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago            sum += num;
1450ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago            idx++;
14510cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh        }
14520cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1453ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(sum == check_sum);
1454ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
1455ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1456ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        auto idx = length - 1;
1457ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        auto sum = 0;
1458ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        for (auto iter = section.rbegin(); iter != section.rend(); ++iter) {
1459ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago            CHECK(*iter == av[idx][1]);
1460ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago            sum += *iter;
1461ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago            idx--;
14620cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh        }
14630cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1464ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(sum == check_sum);
1465ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
1466ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago}
14670cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1468b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("span_section_iteration")
1469ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago{
1470ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    int arr[4][2] = {{4, 0}, {5, 1}, {6, 2}, {7, 3}};
14710cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1472ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    // static bounds
1473ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1474ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, 4, 2> av = arr;
1475ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        iterate_second_column(av);
1476ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
1477ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    // first bound is dynamic
1478ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1479ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, dynamic_range, 2> av = arr;
1480ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        iterate_second_column(av);
1481ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
1482ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    // second bound is dynamic
1483ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1484ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, 4, dynamic_range> av = arr;
1485ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        iterate_second_column(av);
1486ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
1487ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    // both bounds are dynamic
1488ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1489ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, dynamic_range, dynamic_range> av = arr;
1490ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        iterate_second_column(av);
1491ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
1492ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago}
14930cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1494b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("dynamic_span_section_iteration")
1495ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago{
1496ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    auto height = 4, width = 2;
1497ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    auto size = height * width;
14980cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1499ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    auto arr = new int[static_cast<std::size_t>(size)];
1500ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    for (auto i = 0; i < size; ++i) {
1501ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        arr[i] = i;
15020cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
15030cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1504ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    auto av = as_multi_span(arr, size);
15050cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1506ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    // first bound is dynamic
1507ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1508ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, dynamic_range, 2> av2 = as_multi_span(av, dim(height), dim(width));
1509ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        iterate_second_column(av2);
15100cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
1511ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    // second bound is dynamic
15120cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    {
1513ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, 4, dynamic_range> av2 = as_multi_span(av, dim(height), dim(width));
1514ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        iterate_second_column(av2);
1515ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
1516ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    // both bounds are dynamic
1517ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1518ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, dynamic_range, dynamic_range> av2 =
1519ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago            as_multi_span(av, dim(height), dim(width));
1520ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        iterate_second_column(av2);
1521ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
15220cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1523ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    delete[] arr;
1524ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago}
15250cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1526b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("span_structure_size")
1527ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago{
1528ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    double(*arr)[3][4] = new double[100][3][4];
1529ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    multi_span<double, dynamic_range, 3, 4> av1(arr, 10);
15300cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1531ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    struct EffectiveStructure
1532ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1533ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        double* v1;
1534ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        ptrdiff_t v2;
1535ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    };
1536ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    CHECK(sizeof(av1) == sizeof(EffectiveStructure));
15370cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1538b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    CHECK_THROWS_AS(av1[10][3][4], fail_fast);
15390cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1540ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    multi_span<const double, dynamic_range, 6, 4> av2 =
1541ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        as_multi_span(av1, dim(5), dim<6>(), dim<4>());
1542ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    (void) av2;
1543ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago}
15440cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1545b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("fixed_size_conversions")
1546ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago{
1547ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    int arr[] = {1, 2, 3, 4};
15480cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1549ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    // converting to an multi_span from an equal size array is ok
1550ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    multi_span<int, 4> av4 = arr;
1551ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    CHECK(av4.length() == 4);
15520cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1553ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    // converting to dynamic_range a_v is always ok
1554ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1555ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, dynamic_range> av = av4;
1556ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        (void) av;
15570cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
15580cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    {
1559ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, dynamic_range> av = arr;
1560ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        (void) av;
1561ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
15620cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
156349e80625c682fe88baf9e306a784f8be7350e416Neil MacIntosh// initialization or assignment to static multi_span that REDUCES size is NOT ok
15640cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
1565ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1566ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, 2> av2 = arr;
1567ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
1568ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1569ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, 2> av2 = av4;
1570ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
15710cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#endif
15720cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1573ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1574ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, dynamic_range> av = arr;
1575ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, 2> av2 = av;
1576ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        (void) av2;
1577ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
15780cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
15790cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
1580ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1581ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, dynamic_range> av = arr;
1582ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, 2, 1> av2 = av.as_multi_span(dim<2>(), dim<2>());
1583ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
15840cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#endif
15850cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1586ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1587ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, dynamic_range> av = arr;
1588ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, 2, 1> av2 = as_multi_span(av, dim(2), dim(2));
1589ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        auto workaround_macro = [&]() { return av2[{1, 0}] == 2; };
1590ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(workaround_macro());
1591ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
15920cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1593ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    // but doing so explicitly is ok
15940cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1595ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    // you can convert statically
1596ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1597ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, 2> av2 = {arr, 2};
1598ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        (void) av2;
1599ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
1600ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1601ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, 1> av2 = av4.first<1>();
1602ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        (void) av2;
1603ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
16040cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1605ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    // ...or dynamically
1606ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1607ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        // NB: implicit conversion to multi_span<int,2> from multi_span<int,dynamic_range>
1608ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, 1> av2 = av4.first(1);
1609ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        (void) av2;
1610ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
16110cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1612ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    // initialization or assignment to static multi_span that requires size INCREASE is not ok.
1613ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    int arr2[2] = {1, 2};
16140cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
16150cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
1616ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1617ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, 4> av4 = arr2;
1618ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
1619ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1620ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, 2> av2 = arr2;
1621ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, 4> av4 = av2;
1622ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
16230cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#endif
1624ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
16250cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh        auto f = [&]() {
1626ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago            multi_span<int, 4> av9 = {arr2, 2};
1627ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago            (void) av9;
16280cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh        };
1629b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh        CHECK_THROWS_AS(f(), fail_fast);
16300cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
16310cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1632ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    // this should fail - we are trying to assign a small dynamic a_v to a fixed_size larger one
1633ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    multi_span<int, dynamic_range> av = arr2;
1634ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    auto f = [&]() {
1635ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, 4> av2 = av;
1636ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        (void) av2;
1637ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    };
1638b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntosh    CHECK_THROWS_AS(f(), fail_fast);
1639ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago}
16400cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1641b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("as_writeable_bytes")
1642ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago{
1643ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    int a[] = {1, 2, 3, 4};
1644ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago
1645ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
16460cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#ifdef CONFIRM_COMPILATION_ERRORS
1647ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        // you should not be able to get writeable bytes for const objects
1648ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<const int, dynamic_range> av = a;
1649ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        auto wav = av.as_writeable_bytes();
16500cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh#endif
1651ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
16520cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1653ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1654ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, dynamic_range> av;
1655ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        auto wav = as_writeable_bytes(av);
1656ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(wav.length() == av.length());
1657ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(wav.length() == 0);
1658ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(wav.size_bytes() == 0);
16590cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
16600cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
16610cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    {
1662ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, dynamic_range> av = a;
1663ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        auto wav = as_writeable_bytes(av);
1664ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(wav.data() == reinterpret_cast<byte*>(&a[0]));
1665ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        CHECK(static_cast<std::size_t>(wav.length()) == sizeof(a));
1666ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
1667ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago}
16680cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1669b2ee48433448556a7be63074f8aaf45ab47a95c1Neil MacIntoshTEST_CASE("iterator")
1670ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago{
1671ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    int a[] = {1, 2, 3, 4};
1672ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago
1673ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1674ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, dynamic_range> av = a;
1675ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        auto wav = as_writeable_bytes(av);
1676ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        for (auto& b : wav) {
1677ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago            b = byte(0);
1678ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        }
1679ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        for (std::size_t i = 0; i < 4; ++i) {
1680ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago            CHECK(a[i] == 0);
16810cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh        }
1682ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    }
16830cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh
1684ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago    {
1685ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        multi_span<int, dynamic_range> av = a;
1686ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        for (auto& n : av) {
1687ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago            n = 1;
1688ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        }
1689ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago        for (std::size_t i = 0; i < 4; ++i) {
1690ebe7ebfd855a95eb93783164ffb342dbd85cbc27Tiago            CHECK(a[i] == 1);
16910cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh        }
16920cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh    }
16930cf947db7760bf5756e4cb0d47c72a257ed527c5Neil MacIntosh}
1694