]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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 | #ifndef UUID_67E67D68A32F11DEA56FD18556D89593 | |
7 | #define UUID_67E67D68A32F11DEA56FD18556D89593 | |
8 | ||
9 | #include <boost/qvm/inline.hpp> | |
10 | #include <boost/qvm/assert.hpp> | |
11 | #include <boost/qvm/static_assert.hpp> | |
12 | ||
13 | namespace | |
14 | boost | |
15 | { | |
16 | namespace | |
17 | qvm | |
18 | { | |
19 | template <class T,int Rows,int Cols> | |
20 | struct | |
21 | mat | |
22 | { | |
23 | T a[Rows][Cols]; | |
24 | template <class R> | |
25 | operator R() const | |
26 | { | |
27 | R r; | |
28 | assign(r,*this); | |
29 | return r; | |
30 | } | |
31 | }; | |
32 | ||
33 | template <class M> | |
34 | struct mat_traits; | |
35 | ||
36 | template <class T,int Rows,int Cols> | |
37 | struct | |
38 | mat_traits< mat<T,Rows,Cols> > | |
39 | { | |
40 | typedef mat<T,Rows,Cols> this_matrix; | |
41 | typedef T scalar_type; | |
42 | static int const rows=Rows; | |
43 | static int const cols=Cols; | |
44 | ||
45 | template <int Row,int Col> | |
46 | static | |
47 | BOOST_QVM_INLINE_CRITICAL | |
48 | scalar_type | |
49 | read_element( this_matrix const & x ) | |
50 | { | |
51 | BOOST_QVM_STATIC_ASSERT(Row>=0); | |
52 | BOOST_QVM_STATIC_ASSERT(Row<Rows); | |
53 | BOOST_QVM_STATIC_ASSERT(Col>=0); | |
54 | BOOST_QVM_STATIC_ASSERT(Col<Cols); | |
55 | return x.a[Row][Col]; | |
56 | } | |
57 | ||
58 | template <int Row,int Col> | |
59 | static | |
60 | BOOST_QVM_INLINE_CRITICAL | |
61 | scalar_type & | |
62 | write_element( this_matrix & x ) | |
63 | { | |
64 | BOOST_QVM_STATIC_ASSERT(Row>=0); | |
65 | BOOST_QVM_STATIC_ASSERT(Row<Rows); | |
66 | BOOST_QVM_STATIC_ASSERT(Col>=0); | |
67 | BOOST_QVM_STATIC_ASSERT(Col<Cols); | |
68 | return x.a[Row][Col]; | |
69 | } | |
70 | ||
71 | static | |
72 | BOOST_QVM_INLINE_CRITICAL | |
73 | scalar_type | |
74 | read_element_idx( int row, int col, this_matrix const & x ) | |
75 | { | |
76 | BOOST_QVM_ASSERT(row>=0); | |
77 | BOOST_QVM_ASSERT(row<Rows); | |
78 | BOOST_QVM_ASSERT(col>=0); | |
79 | BOOST_QVM_ASSERT(col<Cols); | |
80 | return x.a[row][col]; | |
81 | } | |
82 | ||
83 | static | |
84 | BOOST_QVM_INLINE_CRITICAL | |
85 | scalar_type & | |
86 | write_element_idx( int row, int col, this_matrix & x ) | |
87 | { | |
88 | BOOST_QVM_ASSERT(row>=0); | |
89 | BOOST_QVM_ASSERT(row<Rows); | |
90 | BOOST_QVM_ASSERT(col>=0); | |
91 | BOOST_QVM_ASSERT(col<Cols); | |
92 | return x.a[row][col]; | |
93 | } | |
94 | }; | |
95 | } | |
96 | } | |
97 | ||
98 | #endif |