1 /**
2  * -*- c++ -*-
3  *
4  * \file c_array.hpp
5  *
6  * \brief provides specializations of matrix and vector traits for c arrays and c matrices.
7  *
8  * Copyright (c) 2009, Gunter Winkler
9  *
10  * Distributed under the Boost Software License, Version 1.0. (See
11  * accompanying file LICENSE_1_0.txt or copy at
12  * http://www.boost.org/LICENSE_1_0.txt)
13  *
14  * \author Gunter Winkler (guwi17 at gmx dot de)
15  */
16 
17 #ifndef BOOST_NUMERIC_UBLAS_TRAITS_C_ARRAY_HPP
18 #define BOOST_NUMERIC_UBLAS_TRAITS_C_ARRAY_HPP
19 
20 
21 #include <boost/numeric/ublas/traits.hpp>
22 #include <boost/numeric/ublas/traits/const_iterator_type.hpp>
23 #include <boost/numeric/ublas/traits/iterator_type.hpp>
24 
25 namespace boost { namespace numeric { namespace ublas {
26 
27     namespace detail {
28 
29 
30 
31     }
32 
33 
34     template < class T, int M, int N >
35     struct matrix_view_traits < T[M][N] > {
36         typedef T              matrix_type[M][N];
37 
38         typedef std::size_t          size_type;
39         typedef std::ptrdiff_t       difference_type;
40 
41         typedef row_major_tag  orientation_category;
42         typedef dense_tag      storage_category;
43 
44         typedef T            value_type;
45         typedef const T      &const_reference;
46         typedef const T      *const_pointer;
47 
48         typedef const matrix_reference<const matrix_type>    const_closure_type;
49 
50         typedef T row_type[N];
51 
52         typedef const row_type *const_iterator1;
53         typedef const_pointer  const_iterator2;
54 
55     };
56 
57     template < class T, int M, int N >
58     struct mutable_matrix_traits < T[M][N] > {
59         typedef T            matrix_type[M][N];
60 
61         typedef T            *reference;
62 
63         typedef matrix_reference<matrix_type>                closure_type;
64 
65     };
66 
67     template < class T, int N  >
68     struct vector_view_traits < T[N] > {
69         typedef T              vector_type[N];
70 
71         typedef std::size_t          size_type;
72         typedef std::ptrdiff_t       difference_type;
73 
74         typedef dense_tag      storage_category;
75 
76         typedef T            value_type;
77         typedef const T      &const_reference;
78         typedef const T      *const_pointer;
79 
80         typedef const vector_reference<const vector_type>    const_closure_type;
81 
82         typedef const_pointer const_iterator;
83 
84         /// iterator pointing to the first element
85         static
beginboost::numeric::ublas::vector_view_traits86         const_iterator begin(const vector_type & v) {
87             return & (v[0]);
88         }
89         /// iterator pointing behind the last element
90         static
endboost::numeric::ublas::vector_view_traits91         const_iterator end(const vector_type & v) {
92             return & (v[N]);
93         }
94     };
95 
96     template < class T, int N  >
97     struct mutable_vector_traits < T[N] >  {
98 
99         typedef T &reference;
100         typedef T *pointer;
101         typedef vector_reference< T[N] > closure_type;
102 
103     };
104 
105 
106 
107 
108 }}} // Namespace boost::numeric::ublas
109 
110 #endif
111