您的位置:首页 > 运维架构

STL的copy真是是做的了极致的效率

2015-11-30 21:00 585 查看
inline char*  unitialized_copy(const char* first, const char* last, char* result){
std::memmove(result, first, last - first);
return result + (last - first);
}
inline wchar_t* unitialized_copy(const wchar_t* first, const wchar_t* last, wchar_t* result){
std::memmove(result, first, sizeof(wchar_t)*(last - first));
return result + (last - first);
}
template<class Input_iterator,class Forward_iterator>
inline Forward_iterator __uninitialized_copy_aux(Input_iterator first, Input_iterator last, Forward_iterator result, __false_type){
for (; first != last; ++first, ++result){
construct(&*result,*first);
return result;
}
}
template<class T>
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<class T>
T* __copy_t(const T* first, const T* last, T* result, __false_type){
return __copy_d(first, last, result, result, ptrdiff_t*(0));
}

template<class Random_iterator, class Output_iterator, class Different>
Output_iterator __copy_d(Random_iterator first, Random_iterator last, Output_iterator result, Different*){
Different n = last - first;
for (; n > 0; --n, ++first, ++result){
*result = *first;
}
return result;
}

template<class Input_iterator,class Output_iterator>
Output_iterator __copy(Input_iterator first, Input_iterator last, Output_iterator result,__input_iterator_tag){
while (first != last){
*result = *first;
++result;
++first;
}
return result;
}
template<class Random_iterator,class Output_iterator>
Output_iterator __copy(Random_iterator first, Random_iterator last, Output_iterator result, __random_access_iterator_tag){
return __copy_d(first, last, result, different_type(first));
}

template<class Input_iterator,class Output_iterator>
struct __copy_dispatch{
Output_iterator operator()(Input_iterator first, Input_iterator last, Output_iterator result){
return __copy(first, last, result, iterator_catagory(result));
}
};

template<class T>
struct __copy_dispatch<const T*, T*>{
T* operator()(const T* first, const T* last, T* result){
typedef typename __iterator_traits<T>::has_trival_assignment_operator has_trival_assignment_operator;
return __copy_t(first, last, result, has_trival_assignment_operator());
}
};
template<class T>
struct __copy_dispatch<T*, T*>{
T* operator()(T* first, T* last, T* result){
typedef typename __iterator_traits<T>::has_trival_assignment_operator has_trival_assignment_operator;
return __copy_t(first, last, result, has_trival_assignment_operator());
}
};

template<class Input_iterator,class Output_iterator>
inline Output_iterator copy__t(Input_iterator first, Input_iterator last, Output_iterator result){
return __copy_dispatch<Input_iterator, Output_iterator>()(first, last, result);
}

template<class Input_iterator,class Forward_iterator>
inline Forward_iterator __uninitialized__copy_aux(Input_iterator first, Input_iterator last, Forward_iterator result, __true_type){
return copy__t(first, last, result);
}

template<class Input_iterator,class Forward_iterator,class T>
inline Forward_iterator __uninitialized_copy(Input_iterator first, Input_iterator last, Forward_iterator result, T*){
typedef typename __iterator_traits<T>::is_pod_type is_pod_type;
return __uninitialized__copy_aux(first, last, result, is_pod_type());
}
template<class Input_iterator,class Forward_iterator>
inline Forward_iterator uninitialized_copy_x(Input_iterator first, Input_iterator last, Forward_iterator result){
return __uninitialized_copy(first, last, result, value_type(result));
}


太美了

第一次是pod类型 dispatch

第二次assign dispatch

第三次是catagory

实在是不能在提高效率了

最高的利用类型的特性

gggggggood
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: