]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/qvm/include/boost/qvm/mat_index.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / qvm / include / boost / qvm / mat_index.hpp
CommitLineData
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_90273D9C0E5911E281B7981F6288709B
7#define UUID_90273D9C0E5911E281B7981F6288709B
8
9#include <boost/qvm/mat_traits.hpp>
10#include <boost/qvm/inline.hpp>
11#include <boost/qvm/assert.hpp>
12#include <boost/qvm/enable_if.hpp>
13#include <boost/qvm/error.hpp>
14#include <boost/exception/info.hpp>
15
16namespace
17boost
18 {
19 namespace
20 qvm
21 {
22 ////////////////////////////////////////////////
23
24 namespace
25 qvm_detail
26 {
27 template <int R,int C>
28 struct
29 mat_index_read_defined
30 {
31 static bool const value=false;
32 };
33
34 template <int I,int N>
35 struct
36 matrix_r
37 {
38 template <class A>
39 static
40 BOOST_QVM_INLINE_CRITICAL
41 typename mat_traits<A>::scalar_type
42 read_element_idx( A const & a, int r, int c )
43 {
44 return (I/mat_traits<A>::cols)==r && (I%mat_traits<A>::cols)==c?
45 mat_traits<A>::template read_element<I/mat_traits<A>::cols,I%mat_traits<A>::cols>(a) :
46 matrix_r<I+1,N>::read_element_idx(a,r,c);
47 }
48 };
49
50 template <int N>
51 struct
52 matrix_r<N,N>
53 {
54 template <class A>
55 static
56 BOOST_QVM_INLINE_TRIVIAL
57 typename mat_traits<A>::scalar_type
58 read_element_idx( A const & a, int, int )
59 {
60 BOOST_QVM_ASSERT(0);
61 return mat_traits<A>::template read_element<0,0>(a);
62 }
63 };
64 }
65
66 template <class A>
67 BOOST_QVM_INLINE_TRIVIAL
68 typename boost::enable_if_c<
69 is_mat<A>::value &&
70 !qvm_detail::mat_index_read_defined<mat_traits<A>::rows,mat_traits<A>::cols>::value,
71 typename mat_traits<A>::scalar_type>::type
72 mat_index_read( A const & a, int r, int c )
73 {
74 return qvm_detail::matrix_r<0,mat_traits<A>::rows*mat_traits<A>::cols>::read_element_idx(a,r,c);
75 }
76
77 ////////////////////////////////////////////////
78
79 namespace
80 qvm_detail
81 {
82 template <int R,int C>
83 struct
84 mat_index_write_defined
85 {
86 static bool const value=false;
87 };
88
89 template <int I,int N>
90 struct
91 matrix_w
92 {
93 template <class A>
94 static
95 BOOST_QVM_INLINE_CRITICAL
96 typename mat_traits<A>::scalar_type &
97 write_element_idx( A & a, int r, int c )
98 {
99 return (I/mat_traits<A>::cols)==r && (I%mat_traits<A>::cols)==c?
100 mat_traits<A>::template write_element<I/mat_traits<A>::cols,I%mat_traits<A>::cols>(a) :
101 matrix_w<I+1,N>::write_element_idx(a,r,c);
102 }
103 };
104
105 template <int N>
106 struct
107 matrix_w<N,N>
108 {
109 template <class A>
110 static
111 BOOST_QVM_INLINE_TRIVIAL
112 typename mat_traits<A>::scalar_type &
113 write_element_idx( A & a, int, int )
114 {
115 BOOST_QVM_ASSERT(0);
116 return mat_traits<A>::template write_element<0,0>(a);
117 }
118 };
119 }
120
121 template <class A>
122 BOOST_QVM_INLINE_TRIVIAL
123 typename boost::enable_if_c<
124 is_mat<A>::value &&
125 !qvm_detail::mat_index_write_defined<mat_traits<A>::rows,mat_traits<A>::cols>::value,
126 typename mat_traits<A>::scalar_type &>::type
127 mat_index_write( A & a, int r, int c )
128 {
129 return qvm_detail::matrix_w<0,mat_traits<A>::rows*mat_traits<A>::cols>::write_element_idx(a,r,c);
130 }
131
132 ////////////////////////////////////////////////
133
134 namespace
135 sfinae
136 {
137 using ::boost::qvm::mat_index_read;
138 using ::boost::qvm::mat_index_write;
139 }
140
141 ////////////////////////////////////////////////
142 }
143 }
144
145#endif