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

📄 smallobject.h

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 H
字号:
/******************************************************************************** Copyright (C) 2004-2006 Trolltech ASA. All rights reserved.** Copyright (C) 2001-2004 Roberto Raggi**** This file is part of the qt3to4 porting application of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#ifndef SMALLOBJECT_H#define SMALLOBJECT_H#include <QList>#include <assert.h>#include <stdlib.h>#include <string.h>struct block_t{    static int N;    block_t *chain;    char *data;    char *ptr;    char *end;    inline void init(int block_size = 256)    {        ++N;        chain = 0;        data = (char*) malloc(block_size);        ptr = data;        end = data + block_size;    }    inline void init0(int block_size)    {        init();        memset(data, '0', block_size);    }    inline void destroy()    {        --N;        if (chain) {            chain->destroy();            free(chain);        }        free(data);    }    inline void *allocate(size_t size, block_t **right_most)    {        const unsigned int block_size = 1 << 16;        if (end < ptr + size) {            assert( size < block_size );            if (!chain) {                chain = (block_t*) malloc(sizeof(block_t));                Q_ASSERT(chain);                chain->init(block_size);            }            return chain->allocate(size, right_most);        }        char *r = ptr;        ptr += size;        if (right_most)            *right_most = this;        return r;    }};// a stupid memory poolstruct pool{    block_t blk;    block_t *right_most;    inline pool() { blk.init(); right_most = &blk; }    inline ~pool() { blk.destroy(); }    inline void *allocate(size_t size)    {        void *ptr = right_most->allocate(size, &right_most);        Q_ASSERT(ptr);        return ptr;    }    inline void *reallocate(void *old, size_t old_size, size_t size)    {        void *alloc = right_most->allocate(size, &right_most);        memcpy(alloc, old, old_size);        return alloc;    }private:   Q_DISABLE_COPY(pool)};/*    A memory pool that calls the destructor for each stored item when memory is    freed, at the expence storing one BaseType* per item.    Note that allocations for types that does not inherit BaseType    is not allowed and will result in a crash when the memory is freed.*/template <typename BaseType>class TypedPool{public:    inline TypedPool() { blk.init(); right_most = &blk; }    inline ~TypedPool()    {        foreach(BaseType *item, allocated)            item->~BaseType();        blk.destroy();    }    inline void *allocate(size_t size)    {        void *memory = right_most->allocate(size, &right_most);        allocated.append(reinterpret_cast<BaseType *>(memory));        return memory;        Q_ASSERT(memory);    }private:    Q_DISABLE_COPY(TypedPool)    block_t blk;    block_t *right_most;    QList<BaseType *> allocated;};struct SmallObject{    static void *operator new(size_t size);    static void operator delete(void *p);};#endif

⌨️ 快捷键说明

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