home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 November / PCWorld_2000-11_cd.bin / Software / Topware / devc40 / _SETUP.6 / Group14 / stl_uninitialized.h < prev    next >
C/C++ Source or Header  |  2000-01-21  |  9KB  |  280 lines

  1. /*
  2.  *
  3.  * Copyright (c) 1994
  4.  * Hewlett-Packard Company
  5.  *
  6.  * Permission to use, copy, modify, distribute and sell this software
  7.  * and its documentation for any purpose is hereby granted without fee,
  8.  * provided that the above copyright notice appear in all copies and
  9.  * that both that copyright notice and this permission notice appear
  10.  * in supporting documentation.  Hewlett-Packard Company makes no
  11.  * representations about the suitability of this software for any
  12.  * purpose.  It is provided "as is" without express or implied warranty.
  13.  *
  14.  *
  15.  * Copyright (c) 1996,1997
  16.  * Silicon Graphics Computer Systems, Inc.
  17.  *
  18.  * Permission to use, copy, modify, distribute and sell this software
  19.  * and its documentation for any purpose is hereby granted without fee,
  20.  * provided that the above copyright notice appear in all copies and
  21.  * that both that copyright notice and this permission notice appear
  22.  * in supporting documentation.  Silicon Graphics makes no
  23.  * representations about the suitability of this software for any
  24.  * purpose.  It is provided "as is" without express or implied warranty.
  25.  */
  26.  
  27. /* NOTE: This is an internal header file, included by other STL headers.
  28.  *   You should not attempt to use it directly.
  29.  */
  30.  
  31. #ifndef __SGI_STL_INTERNAL_UNINITIALIZED_H
  32. #define __SGI_STL_INTERNAL_UNINITIALIZED_H
  33.  
  34. __STL_BEGIN_NAMESPACE
  35.  
  36. // uninitialized_copy
  37.  
  38. // Valid if copy construction is equivalent to assignment, and if the
  39. //  destructor is trivial.
  40. template <class _InputIter, class _ForwardIter>
  41. inline _ForwardIter 
  42. __uninitialized_copy_aux(_InputIter __first, _InputIter __last,
  43.                          _ForwardIter __result,
  44.                          __true_type)
  45. {
  46.   return copy(__first, __last, __result);
  47. }
  48.  
  49. template <class _InputIter, class _ForwardIter>
  50. _ForwardIter 
  51. __uninitialized_copy_aux(_InputIter __first, _InputIter __last,
  52.                          _ForwardIter __result,
  53.                          __false_type)
  54. {
  55.   _ForwardIter __cur = __result;
  56.   __STL_TRY {
  57.     for ( ; __first != __last; ++__first, ++__cur)
  58.       construct(&*__cur, *__first);
  59.     return __cur;
  60.   }
  61.   __STL_UNWIND(destroy(__result, __cur));
  62. }
  63.  
  64.  
  65. template <class _InputIter, class _ForwardIter, class _Tp>
  66. inline _ForwardIter
  67. __uninitialized_copy(_InputIter __first, _InputIter __last,
  68.                      _ForwardIter __result, _Tp*)
  69. {
  70.   typedef typename __type_traits<_Tp>::is_POD_type _Is_POD;
  71.   return __uninitialized_copy_aux(__first, __last, __result, _Is_POD());
  72. }
  73.  
  74. template <class _InputIter, class _ForwardIter>
  75. inline _ForwardIter
  76.   uninitialized_copy(_InputIter __first, _InputIter __last,
  77.                      _ForwardIter __result)
  78. {
  79.   return __uninitialized_copy(__first, __last, __result,
  80.                               __VALUE_TYPE(__result));
  81. }
  82.  
  83. inline char* uninitialized_copy(const char* __first, const char* __last,
  84.                                 char* __result) {
  85.   memmove(__result, __first, __last - __first);
  86.   return __result + (__last - __first);
  87. }
  88.  
  89. inline wchar_t* 
  90. uninitialized_copy(const wchar_t* __first, const wchar_t* __last,
  91.                    wchar_t* __result)
  92. {
  93.   memmove(__result, __first, sizeof(wchar_t) * (__last - __first));
  94.   return __result + (__last - __first);
  95. }
  96.  
  97. // uninitialized_copy_n (not part of the C++ standard)
  98.  
  99. template <class _InputIter, class _Size, class _ForwardIter>
  100. pair<_InputIter, _ForwardIter>
  101. __uninitialized_copy_n(_InputIter __first, _Size __count,
  102.                        _ForwardIter __result,
  103.                        input_iterator_tag)
  104. {
  105.   _ForwardIter __cur = __result;
  106.   __STL_TRY {
  107.     for ( ; __count > 0 ; --__count, ++__first, ++__cur) 
  108.       construct(&*__cur, *__first);
  109.     return pair<_InputIter, _ForwardIter>(__first, __cur);
  110.   }
  111.   __STL_UNWIND(destroy(__result, __cur));
  112. }
  113.  
  114. template <class _RandomAccessIter, class _Size, class _ForwardIter>
  115. inline pair<_RandomAccessIter, _ForwardIter>
  116. __uninitialized_copy_n(_RandomAccessIter __first, _Size __count,
  117.                        _ForwardIter __result,
  118.                        random_access_iterator_tag) {
  119.   _RandomAccessIter __last = __first + __count;
  120.   return pair<_RandomAccessIter, _ForwardIter>(
  121.                  __last,
  122.                  uninitialized_copy(__first, __last, __result));
  123. }
  124.  
  125. template <class _InputIter, class _Size, class _ForwardIter>
  126. inline pair<_InputIter, _ForwardIter>
  127. __uninitialized_copy_n(_InputIter __first, _Size __count,
  128.                      _ForwardIter __result) {
  129.   return __uninitialized_copy_n(__first, __count, __result,
  130.                                 __ITERATOR_CATEGORY(__first));
  131. }
  132.  
  133. template <class _InputIter, class _Size, class _ForwardIter>
  134. inline pair<_InputIter, _ForwardIter>
  135. uninitialized_copy_n(_InputIter __first, _Size __count,
  136.                      _ForwardIter __result) {
  137.   return __uninitialized_copy_n(__first, __count, __result,
  138.                                 __ITERATOR_CATEGORY(__first));
  139. }
  140.  
  141. // Valid if copy construction is equivalent to assignment, and if the
  142. // destructor is trivial.
  143. template <class _ForwardIter, class _Tp>
  144. inline void
  145. __uninitialized_fill_aux(_ForwardIter __first, _ForwardIter __last, 
  146.                          const _Tp& __x, __true_type)
  147. {
  148.   fill(__first, __last, __x);
  149. }
  150.  
  151. template <class _ForwardIter, class _Tp>
  152. void
  153. __uninitialized_fill_aux(_ForwardIter __first, _ForwardIter __last, 
  154.                          const _Tp& __x, __false_type)
  155. {
  156.   _ForwardIter __cur = __first;
  157.   __STL_TRY {
  158.     for ( ; __cur != __last; ++__cur)
  159.       construct(&*__cur, __x);
  160.   }
  161.   __STL_UNWIND(destroy(__first, __cur));
  162. }
  163.  
  164. template <class _ForwardIter, class _Tp, class _Tp1>
  165. inline void __uninitialized_fill(_ForwardIter __first, 
  166.                                  _ForwardIter __last, const _Tp& __x, _Tp1*)
  167. {
  168.   typedef typename __type_traits<_Tp1>::is_POD_type _Is_POD;
  169.   __uninitialized_fill_aux(__first, __last, __x, _Is_POD());
  170.                    
  171. }
  172.  
  173. template <class _ForwardIter, class _Tp>
  174. inline void uninitialized_fill(_ForwardIter __first,
  175.                                _ForwardIter __last, 
  176.                                const _Tp& __x)
  177. {
  178.   __uninitialized_fill(__first, __last, __x, __VALUE_TYPE(__first));
  179. }
  180.  
  181. // Valid if copy construction is equivalent to assignment, and if the
  182. //  destructor is trivial.
  183. template <class _ForwardIter, class _Size, class _Tp>
  184. inline _ForwardIter
  185. __uninitialized_fill_n_aux(_ForwardIter __first, _Size __n,
  186.                            const _Tp& __x, __true_type)
  187. {
  188.   return fill_n(__first, __n, __x);
  189. }
  190.  
  191. template <class _ForwardIter, class _Size, class _Tp>
  192. _ForwardIter
  193. __uninitialized_fill_n_aux(_ForwardIter __first, _Size __n,
  194.                            const _Tp& __x, __false_type)
  195. {
  196.   _ForwardIter __cur = __first;
  197.   __STL_TRY {
  198.     for ( ; __n > 0; --__n, ++__cur)
  199.       construct(&*__cur, __x);
  200.     return __cur;
  201.   }
  202.   __STL_UNWIND(destroy(__first, __cur));
  203. }
  204.  
  205. template <class _ForwardIter, class _Size, class _Tp, class _Tp1>
  206. inline _ForwardIter 
  207. __uninitialized_fill_n(_ForwardIter __first, _Size __n, const _Tp& __x, _Tp1*)
  208. {
  209.   typedef typename __type_traits<_Tp1>::is_POD_type _Is_POD;
  210.   return __uninitialized_fill_n_aux(__first, __n, __x, _Is_POD());
  211. }
  212.  
  213. template <class _ForwardIter, class _Size, class _Tp>
  214. inline _ForwardIter 
  215. uninitialized_fill_n(_ForwardIter __first, _Size __n, const _Tp& __x)
  216. {
  217.   return __uninitialized_fill_n(__first, __n, __x, __VALUE_TYPE(__first));
  218. }
  219.  
  220. // Extensions: __uninitialized_copy_copy, __uninitialized_copy_fill, 
  221. // __uninitialized_fill_copy.
  222.  
  223. // __uninitialized_copy_copy
  224. // Copies [first1, last1) into [result, result + (last1 - first1)), and
  225. //  copies [first2, last2) into
  226. //  [result, result + (last1 - first1) + (last2 - first2)).
  227.  
  228. template <class _InputIter1, class _InputIter2, class _ForwardIter>
  229. inline _ForwardIter
  230. __uninitialized_copy_copy(_InputIter1 __first1, _InputIter1 __last1,
  231.                           _InputIter2 __first2, _InputIter2 __last2,
  232.                           _ForwardIter __result)
  233. {
  234.   _ForwardIter __mid = uninitialized_copy(__first1, __last1, __result);
  235.   __STL_TRY {
  236.     return uninitialized_copy(__first2, __last2, __mid);
  237.   }
  238.   __STL_UNWIND(destroy(__result, __mid));
  239. }
  240.  
  241. // __uninitialized_fill_copy
  242. // Fills [result, mid) with x, and copies [first, last) into
  243. //  [mid, mid + (last - first)).
  244. template <class _ForwardIter, class _Tp, class _InputIter>
  245. inline _ForwardIter 
  246. __uninitialized_fill_copy(_ForwardIter __result, _ForwardIter __mid,
  247.                           const _Tp& __x,
  248.                           _InputIter __first, _InputIter __last)
  249. {
  250.   uninitialized_fill(__result, __mid, __x);
  251.   __STL_TRY {
  252.     return uninitialized_copy(__first, __last, __mid);
  253.   }
  254.   __STL_UNWIND(destroy(__result, __mid));
  255. }
  256.  
  257. // __uninitialized_copy_fill
  258. // Copies [first1, last1) into [first2, first2 + (last1 - first1)), and
  259. //  fills [first2 + (last1 - first1), last2) with x.
  260. template <class _InputIter, class _ForwardIter, class _Tp>
  261. inline void
  262. __uninitialized_copy_fill(_InputIter __first1, _InputIter __last1,
  263.                           _ForwardIter __first2, _ForwardIter __last2,
  264.                           const _Tp& __x)
  265. {
  266.   _ForwardIter __mid2 = uninitialized_copy(__first1, __last1, __first2);
  267.   __STL_TRY {
  268.     uninitialized_fill(__mid2, __last2, __x);
  269.   }
  270.   __STL_UNWIND(destroy(__first2, __mid2));
  271. }
  272.  
  273. __STL_END_NAMESPACE
  274.  
  275. #endif /* __SGI_STL_INTERNAL_UNINITIALIZED_H */
  276.  
  277. // Local Variables:
  278. // mode:C++
  279. // End:
  280.