• 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/quat_traits_array.hpp>
7 #include <boost/qvm/quat_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 & q,P * ptr)21 test_ref_cast( T & q, P * ptr )
22     {
23     using namespace boost::qvm;
24     BOOST_QVM_STATIC_ASSERT(is_quat<T>::value);
25     BOOST_TEST(quat_traits<T>::template read_element<0>(q)==ptr[0]);
26     BOOST_TEST(quat_traits<T>::template read_element<1>(q)==ptr[1]);
27     BOOST_TEST(quat_traits<T>::template read_element<2>(q)==ptr[2]);
28     BOOST_TEST(quat_traits<T>::template read_element<3>(q)==ptr[3]);
29     BOOST_TEST(&quat_traits<T>::template write_element<0>(q)==&ptr[0]);
30     BOOST_TEST(&quat_traits<T>::template write_element<1>(q)==&ptr[1]);
31     BOOST_TEST(&quat_traits<T>::template write_element<2>(q)==&ptr[2]);
32     BOOST_TEST(&quat_traits<T>::template write_element<3>(q)==&ptr[3]);
33     BOOST_TEST(&q[0]==&ptr[0]);
34     BOOST_TEST(&q[1]==&ptr[1]);
35     BOOST_TEST(&q[2]==&ptr[2]);
36     BOOST_TEST(&q[3]==&ptr[3]);
37     }
38 
39 int
main()40 main()
41     {
42     using namespace boost::qvm;
43         {
44         BOOST_QVM_STATIC_ASSERT(is_quat<int[4]>::value);
45         BOOST_QVM_STATIC_ASSERT(!is_quat<int[4][4]>::value);
46         BOOST_QVM_STATIC_ASSERT(!is_quat<int[4][4][4]>::value);
47         same_type<quat_traits<int[4]>::scalar_type,int>();
48         same_type< quat<int>, deduce_quat<int[4]>::type >();
49         same_type< quat<int>, deduce_quat<int const[4]>::type >();
50         int arr[4] = {0,1,2,3};
51         BOOST_TEST((quat_traits<int[4]>::read_element<0>(arr)==0));
52         BOOST_TEST((quat_traits<int[4]>::read_element<1>(arr)==1));
53         BOOST_TEST((quat_traits<int[4]>::read_element<2>(arr)==2));
54         BOOST_TEST((quat_traits<int[4]>::read_element<3>(arr)==3));
55         BOOST_TEST((quat_traits<int const[4]>::read_element<0>(arr)==0));
56         BOOST_TEST((quat_traits<int const[4]>::read_element<1>(arr)==1));
57         BOOST_TEST((quat_traits<int const[4]>::read_element<2>(arr)==2));
58         BOOST_TEST((quat_traits<int const[4]>::read_element<3>(arr)==3));
59         BOOST_TEST((quat_traits<int[4]>::read_element_idx(0,arr)==0));
60         BOOST_TEST((quat_traits<int[4]>::read_element_idx(1,arr)==1));
61         BOOST_TEST((quat_traits<int[4]>::read_element_idx(2,arr)==2));
62         BOOST_TEST((quat_traits<int[4]>::read_element_idx(3,arr)==3));
63         BOOST_TEST((quat_traits<int const[4]>::read_element_idx(0,arr)==0));
64         BOOST_TEST((quat_traits<int const[4]>::read_element_idx(1,arr)==1));
65         BOOST_TEST((quat_traits<int const[4]>::read_element_idx(2,arr)==2));
66         BOOST_TEST((quat_traits<int const[4]>::read_element_idx(3,arr)==3));
67         BOOST_TEST((&quat_traits<int[4]>::write_element<0>(arr)==&arr[0]));
68         BOOST_TEST((&quat_traits<int[4]>::write_element<1>(arr)==&arr[1]));
69         BOOST_TEST((&quat_traits<int[4]>::write_element<2>(arr)==&arr[2]));
70         BOOST_TEST((&quat_traits<int[4]>::write_element<3>(arr)==&arr[3]));
71         BOOST_TEST((&quat_traits<int[4]>::write_element_idx(0,arr)==&arr[0]));
72         BOOST_TEST((&quat_traits<int[4]>::write_element_idx(1,arr)==&arr[1]));
73         BOOST_TEST((&quat_traits<int[4]>::write_element_idx(2,arr)==&arr[2]));
74         BOOST_TEST((&quat_traits<int[4]>::write_element_idx(3,arr)==&arr[3]));
75         }
76         {
77         int arr[42] = {0};
78         int * ptr=arr+5;
79         ptr[0]=42;
80         ptr[1]=43;
81         ptr[2]=44;
82         ptr[3]=45;
83         test_ref_cast(ptr_qref(ptr),ptr);
84         int q[4] = {1,1,1,1};
85         ptr_qref(ptr) += qref(q);
86         BOOST_TEST(ptr[0]==43);
87         BOOST_TEST(ptr[1]==44);
88         BOOST_TEST(ptr[2]==45);
89         BOOST_TEST(ptr[3]==46);
90         }
91     return boost::report_errors();
92     }
93