00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef SGI_container_adapter_h_INCLUDED
00038 #define SGI_container_adapter_h_INCLUDED
00039
00040 #include <iterator>
00041 #include "iterator_adapter.h"
00042
00043 namespace SGI {
00044
00045 template <class RandomAccessIterator>
00046 struct container_adapter {
00047 typedef typename iterator_traits<RandomAccessIterator>::value_type value_type;
00048 typedef typename iterator_traits<RandomAccessIterator>::pointer pointer;
00049 typedef typename iterator_traits<RandomAccessIterator>::reference reference;
00050 typedef const iterator_traits<RandomAccessIterator>::value_type& const_reference;
00051 typedef typename iterator_traits<RandomAccessIterator>::difference_type size_type;
00052 typedef typename iterator_traits<RandomAccessIterator>::difference_type difference_type;
00053 typedef RandomAccessIterator iterator;
00054 typedef const_iterator<RandomAccessIterator> const_iterator;
00055 typedef reverse_iterator<const_iterator> const_reverse_iterator;
00056 typedef reverse_iterator<iterator> reverse_iterator;
00057
00058 protected:
00059 iterator first;
00060 iterator last;
00061 iterator end_of_storage;
00062
00063 public:
00064 iterator begin() { return first; }
00065 iterator end() { return last; }
00066 const_iterator begin() const { return const_iterator(first); }
00067 const_iterator end() const { return const_iterator(last); }
00068 reverse_iterator rbegin() { return reverse_iterator(end()); }
00069 reverse_iterator rend() { return reverse_iterator(begin()); }
00070 const_reverse_iterator rbegin() const {
00071 return const_reverse_iterator(end());
00072 }
00073 const_reverse_iterator rend() const {
00074 return const_reverse_iterator(begin());
00075 }
00076 size_type size() const { return size_type(end() - begin()); }
00077 size_type max_size() const { return size_type(end_of_storage - begin()); }
00078 size_type capacity() const { return size_type(end_of_storage - begin()); }
00079 bool empty() const { return begin() == end(); }
00080 reference operator[](size_type n) { return *(begin() + n); }
00081 const_reference operator[](size_type n) const { return *(begin() + n); }
00082
00083 container_adapter(RandomAccessIterator first, RandomAccessIterator last):
00084 first(first), last(first), end_of_storage(last) {}
00085
00086 void reserve(size_type n) { }
00087
00088 reference front() { return *begin(); }
00089 const_reference front() const { return *begin(); }
00090 reference back() { return *(end() - 1); }
00091 const_reference back() const { return *(end() - 1); }
00092 void push_back(const value_type &v) {
00093 *last = v; ++last;
00094 }
00095 void pop_back() { --last; }
00096
00097 iterator insert(iterator pos, const value_type& x) {
00098 copy_backward(pos, last, last+1);
00099 ++last;
00100 *pos = x;
00101 return pos;
00102 }
00103 template <class Iterator>
00104 void insert(iterator pos, Iterator f, Iterator l, forward_iterator_tag) {
00105 Iterator::difference_type n=0;
00106 distance(l,f,n);
00107 copy_backward(pos, last, last+n);
00108 last += n;
00109 copy(f, l, pos);
00110 }
00111 template <class Iterator>
00112 void insert(iterator pos, Iterator f, Iterator l, input_iterator_tag) {
00113 iterator_traits<iterator>::distance_type count = 0;
00114 while (f != l) {
00115 *last = *pos; *pos = *f;
00116 ++last; ++pos; ++f;
00117 ++count;
00118 }
00119 iterator middle = last - count % (last - pos);
00120 rotate(pos, middle, last);
00121 }
00122 template <class Iterator>
00123 void insert(iterator pos, Iterator f, Iterator l) {
00124 if (pos == last)
00125 last = copy(f,l,pos);
00126 else
00127 insert(pos, f, l, iterator_category(f));
00128 }
00129 void insert(iterator pos, size_type n, const value_type& x) {
00130 copy_backward(pos, last, last+n);
00131 last += n;
00132 fill(pos, pos + n, x);
00133 }
00134 void erase(iterator pos) {
00135 if (pos + 1 != end())
00136 copy(pos + 1, end(), pos);
00137 --last;
00138 }
00139 void erase(iterator f, iterator l) {
00140 copy(l, last, f);
00141 finish = finish - (l - f);
00142 }
00143 };
00144
00145 }
00146
00147 #endif
00148
00149
00150
00151