mirror of
				https://github.com/microsoft/GSL.git
				synced 2025-10-27 21:22:28 +01:00 
			
		
		
		
	Merge branch 'master' of https://github.com/Microsoft/GSL
Conflicts: include/array_view.h
This commit is contained in:
		| @@ -17,6 +17,7 @@ | ||||
| #include <UnitTest++/UnitTest++.h>  | ||||
| #include <array_view.h> | ||||
| #include <numeric> | ||||
| #include <limits> | ||||
| #include <array> | ||||
| #include <string> | ||||
| #include <vector> | ||||
| @@ -554,7 +555,7 @@ SUITE(array_view_tests) | ||||
|  | ||||
| 		{ | ||||
| 			// zero stride | ||||
| 			strided_array_view<int, 1> sav{ av, {{4}, {}} }; | ||||
| 			strided_array_view<int, 1> sav{ av,{ { 4 },{} } }; | ||||
| 			CHECK(sav[0] == 0); | ||||
| 			CHECK(sav[3] == 0); | ||||
| 			CHECK_THROW(sav[4], fail_fast); | ||||
| @@ -562,7 +563,7 @@ SUITE(array_view_tests) | ||||
|  | ||||
| 		{ | ||||
| 			// zero extent | ||||
| 			strided_array_view<int, 1> sav{ av,{ {},{1} } }; | ||||
| 			strided_array_view<int, 1> sav{ av,{ {},{ 1 } } }; | ||||
| 			CHECK_THROW(sav[0], fail_fast); | ||||
| 		} | ||||
|  | ||||
| @@ -635,27 +636,26 @@ SUITE(array_view_tests) | ||||
| 			strided_array_view<int, 2> sav5{ av.as_array_view(dim<2>(), dim<2>()), { 1 } }; | ||||
| 			strided_array_view<int, 2> sav6{ av.as_array_view(dim<2>(), dim<2>()), { 1,1,1 } }; | ||||
| 			strided_array_view<int, 2> sav7{ av.as_array_view(dim<2>(), dim<2>()), { { 1,1 },{ 1,1 },{ 1,1 } } }; | ||||
|  | ||||
| 			index<1> index{ 0, 1 }; | ||||
| 			strided_array_view<int, 1> sav8{ arr,{ 1,{ 1,1 } } }; | ||||
| #ifdef _MSC_VER | ||||
| 			strided_array_view<int, 1> sav9{ arr,{ { 1,1 },{ 1,1 } } }; | ||||
| #endif | ||||
| 			strided_array_view<int, 1> sav10{ av,{ 1,{ 1,1 } } }; | ||||
| #ifdef _MSC_VER | ||||
| 			strided_array_view<int, 1> sav11{ av,{ { 1,1 },{ 1,1 } } }; | ||||
| #endif | ||||
| 		} | ||||
| #endif | ||||
| 		 | ||||
|  | ||||
| 		{ | ||||
| 			// stride initializer list size should match the rank of the array | ||||
| 			CHECK_THROW((index<1>{ 0,1 }), fail_fast); | ||||
| 			CHECK_THROW((strided_array_view<int, 1>{ arr, {1, {1,1}} }), fail_fast); | ||||
| #ifdef _MSC_VER | ||||
| 			CHECK_THROW((strided_array_view<int, 1>{ arr, {{1,1 }, {1,1}} }), fail_fast); | ||||
| #endif | ||||
| 			CHECK_THROW((strided_array_view<int, 1>{ av, {1, {1,1}} }), fail_fast); | ||||
| #ifdef _MSC_VER | ||||
| 			CHECK_THROW((strided_array_view<int, 1>{ av, {{1,1 }, {1,1}} }), fail_fast); | ||||
| #endif			 | ||||
| 			CHECK_THROW((strided_array_view<int, 2>{ av.as_array_view(dim<2>(), dim<2>()), {{1}, {1}} }), fail_fast); | ||||
| 			CHECK_THROW((strided_array_view<int, 2>{ av.as_array_view(dim<2>(), dim<2>()), {{1}, {1,1,1}} }), fail_fast); | ||||
| #ifdef _MSC_VER | ||||
| 			CHECK_THROW((strided_array_view<int, 2>{ av.as_array_view(dim<2>(), dim<2>()), {{1,1,1}, {1}} }), fail_fast); | ||||
| #endif | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	TEST(strided_array_view_type_conversion) | ||||
| @@ -873,7 +873,18 @@ SUITE(array_view_tests) | ||||
| 		} | ||||
|  | ||||
| 		{ | ||||
| 			index<2> k = index<2>::shift_left(i); | ||||
| 			index<3> k = 3 * i; | ||||
|  | ||||
| 			CHECK(i[0] == 0); | ||||
| 			CHECK(i[1] == 1); | ||||
| 			CHECK(i[2] == 2); | ||||
| 			CHECK(k[0] == 0); | ||||
| 			CHECK(k[1] == 3); | ||||
| 			CHECK(k[2] == 6); | ||||
| 		} | ||||
|  | ||||
| 		{ | ||||
| 			index<2> k = details::shift_left(i); | ||||
|  | ||||
| 			CHECK(i[0] == 0); | ||||
| 			CHECK(i[1] == 1); | ||||
| @@ -989,7 +1000,7 @@ SUITE(array_view_tests) | ||||
| 		auto bounds = strided_bounds<1>({ length }, { 2 }); | ||||
| #else | ||||
| 		auto bounds = strided_bounds<1>(index<1>{ length }, index<1>{ 2 }); | ||||
| #endif         | ||||
| #endif | ||||
| 		strided_array_view<int, 1> strided(&av.data()[1], av.size() - 1, bounds); | ||||
|  | ||||
| 		CHECK(strided.size() == length); | ||||
| @@ -1050,7 +1061,7 @@ SUITE(array_view_tests) | ||||
| 				for (unsigned int k = 0; k < section.extent<2>(); ++k) | ||||
| 				{ | ||||
| 					auto idx = index<3>{ i,j,k }; // avoid braces in the CHECK macro | ||||
| 					CHECK(section[idx] == expected[2 * i + 2 * j + k]);                    | ||||
| 					CHECK(section[idx] == expected[2 * i + 2 * j + k]); | ||||
| 				} | ||||
| 		} | ||||
|  | ||||
| @@ -1168,6 +1179,152 @@ SUITE(array_view_tests) | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	template<size_t Rank, typename T1, typename T2> | ||||
| 	index<Rank, T2> Convert(index<Rank, T1> index) | ||||
| 	{ | ||||
| 		return{ index }; | ||||
| 	} | ||||
|  | ||||
| 	TEST(DomainConverters) | ||||
| 	{ | ||||
| 		// to smaller | ||||
| 		{ | ||||
| 			index<2, int> int_index{ 0,1 }; | ||||
| 			index<2, short> short_index{ int_index }; | ||||
|  | ||||
| 			CHECK(short_index[0] == 0); | ||||
| 			CHECK(short_index[1] == 1); | ||||
| 		} | ||||
|  | ||||
| 		// to smaller (failure) | ||||
| 		{ | ||||
| 			index<2, int> big_int_index{ std::numeric_limits<int>::max(), 1 }; | ||||
| 			CHECK_THROW((Convert<2,int, short int>(big_int_index)), fail_fast); | ||||
| 		} | ||||
|  | ||||
| 		// to same, sign mismatch | ||||
| 		{ | ||||
| 			index<2, int> int_index{ 0,1 }; | ||||
| 			index<2, unsigned int> uint_index{ int_index }; | ||||
|  | ||||
| 			CHECK(uint_index[0] == 0); | ||||
| 			CHECK(uint_index[1] == 1); | ||||
| 		} | ||||
|  | ||||
| 		// to same, sign mismatch, reversed | ||||
| 		{ | ||||
| 			index<2, unsigned int> uint_index{ 0,1 }; | ||||
| 			index<2, int> int_index{ uint_index }; | ||||
|  | ||||
| 			CHECK(int_index[0] == 0); | ||||
| 			CHECK(int_index[1] == 1); | ||||
| 		} | ||||
|  | ||||
| 		// to smaller, sign mismatch | ||||
| 		{ | ||||
| 			index<2, int> int_index{ 0,1 }; | ||||
| 			index<2, unsigned short> ushort_index{ int_index }; | ||||
|  | ||||
| 			CHECK(ushort_index[0] == 0); | ||||
| 			CHECK(ushort_index[1] == 1); | ||||
| 		} | ||||
|  | ||||
| 		// to bigger | ||||
| 		{ | ||||
| 			index<2, int> int_index{ 0,1 }; | ||||
| 			index<2, long long> longlong_index{ int_index }; | ||||
|  | ||||
| 			CHECK(longlong_index[0] == 0); | ||||
| 			CHECK(longlong_index[1] == 1); | ||||
| 		} | ||||
|  | ||||
| 		// to bigger with max index | ||||
| 		{ | ||||
| 			index<2, int> big_int_index{ std::numeric_limits<int>::max(), 1 }; | ||||
| 			index<2, long long> longlong_index{ big_int_index }; | ||||
|  | ||||
| 			CHECK(longlong_index[0] == std::numeric_limits<int>::max()); | ||||
| 			CHECK(longlong_index[1] == 1); | ||||
| 		} | ||||
|  | ||||
| 		// to bigger, sign mismatch | ||||
| 		{ | ||||
| 			index<2, int> int_index{ 0,1 }; | ||||
| 			index<2, unsigned long long> ulonglong_index{ int_index }; | ||||
|  | ||||
| 			CHECK(ulonglong_index[0] == 0); | ||||
| 			CHECK(ulonglong_index[1] == 1); | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	TEST(DomainConvertersRank1) | ||||
| 	{ | ||||
| 		// to smaller | ||||
| 		{ | ||||
| 			index<1, int> int_index{ 0 }; | ||||
| 			index<1, short> short_index{ int_index }; | ||||
|  | ||||
| 			CHECK(short_index[0] == 0); | ||||
| 		} | ||||
|  | ||||
| 		// to smaller (failure) | ||||
| 		{ | ||||
| 			index<1, int> big_int_index{ std::numeric_limits<int>::max() }; | ||||
|  | ||||
| 			CHECK_THROW((Convert<1, int, short int>(big_int_index)), fail_fast); | ||||
| 		} | ||||
|  | ||||
| 		// to same, sign mismatch | ||||
| 		{ | ||||
| 			index<1, int> int_index{ 0 }; | ||||
| 			index<1, unsigned int> uint_index{ int_index }; | ||||
|  | ||||
| 			CHECK(uint_index[0] == 0); | ||||
| 		} | ||||
|  | ||||
| 		// to same, sign mismatch, reversed | ||||
| 		{ | ||||
| 			index<1, unsigned int> uint_index{ 0 }; | ||||
| 			index<1, int> int_index{ uint_index }; | ||||
|  | ||||
| 			CHECK(int_index[0] == 0); | ||||
| 		} | ||||
|  | ||||
| 		// to smaller, sign mismatch | ||||
| 		{ | ||||
| 			index<1, int> int_index{ 0 }; | ||||
| 			index<1, unsigned short> ushort_index{ int_index }; | ||||
|  | ||||
| 			CHECK(ushort_index[0] == 0); | ||||
| 		} | ||||
|  | ||||
| 		// to bigger | ||||
| 		{ | ||||
| 			index<1, int> int_index{ 0 }; | ||||
| 			index<1, long long> longlong_index{ int_index }; | ||||
|  | ||||
| 			CHECK(longlong_index[0] == 0); | ||||
| 		} | ||||
|  | ||||
| 		// to bigger with max index | ||||
| 		{ | ||||
| 			index<1, int> big_int_index{ std::numeric_limits<int>::max() }; | ||||
| 			index<1, long long> longlong_index{ big_int_index }; | ||||
|  | ||||
| 			CHECK(longlong_index[0] == std::numeric_limits<int>::max()); | ||||
| 		} | ||||
|  | ||||
| 		// to bigger, sign mismatch | ||||
| 		{ | ||||
| 			index<1, int> int_index{ 0 }; | ||||
| 			index<1, unsigned long long> ulonglong_index{ int_index }; | ||||
|  | ||||
| 			CHECK(ulonglong_index[0] == 0); | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	TEST(constructors) | ||||
| 	{ | ||||
| 		array_view<int, dynamic_range> av(nullptr); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user