STL源码剖析__copy

继续捣鼓<<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


你可能感兴趣的:(STL源码剖析__copy)