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

📄 wmlunorderedset.inl

📁 3D Game Engine Design Source Code非常棒
💻 INL
字号:
// Magic Software, Inc.
// http://www.magic-software.com
// http://www.wild-magic.com
// Copyright (c) 2003.  All Rights Reserved
//
// The Wild Magic Library (WML) source code is supplied under the terms of
// the license agreement http://www.magic-software.com/License/WildMagic.pdf
// and may not be copied or disclosed except in accordance with the terms of
// that agreement.

//----------------------------------------------------------------------------
template <class T>
UnorderedSet<T>::UnorderedSet (int iMaxQuantity, int iGrow)
{
    if ( iMaxQuantity == 0 )
        iMaxQuantity = DEFAULT_GROW;

    if ( iGrow == 0 )
        iGrow = DEFAULT_GROW;

    m_iQuantity = 0;
    m_iMaxQuantity = iMaxQuantity;
    m_iGrow = iGrow;
    m_atElement = new T[m_iMaxQuantity];
}
//----------------------------------------------------------------------------
template <class T>
UnorderedSet<T>::UnorderedSet (const UnorderedSet& rkSet)
{
    m_atElement = NULL;
    *this = rkSet;
}
//----------------------------------------------------------------------------
template <class T>
UnorderedSet<T>::~UnorderedSet ()
{
    delete[] m_atElement;
}
//----------------------------------------------------------------------------
template <class T>
void UnorderedSet<T>::Clear ()
{
    m_iQuantity = 0;
}
//----------------------------------------------------------------------------
template <class T>
void UnorderedSet<T>::Reset (int iMaxQuantity, int iGrow)
{
    delete[] m_atElement;

    if ( iMaxQuantity == 0 )
        iMaxQuantity = DEFAULT_GROW;

    if ( iGrow == 0 )
        iGrow = DEFAULT_GROW;

    m_iQuantity = 0;
    m_iMaxQuantity = iMaxQuantity;
    m_iGrow = iGrow;
    m_atElement = new T[m_iMaxQuantity];
}
//----------------------------------------------------------------------------
template <class T>
UnorderedSet<T>& UnorderedSet<T>::operator= (const UnorderedSet& rkSet)
{
    m_iQuantity = rkSet.m_iQuantity;
    m_iMaxQuantity = rkSet.m_iMaxQuantity;
    m_iGrow = rkSet.m_iGrow;
    delete[] m_atElement;
    m_atElement = new T[m_iMaxQuantity];
    for (int i = 0; i < m_iMaxQuantity; i++)
        m_atElement[i] = rkSet.m_atElement[i];

    return *this;
}
//----------------------------------------------------------------------------
template <class T>
int UnorderedSet<T>::GetMaxQuantity () const
{
    return m_iMaxQuantity;
}
//----------------------------------------------------------------------------
template <class T>
int UnorderedSet<T>::GetGrow () const
{
    return m_iGrow;
}
//----------------------------------------------------------------------------
template <class T>
int UnorderedSet<T>::GetQuantity () const
{
    return m_iQuantity;
}
//----------------------------------------------------------------------------
template <class T>
const T& UnorderedSet<T>::Get (int i) const
{
    assert( 0 <= i && i < m_iQuantity );
    return m_atElement[i];
}
//----------------------------------------------------------------------------
template <class T>
T& UnorderedSet<T>::operator[] (int i)
{
    assert( 0 <= i && i < m_iQuantity );
    return m_atElement[i];
}
//----------------------------------------------------------------------------
template <class T>
bool UnorderedSet<T>::Exists (const T& rtElement) const
{
    for (int i = 0; i < m_iQuantity; i++)
    {
        if ( rtElement == m_atElement[i] )
            return true;
    }

    return false;
}
//----------------------------------------------------------------------------
template <class T>
bool UnorderedSet<T>::Insert (const T& rtElement)
{
    int i;
    for (i = 0; i < m_iQuantity; i++)
    {
        if ( rtElement == m_atElement[i] )
            return false;
    }

    if ( m_iQuantity == m_iMaxQuantity )
    {
        int iNewMaxQuantity = m_iMaxQuantity + m_iGrow;
        T* atNewElement = new T[iNewMaxQuantity];
        for (i = 0; i < m_iMaxQuantity; i++)
            atNewElement[i] = m_atElement[i];
        delete[] m_atElement;
        m_iMaxQuantity = iNewMaxQuantity;
        m_atElement = atNewElement;
    }

    m_atElement[m_iQuantity++] = rtElement;
    return true;
}
//----------------------------------------------------------------------------
template <class T>
int UnorderedSet<T>::Append (const T& rtElement)
{
    if ( m_iQuantity == m_iMaxQuantity )
    {
        int iNewMaxQuantity = m_iMaxQuantity + m_iGrow;
        T* atNewElement = new T[iNewMaxQuantity];
        for (int i = 0; i < m_iMaxQuantity; i++)
            atNewElement[i] = m_atElement[i];
        delete[] m_atElement;
        m_iMaxQuantity = iNewMaxQuantity;
        m_atElement = atNewElement;
    }

    int iLocation = m_iQuantity++;
    m_atElement[iLocation] = rtElement;
    return iLocation;
}
//----------------------------------------------------------------------------
template <class T>
bool UnorderedSet<T>::Remove (const T& rtElement, int* piOld, int* piNew)
{
    for (int i = 0; i < m_iQuantity; i++)
    {
        if ( rtElement == m_atElement[i] )
        {
            m_iQuantity--;
            if ( piOld )
                *piOld = m_iQuantity;

            if ( i != m_iQuantity )
            {
                m_atElement[i] = m_atElement[m_iQuantity];
                if ( piNew )
                    *piNew = i;
            }
            else
            {
                if ( piNew )
                    *piNew = -1;
            }
            return true;
        }
    }

    return false;
}
//----------------------------------------------------------------------------
template <class T>
bool UnorderedSet<T>::RemoveAt (int i, int* piOld, int* piNew)
{
    if ( 0 <= i && i < m_iQuantity )
    {
        m_iQuantity--;
        if ( piOld )
            *piOld = m_iQuantity;

        if ( i != m_iQuantity )
        {
            m_atElement[i] = m_atElement[m_iQuantity];
            if ( piNew )
                *piNew = i;
        }
        else
        {
            if ( piNew )
                *piNew = -1;
        }
        return true;
    }

    return false;
}
//----------------------------------------------------------------------------
template <class T>
void UnorderedSet<T>::Compactify ()
{
    if ( m_iQuantity > 0 )
    {
        T* atNewElement = new T[m_iQuantity];
        for (int i = 0; i < m_iQuantity; i++)
            atNewElement[i] = m_atElement[i];
        delete[] m_atElement;
        m_iMaxQuantity = m_iQuantity;
        m_atElement = atNewElement;
    }
    else
    {
        m_iQuantity = 0;
        m_iMaxQuantity = DEFAULT_GROW;
        m_iGrow = DEFAULT_GROW;
        delete[] m_atElement;
        m_atElement = new int[m_iMaxQuantity];
    }
}
//----------------------------------------------------------------------------

⌨️ 快捷键说明

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