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