zoukankan      html  css  js  c++  java
  • 实现的一些内存辅助操作函数

    其中有一个函数调用了std::copy,本来想自己实现这个copy函数的,不过为了能先用上这些内存辅助函数来实现我的容器类和算法,只好过一段时间来实现一个自己的高效的实现copy函数

      1 #ifndef _STL_UNINITIALIZED_H_
      2 #define _STL_UNINITIALIZED_H_
      3 
      4 #include "stl_algobase.h"
      5 #include "stl_iterator.h"
      6 #include "type_traits.h"
      7 
      8 //#include <algorithm>
      9 
     10 namespace zstd
     11 {
     12     /***************************************************************************/
     13     template<class InputIterator, class ForwardIterator, class T>
     14     ForwardIterator _uninitialized_copy(InputIterator first, InputIterator last,
     15         ForwardIterator result, T*);
     16     template<class InputIterator, class ForwardIterator>
     17     ForwardIterator _uninitialized_copy_aux(InputIterator first, InputIterator last,
     18         ForwardIterator result, _true_type);
     19     template<class InputIterator, class ForwardIterator>
     20     ForwardIterator _uninitialized_copy_aux(InputIterator first, InputIterator last,
     21         ForwardIterator result, _false_type);
     22 
     23     template<class InputIterator, class ForwardIterator>
     24     ForwardIterator 
     25     inline uninitialized_copy(InputIterator first, InputIterator last, ForwardIterator result)
     26     {
     27         return _uninitialized_copy(first, last, result, value_type(result));
     28     }
     29     template<>
     30     inline char *uninitialized_copy(const char *first, const char *last, char *result)
     31     {
     32         memmove(result, first, last - first);
     33         return result + (last - first);
     34     }
     35     template<>
     36     inline char *uninitialized_copy(char *first, char *last, char *result)
     37     {
     38         memmove(result, first, last - first);
     39         return result + (last - first);
     40     }
     41     template<>
     42     inline wchar_t *uninitialized_copy(const wchar_t *first, const wchar_t *last, wchar_t *result)
     43     {
     44         memmove(result, first, (last - first) * sizeof(wchar_t));
     45         return result + (last - first);
     46     }
     47     template<>
     48     inline wchar_t *uninitialized_copy(wchar_t *first, wchar_t *last, wchar_t *result)
     49     {
     50         memmove(result, first, (last - first) * sizeof(wchar_t));
     51         return result + (last - first);
     52     }
     53     template<class InputIterator, class ForwardIterator, class T>
     54     inline ForwardIterator _uninitialized_copy(InputIterator first, InputIterator last,
     55         ForwardIterator result, T*)
     56     {
     57         typedef typename _type_traits<T>::is_POD_type is_POD_type;
     58         return _uninitialized_copy_aux(first, last, result, is_POD_type());
     59     }
     60     template<class InputIterator, class ForwardIterator>
     61     inline ForwardIterator _uninitialized_copy_aux(InputIterator first, InputIterator last,
     62         ForwardIterator result, _true_type)
     63     {
     64         return std::copy(first, last, result);//到时候记得自己实现copy
     65     }
     66     template<class InputIterator, class ForwardIterator>
     67     ForwardIterator _uninitialized_copy_aux(InputIterator first, InputIterator last,
     68         ForwardIterator result, _false_type)
     69     {
     70         ForwardIterator cur = result;
     71         try
     72         {
     73             for (; first != last; ++first, ++cur)
     74                 construct(&*cur, *first);
     75         }
     76         catch (...)
     77         {
     78             destroy(result, cur);
     79         }
     80         return cur;
     81     }
     82 
     83     /***************************************************************************/
     84     template<class ForwardIterator, class T, class T1>
     85     void _uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x, T1*);
     86     template<class ForwardIterator, class T>
     87     void _uninitialized_fill_aux(ForwardIterator first, ForwardIterator last,
     88         const T& x, _true_type);
     89     template<class ForwardIterator, class T>
     90     void _uninitialized_fill_aux(ForwardIterator first, ForwardIterator last,
     91         const T& x, _false_type);
     92 
     93     template<class ForwardIterator, class T>
     94     void uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x)
     95     {
     96         _uninitialized_fill(first, last, x, value_type(first));
     97     }
     98     template<class ForwardIterator, class T, class T1>
     99     void _uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x, T1*)
    100     {
    101         typedef typename _type_traits<T1>::is_POD_type is_POD;
    102         _uninitialized_fill_aux(first, last, x, is_POD());
    103     }
    104     template<class ForwardIterator, class T>
    105     void _uninitialized_fill_aux(ForwardIterator first, ForwardIterator last,
    106         const T& x, _true_type)
    107     {
    108         fill(first, last, x);
    109     }
    110     template<class ForwardIterator, class T>
    111     void _uninitialized_fill_aux(ForwardIterator first, ForwardIterator last,
    112         const T& x, _false_type)
    113     {
    114         ForwardIterator cur = first;
    115         for (; cur != last; ++cur)
    116             construct(&*cur, x);
    117     }
    118 
    119     /***************************************************************************/
    120     template<class ForwardIterator, class Size, class T, class T1>
    121     ForwardIterator _uninitialized_fill_n(ForwardIterator first,
    122         Size n, const T& x, T1*);
    123     template<class ForwardIterator, class Size, class T>
    124     ForwardIterator _uninitialized_n_fill_aux(ForwardIterator first,
    125         Size n, const T& x, _true_type);
    126     template<class ForwardIterator, class Size, class T>
    127     ForwardIterator _uninitialized_n_fill_aux(ForwardIterator first,
    128         Size n, const T& x, _false_type);
    129 
    130     template<class ForwardIterator, class Size, class T>
    131     inline ForwardIterator uninitialized_fill_n(ForwardIterator first,
    132         Size n, const T& x)
    133     {
    134         return _uninitialized_fill_n(first, n, x, value_type(first));
    135     }
    136     template<class ForwardIterator, class Size, class T, class T1>
    137     ForwardIterator _uninitialized_fill_n(ForwardIterator first, 
    138         Size n, const T& x, T1*)
    139     {
    140         typedef typename _type_traits<T1>::is_POD_type is_POD;
    141         return _uninitialized_fill_n_aux(first, n, x, is_POD());
    142     }
    143     template<class ForwardIterator, class Size, class T>
    144     ForwardIterator _uninitialized_n_fill_aux(ForwardIterator first, 
    145         Size n, const T& x, _true_type)
    146     {
    147         return fill_n(first, n, x);
    148     }
    149     template<class ForwardIterator, class Size, class T>
    150     ForwardIterator _uninitialized_n_fill_aux(ForwardIterator first, 
    151         Size n, const T& x, _false_type)
    152     {
    153         ForwardIterator cur = first;
    154         for (; n > 0; --n, ++cur)
    155             construct(&*cur, x);
    156         return cur;
    157     }
    158 
    159 }
    160 #endif
  • 相关阅读:
    Spring自动装配Beans
    Spring过滤器组件自动扫描
    Spring自动扫描组件
    Spring EL运算符实例
    Spring EL方法调用实例
    Spring EL bean引用实例
    Spring EL hello world实例
    Spring @PostConstruct和@PreDestroy实例
    Spring Bean init-method 和 destroy-method实例
    Spring Bean InitializingBean和DisposableBean实例
  • 原文地址:https://www.cnblogs.com/zxh1210603696/p/3574373.html
Copyright © 2011-2022 走看看