Newer
Older
// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
// vi: set et ts=4 sw=2 sts=2:
Oliver Sander
committed
/** \file
\brief implementation of the stl array class (a static array)
*/
#include <iostream>
#include <iomanip>
#include <string>
Oliver Sander
committed
// Include system implementation of array class if present
#ifdef HAVE_ARRAY
#include <array>
#else
#include <algorithm>
Oliver Sander
committed
#endif
namespace Dune
{
/** @addtogroup Common
@{
*/
Oliver Sander
committed
#ifdef HAVE_ARRAY
using std::array;
#else
/** \brief Simple fixed size array class. This replaces std::array,
* if that is not available.
*
*/
template<class T, int N>
Oliver Sander
committed
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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;
}
Oliver Sander
committed
//! 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;
}
Oliver Sander
committed
T a[(N > 0) ? N : 1];
};
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// 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);
}
Oliver Sander
committed
#endif
Oliver Sander
committed
//! Output operator for array
template <class T, int N>
inline std::ostream& operator<< (std::ostream& s, const array<T,N>& e)
Oliver Sander
committed
{
s << "[";
for (int i=0; i<N-1; i++) s << e[i] << ",";
s << e[N-1] << "]";
return s;
}
/** @} */
} // end namespace Dune
#endif