继续捣鼓<<STL源码剖析>>
#ifndef _copy_H_ #define _copy_H_ #include <memory> #include "type_traits.h" #include "iterator.h" namespace SGISTL { //copy template<typename InputIterator, typename OutputIterator> inline OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result) { return __copy_dispatch<InputIterator, OutputIterator>()(first, last, result); } inline char* copy(char* first, char* last, char* result) { std::memmove(result, first, (last - first)); return result + (last - first); } inline wchar_t* copy(wchar_t* first, wchar_t* last, wchar_t* result) { std::memmove(result, first, sizeof(wchar_t) * (last - first)); return result + (last - first); } template<typename InputIterator, typename OutputIterator> struct __copy_dispatch { OutputIterator operator()(InputIterator first, InputIterator last, OutputIterator result) { return __copy(first, last, result, iterator_category(first)); } }; template<typename T> struct __copy_dispatch<T*, T*> { T* operator()(T* first, T* last, T* result) { typedef typename type_traits<T>::has_trivial_assigment_operator t; return __copy_t(first, last, result, t()); }; }; template<typename T> struct __copy_dispatch<const T*, T*> { T* operator()(const T* first, const T* last, T* result) { typedef typename type_traits<T>::has_trivial_assigment_operator t; return __copy_t(first, last, result, t()); }; }; template<typename InputIterator, typename OutputIterator> inline OutputIterator __copy(InputIterator first, InputIterator last, OutputIterator result, input_iterator_tag) { for(; first != last; ++first, ++result) { *result = *first; }; return result; }; template<typename InputIterator, typename OutputIterator> inline OutputIterator __copy(InputIterator first, InputIterator last, OutputIterator result, random_access_iterator_tag) { return __copy_d(first, last, result, distance_type(first)); }; template<typename RandomIterator, typename OutputIterator, typename Distance> inline OutputIterator __copy_d(RandomIterator first, RandomIterator last, OutputIterator result, Distance*) { for(Distance n = last - first; n > 0; --n, ++ result; ++first) { *result = *first; } return result; } template<typename T> inline T* __copy_t(const T* first, const T* last, T* result, true_type) { std::memmove(result, first, sizeof(T) * (last - first)); return result + (last - first); }; template<typename T> inline T* __copy_t(const T* first, const T* last, T* result, false_type) { return __copy_d(first, last, result, (ptrdiff_t*)0); }; } #endif