cpueblo's
Programming
     

Google
 
Programming | Tools | Money | Blog | ±âÁ¸ ÀÚ·á½Ç | ÄÚµå»ç¶û ¹æ¸í·Ï | About Me | English | °Ë»ö   
¾ð¾îº°:


ÁÖÁ¦º°:


Àüü Ç׸ñº°


±âŸ


±¤ÈñÀÇ ÀÚÀÛÅø

cpueblo's Library

 

wTemplateList - ÅÛÇø´À¸·Î ±¸¼ºµÈ List Ŭ·¡½º ¶óÀ̺귯¸®

µî·ÏÀÚ : À¯±¤Èñ, 07-09-14 02:00:53


#ifndef __WTEMPLATELIST_H__
#define __WTEMPLATELIST_H__

/*******************************************************************

    wTemplateList : List ó¸® °ü·Ã ÅÛÇø´ Ŭ·¡½º

    by : cpueblo@cpueblo.com, À¯±¤Èñ

    help : debugx

    History : 2007.09.14 1Â÷ µî·Ï

ex)
    typedef wTemplateList    TIntegerList;
    TIntegerList a;

    a.Add(5);
    a.Add(10);

    // Items[] ¸¦ ÀÌ¿ë½Ã
    for (int i = 0; i < a.Count; i++)
    {
        TRACE("%d = %d\\n", i, a.Items[i]);
    }

    // Node ¸¦ ÀÌ¿ë½Ã
    int *p;
    for (a.MoveHead(); p = a.GetNode(); a.MoveNext())
    {
        TRACE("- %d\\n", *p);

        // 10À̶ó´Â ¼ýÀÚ¸¦ ¸¸³ª¸é ÇØ´ç Node ¸¦ ¸®½ºÆ®¿¡¼­ Áö¿î´Ù
        if (*p == 10)
            a.DeleteNode();
    }

    // °ª °¡Á®¿À±â
    int A0 = a.Items[0];

    // °ª ¼öÁ¤
    int *pA0 = a.ItemsPtr[0];
    *pA0 = 10;
*******************************************************************/


template <class Type>
class wTemplateList
{
private:
    Type extractData;

    class CNode
    {
    public:
        Type  tData;
        CNode * pPrev;
        CNode * pNext;
        CNode()
        {
            pPrev = NULL;
            pNext = NULL;
        }
    };

    CNode *    m_pHead;
    CNode *    m_pTail;

    // MoveHead, MoveTail, MoveNext, MovePrev ¿¡¼­¸¸ »ç¿ë
    CNode *    m_pCrnt;
    int        m_nCount;

public:
    wTemplateList (void);
    ~wTemplateList (void);

    void    Add     (Type tData);            // »õ·Î¿î °ªÀ» ¸¶Áö¸·¿¡ Ãß°¡ÇÑ ÈÄ Ãß°¡µÈ À妽º ¹øÈ£¸¦ ¸®ÅÏÇÑ´Ù. ½ÃÀÛÀº 0 ÀÌ´Ù.
    void    Clear   (void);                    // ¸ðµç À妽º¸¦ »èÁ¦Çϸç, ÃÑ °³¼ö¸¦ 0 À¸·Î ÃʱâÈ­ÇÑ´Ù
    BOOL    delete  (int Index);            // ƯÁ¤ À妽º¸¦ »èÁ¦ÇÑ´Ù. »èÁ¦ÈÄ¿¡´Â Index ¹è¿­ÀÇ º¯È­°¡ »ý±â¹Ç·Î À¯ÀÇÇØ¾ß ÇÑ´Ù
    Type     Extract (int Index);            // ¸®½ºÆ®¿¡¼­ À妽º¿¡ ÇØ´çÇÏ´Â ¾ÆÀÌÅÛÀ» ÃßÃâÇÑ´Ù
                                            // ¾ÆÀÌÅÛÀÇ ÃßÃâ°ú ÇÔ²² »èÁ¦¸¦ ó¸®Çϸç, ÃÑ °³¼ö¸¦ °¨¼Ò½ÃŲ´Ù

    // [] ¸¦ ÀÌ¿ëÇÑ Ã³¸® °ü·Ã
    __declspec(property(get=PGetCount))        int        Count;
    __declspec(property(get=PGetItems))        Type    Items[];
    __declspec(property(get=PGetItemsPtr))    Type*    ItemsPtr[];

    // Node Á÷Á¢ ó¸® °ü·Ã
    Type *    MoveHead (void);
    Type *    MoveTail (void);
    Type *    MoveNext (void);
    Type *    MovePrev (void);
    Type *    GetNode     (void);
    void    DeleteNode(void);

private:
    // FMoveIndex »ç¿ë½Ã À妽º À̵¿ ¼Óµµ¸¦ È¿À²ÀûÀ¸·Î Çϱâ À§ÇØ
    int        LastMoveIndex;
    CNode *    LastMoveNode;

public:
    Type    PGetItems(int Index);
    Type *    PGetItemsPtr(int Index);
    int        PGetCount (void);

private:
    void *    FMoveIndex (int i);
    void    FResetLastMoveIndex();
    void    FDeleteNode(CNode *Node);
};


//-----------------------------------------------------------------------------
// Construction
//-----------------------------------------------------------------------------
template <class Type>
inline wTemplateList::wTemplateList (void) : m_pHead(0), m_pTail(0), m_pCrnt(0), m_nCount(0)
{
    FResetLastMoveIndex();
}


//-----------------------------------------------------------------------------
// Destruction
//-----------------------------------------------------------------------------
template <class Type>
inline wTemplateList::~wTemplateList (void)
{
    Clear();
}


//-----------------------------------------------------------------------------
// Add()
//-----------------------------------------------------------------------------
template <class Type>
inline void wTemplateList::Add (Type tData)
{
    CNode * pNode = new CNode;
    pNode->tData = tData;
    m_nCount++;

    if (m_pHead)
    {
        m_pTail->pNext = pNode;
        pNode->pPrev   = m_pTail;
        m_pTail           = pNode;
    }
    else
    {
        m_pHead = pNode;
        m_pTail = pNode;
    }
}




//-----------------------------------------------------------------------------
// Extract() - ÇØ´ç À妽º¸¦ »èÁ¦ÇÔ°ú µ¿½Ã¿¡ °ªÀ» ¸®ÅÏ
//-----------------------------------------------------------------------------
template <class Type>
inline Type wTemplateList::Extract (int i)
{
    CNode *pNode = (CNode *)FMoveIndex(i);

    extractData = pNode->tData;

    FDeleteNode(pNode);
    FResetLastMoveIndex();

    return extractData;
}


//-----------------------------------------------------------------------------
// Delete() - ÇØ´ç À妽º¸¦ »èÁ¦
//-----------------------------------------------------------------------------
template <class Type>
inline BOOL wTemplateList::Delete (int i)
{
    CNode *pNode = (CNode *)FMoveIndex(i);

    if (!pNode)
        return FALSE;

    FDeleteNode(pNode);

    FResetLastMoveIndex();
    return TRUE;
}


//-----------------------------------------------------------------------------
// FResetLastMoveIndex() - ¸¶Áö¸· °Ë»ö À妽º¸¦ ÃʱâÈ­ ÇÑ´Ù
//-----------------------------------------------------------------------------
template <class Type>
inline void wTemplateList::FResetLastMoveIndex()
{
    LastMoveIndex = -2;
    LastMoveNode = NULL;
}


//-----------------------------------------------------------------------------
// FDeleteNode() - ƯÁ¤ ³ëµåÀÇ »èÁ¦
//-----------------------------------------------------------------------------
template <class Type>
inline void wTemplateList::FDeleteNode (CNode *pNode)
{
    CNode * pPrev = pNode->pPrev;
    CNode * pNext = pNode->pNext;

    // ÀÌÀüÀÇ ´ÙÀ½Àº ´ÙÀ½²¨
    if (pPrev)
        pPrev->pNext = pNext;

    // ´ÙÀ½ÀÇ ÀÌÀüÀº ÀÌÀü²¨
    if (pNext)
        pNext->pPrev = pPrev;

    // ÀÌÀüÀÌ ¾ø´Ù¸é Çìµå´Â ´ÙÀ½²¨
    if (!pPrev)
        m_pHead = pNext;

    // ´ÙÀ½ÀÌ ¾ø´Ù¸é ²¿¸®´Â ÀÌÀü²¨
    if (!pNext)
        m_pTail = pPrev;

    delete pNode;
    m_nCount--;
}


//-----------------------------------------------------------------------------
// FMoveIndex() - À妽º À̵¿
//-----------------------------------------------------------------------------
template <class Type>
inline void * wTemplateList::FMoveIndex (int i)
{
    int Count = 0;

    // °¡Àå ¸¹ÀÌ ¾²ÀÌ´Â ´ÙÀ½ À妽º¸¦ ¿äû½Ã
    if (LastMoveIndex + 1 == i)
    {
        LastMoveIndex++;
        LastMoveNode = LastMoveNode->pNext;
        return LastMoveNode;
    }

    // ÀÌÀü À妽º¸¦ ¿äû½Ã
    if (LastMoveIndex - 1 == i)
    {
        LastMoveIndex--;
        LastMoveNode = LastMoveNode->pPrev;
        return LastMoveNode;
    }

    // °°Àº À妽º¸¦ ¿äû½Ã
    if (LastMoveIndex == i)
        return LastMoveNode;


    for (CNode * pNode = m_pHead; pNode;)
    {
        if (Count == i)
        {
            LastMoveNode = pNode;
            LastMoveIndex = i;
            return pNode;
        }

        Count++;
        pNode = pNode->pNext;
    }

    return NULL;
}


//-----------------------------------------------------------------------------
// Clear()
//-----------------------------------------------------------------------------
template <class Type>
inline void wTemplateList::Clear (void)
{
    CNode * pTemp;

    for (CNode * pNode = m_pHead ; pNode; pNode = pTemp)
    {
        pTemp = pNode->pNext;
        if (pNode)
        {
            delete pNode;
            pNode = 0;
        }
    }

    m_nCount = 0;
    m_pHead = 0;
    m_pTail = 0;
}


//-----------------------------------------------------------------------------
// DeleteNode() - MoveHead. MoveNext µî¿¡¼­ À̵¿ ÈÄ ÇöÀçÀÇ ³ëµå¸¦ »èÁ¦½Ã »ç¿ë
//-----------------------------------------------------------------------------
template <class Type>
inline void wTemplateList::DeleteNode()
{
    CNode *Node = m_pCrnt->pPrev;

    FDeleteNode(m_pCrnt);

    m_pCrnt = Node;
}


//-----------------------------------------------------------------------------
// MoveHead()
//-----------------------------------------------------------------------------
template <class Type>
inline Type *wTemplateList::MoveHead (void)
{
    m_pCrnt = m_pHead;

    return (Type *)m_pCrnt;
}


//-----------------------------------------------------------------------------
// MoveTail()
//-----------------------------------------------------------------------------
template <class Type>
inline Type *wTemplateList::MoveTail (void)
{
    m_pCrnt = m_pTail;
    return (Type *)m_pCrnt;
}


//-----------------------------------------------------------------------------
// MoveNext()
//-----------------------------------------------------------------------------
template <class Type>
inline Type *wTemplateList::MoveNext (void)
{
    if (m_pCrnt)
    {
        m_pCrnt = m_pCrnt->pNext;
        return (Type *)m_pCrnt;
    }

    return NULL;
}


//-----------------------------------------------------------------------------
// MovePrev()
//-----------------------------------------------------------------------------
template <class Type>
inline Type *wTemplateList::MovePrev (void)
{
    if (m_pCrnt)
    {
        m_pCrnt = m_pCrnt->pPrev;
        return (Type *)m_pCrnt;
    }

    return NULL;
}


//-----------------------------------------------------------------------------
// GetNode()
//-----------------------------------------------------------------------------
template <class Type>
inline Type *wTemplateList::GetNode (void)
{
    return (Type *)m_pCrnt;
}


//-----------------------------------------------------------------------------
// PGetItems - Items[] ÇÁ·ÎÆÛƼ¿¡ ÀÇÇØ È£ÃâµÇ´Â ÇÔ¼ö
//-----------------------------------------------------------------------------
template <class Type>
inline Type  wTemplateList::PGetItems(int Index)
{
    CNode *pNode = (CNode *)FMoveIndex(Index);

    if (!pNode)
        return FALSE;

    return pNode->tData;
}


//-----------------------------------------------------------------------------
// PGetItemsPtr - ItemsPtr[] ÇÁ·ÎÆÛƼ¿¡ ÀÇÇØ È£ÃâµÇ´Â ÇÔ¼ö
//-----------------------------------------------------------------------------
template <class Type>
inline Type * wTemplateList::PGetItemsPtr(int Index)
{
    CNode *pNode = (CNode *)FMoveIndex(Index);

    if (!pNode)
        return FALSE;

    return (Type *)pNode; //->tData;
}


//-----------------------------------------------------------------------------
// PGetCount() - Count ÇÁ·ÎÆÛƼ¿¡ ÀÇ ÇØ È£Ãâ
//-----------------------------------------------------------------------------
template <class Type>
inline int wTemplateList::PGetCount (void)
{
    return m_nCount;
}



#endif

World of World. http://cpueblo.com by À¯±¤Èñ. mail to cpueblocpueblo.com