3 #ifndef DUNE_ARRAYLIST_HH
4 #define DUNE_ARRAYLIST_HH
15 template<
class T,
int N,
class A>
16 class ArrayListIterator;
18 template<
class T,
int N,
class A>
19 class ConstArrayListIterator;
57 template<
class T,
int N=100,
class A=std::allocator<T> >
133 const_iterator
begin()
const;
145 const_iterator
end()
const;
171 inline size_type
size()
const;
196 typedef typename A::template rebind<shared_ptr<array<MemberType,chunkSize_> > >::other
197 SmartPointerAllocator;
202 typedef typename A::template rebind<array<MemberType,chunkSize_> >::other
212 std::vector<shared_ptr<array<MemberType,chunkSize_> >,
213 SmartPointerAllocator> chunks_;
252 template<
class T,
int N,
class A>
254 typename A::value_type,
255 typename A::reference,
256 typename A::difference_type>
303 inline void increment();
308 inline void decrement();
333 inline void eraseToHere();
372 template<
class T,
int N,
class A>
375 const typename A::value_type,
376 typename A::const_reference,
377 typename A::difference_type>
416 inline void increment();
421 inline void decrement();
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_;
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>
523 typename ArrayList<T,N,A>::const_reference ArrayList<T,N,A>::elementAt(size_type i)
const
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_ );
565 std::copy(chunks_.begin()+distance,
566 chunks_.begin()+(distance+chunks), chunks_.begin());
569 start_ = start_ % chunkSize_;
574 template<
class T,
int N,
class A>
580 template<
class T,
int N,
class A>
587 template<
class T,
int N,
class A>
591 assert(list_==(other.list_));
592 return position_==other.position_ ;
596 template<
class T,
int N,
class A>
600 assert(list_==(other.list_));
601 return position_==other.position_ ;
605 template<
class T,
int N,
class A>
609 assert(list_==(other.list_));
610 return position_==other.position_ ;
613 template<
class T,
int N,
class A>
619 template<
class T,
int N,
class A>
625 template<
class T,
int N,
class A>
631 template<
class T,
int N,
class A>
637 template<
class T,
int N,
class A>
640 return list_->elementAt(i+position_);
643 template<
class T,
int N,
class A>
646 return list_->elementAt(i+position_);
649 template<
class T,
int N,
class A>
652 return list_->elementAt(position_);
655 template<
class T,
int N,
class A>
658 return list_->elementAt(position_);
661 template<
class T,
int N,
class A>
665 assert(list_==(other.list_));
666 return other.position_ - position_;
669 template<
class T,
int N,
class A>
673 assert(list_==(other.list_));
674 return other.position_ - position_;
677 template<
class T,
int N,
class A>
680 position_=other.position_;
685 template<
class T,
int N,
class A>
688 position_=other.position_;
693 template<
class T,
int N,
class A>
696 list_->size_ -= ++position_ - list_->start_;
698 size_t posChunkStart = position_ / chunkSize_;
700 size_t chunks = (position_ - list_->start_ + list_->start_ % chunkSize_)
702 list_->start_ = position_;
705 for(
size_t chunk=0; chunk<chunks;chunk++) {
707 list_->chunks_[posChunkStart].reset();
712 assert(list_->start_+list_->size_<=list_->capacity_);
715 template<
class T,
int N,
class A>
717 : position_(position), list_(&arrayList)
721 template<
class T,
int N,
class A>
724 : position_(position), list_(&arrayList)
727 template<
class T,
int N,
class A>
729 : position_(other.position_), list_(other.list_)