• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
test_ref_cast(T & v,P * ptr)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
main()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     }
137