⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 node_pool.h

📁 这是linux下的进化计算的源代码。 === === === === === === === === === === === ===== check latest news at http:
💻 H
字号:
/** *	Pool allocator for the subtree and parse tree classes (homebrew and not compliant to ANSI allocator requirements) *  (c) copyright Maarten Keijzer 1999, 2000  * Permission to copy, use,  modify, sell and distribute this software is granted provided  * this copyright notice appears in all copies. This software is provided "as is" without * express or implied warranty, and with no claim as to its suitability for * any purpose.  * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice.*/#ifndef node_pool_h#define node_pool_hclass MemPool{public :        MemPool(unsigned int sz) : esize(sz<sizeof(Link)? sizeof(Link) : sz) {}    ~MemPool()    {        Chunk* n = chunks;        while(n)        {            Chunk* p = n;            n = n->next;            delete p;        }    }        void* allocate()    {        if (head == 0) grow();        Link* p = head;        head = p->next;        return static_cast<void*>(p);    }    void deallocate(void* b)    {        Link* p = static_cast<Link*>(b);        p->next = head;        head = p;    }private :    void grow()    {        Chunk* n = new Chunk;        n->next = chunks;        chunks = n;        const int nelem = Chunk::size/esize;        char* start = n->mem;        char* last  = &start[(nelem-1)*esize];        for (char* p = start; p < last; p += esize)        {            reinterpret_cast<Link*>(p)->next =                 reinterpret_cast<Link*>(p + esize);        }                reinterpret_cast<Link*>(last)->next = 0;        head = reinterpret_cast<Link*>(start);    }    struct Link    {        Link* next;    };    struct Chunk    {        enum {size = 8 * 1024 - 16};        Chunk* next;        char mem[size];    };    Chunk* chunks;    const unsigned int esize;    Link* head;};template<class T>class Node_alloc{public :        T* allocate(void)     {        T* t = static_cast<T*>(mem.allocate());        t = new  (t) T;        return t;    }        T* construct(const T& org)     {        T* t = static_cast<T*>(mem.allocate());        t = new  (t) T(org);        return t;    }    void deallocate(T* t)    {        t->~T(); // call destructor        mem.deallocate(static_cast<void*>(t));    }private :    static MemPool mem;};template <class T> class Standard_alloc{public :    Standard_alloc() {}    T* allocate(size_t arity = 1)    {        if (arity == 0)            return 0;        return new T [arity];    }        T* construct(size_t arity, T* org)    {        if (arity == 0)            return 0;        T* t = new T [arity];        for (int i = 0; i < arity; ++i)        {            t = T(org[i]);        }    }    void deallocate(T* t, size_t arity = 1)    {        if (arity == 0)            return ;        delete [] t;    }};template <class T> class Standard_Node_alloc{public :    Standard_Node_alloc() {}    T* allocate(void)    {        return new T;// [arity];    }    T* construct(const T& org)    {        return new T(org);    }    void deallocate(T* t)    {        delete t;    }};template <class T>class Tree_alloc{public :    Tree_alloc() {}    T* allocate(size_t arity)    {        T* t;        switch(arity)        {        case 0 : return 0;        case 1 :            {                t = static_cast<T*>(mem1.allocate());                new (t) T;                break;            }        case 2 :            {                t = static_cast<T*>(mem2.allocate());                new (t) T;                new (&t[1]) T;                break;            }        case 3 :            {                t = static_cast<T*>(mem3.allocate());                new (t) T;                new (&t[1]) T;                new (&t[2]) T;                break;            }        default :            {                return new T[arity];            }        }        return t;     }    T* construct(size_t arity, T* org)    {        T* t;        switch(arity)        {        case 0 : return 0;        case 1 :            {                t = static_cast<T*>(mem1.allocate());                new (t) T(*org);                break;            }        case 2 :            {                t = static_cast<T*>(mem2.allocate());                new (t) T(*org);                new (&t[1]) T(org[1]);                break;            }        case 3 :            {                t = static_cast<T*>(mem3.allocate());                new (t) T(*org);                new (&t[1]) T(org[1]);                new (&t[1]) T(org[2]);                break;            }        default :            {                t = new T[arity]; // does call default ctor                for (int i = 0; i < arity; ++i)                {                    t[i] = T(org[i]); // constructs now                }            }        }        return t;     }    void deallocate(T* t, size_t arity)    {        switch(arity)        {        case 0: return;        case 3 :             {                t[2].~T(); t[1].~T(); t[0].~T();                mem3.deallocate(static_cast<void*>(t));                return;            }        case 2 :             {                t[1].~T(); t[0].~T();                mem2.deallocate(static_cast<void*>(t));                return;            }        case 1 :             {                t[0].~T();                mem1.deallocate(static_cast<void*>(t));                return;            }        default :            {                delete [] t;                return;            }        }    }    private :    static MemPool mem1;    static MemPool mem2;    static MemPool mem3;};// static (non thread_safe) memory poolstemplate <class T> MemPool Node_alloc<T>::mem  = sizeof(T);template <class T> MemPool Tree_alloc<T>::mem1 = sizeof(T);template <class T> MemPool Tree_alloc<T>::mem2 = sizeof(T) * 2;template <class T> MemPool Tree_alloc<T>::mem3 = sizeof(T) * 3;#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -