3 * \file RandomAccessList.h
4 * This file is part of LyX, the document processor.
5 * Licence details can be found in the file COPYING.
7 * \author Abdelrazak Younes
9 * Full author contact details are available in file CREDITS.
13 #ifndef RANDOM_ACESS_LIST_H
14 #define RANDOM_ACESS_LIST_H
23 #define USE_OLD_ITERATOR 1
25 /// Random Access List.
27 This templatized class provide a std::vector like interface to a
28 standard std::list underneath. An important property is that it
29 keeps the std::list::iterator interface. A typical use would be:
31 typedef RandomAccessList<some_class> MyContainer;
33 Then you can use MyContainer as if it was a standard
34 std::vector<some_class> for operator[] access and as if it was a
35 standard std::list for iterator access. The main difference with
36 std::vector is that insertion of elements is much less costly. Compared
37 to a standard list alone, there is of course a small overhead because
38 the class always keeps its internal vector of iterator (it_vector_) up
42 class RandomAccessList {
45 typedef std::list<T> Container;
46 typedef typename Container::reference reference;
47 typedef typename Container::const_reference const_reference;
50 typedef typename Container::iterator iterator;
51 // const_iterator (below)
52 typedef typename Container::const_iterator const_iterator;
56 typedef typename Container::size_type size_type;
57 typedef typename Container::difference_type difference_type;
58 typedef typename Container::value_type value_type;
59 typedef typename Container::allocator_type allocator_type;
60 typedef typename Container::pointer pointer;
61 typedef typename Container::const_pointer const_pointer;
63 // const_reverse_iterator
65 typedef std::vector<typename Container::iterator> IterCont;
67 // construct/copy/destroy
72 // RandomAccessList(size_type n T const & value = T())
74 template<class InputIterator>
75 RandomAccessList(InputIterator first, InputIterator last)
82 RandomAccessList(RandomAccessList const & x)
84 assign(x.begin(), x.end());
87 // ~RandomAccessList()
90 RandomAccessList & operator=(RandomAccessList const & x)
92 assign(x.begin(), x.end());
96 template<class InputIterator>
97 void assign(InputIterator first, InputIterator last)
99 container_.assign(first, last);
104 // void assign(size_type n, T const & u);
110 return container_.begin();
113 const_iterator begin() const
115 return container_.begin();
120 return container_.end();
123 const_iterator end() const
125 return container_.end();
128 // reverse_iterator rbegin();
129 // const_reverse_iterator rbegin() const;
130 // reverse_iterator rend();
131 // const_reverse_iterator rend() const;
134 size_type size() const
136 return iterCont_.size();
139 size_type max_size() const
141 return iterCont_.max_size();
144 // void resize(size_type sz, T c = T());
146 size_type capacity() const
148 return iterCont_.capacity();
153 return container_.empty();
156 // void reserve(size_type n);
160 reference operator[](size_type pos)
162 return *iterCont_[pos];
166 const_reference operator[](size_type pos) const
168 return *iterCont_[pos];
171 reference at(size_type pos)
173 return *iterCont_.at(pos);
176 const_reference at(size_type pos) const
178 return *iterCont_.at(pos);
183 return container_.front();
186 const_reference front() const
188 return container_.front();
193 return container_.back();
196 const_reference back() const
198 return container_.back();
203 void push_back(T const & x)
205 typename Container::iterator it =
206 container_.insert(container_.end(), x);
207 iterCont_.push_back(it);
212 container_.pop_back();
213 iterCont_.pop_back();
216 iterator insert(iterator position, T const & x)
218 typename Container::iterator it =
219 container_.insert(position, x);
224 // void insert(iterator position, size_type n, T const & x);
226 template<class InputIterator>
227 void insert(iterator position,
228 InputIterator first, InputIterator last)
230 container_.insert(position, first, last);
234 iterator erase(iterator position)
236 typename Container::iterator it =
237 container_.erase(position);
242 iterator erase(iterator first, iterator last)
244 typename Container::iterator it =
245 container_.erase(first, last);
250 void swap(size_t i, size_t j)
252 size_t const p = std::max(i, j);
253 size_t const q = std::min(i, j);
254 container_.splice(iterCont_[p], container_, iterCont_[q]);
255 container_.splice(iterCont_[q], container_, iterCont_[p]);
259 void splice(iterator where, iterator first, iterator last)
261 container_.splice(where, container_, first, last);
265 void swap(RandomAccessList & x)
267 std::swap(container_, x.container_);
268 std::swap(iterCont_, x.iterCont_);
278 void recreateVector()
281 typename Container::iterator beg = container_.begin();
282 typename Container::iterator end = container_.end();
283 for (; beg != end; ++beg)
284 iterCont_.push_back(beg);
288 Container container_;
289 /// Our container of iterators.