stl_uninitialized.h

来源:互联网 发布:lt18i 预装软件 卸载 编辑:程序博客网 时间:2024/05/02 03:10
stl_uninitialized.h// Filename:    stl_uninitialized.h// Comment By:  凝霜// E-mail:      mdl2009@vip.qq.com// Blog:        http://blog.csdn.net/mdl13412// 主要接口:////      template <class InputIterator, class ForwardIterator>//      inline ForwardIterator//      uninitialized_copy(InputIterator first, InputIterator last,//                         ForwardIterator result)//      将[first, last)的对象复制一份到[result, result + (last - first))//      对于char和wchar_t提供特化版本, 以获取最佳效率//      注: commit or rollback////      template <class InputIterator, class Size, class ForwardIterator>//      inline pair<InputIterator, ForwardIterator>//      uninitialized_copy_n(InputIterator first, Size count,//                           ForwardIterator result)//      从first开始, 复制count个对象到[result, result + n)//      注: commit or rollback////      template <class ForwardIterator, class T>//      inline void uninitialized_fill(ForwardIterator first,//                                     ForwardIterator last,//                                     const T& x)//      将x复制到pfirst, last)//      注: commit or rollback////      template <class ForwardIterator, class Size, class T>//      inline ForwardIterator uninitialized_fill_n(ForwardIterator first,//                                                  Size n, const T& x)//      复制n个x对象到[first, first + n)//      注: commit or rollback/* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation.  Hewlett-Packard Company makes no * representations about the suitability of this software for any * purpose.  It is provided "as is" without express or implied warranty. * * * Copyright (c) 1996,1997 * Silicon Graphics Computer Systems, Inc. * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation.  Silicon Graphics makes no * representations about the suitability of this software for any * purpose.  It is provided "as is" without express or implied warranty. *//* NOTE: This is an internal header file, included by other STL headers. *   You should not attempt to use it directly. */#ifndef __SGI_STL_INTERNAL_UNINITIALIZED_H#define __SGI_STL_INTERNAL_UNINITIALIZED_H__STL_BEGIN_NAMESPACE////////////////////////////////////////////////////////////////////////////////// uninitialized_copy()实现部分//////////////////////////////////////////////////////////////////////////////////                         特化char版本//                      |---------------> (char *, ...)  <---    字串串专用版本//                      |  特化wchar_t版本                   |--- 调用memmove()// uninitialized_copy ------------------> (wchar_t, ...) <---    获取最佳效率//                      |//                      |//                      | 泛化   调用 __uninitialized_copy()//                      |----->  根据类型是否为POD进行函数派发//                                           |//                                           |---------------- Is POD?//                                           |//              -------------------------------------//           No |                                   | Yes//              ↓                                   |// __uninitialized_copy_aux(..., __false_type)      |// for ( ; first != last; ++first, ++cur)           |//      construct(&*cur, *first);                   ↓//                                   __uninitialized_copy_aux(..., __true_type)//                                   copy(first, last, result)////////////////////////////////////////////////////////////////////////////////// 如果copy construction和operator =等效, 并且destructor is trivial// 那么就可以使用本函数// 返回值为目标地址的end// 注: 使用copy()进行复制的时候, 调用的是对象的operator =,//     所以要满足copy construction和operator =等效,//     destructor is trivial保证在此版本中不会进行析构,//     以保证效率template <class InputIterator, class ForwardIterator>inline ForwardIterator__uninitialized_copy_aux(InputIterator first, InputIterator last,                         ForwardIterator result,                         __true_type){  // 调用的是STL算法copy()  return copy(first, last, result);}// 如果copy construction和operator =不等效, 那么就要调用construct()进行构造template <class InputIterator, class ForwardIterator>ForwardIterator__uninitialized_copy_aux(InputIterator first, InputIterator last,                         ForwardIterator result,                         __false_type){  ForwardIterator cur = result;  __STL_TRY {    // 因为copy construction和operator =不等效,    // 则必须每个对象都以其它对象为蓝本进行构造    // 本实作中使用的是placement new进行构造    for ( ; first != last; ++first, ++cur)      construct(&*cur, *first);    return cur;  }  // commit or rollback  // 如果分配失败就stack unwinding,  // 保证所有对象都被析构  __STL_UNWIND(destroy(result, cur));}// 派发函数, traits出T是否为POD, 然后进行派发template <class InputIterator, class ForwardIterator, class T>inline ForwardIterator__uninitialized_copy(InputIterator first, InputIterator last,                     ForwardIterator result, T*){  // POD = Plain Old Data  // 其具有trvial constructor/destructor/copy constructor/operator =  // 所有的C++内置基本数据类型和传统C struct都属于POD  typedef typename __type_traits<T>::is_POD_type is_POD;  // 根据是否为POD类型进行派发, 以保证效率  return __uninitialized_copy_aux(first, last, result, is_POD());}template <class InputIterator, class ForwardIterator>inline ForwardIterator  uninitialized_copy(InputIterator first, InputIterator last,                     ForwardIterator result){  // 调用派发函数, 根据是否为POD决议出最佳效率的函数  return __uninitialized_copy(first, last, result, value_type(result));}// 提供给char专用, 效率最优化inline char* uninitialized_copy(const char* first, const char* last,                                char* result){  memmove(result, first, last - first);  return result + (last - first);}// 提供给wchar_t专用, 效率最优化inline wchar_t* uninitialized_copy(const wchar_t* first, const wchar_t* last,                                   wchar_t* result){  memmove(result, first, sizeof(wchar_t) * (last - first));  return result + (last - first);}////////////////////////////////////////////////////////////////////////////////// uninitialized_copy_n()实现部分//////////////////////////////////////////////////////////////////////////////////                         uninitialized_copy_n//                                  |//                                  |------------ 判断迭代器first的类别//                                  |//               -----------------------------------------// InputIterator |                                       | RandomAccessIterator//               |                                       |//               ↓                                       |// __uninitialized_copy_n(..., input_iterator_tag)       |// for ( ; count > 0 ; --count, ++first, ++cur)          |//    construct(&*cur, *first);                          |//                                                       ↓//                    __uninitialized_copy_n(..., random_access_iterator_tag)//                    last = first + count;//                    uninitialized_copy(first, last, result)////////////////////////////////////////////////////////////////////////////////// POD版本template <class InputIterator, class Size, class ForwardIterator>pair<InputIterator, ForwardIterator>__uninitialized_copy_n(InputIterator first, Size count,                       ForwardIterator result,                       input_iterator_tag){  ForwardIterator cur = result;  __STL_TRY {    for ( ; count > 0 ; --count, ++first, ++cur)      construct(&*cur, *first);    return pair<InputIterator, ForwardIterator>(first, cur);  }  __STL_UNWIND(destroy(result, cur));}// 非POD版本// 对于支持随机存取的迭代器, 可以直接使用uninitialized_copy()进行复制template <class RandomAccessIterator, class Size, class ForwardIterator>inline pair<RandomAccessIterator, ForwardIterator>__uninitialized_copy_n(RandomAccessIterator first, Size count,                       ForwardIterator result,                       random_access_iterator_tag){  RandomAccessIterator last = first + count;  return make_pair(last, uninitialized_copy(first, last, result));}template <class InputIterator, class Size, class ForwardIterator>inline pair<InputIterator, ForwardIterator>uninitialized_copy_n(InputIterator first, Size count,                     ForwardIterator result){  return __uninitialized_copy_n(first, count, result,                                iterator_category(first));}////////////////////////////////////////////////////////////////////////////////// uninitialized_fill()实现部分//////////////////////////////////////////////////////////////////////////////////                           uninitialized_fill//                                   |//                                   |//                                   ↓//                       调用__uninitialized_fill()//                       根据类型是否为POD进行函数派发//                                   |//                                   |---------------- Is POD?//                   No 泛化版本      |      Yes 特化版本//               -------------------------------------------//               |                                         |//               |                                         |//               ↓                                         |// __uninitialized_fill_aux(..., __false_type)             |// for ( ; cur != last; ++cur)                             |//    construct(&*cur, x);                                 ↓//                                __uninitialized_fill_aux(..., __true_type)//                                fill(first, last, x);////////////////////////////////////////////////////////////////////////////////// POD版本// 如果copy construction和operator =等效, 并且destructor is trivial// 那么就可以使用本函数template <class ForwardIterator, class T>inline void__uninitialized_fill_aux(ForwardIterator first, ForwardIterator last,                         const T& x, __true_type){  fill(first, last, x);}// 非POD版本template <class ForwardIterator, class T>void__uninitialized_fill_aux(ForwardIterator first, ForwardIterator last,                         const T& x, __false_type){  ForwardIterator cur = first;  __STL_TRY {    for ( ; cur != last; ++cur)      construct(&*cur, x);  }  __STL_UNWIND(destroy(first, cur));}// 派发函数template <class ForwardIterator, class T, class T1>inline void __uninitialized_fill(ForwardIterator first, ForwardIterator last,                                 const T& x, T1*){  typedef typename __type_traits<T1>::is_POD_type is_POD;  __uninitialized_fill_aux(first, last, x, is_POD());}template <class ForwardIterator, class T>inline void uninitialized_fill(ForwardIterator first, ForwardIterator last,                               const T& x){  __uninitialized_fill(first, last, x, value_type(first));}////////////////////////////////////////////////////////////////////////////////// uninitialized_fill_n()实现部分//////////////////////////////////////////////////////////////////////////////////                           uninitialized_fill_n//                                   |//                                   |//                                   ↓//                      调用__uninitialized_fill_n()//                      根据类型是否为POD进行函数派发//                                   |//                                   |---------------- Is POD?//                   No 泛化版本      |      Yes 特化版本//               -------------------------------------------//               |                                         |//               |                                         |//               ↓                                         |// __uninitialized_fill_n_aux(..., __false_type)           |// for ( ; n > 0; --n, ++cur)                              |//    construct(&*cur, x);                                 |//                                                         ↓//                               __uninitialized_fill_n_aux(..., __true_type)//                               fill_n(first, n, x);////////////////////////////////////////////////////////////////////////////////// 如果copy construction和operator =等效, 并且destructor is trivial// 那么就可以使用本函数template <class ForwardIterator, class Size, class T>inline ForwardIterator__uninitialized_fill_n_aux(ForwardIterator first, Size n,                           const T& x, __true_type){  return fill_n(first, n, x);}template <class ForwardIterator, class Size, class T>ForwardIterator__uninitialized_fill_n_aux(ForwardIterator first, Size n,                           const T& x, __false_type){  ForwardIterator cur = first;  __STL_TRY {    for ( ; n > 0; --n, ++cur)      construct(&*cur, x);    return cur;  }  __STL_UNWIND(destroy(first, cur));}template <class ForwardIterator, class Size, class T, class T1>inline ForwardIterator __uninitialized_fill_n(ForwardIterator first, Size n,                                              const T& x, T1*){  typedef typename __type_traits<T1>::is_POD_type is_POD;  return __uninitialized_fill_n_aux(first, n, x, is_POD());}template <class ForwardIterator, class Size, class T>inline ForwardIterator uninitialized_fill_n(ForwardIterator first, Size n,                                            const T& x){  return __uninitialized_fill_n(first, n, x, value_type(first));}////////////////////////////////////////////////////////////////////////////////// 其它函数实现////////////////////////////////////////////////////////////////////////////////// Copies [first1, last1) into [result, result + (last1 - first1)), and// copies [first2, last2) into// [result, result + (last1 - first1) + (last2 - first2)).// 我认为应该是把[first2, last2)copy到// [result + (last1 - first1), result + (last1 - first1) + (last2 - first2))// 大家可以讨论一下template <class InputIterator1, class InputIterator2, class ForwardIterator>inline ForwardIterator__uninitialized_copy_copy(InputIterator1 first1, InputIterator1 last1,                          InputIterator2 first2, InputIterator2 last2,                          ForwardIterator result){  ForwardIterator mid = uninitialized_copy(first1, last1, result);  __STL_TRY {    return uninitialized_copy(first2, last2, mid);  }  __STL_UNWIND(destroy(result, mid));}// Fills [result, mid) with x, and copies [first, last) into//  [mid, mid + (last - first)).template <class ForwardIterator, class T, class InputIterator>inline ForwardIterator__uninitialized_fill_copy(ForwardIterator result, ForwardIterator mid,                          const T& x,                          InputIterator first, InputIterator last){  uninitialized_fill(result, mid, x);  __STL_TRY {    return uninitialized_copy(first, last, mid);  }  __STL_UNWIND(destroy(result, mid));}// Copies [first1, last1) into [first2, first2 + (last1 - first1)), and//  fills [first2 + (last1 - first1), last2) with x.template <class InputIterator, class ForwardIterator, class T>inline void__uninitialized_copy_fill(InputIterator first1, InputIterator last1,                          ForwardIterator first2, ForwardIterator last2,                          const T& x){  ForwardIterator mid2 = uninitialized_copy(first1, last1, first2);  __STL_TRY {    uninitialized_fill(mid2, last2, x);  }  __STL_UNWIND(destroy(first2, mid2));}__STL_END_NAMESPACE#endif /* __SGI_STL_INTERNAL_UNINITIALIZED_H */// Local Variables:// mode:C++// End:

0 0
原创粉丝点击