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 Fallback implementation of the std::array class (a static array)
Oliver Sander
committed
*/
#include <iostream>
#include <iomanip>
#include <string>
Oliver Sander
committed
// Include system implementation of array class if present
#ifdef HAVE_ARRAY
#include <array>
#else // #ifdef HAVE_ARRAY
#endif // #else // #ifdef HAVE_ARRAY
Oliver Sander
committed
Oliver Sander
committed
namespace Dune
{
/** @addtogroup Common
@{
*/
Oliver Sander
committed
#ifdef HAVE_ARRAY
Oliver Sander
committed
using std::array;
#else // #ifdef HAVE_ARRAY
Oliver Sander
committed
/** \brief Simple fixed size array class. This replaces std::array,
* if that is not available.
template< class T, std::size_t N >
struct array
{
Oliver Sander
committed
//! Remember the storage type
typedef T value_type;
/** \brief Reference to an object */
typedef value_type &reference;
Oliver Sander
committed
/** \brief Const reference to an object */
typedef const value_type &const_reference;
Oliver Sander
committed
/** \brief Iterator type */
typedef value_type *iterator;
Oliver Sander
committed
/** \brief Const iterator type */
typedef const value_type *const_iterator;
Oliver Sander
committed
/** \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;
Oliver Sander
committed
/** \brief Const reverse iterator type */
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
/** \brief Return array size */
size_type size () const { return N; }
/** \brief Determine, whether the container is empty */
bool empty () const { return (N == 0); }
Oliver Sander
committed
//! Assign value to all entries
array<T,N>& operator= (const T& t)
{
Oliver Sander
committed
return (*this);
}
//! \brief Assign value to all entries (according to C++0x the fill method is to be prefered)
void fill ( const T &t )
{
for( size_type i = 0; i < size(); ++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];
};
// Comparison Operators (see [lib.container.requirements])
// -------------------------------------------------------
template< class T, std::size_t 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, std::size_t N >
inline bool operator> ( const array< T, N > &a, const array< T, N > &b )
{
return b < a;
}
template< class T, std::size_t N >
inline bool operator<= ( const array< T, N > &a, const array< T, N > &b )
{
return !(a > b);
}
template< class T, std::size_t N >
inline bool operator>= ( const array< T, N > &a, const array< T, N > &b )
{
return !(a < b);
}
Christian Engwer
committed
#endif // #else // #ifdef HAVE_ARRAY
/** \brief output operator for array
*
* \note This operator is Dune-specific and not part of any C++-standard.
*/
template< class T, std::size_t N >
inline std::ostream &operator<< ( std::ostream &s, const array< T, N > &e )
Oliver Sander
committed
{
typedef typename array< T, N >::size_type size_type;
if( !e.empty() )
s << "[" << e[ size_type( 0 ) ];
for( size_type i = 1; i < e.size(); ++i )
s << "," << e[ i ];
s << "]";
Oliver Sander
committed
return s;
}
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
#ifndef DOXYGEN
template<class T>
array<T, 1> make_array(const T &t0) {
array<T, 1> result = { t0 };
return result;
}
template<class T>
array<T, 2> make_array(const T &t0, const T &t1) {
array<T, 2> result = { t0, t1 };
return result;
}
template<class T>
array<T, 3> make_array(const T &t0, const T &t1, const T &t2) {
array<T, 3> result = { t0, t1, t2 };
return result;
}
template<class T>
array<T, 4> make_array(const T &t0, const T &t1, const T &t2, const T &t3) {
array<T, 4> result = { t0, t1, t2, t3 };
return result;
}
template<class T>
array<T, 5> make_array(const T &t0, const T &t1, const T &t2, const T &t3,
const T &t4)
{
array<T, 5> result = { t0, t1, t2, t3, t4 };
return result;
}
template<class T>
array<T, 6> make_array(const T &t0, const T &t1, const T &t2, const T &t3,
const T &t4, const T &t5)
{
array<T, 6> result = { t0, t1, t2, t3, t4, t5 };
return result;
}
template<class T>
array<T, 7> make_array(const T &t0, const T &t1, const T &t2, const T &t3,
const T &t4, const T &t5, const T &t6)
{
array<T, 7> result = { t0, t1, t2, t3, t4, t5, t6 };
return result;
}
template<class T>
array<T, 8> make_array(const T &t0, const T &t1, const T &t2, const T &t3,
const T &t4, const T &t5, const T &t6, const T &t7)
{
array<T, 8> result = { t0, t1, t2, t3, t4, t5, t6, t7 };
return result;
}
template<class T>
array<T, 9> make_array(const T &t0, const T &t1, const T &t2, const T &t3,
const T &t4, const T &t5, const T &t6, const T &t7,
const T &t8)
{
array<T, 9> result = { t0, t1, t2, t3, t4, t5, t6, t7, t8 };
return result;
}
#endif // #ifndef DOXYGEN
/** \brief create and initialize an array
* \note There are overloads for this method which take fewer arguments
* (minimum 1). The current maximum of 10 arguments is arbitrary and
* can be raised on demand.
* \note This function is Dune-specific and not part of any C++-standard.
*/
template<class T>
array<T, 10> make_array(const T &t0, const T &t1, const T &t2, const T &t3,
const T &t4, const T &t5, const T &t6, const T &t7,
const T &t8, const T &t9)
{
array<T, 10> result = { t0, t1, t2, t3, t4, t5, t6, t7, t8, t9 };
return result;
}
/** @} */
#endif // #ifndef DUNE_ARRAY_HH