stl_uninitialized.h
上传用户:sichengcw
上传日期:2009-02-17
资源大小:202k
文件大小:8k
源码类别:

STL

开发平台:

Visual C++

  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. /* NOTE: This is an internal header file, included by other STL headers.
  27.  *   You should not attempt to use it directly.
  28.  */
  29. #ifndef __SGI_STL_INTERNAL_UNINITIALIZED_H
  30. #define __SGI_STL_INTERNAL_UNINITIALIZED_H
  31. __STL_BEGIN_NAMESPACE
  32. // Valid if copy construction is equivalent to assignment, and if the
  33. //  destructor is trivial.
  34. template <class InputIterator, class ForwardIterator>
  35. inline ForwardIterator 
  36. __uninitialized_copy_aux(InputIterator first, InputIterator last,
  37.                          ForwardIterator result,
  38.                          __true_type) {
  39.   return copy(first, last, result);
  40. }
  41. template <class InputIterator, class ForwardIterator>
  42. ForwardIterator 
  43. __uninitialized_copy_aux(InputIterator first, InputIterator last,
  44.                          ForwardIterator result,
  45.                          __false_type) {
  46.   ForwardIterator cur = result;
  47.   __STL_TRY {
  48.     for ( ; first != last; ++first, ++cur)
  49.       construct(&*cur, *first);
  50.     return cur;
  51.   }
  52.   __STL_UNWIND(destroy(result, cur));
  53. }
  54. template <class InputIterator, class ForwardIterator, class T>
  55. inline ForwardIterator
  56. __uninitialized_copy(InputIterator first, InputIterator last,
  57.                      ForwardIterator result, T*) {
  58.   typedef typename __type_traits<T>::is_POD_type is_POD;
  59.   return __uninitialized_copy_aux(first, last, result, is_POD());
  60. }
  61. template <class InputIterator, class ForwardIterator>
  62. inline ForwardIterator
  63.   uninitialized_copy(InputIterator first, InputIterator last,
  64.                      ForwardIterator result) {
  65.   return __uninitialized_copy(first, last, result, value_type(result));
  66. }
  67. inline char* uninitialized_copy(const char* first, const char* last,
  68.                                 char* result) {
  69.   memmove(result, first, last - first);
  70.   return result + (last - first);
  71. }
  72. inline wchar_t* uninitialized_copy(const wchar_t* first, const wchar_t* last,
  73.                                    wchar_t* result) {
  74.   memmove(result, first, sizeof(wchar_t) * (last - first));
  75.   return result + (last - first);
  76. }
  77. template <class InputIterator, class Size, class ForwardIterator>
  78. pair<InputIterator, ForwardIterator>
  79. __uninitialized_copy_n(InputIterator first, Size count,
  80.                        ForwardIterator result,
  81.                        input_iterator_tag) {
  82.   ForwardIterator cur = result;
  83.   __STL_TRY {
  84.     for ( ; count > 0 ; --count, ++first, ++cur) 
  85.       construct(&*cur, *first);
  86.     return pair<InputIterator, ForwardIterator>(first, cur);
  87.   }
  88.   __STL_UNWIND(destroy(result, cur));
  89. }
  90. template <class RandomAccessIterator, class Size, class ForwardIterator>
  91. inline pair<RandomAccessIterator, ForwardIterator>
  92. __uninitialized_copy_n(RandomAccessIterator first, Size count,
  93.                        ForwardIterator result,
  94.                        random_access_iterator_tag) {
  95.   RandomAccessIterator last = first + count;
  96.   return make_pair(last, uninitialized_copy(first, last, result));
  97. }
  98. template <class InputIterator, class Size, class ForwardIterator>
  99. inline pair<InputIterator, ForwardIterator>
  100. uninitialized_copy_n(InputIterator first, Size count,
  101.                      ForwardIterator result) {
  102.   return __uninitialized_copy_n(first, count, result,
  103.                                 iterator_category(first));
  104. }
  105. // Valid if copy construction is equivalent to assignment, and if the
  106. //  destructor is trivial.
  107. template <class ForwardIterator, class T>
  108. inline void
  109. __uninitialized_fill_aux(ForwardIterator first, ForwardIterator last, 
  110.                          const T& x, __true_type)
  111. {
  112.   fill(first, last, x);
  113. }
  114. template <class ForwardIterator, class T>
  115. void
  116. __uninitialized_fill_aux(ForwardIterator first, ForwardIterator last, 
  117.                          const T& x, __false_type)
  118. {
  119.   ForwardIterator cur = first;
  120.   __STL_TRY {
  121.     for ( ; cur != last; ++cur)
  122.       construct(&*cur, x);
  123.   }
  124.   __STL_UNWIND(destroy(first, cur));
  125. }
  126. template <class ForwardIterator, class T, class T1>
  127. inline void __uninitialized_fill(ForwardIterator first, ForwardIterator last, 
  128.                                  const T& x, T1*) {
  129.   typedef typename __type_traits<T1>::is_POD_type is_POD;
  130.   __uninitialized_fill_aux(first, last, x, is_POD());
  131.                    
  132. }
  133. template <class ForwardIterator, class T>
  134. inline void uninitialized_fill(ForwardIterator first, ForwardIterator last, 
  135.                                const T& x) {
  136.   __uninitialized_fill(first, last, x, value_type(first));
  137. }
  138. // Valid if copy construction is equivalent to assignment, and if the
  139. //  destructor is trivial.
  140. template <class ForwardIterator, class Size, class T>
  141. inline ForwardIterator
  142. __uninitialized_fill_n_aux(ForwardIterator first, Size n,
  143.                            const T& x, __true_type) {
  144.   return fill_n(first, n, x);
  145. }
  146. template <class ForwardIterator, class Size, class T>
  147. ForwardIterator
  148. __uninitialized_fill_n_aux(ForwardIterator first, Size n,
  149.                            const T& x, __false_type) {
  150.   ForwardIterator cur = first;
  151.   __STL_TRY {
  152.     for ( ; n > 0; --n, ++cur)
  153.       construct(&*cur, x);
  154.     return cur;
  155.   }
  156.   __STL_UNWIND(destroy(first, cur));
  157. }
  158. template <class ForwardIterator, class Size, class T, class T1>
  159. inline ForwardIterator __uninitialized_fill_n(ForwardIterator first, Size n,
  160.                                               const T& x, T1*) {
  161.   typedef typename __type_traits<T1>::is_POD_type is_POD;
  162.   return __uninitialized_fill_n_aux(first, n, x, is_POD());
  163.                                     
  164. }
  165. template <class ForwardIterator, class Size, class T>
  166. inline ForwardIterator uninitialized_fill_n(ForwardIterator first, Size n,
  167.                                             const T& x) {
  168.   return __uninitialized_fill_n(first, n, x, value_type(first));
  169. }
  170. // Copies [first1, last1) into [result, result + (last1 - first1)), and
  171. //  copies [first2, last2) into
  172. //  [result, result + (last1 - first1) + (last2 - first2)).
  173. template <class InputIterator1, class InputIterator2, class ForwardIterator>
  174. inline ForwardIterator
  175. __uninitialized_copy_copy(InputIterator1 first1, InputIterator1 last1,
  176.                           InputIterator2 first2, InputIterator2 last2,
  177.                           ForwardIterator result) {
  178.   ForwardIterator mid = uninitialized_copy(first1, last1, result);
  179.   __STL_TRY {
  180.     return uninitialized_copy(first2, last2, mid);
  181.   }
  182.   __STL_UNWIND(destroy(result, mid));
  183. }
  184. // Fills [result, mid) with x, and copies [first, last) into
  185. //  [mid, mid + (last - first)).
  186. template <class ForwardIterator, class T, class InputIterator>
  187. inline ForwardIterator 
  188. __uninitialized_fill_copy(ForwardIterator result, ForwardIterator mid,
  189.                           const T& x,
  190.                           InputIterator first, InputIterator last) {
  191.   uninitialized_fill(result, mid, x);
  192.   __STL_TRY {
  193.     return uninitialized_copy(first, last, mid);
  194.   }
  195.   __STL_UNWIND(destroy(result, mid));
  196. }
  197. // Copies [first1, last1) into [first2, first2 + (last1 - first1)), and
  198. //  fills [first2 + (last1 - first1), last2) with x.
  199. template <class InputIterator, class ForwardIterator, class T>
  200. inline void
  201. __uninitialized_copy_fill(InputIterator first1, InputIterator last1,
  202.                           ForwardIterator first2, ForwardIterator last2,
  203.                           const T& x) {
  204.   ForwardIterator mid2 = uninitialized_copy(first1, last1, first2);
  205.   __STL_TRY {
  206.     uninitialized_fill(mid2, last2, x);
  207.   }
  208.   __STL_UNWIND(destroy(first2, mid2));
  209. }
  210. __STL_END_NAMESPACE
  211. #endif /* __SGI_STL_INTERNAL_UNINITIALIZED_H */
  212. // Local Variables:
  213. // mode:C++
  214. // End: