diff --git a/dune/common/reservedvector.hh b/dune/common/reservedvector.hh new file mode 100644 index 0000000000000000000000000000000000000000..e5e5100030f3683fa19b6fa9477892baebbc5c7b --- /dev/null +++ b/dune/common/reservedvector.hh @@ -0,0 +1,201 @@ +// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- +// vi: set et ts=4 sw=2 sts=2: +#ifndef RESERVEDVECTOR_HH +#define RESERVEDVECTOR_HH + +#include <iostream> +#include <dune/common/genericiterator.hh> + +#ifdef CHECK_RESERVEDVECTOR +#define CHECKSIZE(X) assert(X) +#else +#define CHECKSIZE(X) {} +#endif + +namespace Dune +{ + /** + \brief A Vector class with statically reserved memory. + + ReservedVector is something between Dune::array and std::vector. + You have vector which can be extended and shrunk using methods like + push_back and pop_back, but reserved memory is predefined. + + This implies that the vector can not grow bigger than the predefined + maximum size. + + \tparam T The data type ReservedVector stores. + \tparam n The maximum number of objects the ReservedVector can store. + + */ + template<class T, int n> + class ReservedVector + { + public: + + /** @{ Typedefs */ + + //! The type of object, T, stored in the vector. + typedef T value_type; + //! Pointer to T. + typedef T* pointer; + //! Reference to T + typedef T& reference; + //! Const reference to T + typedef const T& const_reference; + //! An unsigned integral type. + typedef size_t size_type; + //! A signed integral type. + typedef std::ptrdiff_t difference_type; + //! Iterator used to iterate through a vector. + typedef Dune::GenericIterator<ReservedVector, value_type> iterator; + //! Const iterator used to iterate through a vector. + typedef Dune::GenericIterator<const ReservedVector, const value_type> const_iterator; + + /** @} */ + + /** @{ Constructors */ + + //! Constructor + ReservedVector() : sz(0) {} + + /** @} */ + + /** @{ Data access operations */ + + //! Erases all elements. + void clear() + { + sz = 0; + } + + //! Specifies a new size for the vector. + void resize(size_t s) + { + CHECKSIZE(s<=n); + sz = s; + } + + //! Appends an element to the end of a vector, up to the maximum size n, O(1) time. + void push_back(const T& t) + { + CHECKSIZE(sz<n); + data[sz++] = t; + } + + //! Erases the last element of the vector, O(1) time. + void pop_back() + { + if (! empty()) sz--; + } + + //! Returns a iterator pointing to the beginning of the vector. + iterator begin(){ + return iterator(*this, 0); + } + + //! Returns a const_iterator pointing to the beginning of the vector. + const_iterator begin() const { + return const_iterator(*this, 0); + } + + //! Returns an iterator pointing to the end of the vector. + iterator end(){ + return iterator(*this, sz); + } + + //! Returns a const_iterator pointing to the end of the vector. + const_iterator end() const { + return const_iterator(*this, sz); + } + + //! Returns reference to the i'th element. + reference operator[] (size_type i) + { + CHECKSIZE(sz>i); + return data[i]; + } + + //! Returns a const reference to the i'th element. + const_reference operator[] (size_type i) const + { + CHECKSIZE(sz>i); + return data[i]; + } + + //! Returns reference to first element of vector. + reference front() + { + CHECKSIZE(sz>0); + return data[0]; + } + + //! Returns const reference to first element of vector. + const_reference front() const + { + CHECKSIZE(sz>0); + return data[0]; + } + + //! Returns reference to last element of vector. + reference back() + { + CHECKSIZE(sz>0); + return data[sz-1]; + } + + //! Returns const reference to last element of vector. + const_reference back() const + { + CHECKSIZE(sz>0); + return data[sz-1]; + } + + /** @} */ + + /** @{ Informative Methods */ + + //! Returns number of elements in the vector. + size_type size () const + { + return sz; + } + + //! Returns true if vector has no elements. + bool empty() const + { + return sz==0; + } + + //! Returns current capacity (allocated memory) of the vector. + static size_type capacity() + { + return n; + } + + //! Returns the maximum length of the vector. + static size_type max_size() + { + return n; + } + + /** @} */ + + //! Send ReservedVector to an output stream + friend std::ostream& operator<< (std::ostream& s, const ReservedVector& v) + { + for (size_t i=0; i<v.size(); i++) + s << v[i] << " "; + return s; + } + + private: + T data[n]; + size_type sz; + }; + +} + +#undef CHECKSIZE + +#endif // RESERVEDVECTOR_HH