]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/qvm/detail/cofactor_impl.hpp
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / boost / boost / qvm / detail / cofactor_impl.hpp
CommitLineData
1e59de90
TL
1#ifndef BOOST_QVM_DETAIL_COFACTOR_IMPL_HPP_INCLUDED
2#define BOOST_QVM_DETAIL_COFACTOR_IMPL_HPP_INCLUDED
92f5a8d4 3
1e59de90 4// Copyright 2008-2022 Emil Dotchevski and Reverge Studios, Inc.
92f5a8d4 5
1e59de90
TL
6// Distributed under the Boost Software License, Version 1.0. (See accompanying
7// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
92f5a8d4
TL
8
9#include <boost/qvm/detail/determinant_impl.hpp>
10#include <boost/qvm/mat_traits.hpp>
11#include <boost/qvm/static_assert.hpp>
12
1e59de90
TL
13namespace boost { namespace qvm {
14
92f5a8d4 15namespace
1e59de90 16qvm_detail
92f5a8d4 17 {
1e59de90
TL
18 template <class A>
19 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
20 typename deduce_mat<A>::type
21 cofactor_impl( A const & a )
92f5a8d4 22 {
1e59de90
TL
23 BOOST_QVM_STATIC_ASSERT(mat_traits<A>::rows==mat_traits<A>::cols);
24 int const N=mat_traits<A>::rows;
25 typedef typename mat_traits<A>::scalar_type T;
26 T c[N-1][N-1];
27 typedef typename deduce_mat<A>::type R;
28 R b;
29 for( int j=0; j!=N; ++j )
92f5a8d4 30 {
1e59de90 31 for( int i=0; i!=N; ++i )
92f5a8d4 32 {
1e59de90
TL
33 int i1=0;
34 for( int ii=0; ii!=N; ++ii )
92f5a8d4 35 {
1e59de90
TL
36 if( ii==i )
37 continue;
38 int j1=0;
39 for( int jj=0; jj!=N; ++jj )
92f5a8d4 40 {
1e59de90
TL
41 if( jj==j )
42 continue;
43 c[i1][j1] = mat_traits<A>::read_element_idx(ii,jj,a);
44 ++j1;
92f5a8d4 45 }
1e59de90 46 ++i1;
92f5a8d4 47 }
1e59de90
TL
48 T det = determinant_impl(c);
49 if( (i+j)&1 )
50 det=-det;
51 mat_traits<R>::write_element_idx(i,j,b) = det;
92f5a8d4
TL
52 }
53 }
1e59de90 54 return b;
92f5a8d4
TL
55 }
56 }
57
1e59de90
TL
58} }
59
92f5a8d4 60#endif