text: /**
   * -*- c++ -*-
   *
   * \file c_array.hpp
   *
   * \brief provides specializations of matrix and vector traits for c arrays and c matrices.
   *
   * Copyright (c) 2009, Gunter Winkler
   *
   * Distributed under the Boost Software License, Version 1.0. (See
   * accompanying file LICENSE_1_0.txt or copy at
   * http://www.boost.org/LICENSE_1_0.txt)
   *
   * \author Gunter Winkler (guwi17 at gmx dot de)
   */
  
  #ifndef BOOST_NUMERIC_UBLAS_TRAITS_C_ARRAY_HPP
  #define BOOST_NUMERIC_UBLAS_TRAITS_C_ARRAY_HPP
  
  
  #include <boost/numeric/ublas/traits.hpp>
  #include <boost/numeric/ublas/traits/const_iterator_type.hpp>
  #include <boost/numeric/ublas/traits/iterator_type.hpp>
  
  namespace boost { namespace numeric { namespace ublas {
  
      namespace detail {
  
  
  
      }
  
  
      template < class T, int M, int N >
      struct matrix_view_traits < T[M][N] > {
          typedef T              matrix_type[M][N];
  
          typedef std::size_t          size_type;
          typedef std::ptrdiff_t       difference_type;
  
          typedef row_major_tag  orientation_category;
          typedef dense_tag      storage_category;
  
          typedef T            value_type;
          typedef const T      &const_reference;
          typedef const T      *const_pointer;
  
          typedef const matrix_reference<const matrix_type>    const_closure_type;
  
          typedef T row_type[N];
  
          typedef const row_type *const_iterator1;
          typedef const_pointer  const_iterator2;
  
      };
  
      template < class T, int M, int N >
      struct mutable_matrix_traits < T[M][N] > {
          typedef T            matrix_type[M][N];
  
          typedef T            *reference;
  
          typedef matrix_reference<matrix_type>                closure_type;
  
      };
  
      template < class T, int N  >
      struct vector_view_traits < T[N] > {
          typedef T              vector_type[N];
  
          typedef std::size_t          size_type;
          typedef std::ptrdiff_t       difference_type;
  
          typedef dense_tag      storage_category;
  
          typedef T            value_type;
          typedef const T      &const_reference;
          typedef const T      *const_pointer;
  
          typedef const vector_reference<const vector_type>    const_closure_type;
  
          typedef const_pointer const_iterator;
  
          /// iterator pointing to the first element
          static
          const_iterator begin(const vector_type & v) {
              return & (v[0]);
          }
          /// iterator pointing behind the last element
          static
          const_iterator end(const vector_type & v) {
              return & (v[N]);
          }
      };
  
      template < class T, int N  >
      struct mutable_vector_traits < T[N] >  {
  
          typedef T &reference;
          typedef T *pointer;
          typedef vector_reference< T[N] > closure_type;
  
      };
  
  
  
  
  }}} // Namespace boost::numeric::ublas
  
  #endif
  