Skip to content
Snippets Groups Projects
array.hh 3.32 KiB
Newer Older
  • Learn to ignore specific revisions
  • // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    // vi: set et ts=4 sw=2 sts=2:
    
    Oliver Sander's avatar
    Oliver Sander committed
    #ifndef DUNE_ARRAY_HH
    #define DUNE_ARRAY_HH
    
    /** \file
        \brief implementation of the stl array class (a static array)
     */
    
    
    #include <iostream>
    #include <iomanip>
    #include <string>
    
    
    // Include system implementation of array class if present
    #ifdef HAVE_ARRAY
    #include <array>
    
    #else
    #include <algorithm>
    
    Oliver Sander's avatar
    Oliver Sander committed
      /** \brief Simple fixed size array class.  This replaces std::array,
       * if that is not available.
    
      class array {
      public:
    
        //! Remember the storage type
        typedef T value_type;
    
        /** \brief Reference to an object */
        typedef value_type&                             reference;
    
        /** \brief Const reference to an object */
        typedef const value_type&                       const_reference;
    
        /** \brief Iterator type */
        typedef value_type*                             iterator;
    
        /** \brief Const iterator type */
        typedef const value_type*                       const_iterator;
    
        /** \brief Type used for array indices */
        typedef std::size_t size_type;
    
        /** \brief Difference type */
        typedef std::ptrdiff_t difference_type;
    
        /** \brief Reverse iterator type */
        typedef std::reverse_iterator<iterator>         reverse_iterator;
    
        /** \brief Const reverse iterator type */
        typedef std::reverse_iterator<const_iterator>   const_reverse_iterator;
    
        /** \brief Return array size */
        size_type size() const {return N;}
    
        //! Assign value to all entries
        array<T,N>& operator= (const T& t)
        {
          for (int i=0; i<N; i++) a[i]=t;
          return (*this);
        }
    
    
        //! \brief Assign value to all entries
        void assign(const T& t)
        {
          for (int i=0; i<N; i++) a[i]=t;
        }
    
    
        //! Component access
        reference operator[] (size_type i)
        {
          return a[i];
        }
    
        //! Const component access
        const_reference operator[] (size_type i) const
        {
          return a[i];
        }
    
    
        iterator begin ()
        {
          return a;
        }
    
        const_iterator begin () const
        {
          return a;
        }
    
        iterator end ()
        {
          return a + N;
        }
    
        const_iterator end () const
        {
          return a + N;
        }
    
    
    
    
    
      // Comparison Operators (see [lib.container.requirements])
      // -------------------------------------------------------
    
      template< class T, int N >
      inline bool operator< ( const array< T, N > &a, const array< T, N > &b )
      {
        return std::lexicographical_compare( a.begin(), a.end(), b.begin(), b.end() );
      }
    
      template< class T, int N >
      inline bool operator> ( const array< T, N > &a, const array< T, N > &b )
      {
        return b < a;
      }
    
      template< class T, int N >
      inline bool operator<= ( const array< T, N > &a, const array< T, N > &b )
      {
        return !(a > b);
      }
    
      template< class T, int N >
      inline bool operator>= ( const array< T, N > &a, const array< T, N > &b )
      {
        return !(a < b);
      }
    
      //! Output operator for array
      template <class T, int N>
    
      inline std::ostream& operator<< (std::ostream& s, const array<T,N>& e)
    
      {
        s << "[";
        for (int i=0; i<N-1; i++) s << e[i] << ",";
        s << e[N-1] << "]";
        return s;
      }