| 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 | |
| 15 | template <class T,class U> |
| 16 | struct same_type; |
| 17 | |
| 18 | template <class T> |
| 19 | struct |
| 20 | same_type<T,T> |
| 21 | { |
| 22 | }; |
| 23 | |
| 24 | template <class T,class P> |
| 25 | void |
| 26 | test_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 | |
| 44 | int |
| 45 | main() |
| 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 | |