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