实现的一些内存辅助操作函数
2014-02-28 21:37
323 查看
其中有一个函数调用了std::copy,本来想自己实现这个copy函数的,不过为了能先用上这些内存辅助函数来实现我的容器类和算法,只好过一段时间来实现一个自己的高效的实现copy函数
#ifndef _STL_UNINITIALIZED_H_ #define _STL_UNINITIALIZED_H_ #include "stl_algobase.h" #include "stl_iterator.h" #include "type_traits.h" //#include <algorithm> namespace zstd { /***************************************************************************/ template<class InputIterator, class ForwardIterator, class T> ForwardIterator _uninitialized_copy(InputIterator first, InputIterator last, ForwardIterator result, T*); template<class InputIterator, class ForwardIterator> ForwardIterator _uninitialized_copy_aux(InputIterator first, InputIterator last, ForwardIterator result, _true_type); template<class InputIterator, class ForwardIterator> ForwardIterator _uninitialized_copy_aux(InputIterator first, InputIterator last, ForwardIterator result, _false_type); template<class InputIterator, class ForwardIterator> ForwardIterator inline uninitialized_copy(InputIterator first, InputIterator last, ForwardIterator result) { return _uninitialized_copy(first, last, result, value_type(result)); } template<> inline char *uninitialized_copy(const char *first, const char *last, char *result) { memmove(result, first, last - first); return result + (last - first); } template<> inline char *uninitialized_copy(char *first, char *last, char *result) { memmove(result, first, last - first); return result + (last - first); } template<> inline wchar_t *uninitialized_copy(const wchar_t *first, const wchar_t *last, wchar_t *result) { memmove(result, first, (last - first) * sizeof(wchar_t)); return result + (last - first); } template<> inline wchar_t *uninitialized_copy(wchar_t *first, wchar_t *last, wchar_t *result) { memmove(result, first, (last - first) * sizeof(wchar_t)); return result + (last - first); } template<class InputIterator, class ForwardIterator, class T> inline ForwardIterator _uninitialized_copy(InputIterator first, InputIterator last, ForwardIterator result, T*) { typedef typename _type_traits<T>::is_POD_type is_POD_type; return _uninitialized_copy_aux(first, last, result, is_POD_type()); } template<class InputIterator, class ForwardIterator> inline ForwardIterator _uninitialized_copy_aux(InputIterator first, InputIterator last, ForwardIterator result, _true_type) { return std::copy(first, last, result);//到时候记得自己实现copy } template<class InputIterator, class ForwardIterator> ForwardIterator _uninitialized_copy_aux(InputIterator first, InputIterator last, ForwardIterator result, _false_type) { ForwardIterator cur = result; try { for (; first != last; ++first, ++cur) construct(&*cur, *first); } catch (...) { destroy(result, cur); } return cur; } /***************************************************************************/ template<class ForwardIterator, class T, class T1> void _uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x, T1*); template<class ForwardIterator, class T> void _uninitialized_fill_aux(ForwardIterator first, ForwardIterator last, const T& x, _true_type); template<class ForwardIterator, class T> void _uninitialized_fill_aux(ForwardIterator first, ForwardIterator last, const T& x, _false_type); template<class ForwardIterator, class T> void uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x) { _uninitialized_fill(first, last, x, value_type(first)); } template<class ForwardIterator, class T, class T1> 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> void _uninitialized_fill_aux(ForwardIterator first, ForwardIterator last, const T& x, _true_type) { fill(first, last, x); } template<class ForwardIterator, class T> void _uninitialized_fill_aux(ForwardIterator first, ForwardIterator last, const T& x, _false_type) { ForwardIterator cur = first; for (; cur != last; ++cur) construct(&*cur, x); } /***************************************************************************/ template<class ForwardIterator, class Size, class T, class T1> ForwardIterator _uninitialized_fill_n(ForwardIterator first, Size n, const T& x, T1*); template<class ForwardIterator, class Size, class T> ForwardIterator _uninitialized_n_fill_aux(ForwardIterator first, Size n, const T& x, _true_type); template<class ForwardIterator, class Size, class T> ForwardIterator _uninitialized_n_fill_aux(ForwardIterator first, Size n, const T& x, _false_type); 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)); } template<class ForwardIterator, class Size, class T, class T1> 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> ForwardIterator _uninitialized_n_fill_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_n_fill_aux(ForwardIterator first, Size n, const T& x, _false_type) { ForwardIterator cur = first; for (; n > 0; --n, ++cur) construct(&*cur, x); return cur; } } #endif
相关文章推荐
- vs2010:fatal error LNK1123: 转换到 COFF 期间失败
- Mysql数据库学习(四):常用Mysql C API 介绍和使用、封装一个访问Mysql数据库的类MysqlDB
- 大家快来A水题
- UBIFS分区制作 UBIFS烧写 启动 (转载)
- C++多线程总结
- linuxdeepin 2013 安装Netbeans出现JVM terminated. Exit code=13
- 2013年杰森·斯坦森动作《蜂鸟》720p.BD中英双字幕
- Apache下实现禁止目录浏览
- OpenCV 脸部跟踪(1)
- 求二叉树的深度
- Cython基础--Cython的类
- 嵌入式学习心得
- 用TransitionDrawable实现ImageView渐隐渐显过渡效果,并解决OutOfMemory问题
- Android listview中嵌套Checkbox的布局文件
- SharePoint默认的欢迎WebPart中超链接样式
- java个人学习笔记04(function、overload、array、栈、堆)
- ASP.Net中的编码与解码
- 压力测试工具——Galting
- SharePoint默认的欢迎WebPart中超链接样式
- bzoj 1058 bst