3
* Copyright (c) 2002, 2003 Kresimir Fresl, Toon Knapen and Karl Meerbergen
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)
9
* KF acknowledges the support of the Faculty of Civil Engineering,
10
* University of Zagreb, Croatia.
14
#ifndef BOOST_NUMERIC_BINDINGS_TRAITS_TNT_H
15
#define BOOST_NUMERIC_BINDINGS_TRAITS_TNT_H
17
// Roldan Pozo's TNT (Template Numerical Toolkit)
18
// see: http://math.nist.gov/tnt/index.html
20
#include <boost/numeric/bindings/traits/config.hpp>
22
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
24
#include <boost/numeric/bindings/traits/traits.hpp>
25
#include <tnt/tnt_array1d.h>
26
#include <tnt/tnt_fortran_array1d.h>
27
#include <tnt/tnt_array2d.h>
28
#include <tnt/tnt_fortran_array2d.h>
30
namespace boost { namespace numeric { namespace bindings { namespace traits {
33
template <typename T, typename V>
34
struct vector_detail_traits<TNT::Array1D<T>, V>
36
#ifndef BOOST_NUMERIC_BINDINGS_NO_SANITY_CHECK
39
TNT::Array1D<T>, typename boost::remove_const<V>::type
43
typedef TNT::Array1D<T> identifier_type;
44
typedef V vector_type;
46
typedef typename detail::generate_const<V,T>::type* pointer;
48
static pointer storage (vector_type& v) { return &v[0]; }
49
static int size (vector_type& v) { return v.dim(); }
50
static int stride (vector_type& v) { return 1; }
53
// TNT::Fortran_Array1D<>
54
template <typename T, typename V>
55
struct vector_detail_traits<TNT::Fortran_Array1D<T>, V>
57
#ifndef BOOST_NUMERIC_BINDINGS_NO_SANITY_CHECK
60
TNT::Fortran_Array1D<T>, typename boost::remove_const<V>::type
64
typedef TNT::Fortran_Array1D<T> identifier_type;
65
typedef V vector_type;
67
typedef typename detail::generate_const<V,T>::type* pointer;
69
static pointer storage (vector_type& v) { return &v(1); }
70
static int size (vector_type& v) { return v.dim(); }
71
static int stride (vector_type& v) { return 1; }
76
template <typename T, typename M>
77
struct matrix_detail_traits<TNT::Array2D<T>, M>
79
#ifndef BOOST_NUMERIC_BINDINGS_NO_SANITY_CHECK
82
TNT::Array2D<T>, typename boost::remove_const<M>::type
86
typedef TNT::Array2D<T> identifier_type;
87
typedef M matrix_type;
88
typedef general_t matrix_structure;
89
typedef row_major_t ordering_type;
92
typedef typename detail::generate_const<M,T>::type* pointer;
94
static pointer storage (matrix_type& m) { return m[0]; }
95
static int size1 (matrix_type& m) { return m.dim1(); }
96
static int size2 (matrix_type& m) { return m.dim2(); }
97
static int storage_size (matrix_type& m) {
98
return size1 (m) * size2 (m);
100
static int leading_dimension (matrix_type& m) { return m.dim2(); }
103
// TNT::Fortran_Array2D<>
104
template <typename T, typename M>
105
struct matrix_detail_traits<TNT::Fortran_Array2D<T>, M> {
106
#ifndef BOOST_NUMERIC_BINDINGS_NO_SANITY_CHECK
109
TNT::Fortran_Array2D<T>, typename boost::remove_const<M>::type
113
typedef TNT::Fortran_Array2D<T> identifier_type;
114
typedef M matrix_type;
115
typedef general_t matrix_structure;
116
typedef column_major_t ordering_type;
118
typedef T value_type;
119
typedef typename detail::generate_const<M,T>::type* pointer;
121
static pointer storage (matrix_type& m) { return &m(1, 1); }
122
static int size1 (matrix_type& m) { return m.dim1(); }
123
static int size2 (matrix_type& m) { return m.dim2(); }
124
static int storage_size (matrix_type& m) {
125
return size1 (m) * size2 (m);
127
static int leading_dimension (matrix_type& m) { return m.dim1(); }
132
#else // BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
134
#error with your compiler TNT cannot be used in bindings
136
#endif // BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
138
#endif // BOOST_NUMERIC_BINDINGS_TRAITS_TNT_H