1// Copyright 2008-2022 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#ifdef BOOST_QVM_TEST_SINGLE_HEADER
7# include BOOST_QVM_TEST_SINGLE_HEADER
8#else
9# include <boost/qvm/quat_operations.hpp>
10#endif
11
12#include <boost/qvm/quat_traits_array.hpp>
13#include <boost/core/lightweight_test.hpp>
14
15template <class T,class U>
16struct same_type;
17
18template <class T>
19struct
20same_type<T,T>
21 {
22 };
23
24template <class T,class P>
25void
26test_ref_cast( T & q, P * ptr )
27 {
28 using namespace boost::qvm;
29 BOOST_QVM_STATIC_ASSERT(is_quat<T>::value);
30 BOOST_TEST(quat_traits<T>::template read_element<0>(q)==ptr[0]);
31 BOOST_TEST(quat_traits<T>::template read_element<1>(q)==ptr[1]);
32 BOOST_TEST(quat_traits<T>::template read_element<2>(q)==ptr[2]);
33 BOOST_TEST(quat_traits<T>::template read_element<3>(q)==ptr[3]);
34 BOOST_TEST(&quat_traits<T>::template write_element<0>(q)==&ptr[0]);
35 BOOST_TEST(&quat_traits<T>::template write_element<1>(q)==&ptr[1]);
36 BOOST_TEST(&quat_traits<T>::template write_element<2>(q)==&ptr[2]);
37 BOOST_TEST(&quat_traits<T>::template write_element<3>(q)==&ptr[3]);
38 BOOST_TEST(&q[0]==&ptr[0]);
39 BOOST_TEST(&q[1]==&ptr[1]);
40 BOOST_TEST(&q[2]==&ptr[2]);
41 BOOST_TEST(&q[3]==&ptr[3]);
42 }
43
44int
45main()
46 {
47 using namespace boost::qvm;
48 {
49 BOOST_QVM_STATIC_ASSERT(is_quat<int[4]>::value);
50 BOOST_QVM_STATIC_ASSERT(!is_quat<int[4][4]>::value);
51 BOOST_QVM_STATIC_ASSERT(!is_quat<int[4][4][4]>::value);
52 same_type<quat_traits<int[4]>::scalar_type,int>();
53 same_type< quat<int>, deduce_quat<int[4]>::type >();
54 same_type< quat<int>, deduce_quat<int const[4]>::type >();
55 int arr[4] = {0,1,2,3};
56 BOOST_TEST((quat_traits<int[4]>::read_element<0>(arr)==0));
57 BOOST_TEST((quat_traits<int[4]>::read_element<1>(arr)==1));
58 BOOST_TEST((quat_traits<int[4]>::read_element<2>(arr)==2));
59 BOOST_TEST((quat_traits<int[4]>::read_element<3>(arr)==3));
60 BOOST_TEST((quat_traits<int const[4]>::read_element<0>(arr)==0));
61 BOOST_TEST((quat_traits<int const[4]>::read_element<1>(arr)==1));
62 BOOST_TEST((quat_traits<int const[4]>::read_element<2>(arr)==2));
63 BOOST_TEST((quat_traits<int const[4]>::read_element<3>(arr)==3));
64 BOOST_TEST((quat_traits<int[4]>::read_element_idx(0,arr)==0));
65 BOOST_TEST((quat_traits<int[4]>::read_element_idx(1,arr)==1));
66 BOOST_TEST((quat_traits<int[4]>::read_element_idx(2,arr)==2));
67 BOOST_TEST((quat_traits<int[4]>::read_element_idx(3,arr)==3));
68 BOOST_TEST((quat_traits<int const[4]>::read_element_idx(0,arr)==0));
69 BOOST_TEST((quat_traits<int const[4]>::read_element_idx(1,arr)==1));
70 BOOST_TEST((quat_traits<int const[4]>::read_element_idx(2,arr)==2));
71 BOOST_TEST((quat_traits<int const[4]>::read_element_idx(3,arr)==3));
72 BOOST_TEST((&quat_traits<int[4]>::write_element<0>(arr)==&arr[0]));
73 BOOST_TEST((&quat_traits<int[4]>::write_element<1>(arr)==&arr[1]));
74 BOOST_TEST((&quat_traits<int[4]>::write_element<2>(arr)==&arr[2]));
75 BOOST_TEST((&quat_traits<int[4]>::write_element<3>(arr)==&arr[3]));
76 BOOST_TEST((&quat_traits<int[4]>::write_element_idx(0,arr)==&arr[0]));
77 BOOST_TEST((&quat_traits<int[4]>::write_element_idx(1,arr)==&arr[1]));
78 BOOST_TEST((&quat_traits<int[4]>::write_element_idx(2,arr)==&arr[2]));
79 BOOST_TEST((&quat_traits<int[4]>::write_element_idx(3,arr)==&arr[3]));
80 }
81 {
82 int arr[42] = {0};
83 int * ptr=arr+5;
84 ptr[0]=42;
85 ptr[1]=43;
86 ptr[2]=44;
87 ptr[3]=45;
88 test_ref_cast(q&: ptr_qref(ptr),ptr);
89 int q[4] = {1,1,1,1};
90 ptr_qref(ptr) += qref(a&: q);
91 BOOST_TEST(ptr[0]==43);
92 BOOST_TEST(ptr[1]==44);
93 BOOST_TEST(ptr[2]==45);
94 BOOST_TEST(ptr[3]==46);
95 }
96 return boost::report_errors();
97 }
98

source code of boost/libs/qvm/test/quat_traits_array_test.cpp