]>
Commit | Line | Data |
---|---|---|
92f5a8d4 TL |
1 | //Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc. |
2 | ||
3 | //Distributed under the Boost Software License, Version 1.0. (See accompanying | |
4 | //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
5 | ||
6 | #include <boost/qvm/mat_traits_array.hpp> | |
7 | #include <boost/qvm/mat_operations.hpp> | |
8 | #include <boost/detail/lightweight_test.hpp> | |
9 | ||
10 | template <class T,class U> | |
11 | struct same_type; | |
12 | ||
13 | template <class T> | |
14 | struct | |
15 | same_type<T,T> | |
16 | { | |
17 | }; | |
18 | ||
19 | template <class T,class P> | |
20 | void | |
21 | test_ref_cast( T & v, P * ptr ) | |
22 | { | |
23 | using namespace boost::qvm; | |
24 | BOOST_QVM_STATIC_ASSERT(is_mat<T>::value); | |
25 | BOOST_QVM_STATIC_ASSERT(mat_traits<T>::rows==3); | |
26 | BOOST_QVM_STATIC_ASSERT(mat_traits<T>::cols==2); | |
27 | BOOST_TEST((mat_traits<T>::template read_element<0,0>(v)==ptr[0*2+0])); | |
28 | BOOST_TEST((mat_traits<T>::template read_element<0,1>(v)==ptr[0*2+1])); | |
29 | BOOST_TEST((mat_traits<T>::template read_element<1,0>(v)==ptr[1*2+0])); | |
30 | BOOST_TEST((mat_traits<T>::template read_element<1,1>(v)==ptr[1*2+1])); | |
31 | BOOST_TEST((mat_traits<T>::template read_element<2,0>(v)==ptr[2*2+0])); | |
32 | BOOST_TEST((mat_traits<T>::template read_element<2,1>(v)==ptr[2*2+1])); | |
33 | BOOST_TEST((&mat_traits<T>::template write_element<0,0>(v)==&ptr[0*2+0])); | |
34 | BOOST_TEST((&mat_traits<T>::template write_element<0,1>(v)==&ptr[0*2+1])); | |
35 | BOOST_TEST((&mat_traits<T>::template write_element<1,0>(v)==&ptr[1*2+0])); | |
36 | BOOST_TEST((&mat_traits<T>::template write_element<1,1>(v)==&ptr[1*2+1])); | |
37 | BOOST_TEST((&mat_traits<T>::template write_element<2,0>(v)==&ptr[2*2+0])); | |
38 | BOOST_TEST((&mat_traits<T>::template write_element<2,1>(v)==&ptr[2*2+1])); | |
39 | BOOST_TEST(&v[0][0]==&ptr[0*2+0]); | |
40 | BOOST_TEST(&v[0][1]==&ptr[0*2+1]); | |
41 | BOOST_TEST(&v[1][0]==&ptr[1*2+0]); | |
42 | BOOST_TEST(&v[1][1]==&ptr[1*2+1]); | |
43 | BOOST_TEST(&v[2][0]==&ptr[2*2+0]); | |
44 | BOOST_TEST(&v[2][1]==&ptr[2*2+1]); | |
45 | } | |
46 | ||
47 | int | |
48 | main() | |
49 | { | |
50 | using namespace boost::qvm; | |
51 | { | |
52 | BOOST_QVM_STATIC_ASSERT(!is_mat<int[3]>::value); | |
53 | BOOST_QVM_STATIC_ASSERT(!is_mat<int[3][3][3]>::value); | |
54 | BOOST_QVM_STATIC_ASSERT(is_mat<int[3][4]>::value); | |
55 | BOOST_QVM_STATIC_ASSERT(mat_traits<int[3][4]>::rows==3); | |
56 | BOOST_QVM_STATIC_ASSERT(mat_traits<int[3][4]>::cols==4); | |
57 | same_type<mat_traits<int[3][4]>::scalar_type,int>(); | |
58 | same_type< mat<int,3,3>, deduce_mat<int[3][3]>::type >(); | |
59 | same_type< mat<int,3,3>, deduce_mat<int const[3][3]>::type >(); | |
60 | int arr[3][3] = {{00,01,02},{10,11,12},{20,21,22}}; | |
61 | BOOST_TEST((mat_traits<int[3][3]>::read_element<0,0>(arr)==00)); | |
62 | BOOST_TEST((mat_traits<int[3][3]>::read_element<0,1>(arr)==01)); | |
63 | BOOST_TEST((mat_traits<int[3][3]>::read_element<0,2>(arr)==02)); | |
64 | BOOST_TEST((mat_traits<int[3][3]>::read_element<1,0>(arr)==10)); | |
65 | BOOST_TEST((mat_traits<int[3][3]>::read_element<1,1>(arr)==11)); | |
66 | BOOST_TEST((mat_traits<int[3][3]>::read_element<1,2>(arr)==12)); | |
67 | BOOST_TEST((mat_traits<int[3][3]>::read_element<2,0>(arr)==20)); | |
68 | BOOST_TEST((mat_traits<int[3][3]>::read_element<2,1>(arr)==21)); | |
69 | BOOST_TEST((mat_traits<int[3][3]>::read_element<2,2>(arr)==22)); | |
70 | BOOST_TEST((mat_traits<int const[3][3]>::read_element<0,0>(arr)==00)); | |
71 | BOOST_TEST((mat_traits<int const[3][3]>::read_element<0,1>(arr)==01)); | |
72 | BOOST_TEST((mat_traits<int const[3][3]>::read_element<0,2>(arr)==02)); | |
73 | BOOST_TEST((mat_traits<int const[3][3]>::read_element<1,0>(arr)==10)); | |
74 | BOOST_TEST((mat_traits<int const[3][3]>::read_element<1,1>(arr)==11)); | |
75 | BOOST_TEST((mat_traits<int const[3][3]>::read_element<1,2>(arr)==12)); | |
76 | BOOST_TEST((mat_traits<int const[3][3]>::read_element<2,0>(arr)==20)); | |
77 | BOOST_TEST((mat_traits<int const[3][3]>::read_element<2,1>(arr)==21)); | |
78 | BOOST_TEST((mat_traits<int const[3][3]>::read_element<2,2>(arr)==22)); | |
79 | BOOST_TEST((mat_traits<int[3][3]>::read_element_idx(0,0,arr)==00)); | |
80 | BOOST_TEST((mat_traits<int[3][3]>::read_element_idx(0,1,arr)==01)); | |
81 | BOOST_TEST((mat_traits<int[3][3]>::read_element_idx(0,2,arr)==02)); | |
82 | BOOST_TEST((mat_traits<int[3][3]>::read_element_idx(1,0,arr)==10)); | |
83 | BOOST_TEST((mat_traits<int[3][3]>::read_element_idx(1,1,arr)==11)); | |
84 | BOOST_TEST((mat_traits<int[3][3]>::read_element_idx(1,2,arr)==12)); | |
85 | BOOST_TEST((mat_traits<int[3][3]>::read_element_idx(2,0,arr)==20)); | |
86 | BOOST_TEST((mat_traits<int[3][3]>::read_element_idx(2,1,arr)==21)); | |
87 | BOOST_TEST((mat_traits<int[3][3]>::read_element_idx(2,2,arr)==22)); | |
88 | BOOST_TEST((mat_traits<int const[3][3]>::read_element_idx(0,0,arr)==00)); | |
89 | BOOST_TEST((mat_traits<int const[3][3]>::read_element_idx(0,1,arr)==01)); | |
90 | BOOST_TEST((mat_traits<int const[3][3]>::read_element_idx(0,2,arr)==02)); | |
91 | BOOST_TEST((mat_traits<int const[3][3]>::read_element_idx(1,0,arr)==10)); | |
92 | BOOST_TEST((mat_traits<int const[3][3]>::read_element_idx(1,1,arr)==11)); | |
93 | BOOST_TEST((mat_traits<int const[3][3]>::read_element_idx(1,2,arr)==12)); | |
94 | BOOST_TEST((mat_traits<int const[3][3]>::read_element_idx(2,0,arr)==20)); | |
95 | BOOST_TEST((mat_traits<int const[3][3]>::read_element_idx(2,1,arr)==21)); | |
96 | BOOST_TEST((mat_traits<int const[3][3]>::read_element_idx(2,2,arr)==22)); | |
97 | BOOST_TEST((&mat_traits<int[3][3]>::write_element<0,0>(arr)==&arr[0][0])); | |
98 | BOOST_TEST((&mat_traits<int[3][3]>::write_element<0,1>(arr)==&arr[0][1])); | |
99 | BOOST_TEST((&mat_traits<int[3][3]>::write_element<0,2>(arr)==&arr[0][2])); | |
100 | BOOST_TEST((&mat_traits<int[3][3]>::write_element<1,0>(arr)==&arr[1][0])); | |
101 | BOOST_TEST((&mat_traits<int[3][3]>::write_element<1,1>(arr)==&arr[1][1])); | |
102 | BOOST_TEST((&mat_traits<int[3][3]>::write_element<1,2>(arr)==&arr[1][2])); | |
103 | BOOST_TEST((&mat_traits<int[3][3]>::write_element<2,0>(arr)==&arr[2][0])); | |
104 | BOOST_TEST((&mat_traits<int[3][3]>::write_element<2,1>(arr)==&arr[2][1])); | |
105 | BOOST_TEST((&mat_traits<int[3][3]>::write_element<2,2>(arr)==&arr[2][2])); | |
106 | BOOST_TEST((&mat_traits<int[3][3]>::write_element_idx(0,0,arr)==&arr[0][0])); | |
107 | BOOST_TEST((&mat_traits<int[3][3]>::write_element_idx(0,1,arr)==&arr[0][1])); | |
108 | BOOST_TEST((&mat_traits<int[3][3]>::write_element_idx(0,2,arr)==&arr[0][2])); | |
109 | BOOST_TEST((&mat_traits<int[3][3]>::write_element_idx(1,0,arr)==&arr[1][0])); | |
110 | BOOST_TEST((&mat_traits<int[3][3]>::write_element_idx(1,1,arr)==&arr[1][1])); | |
111 | BOOST_TEST((&mat_traits<int[3][3]>::write_element_idx(1,2,arr)==&arr[1][2])); | |
112 | BOOST_TEST((&mat_traits<int[3][3]>::write_element_idx(2,0,arr)==&arr[2][0])); | |
113 | BOOST_TEST((&mat_traits<int[3][3]>::write_element_idx(2,1,arr)==&arr[2][1])); | |
114 | BOOST_TEST((&mat_traits<int[3][3]>::write_element_idx(2,2,arr)==&arr[2][2])); | |
115 | } | |
116 | { | |
117 | int arr[42] = {0}; | |
118 | int * ptr=arr+5; | |
119 | ptr[0*2+0]=42; | |
120 | ptr[0*2+1]=43; | |
121 | ptr[1*2+0]=44; | |
122 | ptr[1*2+1]=45; | |
123 | ptr[2*2+0]=46; | |
124 | ptr[2*2+1]=47; | |
125 | test_ref_cast(ptr_mref<3,2>(ptr),ptr); | |
126 | int m[3][2] = {{1,1},{1,1},{1,1}}; | |
127 | ptr_mref<3,2>(ptr) += mref(m); | |
128 | BOOST_TEST(ptr[0*2+0]=43); | |
129 | BOOST_TEST(ptr[0*2+1]=44); | |
130 | BOOST_TEST(ptr[1*2+0]=45); | |
131 | BOOST_TEST(ptr[1*2+1]=46); | |
132 | BOOST_TEST(ptr[2*2+0]=47); | |
133 | BOOST_TEST(ptr[2*2+1]=48); | |
134 | } | |
135 | return boost::report_errors(); | |
136 | } |