Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-01-08 10:04:58

0001 #ifndef BOOST_QVM_DETAIL_TRANSP_IMPL_HPP_INCLUDED
0002 #define BOOST_QVM_DETAIL_TRANSP_IMPL_HPP_INCLUDED
0003 
0004 // Copyright 2008-2024 Emil Dotchevski and Reverge Studios, Inc.
0005 // Distributed under the Boost Software License, Version 1.0. (See accompanying
0006 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
0007 
0008 #include <boost/qvm/deduce_mat.hpp>
0009 #include <boost/qvm/static_assert.hpp>
0010 #include <boost/qvm/assert.hpp>
0011 
0012 namespace boost { namespace qvm {
0013 
0014 namespace
0015 qvm_detail
0016     {
0017     template <class OriginalMatrix>
0018     class
0019     transposed_
0020         {
0021         transposed_( transposed_ const & );
0022         transposed_ & operator=( transposed_ const & );
0023         ~transposed_();
0024 
0025         public:
0026 
0027         template <class T>
0028         BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_TRIVIAL
0029         transposed_ &
0030         operator=( T const & x )
0031             {
0032             assign(*this,x);
0033             return *this;
0034             }
0035 
0036         template <class R
0037 #if __cplusplus >= 201103L
0038             , class = typename enable_if<is_mat<R> >::type
0039 #endif
0040         >
0041         BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_TRIVIAL
0042         operator R() const
0043             {
0044             R r;
0045             assign(r,*this);
0046             return r;
0047             }
0048         };
0049 
0050     template <class OriginalMatrix,bool WriteElementRef=mat_write_element_ref<OriginalMatrix>::value>
0051     struct transposed_write_traits;
0052 
0053     template <class OriginalMatrix>
0054     struct
0055     transposed_write_traits<OriginalMatrix,true>
0056         {
0057         typedef typename mat_traits<OriginalMatrix>::scalar_type scalar_type;
0058         typedef transposed_<OriginalMatrix> this_matrix;
0059         static int const rows=mat_traits<OriginalMatrix>::cols;
0060         static int const cols=mat_traits<OriginalMatrix>::rows;
0061 
0062         template <int Row,int Col>
0063         static
0064         BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
0065         scalar_type &
0066         write_element( this_matrix & x )
0067             {
0068             BOOST_QVM_STATIC_ASSERT(Row>=0);
0069             BOOST_QVM_STATIC_ASSERT(Row<rows);
0070             BOOST_QVM_STATIC_ASSERT(Col>=0);
0071             BOOST_QVM_STATIC_ASSERT(Col<cols);
0072             return mat_traits<OriginalMatrix>::template write_element<Col,Row>(reinterpret_cast<OriginalMatrix &>(x));
0073             }
0074 
0075         static
0076         BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
0077         scalar_type &
0078         write_element_idx( int row, int col, this_matrix & x )
0079             {
0080             BOOST_QVM_ASSERT(row>=0);
0081             BOOST_QVM_ASSERT(row<rows);
0082             BOOST_QVM_ASSERT(col>=0);
0083             BOOST_QVM_ASSERT(col<cols);
0084             return mat_traits<OriginalMatrix>::write_element_idx(col,row,reinterpret_cast<OriginalMatrix &>(x));
0085             }
0086         };
0087 
0088     template <class OriginalMatrix>
0089     struct
0090     transposed_write_traits<OriginalMatrix,false>
0091         {
0092         typedef typename mat_traits<OriginalMatrix>::scalar_type scalar_type;
0093         typedef transposed_<OriginalMatrix> this_matrix;
0094         static int const rows=mat_traits<OriginalMatrix>::cols;
0095         static int const cols=mat_traits<OriginalMatrix>::rows;
0096 
0097         template <int Row,int Col>
0098         static
0099         BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
0100         void
0101         write_element( this_matrix & x, scalar_type s )
0102             {
0103             BOOST_QVM_STATIC_ASSERT(Row>=0);
0104             BOOST_QVM_STATIC_ASSERT(Row<rows);
0105             BOOST_QVM_STATIC_ASSERT(Col>=0);
0106             BOOST_QVM_STATIC_ASSERT(Col<cols);
0107             mat_traits<OriginalMatrix>::template write_element<Col,Row>(reinterpret_cast<OriginalMatrix &>(x), s);
0108             }
0109 
0110         static
0111         BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
0112         void
0113         write_element_idx( int row, int col, this_matrix & x, scalar_type s )
0114             {
0115             BOOST_QVM_ASSERT(row>=0);
0116             BOOST_QVM_ASSERT(row<rows);
0117             BOOST_QVM_ASSERT(col>=0);
0118             BOOST_QVM_ASSERT(col<cols);
0119             mat_traits<OriginalMatrix>::write_element_idx(col,row,reinterpret_cast<OriginalMatrix &>(x), s);
0120             }
0121         };
0122     }
0123 
0124 template <class OriginalMatrix>
0125 struct
0126 mat_traits< qvm_detail::transposed_<OriginalMatrix> >:
0127     qvm_detail::transposed_write_traits<OriginalMatrix>
0128     {
0129     typedef typename mat_traits<OriginalMatrix>::scalar_type scalar_type;
0130     typedef qvm_detail::transposed_<OriginalMatrix> this_matrix;
0131     static int const rows=mat_traits<OriginalMatrix>::cols;
0132     static int const cols=mat_traits<OriginalMatrix>::rows;
0133 
0134     template <int Row,int Col>
0135     static
0136     BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
0137     scalar_type
0138     read_element( this_matrix const & x )
0139         {
0140         BOOST_QVM_STATIC_ASSERT(Row>=0);
0141         BOOST_QVM_STATIC_ASSERT(Row<rows);
0142         BOOST_QVM_STATIC_ASSERT(Col>=0);
0143         BOOST_QVM_STATIC_ASSERT(Col<cols);
0144         return mat_traits<OriginalMatrix>::template read_element<Col,Row>(reinterpret_cast<OriginalMatrix const &>(x));
0145         }
0146 
0147     static
0148     BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
0149     scalar_type
0150     read_element_idx( int row, int col, this_matrix const & x )
0151         {
0152         BOOST_QVM_ASSERT(row>=0);
0153         BOOST_QVM_ASSERT(row<rows);
0154         BOOST_QVM_ASSERT(col>=0);
0155         BOOST_QVM_ASSERT(col<cols);
0156         return mat_traits<OriginalMatrix>::read_element_idx(col,row,reinterpret_cast<OriginalMatrix const &>(x));
0157         }
0158     };
0159 
0160 template <class OriginalMatrix,int R,int C>
0161 struct
0162 deduce_mat<qvm_detail::transposed_<OriginalMatrix>,R,C>
0163     {
0164     typedef mat<typename mat_traits<OriginalMatrix>::scalar_type,R,C> type;
0165     };
0166 
0167 template <class OriginalMatrix,int R,int C>
0168 struct
0169 deduce_mat2<qvm_detail::transposed_<OriginalMatrix>,qvm_detail::transposed_<OriginalMatrix>,R,C>
0170     {
0171     typedef mat<typename mat_traits<OriginalMatrix>::scalar_type,R,C> type;
0172     };
0173 
0174 } }
0175 
0176 #endif