2
// Copyright (c) 2002-2003
3
// Toon Knapen, Kresimir Fresl, Joerg Walter
5
// Distributed under the Boost Software License, Version 1.0.
6
// (See accompanying file LICENSE_1_0.txt or copy at
7
// http://www.boost.org/LICENSE_1_0.txt)
10
#ifndef BOOST_NUMERIC_BINDINGS_TRAITS_SYMM_HERM_RAW_HPP
11
#define BOOST_NUMERIC_BINDINGS_TRAITS_SYMM_HERM_RAW_HPP
13
#include <boost/numeric/bindings/traits/matrix_raw.hpp>
14
#ifndef BOOST_UBLAS_HAVE_BINDINGS
15
# include <boost/numeric/ublas/symmetric.hpp>
16
# include <boost/numeric/ublas/hermitian.hpp>
19
namespace boost { namespace numeric { namespace bindings { namespace traits {
21
namespace ublas = boost::numeric::ublas;
23
template <typename M, typename F>
25
int leading_dimension (const ublas::symmetric_adaptor<M, F> &m) {
26
return bindings::traits::leading_dimension (m.data());
29
template <typename M, typename F>
31
int leading_dimension (const ublas::hermitian_adaptor<M, F> &m) {
32
return bindings::traits::leading_dimension (m.data());
37
template <typename M, typename F>
39
int matrix_storage_size (const ublas::symmetric_adaptor<M, F> &m) {
40
return matrix_storage_size (m.data());
43
template <typename M, typename F>
45
int matrix_storage_size (const ublas::hermitian_adaptor<M, F> &m) {
46
return matrix_storage_size (m.data());
49
template<typename T, typename F1, typename F2, typename A>
51
int matrix_storage_size (const ublas::symmetric_matrix<T,F1,F2,A> &m) {
52
return (int) ((m.size1() * (m.size1() + 1)) / 2);
55
template<typename T, typename F1, typename F2, typename A>
57
int matrix_storage_size (const ublas::hermitian_matrix<T,F1,F2,A> &m) {
58
return (int) ((m.size1() * (m.size1() + 1)) / 2);
63
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
64
template<typename T, typename F1, typename F2, typename A>
66
typename ublas::symmetric_matrix<T,F1,F2,A>::const_pointer
67
matrix_storage (const ublas::symmetric_matrix<T,F1,F2,A> &m) {
68
return &m.data().begin()[0];
71
// We need data_const() mostly due to MSVC 6.0.
72
// But how shall we write portable code otherwise?
73
template<typename T, typename F1, typename F2, typename A>
75
typename ublas::symmetric_matrix<T,F1,F2,A>::const_pointer
76
matrix_storage_const (const ublas::symmetric_matrix<T,F1,F2,A> &m) {
77
return &m.data().begin()[0];
79
template<typename T, typename F1, typename F2, typename A>
81
typename ublas::symmetric_matrix<T,F1,F2,A>::pointer
82
matrix_storage (ublas::symmetric_matrix<T,F1,F2,A> &m) {
83
return &m.data().begin()[0];
86
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
87
template <typename M, typename F>
89
typename M::const_pointer
90
matrix_storage (const ublas::symmetric_adaptor<M, F> &m) {
91
return matrix_storage (m.data());
94
// We need data_const() mostly due to MSVC 6.0.
95
// But how shall we write portable code otherwise?
96
template <typename M, typename F>
98
typename M::const_pointer
99
matrix_storage_const (const ublas::symmetric_adaptor<M, F> &m) {
100
return matrix_storage_const (m.data());
102
template <typename M, typename F>
104
typename M::pointer matrix_storage (ublas::symmetric_adaptor<M, F> &m) {
105
return matrix_storage (m.data());
109
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
110
template<typename T, typename F1, typename F2, typename A>
112
typename ublas::hermitian_matrix<T,F1,F2,A>::const_pointer
113
matrix_storage (const ublas::hermitian_matrix<T,F1,F2,A> &m) {
114
return &m.data().begin()[0];
117
// We need data_const() mostly due to MSVC 6.0.
118
// But how shall we write portable code otherwise?
119
template<typename T, typename F1, typename F2, typename A>
121
typename ublas::hermitian_matrix<T,F1,F2,A>::const_pointer
122
matrix_storage_const (const ublas::hermitian_matrix<T,F1,F2,A> &m) {
123
return &m.data().begin()[0];
125
template<typename T, typename F1, typename F2, typename A>
127
typename ublas::hermitian_matrix<T,F1,F2,A>::pointer
128
matrix_storage (ublas::hermitian_matrix<T,F1,F2,A> &m) {
129
return &m.data().begin()[0];
132
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
133
template <typename M, typename F>
135
typename M::const_pointer
136
matrix_storage (const ublas::hermitian_adaptor<M, F> &m) {
137
return matrix_storage (m.data());
140
// We need data_const() mostly due to MSVC 6.0.
141
// But how shall we write portable code otherwise?
142
template <typename M, typename F>
144
typename M::const_pointer
145
matrix_storage_const (const ublas::hermitian_adaptor<M, F> &m) {
146
return matrix_storage_const (m.data());
148
template <typename M, typename F>
150
typename M::pointer matrix_storage (ublas::hermitian_adaptor<M, F> &m) {
151
return matrix_storage (m.data());
156
inline char m_uplo_tag (ublas::upper_tag const&) { return 'U'; }
157
inline char m_uplo_tag (ublas::lower_tag const&) { return 'L'; }
161
template <typename SymmM>
163
char matrix_uplo_tag (SymmM&) {
164
typedef typename SymmM::packed_category uplo_t;
165
return detail::m_uplo_tag (uplo_t());