liuxiaolong
2021-07-20 58d904a328c0d849769b483e901a0be9426b8209
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
//Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc.
 
//Distributed under the Boost Software License, Version 1.0. (See accompanying
//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 
#ifndef BOOST_QVM_6D6B1EE2119A11E291554FEE6188709B
#define BOOST_QVM_6D6B1EE2119A11E291554FEE6188709B
 
#include <boost/qvm/inline.hpp>
#include <boost/qvm/deduce_quat.hpp>
#include <boost/qvm/detail/remove_const.hpp>
#include <boost/qvm/assert.hpp>
 
namespace
boost
    {
    namespace
    qvm
        {
        template <class T,int D>
        struct
        quat_traits<T[D]>
            {
            typedef void scalar_type;
            };
        template <class T,int D>
        struct
        quat_traits<T[D][4]>
            {
            typedef void scalar_type;
            };
        template <class T,int D>
        struct
        quat_traits<T[4][D]>
            {
            typedef void scalar_type;
            };
        template <class T>
        struct
        quat_traits<T[4][4]>
            {
            typedef void scalar_type;
            };
        template <class T,int M,int N>
        struct
        quat_traits<T[M][N]>
            {
            typedef void scalar_type;
            };
 
        template <class T>
        struct
        quat_traits<T[4]>
            {
            typedef T this_quaternion[4];
            typedef typename qvm_detail::remove_const<T>::type scalar_type;
 
            template <int I>
            static
            BOOST_QVM_INLINE_CRITICAL
            scalar_type
            read_element( this_quaternion const & x )
                {
                BOOST_QVM_STATIC_ASSERT(I>=0);
                BOOST_QVM_STATIC_ASSERT(I<4);
                return x[I];
                }
 
            template <int I>
            static
            BOOST_QVM_INLINE_CRITICAL
            scalar_type &
            write_element( this_quaternion & x )
                {
                BOOST_QVM_STATIC_ASSERT(I>=0);
                BOOST_QVM_STATIC_ASSERT(I<4);
                return x[I];
                }
 
            static
            BOOST_QVM_INLINE_CRITICAL
            scalar_type
            read_element_idx( int i, this_quaternion const & x )
                {
                BOOST_QVM_ASSERT(i>=0);
                BOOST_QVM_ASSERT(i<4);
                return x[i];
                }
 
            static
            BOOST_QVM_INLINE_CRITICAL
            scalar_type &
            write_element_idx( int i, this_quaternion & x )
                {
                BOOST_QVM_ASSERT(i>=0);
                BOOST_QVM_ASSERT(i<4);
                return x[i];
                }
            };
 
        template <class T>
        struct
        deduce_quat<T[4]>
            {
            typedef quat<T> type;
            };
 
        template <class T>
        struct
        deduce_quat<T const[4]>
            {
            typedef quat<T> type;
            };
 
        template <class T1,class T2>
        struct
        deduce_quat2<T1[4],T2[4]>
            {
            typedef quat<typename deduce_scalar<T1,T2>::type> type;
            };
 
        template <class T>
        T (&ptr_qref( T * ptr ))[4]
            {
            return *reinterpret_cast<T (*)[4]>(ptr);
            }
        }
    }
 
#endif