4 #ifndef DUNE_COMMON_ARRAYLIST_HH
5 #define DUNE_COMMON_ARRAYLIST_HH
16 template<
class T,
int N,
class A>
17 class ArrayListIterator;
19 template<
class T,
int N,
class A>
20 class ConstArrayListIterator;
58 template<
class T,
int N=100,
class A=std::allocator<T> >
197 using SmartPointerAllocator =
typename std::allocator_traits<A>::template rebind_alloc< std::shared_ptr< std::array<MemberType,chunkSize_> > >;
202 using ArrayAllocator =
typename std::allocator_traits<A>::template rebind_alloc< std::array<MemberType,chunkSize_> >;
211 std::vector<std::shared_ptr<std::array<MemberType,chunkSize_> >,
212 SmartPointerAllocator> chunks_;
251 template<
class T,
int N,
class A>
253 typename A::value_type,
254 typename A::value_type &,
255 typename A::difference_type>
371 template<
class T,
int N,
class A>
374 const typename A::value_type,
375 typename A::value_type const&,
376 typename A::difference_type>
468 template<
class T,
int N,
class A>
470 : capacity_(0), size_(0), start_(0)
472 chunks_.reserve(100);
475 template<
class T,
int N,
class A>
483 template<
class T,
int N,
class A>
489 template<
class T,
int N,
class A>
492 size_t index=start_+size_;
495 chunks_.push_back(std::make_shared<std::array<MemberType,chunkSize_> >());
496 capacity_ += chunkSize_;
498 elementAt(index)=entry;
502 template<
class T,
int N,
class A>
505 return elementAt(start_+i);
509 template<
class T,
int N,
class A>
512 return elementAt(start_+i);
515 template<
class T,
int N,
class A>
518 return chunks_[i/chunkSize_]->operator[](i%chunkSize_);
522 template<
class T,
int N,
class A>
525 return chunks_[i/chunkSize_]->operator[](i%chunkSize_);
528 template<
class T,
int N,
class A>
534 template<
class T,
int N,
class A>
540 template<
class T,
int N,
class A>
546 template<
class T,
int N,
class A>
552 template<
class T,
int N,
class A>
556 size_t distance = start_/chunkSize_;
559 size_t chunks = ((start_%chunkSize_ + size_)/chunkSize_ );
562 std::copy(chunks_.begin()+distance,
563 chunks_.begin()+(distance+chunks), chunks_.begin());
566 start_ = start_ % chunkSize_;
571 template<
class T,
int N,
class A>
577 template<
class T,
int N,
class A>
584 template<
class T,
int N,
class A>
588 assert(list_==(other.list_));
589 return position_==other.position_ ;
593 template<
class T,
int N,
class A>
597 assert(list_==(other.list_));
598 return position_==other.position_ ;
602 template<
class T,
int N,
class A>
606 assert(list_==(other.list_));
607 return position_==other.position_ ;
610 template<
class T,
int N,
class A>
616 template<
class T,
int N,
class A>
622 template<
class T,
int N,
class A>
628 template<
class T,
int N,
class A>
634 template<
class T,
int N,
class A>
640 template<
class T,
int N,
class A>
646 template<
class T,
int N,
class A>
652 template<
class T,
int N,
class A>
658 template<
class T,
int N,
class A>
662 assert(list_==(other.list_));
663 return other.position_ - position_;
666 template<
class T,
int N,
class A>
670 assert(list_==(other.list_));
671 return other.position_ - position_;
674 template<
class T,
int N,
class A>
677 position_=other.position_;
682 template<
class T,
int N,
class A>
685 position_=other.position_;
690 template<
class T,
int N,
class A>
693 list_->size_ -= ++position_ - list_->start_;
695 size_t posChunkStart = position_ / chunkSize_;
697 size_t chunks = (position_ - list_->start_ + list_->start_ % chunkSize_)
699 list_->start_ = position_;
702 for(
size_t chunk=0; chunk<chunks; chunk++) {
704 list_->chunks_[posChunkStart].reset();
709 assert(list_->start_+list_->size_<=list_->capacity_);
712 template<
class T,
int N,
class A>
714 : position_(position), list_(&arrayList)
718 template<
class T,
int N,
class A>
721 : position_(position), list_(&arrayList)
724 template<
class T,
int N,
class A>
726 : position_(other.position_), list_(other.list_)
This file implements iterator facade classes for writing stl conformant iterators.
reference operator[](size_type i)
Get the element at specific position.
Definition: arraylist.hh:503
iterator begin()
Get an iterator that is positioned at the first element.
Definition: arraylist.hh:529
bool equals(const ArrayListIterator< MemberType, N, A > &other) const
Comares two iterators.
Definition: arraylist.hh:585
void increment()
Increment the iterator.
Definition: arraylist.hh:611
size_type size() const
Get the number of elements in the list.
Definition: arraylist.hh:484
ConstArrayListIterator(const ArrayListIterator< T, N, A > &other)
Definition: arraylist.hh:725
void purge()
Purge the list.
Definition: arraylist.hh:553
const ConstArrayListIterator< T, N, A > & operator=(const ConstArrayListIterator< T, N, A > &other)
Definition: arraylist.hh:683
void decrement()
decrement the iterator.
Definition: arraylist.hh:623
void eraseToHere()
Erase all entries before the current position and the one at the current position.
Definition: arraylist.hh:691
ArrayList()
Constructs an Array list with one chunk.
Definition: arraylist.hh:469
const_iterator begin() const
Get a random access iterator that is positioned at the first element.
Definition: arraylist.hh:535
void increment()
Increment the iterator.
Definition: arraylist.hh:617
iterator end()
Get a random access iterator positioned after the last element.
Definition: arraylist.hh:541
const_reference elementAt(size_type i) const
Get the value of the list at an arbitrary position.
Definition: arraylist.hh:641
const_reference operator[](size_type i) const
Get the element at specific position.
Definition: arraylist.hh:510
void decrement()
decrement the iterator.
Definition: arraylist.hh:629
void advance(difference_type n)
Definition: arraylist.hh:578
const_iterator end() const
Get a random access iterator positioned after the last element.
Definition: arraylist.hh:547
const_reference dereference() const
Access the element at the current position.
Definition: arraylist.hh:653
void clear()
Delete all entries from the list.
Definition: arraylist.hh:476
reference elementAt(size_type i) const
Get the value of the list at an arbitrary position.
Definition: arraylist.hh:635
bool equals(const ConstArrayListIterator< MemberType, N, A > &other) const
Comares to iterators.
Definition: arraylist.hh:603
void advance(difference_type n)
Definition: arraylist.hh:572
ArrayListIterator< T, N, A > & operator=(const ArrayListIterator< T, N, A > &other)
Definition: arraylist.hh:675
difference_type distanceTo(const ConstArrayListIterator< T, N, A > &other) const
Definition: arraylist.hh:667
reference dereference() const
Access the element at the current position.
Definition: arraylist.hh:647
void push_back(const_reference entry)
Append an entry to the list.
Definition: arraylist.hh:490
difference_type distanceTo(const ArrayListIterator< T, N, A > &other) const
Definition: arraylist.hh:659
Dune namespace.
Definition: alignedallocator.hh:14
A random access iterator for the Dune::ArrayList class.
Definition: arraylist.hh:256
@ chunkSize_
The number of elements in one chunk of the list.
Definition: arraylist.hh:281
size_type position()
Definition: arraylist.hh:335
A::value_type MemberType
The member type.
Definition: arraylist.hh:264
ArrayListIterator()
Standard constructor.
Definition: arraylist.hh:347
A::difference_type difference_type
Definition: arraylist.hh:266
A::size_type size_type
Definition: arraylist.hh:268
typename A::value_type const & const_reference
Definition: arraylist.hh:272
typename A::value_type & reference
Definition: arraylist.hh:270
A constant random access iterator for the Dune::ArrayList class.
Definition: arraylist.hh:377
typename A::value_type & reference
Definition: arraylist.hh:392
@ chunkSize_
The number of elements in one chunk of the list.
Definition: arraylist.hh:403
ConstArrayListIterator()
Definition: arraylist.hh:443
A::value_type MemberType
The member type.
Definition: arraylist.hh:386
A::difference_type difference_type
Definition: arraylist.hh:388
typename A::value_type const & const_reference
Definition: arraylist.hh:394
A::size_type size_type
Definition: arraylist.hh:390
A dynamically growing random access list.
Definition: arraylist.hh:60
T value_type
Value type for stl compliance.
Definition: arraylist.hh:72
@ chunkSize_
The number of elements in one chunk of the list. This has to be at least one. The default is 100.
Definition: arraylist.hh:100
const T * const_pointer
The type of a const pointer to the type we store.
Definition: arraylist.hh:92
ArrayListIterator< MemberType, N, A > iterator
A random access iterator.
Definition: arraylist.hh:106
const T & const_reference
The type of a const reference to the type we store.
Definition: arraylist.hh:82
T & reference
The type of a reference to the type we store.
Definition: arraylist.hh:77
std::size_t size_type
The size type.
Definition: arraylist.hh:116
T MemberType
The member type that is stored.
Definition: arraylist.hh:67
T * pointer
The type of a pointer to the type we store.
Definition: arraylist.hh:87
ConstArrayListIterator< MemberType, N, A > const_iterator
A constant random access iterator.
Definition: arraylist.hh:111
std::ptrdiff_t difference_type
The difference type.
Definition: arraylist.hh:121
Base class for stl conformant forward iterators.
Definition: iteratorfacades.hh:432
D difference_type
Definition: iteratorfacades.hh:438
A pair consisting of a global and local index.
Definition: indexset.hh:84