52 #ifndef __K2VectorHelpers__ 53 #define __K2VectorHelpers__ 55 namespace VectorHelpers {
61 template <
class ForwardIterator,
class Vector>
62 void assign(ForwardIterator first, ForwardIterator last, Vector* v,
typename Vector::Hole h,
ForwardIterTag)
64 typedef typename Vector::size_type size_type;
65 size_type (&fLength) (h.LengthRef(v));
66 typedef typename Vector::pointer pointer;
68 typedef typename Vector::allocator_type allocator_type;
70 size_type len = (size_type)std::distance(first, last);
71 ASSERT_MSG(len <= v->max_size(),
"K2VectorTempBase::assign length error");
73 if (len <= v->capacity())
75 typename Vector::iterator i = v->begin();
79 i = K2copy(first, last, i);
80 K2destroy(i, v->end());
85 ForwardIterator mid = first;
86 std::advance(mid, fLength);
87 i = K2copy(first, mid, i);
88 K2uninitialized_copy(mid, last, i);
95 typename Vector::pointer newData = fAllocator.allocate(len);
96 K2uninitialized_copy(first, last, newData);
97 v->DoReset(newData, len, len);
101 template <
class ForwardIterator,
class Vector>
102 void insert(
typename Vector::iterator position, ForwardIterator first, ForwardIterator last, Vector* v,
typename Vector::Hole h, ForwardIterTag)
104 typedef typename Vector::size_type size_type;
105 typedef typename Vector::Hole Hole;
106 size_type (&fLength) (h.LengthRef(v));
107 typedef typename Vector::pointer pointer;
108 pointer(&fArray)(h.ArrayRef(v));
110 typedef typename Vector::allocator_type allocator_type;
113 ASSERT(position >= v->begin());
114 ASSERT(position <= v->end());
115 ASSERT(first <= last);
117 size_type n = (size_type) std::distance(first, last);
118 ASSERT(n <= v->max_size());
119 ASSERT(fLength <= v->max_size() - n);
124 if (fLength + n <= v->capacity())
126 typename Vector::pointer oldFinish = fArray + fLength;
127 const size_type elementsAfter =
static_cast<size_type
>(oldFinish - position);
128 if (n <= elementsAfter)
132 K2uninitialized_copy(oldFinish - n, oldFinish, oldFinish);
135 K2copy_backward(position, oldFinish - n, oldFinish);
138 K2copy(first, last, position);
144 K2uninitialized_copy(position, oldFinish, oldFinish + n - elementsAfter);
147 K2copy(first, first+elementsAfter, position);
149 std::advance(first, elementsAfter);
152 K2uninitialized_copy(first, last, oldFinish);
158 size_type newLen = fLength + n;
159 size_type newCap = v->DoGetCapacity(newLen);
162 typename Vector::pointer newData = fAllocator.allocate(newCap);
163 typename Vector::pointer newFinish = K2uninitialized_copy(fArray, position, newData);
166 newFinish = K2uninitialized_copy(first, last, newFinish);
169 K2uninitialized_copy(position, fArray + fLength, newFinish);
171 v->DoReset(newData, newLen, newCap);
175 template <
class ForwardIterator,
class Vector>
176 void initialize(ForwardIterator first, ForwardIterator last, Vector* v,
typename Vector::Hole h, ForwardIterTag)
179 typedef typename Vector::size_type size_type;
180 typedef typename Vector::Hole Hole;
181 size_type (&fLength) (h.LengthRef(v));
182 typedef typename Vector::pointer pointer;
183 pointer(&fArray)(h.ArrayRef(v));
184 typedef typename Vector::allocator_type allocator_type;
187 fLength = fAllocator.f = std::distance(first, last);
188 ASSERT_MSG (fAllocator.f <= v->max_size(),
"K2VectorTempBase::construction length error");
191 if (fAllocator.f > 0)
193 fArray = fAllocator.allocate(fAllocator.f);
194 K2uninitialized_copy(first, last, fArray);
199 template <
typename I,
class Vector>
200 void assign(I count, I value, Vector* v,
typename Vector::Hole h, IntegerTag)
202 v->fill_assign(count, value);
206 template <
typename I,
class Vector>
207 void initialize(I count, I value, Vector* v,
typename Vector::Hole h, IntegerTag)
209 v->initialize(count, value);
212 template <
typename I,
class Vector>
213 void insert(
typename Vector::iterator pos, I count, I value, Vector* v,
typename Vector::Hole , IntegerTag)
215 v->fill_insert(pos, count, value);
219 template <
class InputIterator,
class Vector>
220 void assign(InputIterator first, InputIterator last, Vector* v,
typename Vector::Hole h, InputIterTag)
222 typename Vector::iterator cur = v->begin();
223 for ( ; first != last && cur != v->end(); ++cur, ++first)
227 v->erase(cur, v->end());
229 v->insert(v->end(), first, last);
232 template <
class InputIterator,
class Vector>
233 void initialize(InputIterator first, InputIterator last, Vector* v,
typename Vector::Hole h, InputIterTag)
235 for ( ; first != last; ++first)
236 v->push_back(*first);
239 template <
class InputIterator,
class Vector>
240 void insert(
typename Vector::iterator pos, InputIterator first, InputIterator last, Vector* v,
typename Vector::Hole h, InputIterTag)
242 uint32 index = pos - v->begin();
243 for ( ; first != last; ++first)
245 v->insert(v->begin() + index, *first);
251 #endif // __K2VectorHelpers__