5 #ifndef DUNE_ARRAYLIST_HH
6 #define DUNE_ARRAYLIST_HH
17 template<
class T,
int N,
class A>
18 class ArrayListIterator;
20 template<
class T,
int N,
class A>
21 class ConstArrayListIterator;
59 template<
class T,
int N=100,
class A=std::allocator<T> >
135 const_iterator
begin()
const;
147 const_iterator
end()
const;
173 inline size_type
size()
const;
198 typedef typename A::template rebind<shared_ptr<array<MemberType,chunkSize_> > >::other
199 SmartPointerAllocator;
204 typedef typename A::template rebind<array<MemberType,chunkSize_> >::other
214 std::vector<shared_ptr<array<MemberType,chunkSize_> >,
215 SmartPointerAllocator> chunks_;
254 template<
class T,
int N,
class A>
256 typename A::value_type,
257 typename A::reference,
258 typename A::difference_type>
305 inline void increment();
310 inline void decrement();
335 inline void eraseToHere();
374 template<
class T,
int N,
class A>
377 const typename A::value_type,
378 typename A::const_reference,
379 typename A::difference_type>
418 inline void increment();
423 inline void decrement();
470 template<
class T,
int N,
class A>
472 : capacity_(0),
size_(0), start_(0)
474 chunks_.reserve(100);
477 template<
class T,
int N,
class A>
485 template<
class T,
int N,
class A>
491 template<
class T,
int N,
class A>
494 size_t index=start_+
size_;
498 capacity_ += chunkSize_;
500 elementAt(index)=entry;
504 template<
class T,
int N,
class A>
507 return elementAt(start_+i);
511 template<
class T,
int N,
class A>
514 return elementAt(start_+i);
517 template<
class T,
int N,
class A>
520 return chunks_[i/chunkSize_]->operator[](i%chunkSize_);
524 template<
class T,
int N,
class A>
525 typename ArrayList<T,N,A>::const_reference ArrayList<T,N,A>::elementAt(size_type i)
const
527 return chunks_[i/chunkSize_]->operator[](i%chunkSize_);
530 template<
class T,
int N,
class A>
536 template<
class T,
int N,
class A>
542 template<
class T,
int N,
class A>
548 template<
class T,
int N,
class A>
554 template<
class T,
int N,
class A>
558 size_t distance = start_/chunkSize_;
561 size_t chunks = ((start_%chunkSize_ +
size_)/chunkSize_ );
564 std::copy(chunks_.begin()+distance,
565 chunks_.begin()+(distance+chunks), chunks_.begin());
568 start_ = start_ % chunkSize_;
573 template<
class T,
int N,
class A>
579 template<
class T,
int N,
class A>
586 template<
class T,
int N,
class A>
590 assert(list_==(other.list_));
595 template<
class T,
int N,
class A>
599 assert(list_==(other.list_));
604 template<
class T,
int N,
class A>
608 assert(list_==(other.list_));
612 template<
class T,
int N,
class A>
618 template<
class T,
int N,
class A>
624 template<
class T,
int N,
class A>
630 template<
class T,
int N,
class A>
636 template<
class T,
int N,
class A>
642 template<
class T,
int N,
class A>
648 template<
class T,
int N,
class A>
654 template<
class T,
int N,
class A>
660 template<
class T,
int N,
class A>
664 assert(list_==(other.list_));
668 template<
class T,
int N,
class A>
672 assert(list_==(other.list_));
676 template<
class T,
int N,
class A>
684 template<
class T,
int N,
class A>
692 template<
class T,
int N,
class A>
695 list_->size_ -= ++
position_ - list_->start_;
697 size_t posChunkStart =
position_ / chunkSize_;
699 size_t chunks = (
position_ - list_->start_ + list_->start_ % chunkSize_)
704 for(
size_t chunk=0; chunk<chunks; chunk++) {
706 list_->chunks_[posChunkStart].reset();
711 assert(list_->start_+list_->size_<=list_->capacity_);
714 template<
class T,
int N,
class A>
720 template<
class T,
int N,
class A>
726 template<
class T,
int N,
class A>