游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4128|回复: 3

Handle存储数据模板

[复制链接]

38

主题

96

帖子

148

积分

注册会员

Rank: 2

积分
148
发表于 2004-3-13 20:25:00 | 显示全部楼层 |阅读模式
//代码名称: Handle存储数据模板
//类别:     内存管理
//关健字:   存储方法 内存 数据管理
//作者:     EasySL
//编译器:   VC
//操作系统: windows

#ifndef __ALLOCSTOREMANGER_H__
#define __ALLOCSTOREMANGER_H__

#include <vector>

class CASMHandle
{
public:
    enum ConstData
    {
        Invalid_Handle = -1,
    };

    CASMHandle()
    {
        m_Handle = Invalid_Handle;
    }

    virtual ~CASMHandle()
    {
    }

    bool Valid() const
        { return m_Handle != Invalid_Handle; }

    int GetHandle() const
        { return m_Handle; }

    void SetHandle( int Handle )
        { m_Handle = Handle; }

private:

    int m_Handle;

};

template< class CT, const int MAXITEM >
class CASMHMANGER
{
public:
    CASMHMANGER()
    {
        m_vecCT.clear();
        m_NextHandle = 0;
        m_HandleNumber = 0;
    }

    virtual ~CASMHMANGER()
    {
        for(int i=0;i<(int)m_vecCT.size();i++)
        {
            delete m_vecCT;
        }
        m_vecCT.clear();
    }

    CT* operator [] ( int i )
    {
        if( i < 0 )
            return NULL;
        if( i >= MAXITEM )
            return NULL;
        if( i >= (int)m_vecCT.size() )
            return NULL;
        if( !m_vecCT->Valid() )
            return NULL;

        return m_vecCT;
    }

    int Add( CT* o )
    {
        int oi = Find(o);
        if( oi != CT::Invalid_Handle )
            return oi;

        if( o && (!IsFull()) )
        {
            int Handle = AllocHandle();
            if( Handle == CT::Invalid_Handle )
                return Handle;
            o->SetHandle(Handle);
            if( Handle < (int)m_vecCT.size() )
            {
                delete m_vecCT[Handle];
                m_vecCT[Handle] = o;
            }
            else
            {
                m_vecCT.push_back(o);
            }
            m_HandleNumber++;
            return o->GetHandle();
        }
        else
            return CT::Invalid_Handle;
    }

    void Del( int i )
    {
        if( i < 0 )
            return;
        if( i >= MAXITEM )
            return;
        if( i >= (int)m_vecCT.size() )
            return;
        if( !m_vecCT->Valid() )
            return;
        m_vecCT->SetHandle( CT::Invalid_Handle );
        m_HandleNumber--;
    }

    bool IsFull() const
        { return m_HandleNumber == MAXITEM; }
   
    int Find( CT* o )
    {
        if( o == NULL )
            return CT::Invalid_Handle;

        for(int i=0;i<(int)m_vecCT.size();i++)
        {
            if( m_vecCT == o )
            {
                if( m_vecCT->Valid() )
                    return i;
            }
        }
        return CT::Invalid_Handle;
    }

private:

    std::vector<CT*> m_vecCT;
    int m_NextHandle;
    int m_HandleNumber;

    int AllocHandle()
    {
        int AllocHandle = CT::Invalid_Handle;
        int count = 0;
        while(true)
        {
            if( m_NextHandle < (int)m_vecCT.size() )   
            {
                if( !m_vecCT[m_NextHandle]->Valid() )
                {
                    AllocHandle = m_NextHandle;
                    break;
                }
            }
            else
            {
                if( m_NextHandle < MAXITEM )
                {
                    AllocHandle = m_NextHandle;
                    break;
                }
            }
            
            m_NextHandle++;
            if( m_NextHandle >= MAXITEM )
            {
                m_NextHandle = 0;
            }

            count++;
            if(count >= MAXITEM)
                return CT::Invalid_Handle;
        }

        return AllocHandle;
    }
};

#endif // __ALLOCSTOREMANGER_H__

0

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2004-5-15 12:18:00 | 显示全部楼层

Re:Handle存储数据模板

VC的?我期待Delphi的

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2004-6-29 01:28:00 | 显示全部楼层

Re:Handle存储数据模板

作者若能加上注释,我想会很好的哦..呵呵
谢谢..

3

主题

155

帖子

161

积分

注册会员

Rank: 2

积分
161
发表于 2004-7-6 14:15:00 | 显示全部楼层

Re:Handle存储数据模板

sdm~~~~~~~~~~~~~~~~~~~~`
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-7-5 13:20

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表