szwolf

专注于C++技术,再用1年的时间努力学C++!
随笔 - 2, 文章 - 0, 评论 - 2, 引用 - 0
数据加载中……

STL学习之二:STL内存工具(一)

      用Traits进行类别推导,将类别选择工作放到编译期进行,利用重载提高效率。
      下面的type_traits.h是我直接从SGI STL里Copy出来的。。。

#ifndef TYPE_TRAITS_H
#define  TYPE_TRAITS_H

// 为了了重载确定那些类弄型是不用析构的SGI STl用了type_traits
// 并将一些Scale type进行特例化
struct  __true_type  {
}
;

struct  __false_type  {
}
;

template 
< class  _Tp >
struct  __type_traits 
   typedef __true_type     this_dummy_member_must_be_first;

   typedef __false_type    has_trivial_default_constructor;
   typedef __false_type    has_trivial_copy_constructor;
   typedef __false_type    has_trivial_assignment_operator;
   typedef __false_type    has_trivial_destructor;
   typedef __false_type    is_POD_type;
}
;

template
<>
struct  __type_traits < bool >   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;
template
<>
 
struct  __type_traits < char >   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;
template
<>
 
struct  __type_traits < signed  char >   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;
template
<>
 
struct  __type_traits < unsigned  char >   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;
template
<>
 
struct  __type_traits < wchar_t >   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;

template
<>
 
struct  __type_traits < short >   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;
template
<>
 
struct  __type_traits < unsigned  short >   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;
template
<>
 
struct  __type_traits < int >   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;
template
<>
 
struct  __type_traits < unsigned  int >   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;
template
<>
 
struct  __type_traits < long >   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;
template
<>
 
struct  __type_traits < unsigned  long >   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;

#ifdef __STL_LONG_LONG
template
<>
 
struct  __type_traits < long   long >   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;

 
struct  __type_traits < unsigned  long   long >   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;

#endif  /* __STL_LONG_LONG */
template
<>
 
struct  __type_traits < float >   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;
template
<>
 
struct  __type_traits < double >   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;
template
<>
 
struct  __type_traits < long   double >   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;

template 
< class  _Tp >
struct  __type_traits < _Tp *>   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;
template
<>
 
struct  __type_traits < char *>   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;
template
<>
 
struct  __type_traits < signed  char *>   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;
template
<>
 
struct  __type_traits < unsigned  char *>   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;
template
<>
 
struct  __type_traits < const   char *>   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;
template
<>
 
struct  __type_traits < const  signed  char *>   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;
template
<>
 
struct  __type_traits < const  unsigned  char *>   {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
}
;

#endif

以下是construct 和 destroy的实现
#ifndef MEM_TOOlS_H
#define MEM_TOOlS_H
#include 
"type_traits.h"
using namespace std;
namespace SGI
{
    template
<typename T1, typename T2>
    inline 
void construct(T1* p, const T2& value)
    
{
        
new(p)T1(value);
    }

    
    template
<typename T>
    inline 
void construct(T* p)
    
{
        
new(p)T();
    }


    template
<typename T>
    
void destroy(T* p)
    
{
        p
->~T();
    }


    template
<typename ForwardIterator>
    inline 
void destroy_aux(ForwardIterator first, ForwardIterator last, __false_type)
    
{
        
for (; first < last; ++first)
            destroy(
&*first);

        cout 
<< "false type" << endl;
    }


    template
<typename ForwardIterator>
    inline 
void destroy_aux(ForwardIterator first, ForwardIterator last, __true_type)
    
{
        cout 
<< "true type" << endl;
    }


    template
<typename ForwardIterator>
    inline 
void destroy(ForwardIterator first, ForwardIterator last)
    
{
        _destroy(first, last, value_type(
*first));
    }


    template
<typename ForwardIterator, typename T>
    inline 
void _destroy(ForwardIterator first, ForwardIterator last, T*)
    
{
        typedef __type_traits
<T>::has_trivial_destructor trivial_destructor;
        destroy_aux(first, last, trivial_destructor());
    }


    inline 
void destroy(char*char*
    
{
        cout 
<< "char* type" << endl;
    }

    inline 
void destroy(wchar_t*, wchar_t*
    
{
        cout 
<< "wchar_t* type" << endl;
    }
    

}


#endif

在main中对construct,destroy时行测试

// mem_tools.cpp : 定义控制台应用程序的入口点。
//
/*
 *    模仿实现SGI STL中的内存工具
 *  szwolf @ szu
 *  2006.08.07
 
*/

#include 
"stdafx.h"
#include 
"sgi_allocator.h"
#include 
<iostream>
#include 
<vector>
#include 
<algorithm>
#include 
"mem_tools.h"

class mem_test
{
public:
    mem_test(
const char* msg)
    
{
        cout 
<< msg << endl;
    }


    
~mem_test()
    
{
        cout 
<< "dead~~" << endl;
    }

}
;

int _tmain(int argc, _TCHAR* argv[])
{
    
//    很郁闷为什么下面的代码是错的?
    
//    typedef simple_alloc<mem_test, SGI::alloc> data_allcator;
    
//    mem_test* t = data_allocator::allocate();

    SGI::simple_alloc
<mem_test, SGI::alloc> data_allocator;
    
    mem_test
* t = data_allocator.allocate();

    SGI::construct(t, 
"come to live!");
    SGI::destroy(
&*t);

    SGI::simple_alloc
<char, SGI::alloc> char_alloc;
    
char *= char_alloc.allocate(133);
    strcpy(p, 
"hellow!");
    SGI::destroy(p,p
+8);
    char_alloc.deallocate(p, 
133);

    system(
"pause");
    
return 0;
}
实中用到的simple_alloc及sgi_allocator.h是上一篇随笔里的东西。。。

posted on 2006-08-07 01:47 szwolf 阅读(1020) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理