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