58 #ifndef __K2STLUtilities__ 59 #define __K2STLUtilities__ 61 #include "K2TypeTraits.h" 63 #include "MetaProgramming.h" 64 #include "InterfaceTrackingUtils.h" 74 inline typename PODTraits<T>::data_type IsBaseOrObjectType(
const T*)
76 typedef typename PODTraits<T>::data_type loc_data_type;
77 return loc_data_type();
88 inline void K2destroy(T* pointer)
90 ASSERT(pointer != nil);
94 namespace K2Internals {
95 template <
class ForwardIterator>
96 inline void destroyAux(ForwardIterator, ForwardIterator,
base_type)
100 template <
class ForwardIterator>
101 inline void destroyAux(ForwardIterator first, ForwardIterator last,
object_type)
103 for(; first < last; ++first)
109 template <
class ForwardIterator>
110 inline void K2destroy(ForwardIterator first, ForwardIterator last)
112 K2Internals::destroyAux(first, last, IsBaseOrObjectType(first));
115 namespace K2Internals {
116 template <
class _T1,
class _T2>
117 inline void _K2Construct(_T1* __p,
const _T2& __v) {
122 inline void _K2Construct(_T1* __p) {
128 template <
class _T1,
class _T2>
129 inline void K2construct(_T1* __p,
const _T2& __v) {
130 K2Internals::_K2Construct(__p, __v);
134 inline void K2construct(_T1* __p) {
135 K2Internals::_K2Construct(__p);
142 template <
class _ForwardIter,
class _Tp>
143 void K2fill(_ForwardIter __first, _ForwardIter __last,
const _Tp& __v) {
144 for ( ; __first != __last; ++__first)
148 template <
class _OutputIter,
class _Size,
class _Tp>
149 _OutputIter K2fill_n(_OutputIter __first, _Size __n,
const _Tp& __v) {
150 for ( ; __n > 0; --__n, ++__first)
158 inline void K2fill(
unsigned char* __first,
unsigned char* __last,
159 const unsigned char& __c) {
160 unsigned char __tmp = __c;
161 memset(__first, __tmp, __last - __first);
164 inline void K2fill(
signed char* __first,
signed char* __last,
165 const signed char& __c) {
166 signed char __tmp = __c;
167 memset(__first, static_cast<unsigned char>(__tmp), __last - __first);
170 inline void K2fill(
char* __first,
char* __last,
const char& __c) {
172 memset(__first, static_cast<unsigned char>(__tmp), __last - __first);
182 namespace K2Internals {
185 template <
class _ForwardIter,
class _Tp>
187 __uninitialized_fill_aux(_ForwardIter __first, _ForwardIter __last,
190 K2fill(__first, __last, __x);
193 template <
class _ForwardIter,
class _Tp>
195 __uninitialized_fill_aux(_ForwardIter __first, _ForwardIter __last,
198 _ForwardIter __cur = __first;
199 for ( ; __cur != __last; ++__cur)
200 K2construct(&*__cur, __x);
206 template <
class _ForwardIter,
class _Size,
class _Tp>
208 __uninitialized_fill_n_aux(_ForwardIter __first, _Size __n,
211 return K2fill_n(__first, __n, __x);
214 template <
class _ForwardIter,
class _Size,
class _Tp>
216 __uninitialized_fill_n_aux(_ForwardIter __first, _Size __n,
219 _ForwardIter __cur = __first;
220 for ( ; __n > 0; --__n, ++__cur)
221 K2Internals::_K2Construct(&*__cur, __x);
227 template <
class _ForwardIter,
class _Tp>
228 inline void K2uninitialized_fill(_ForwardIter __first,
236 template <
class _ForwardIter,
class _Size,
class _Tp>
238 K2uninitialized_fill_n(_ForwardIter __first, _Size __n,
const _Tp& __x)
242 return K2Internals::__uninitialized_fill_n_aux(__first, __n, __x, loc_tag()
251 namespace K2Internals {
252 template <
class InputIter,
class ForwardIter>
254 static ForwardIter copy(InputIter first, InputIter last, ForwardIter result);
255 static ForwardIter copy_backward(InputIter first, InputIter last, ForwardIter result);
256 static ForwardIter uninitialized_copy(InputIter first, InputIter last, ForwardIter result);
259 template <
class InputIter,
class ForwardIter>
261 static ForwardIter copy(InputIter first, InputIter last, ForwardIter result);
262 static ForwardIter copy_backward(InputIter first, InputIter last, ForwardIter result);
263 static ForwardIter uninitialized_copy(InputIter first, InputIter last, ForwardIter result);
270 namespace K2Internals {
271 template <
class InputIter,
class ForwardIter>
272 inline ForwardIter SafeCopy<InputIter, ForwardIter>::copy(InputIter first, InputIter last, ForwardIter result)
274 for (; first != last; ++first, ++result)
280 template <
class InputIter,
class ForwardIter>
281 inline ForwardIter SafeCopy<InputIter, ForwardIter>::copy_backward(InputIter first, InputIter last, ForwardIter result)
283 while (last != first)
289 template <
class InputIter,
class ForwardIter>
290 inline ForwardIter SafeCopy<InputIter, ForwardIter>::uninitialized_copy(InputIter first, InputIter last, ForwardIter result)
292 return std::uninitialized_copy(first, last, result);
300 template <
class InputIter,
class ForwardIter>
303 using namespace K2Meta;
304 META_ASSERT<IS_PTR<InputIter>::RET
308 &&
sizeof(*first) ==
sizeof(*result),
310 std::ptrdiff_t count = last - first;
311 std::memmove((
void*) result, (
void*) first, count*
sizeof(*first));
312 return result + count;
314 template <
class InputIter,
class ForwardIter>
315 inline ForwardIter FastCopy<InputIter, ForwardIter>::copy_backward(InputIter first, InputIter last, ForwardIter result)
317 using namespace K2Meta;
318 META_ASSERT<IS_PTR<InputIter>::RET
322 &&
sizeof(*first) ==
sizeof(*result),
323 FastCopy_on_bad_types>();
324 std::ptrdiff_t count = last - first;
325 std::memmove((
void*) (result - count), (
void*) first, count*
sizeof(*first));
326 return result - count;
329 template <
class InputIter,
class ForwardIter>
330 inline ForwardIter FastCopy<InputIter, ForwardIter>::uninitialized_copy(InputIter first, InputIter last, ForwardIter result)
332 using namespace K2Meta;
333 META_ASSERT<IS_PTR<InputIter>::RET
337 &&
sizeof(*first) ==
sizeof(*result),
338 FastCopy_on_bad_types>();
339 std::ptrdiff_t count = last - first;
340 std::memmove((
void*) result, (
void*) first, count*
sizeof(*first));
341 return result + count;
345 template <
class InputIter,
class ForwardIter>
346 inline ForwardIter K2copy(InputIter first, InputIter last, ForwardIter result)
348 using namespace K2Meta;
353 &&
sizeof(*first) ==
sizeof(*result),
356 >::RET::copy(first, last, result);
365 template <
class InputIter,
class ForwardIter>
366 inline ForwardIter K2uninitialized_copy(InputIter first, InputIter last, ForwardIter result)
368 using namespace K2Meta;
373 &&
sizeof(*first) ==
sizeof(*result),
376 >::RET::uninitialized_copy(first, last, result);
385 template <
class InputIter,
class ForwardIter>
386 inline ForwardIter K2copy_backward(InputIter first, InputIter last, ForwardIter result)
388 using namespace K2Meta;
393 &&
sizeof(*first) ==
sizeof(*result),
396 >::RET::copy_backward(first, last, result);
405 template <
class CONTAINER>
406 void Shrink(CONTAINER& c, int32 newlen)
408 ASSERT_MSG(newlen >= c.size(),
"Shrink: newlen is too small");
409 ASSERT_MSG(newlen <= c.capacity(),
"Shrink: newlen is too large");
411 if (newlen < c.capacity()) {
413 temp.reserve(newlen);
414 temp.assign(c.begin(), c.begin() + c.size());
428 template <
class Base,
class Member>
438 template <
class Base,
class Member>
445 template <
class Base,
class Member>
452 template <
class Base,
class Member>
463 #ifndef INTERFACEPROXIES_SUPPORTED 464 template <
class InputIterator,
class T>
466 K2find(InputIterator first, InputIterator last,
const T& value)
468 while (first != last && !(*first == value))
474 extern bool16 ts_tkSupportInterfaceProxies;
476 template <
class InputIterator,
class T>
480 static InputIterator execute(InputIterator first, InputIterator last,
const T& value);
483 template <
class InputIterator,
class T>
484 inline InputIterator NotPtr_K2Find<InputIterator, T>::execute(InputIterator first, InputIterator last,
const T& value)
486 while (first != last && !(*first == value))
491 template <
class InputIterator,
class T>
495 static InputIterator execute(InputIterator first, InputIterator last,
const T& value);
498 template <
class InputIterator,
class T>
499 InputIterator Ptr_K2Find<InputIterator, T>:: execute(InputIterator first, InputIterator last,
const T& value)
501 if (ts_tkSupportInterfaceProxies) {
502 while (first != last &&
503 (InterfaceTrackingUtils::ExtractInterfaceImplementation (*first) !=
504 InterfaceTrackingUtils::ExtractInterfaceImplementation (value)))
509 NotPtr_K2Find<InputIterator,T>::execute(first, last, value);
513 template <
class InputIterator,
class T>
515 K2find(InputIterator first, InputIterator last,
const T& value)
518 Ptr_K2Find<InputIterator,T>,
519 NotPtr_K2Find<InputIterator,T> >::RET::execute(first, last, value);
524 template <
typename CONTAINER,
class T>
525 inline typename CONTAINER::iterator
526 K2find(CONTAINER& c,
const T& value)
528 return K2find(c.begin(), c.end(), value);
531 template <
typename CONTAINER,
class T>
532 inline typename CONTAINER::const_iterator
533 K2find(
const CONTAINER& c,
const T& value)
535 return K2find(c.begin(), c.end(), value);
538 template <
class InputIterator,
class T>
540 K2notfound(InputIterator first, InputIterator last,
const T& value)
542 return (std::find(first, last, value) == last);
545 template <
typename CONTAINER,
class T>
547 K2notfound(
const CONTAINER& c,
const T& value)
549 return (std::find(std::begin(c), std::end(c), value) == std::end(c));
552 template <
class InputIterator,
class T>
554 K2found(InputIterator first, InputIterator last,
const T& value)
556 return (std::find(first, last, value) != last);
559 template <
typename CONTAINER,
class T>
561 K2found(
const CONTAINER& c,
const T& value)
563 return (std::find(std::begin(c), std::end(c), value) != std::end(c));
576 template <
typename CONTAINER,
class T>
577 inline int32 K2location(
const CONTAINER& c,
const T& value)
579 typename CONTAINER::const_iterator i = std::find(c.begin(), c.end(), value);
580 int32 index = i != c.end() ? i - c.begin() : -1;
597 template <
typename CONTAINER>
598 inline int32 K2length(
const CONTAINER& c)
600 return static_cast<int32
>(c.size());
603 #endif //ID_DEPRECATED 605 #endif //__K2STLUtilities__