DragonNest/Common/Utility/BitSetEx1.hpp

337 lines
9.7 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
/*//===============================================================
<< BIT SET EX (1) >>
PRGM : B4nFter
FILE : BITSETEX1.HPP
DESC : <EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, ũ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD>ӵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
INIT BUILT DATE : 2004. 06. 06
LAST BUILT DATE : 2008. 05. 20
Copyright<EFBFBD><EFBFBD> 2002~2009 B4nFter (b4nfter@gmail.com) and Co-Writers. All Rights Reserved.
P.S.>
- <EFBFBD>Ϲ<EFBFBD> <EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Ʈ <EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> (<EFBFBD>޼<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
- TTYPE Ÿ<EFBFBD>Ը<EFBFBD>ŭ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ѵ<EFBFBD> ũ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ܼ<EFBFBD>ȭ<EFBFBD>Ǿ<EFBFBD> <EFBFBD>ӵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*///===============================================================
#pragma once
///////////////////////////////////////////////////////////////////
// INCLUDE
///////////////////////////////////////////////////////////////////
#include "COMMONMACROS.H"
#include "BASESET.H"
#include "DEBUGUTIL.H"
#include "SAFESTRINGMACROS.H"
///////////////////////////////////////////////////////////////////
// DEFINE
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
// DECLARATION
///////////////////////////////////////////////////////////////////
//*---------------------------------------------------------------
// TYPE : CLASS
// NAME : CBitSetEx1
//*---------------------------------------------------------------
// DESC : <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>, ũ<><C5A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD>)
// PRGM : B4nFter
//*---------------------------------------------------------------
template<INT TMAX, class TTYPE>
class CBitSetEx1
{
public:
typedef TTYPE TP_TYPE;
public:
explicit CBitSetEx1(TTYPE pBitSet = static_cast<TTYPE>(0));
// <20><>Ʈ <20><><EFBFBD><EFBFBD> <20>޼<EFBFBD><DEBC><EFBFBD>
BOOL Get(ULONG pBitPos);
BOOL IsSet() const;
VOID Set(ULONG pBitPos, BOOL pBitVal);
VOID SetAll(BOOL pBitVal);
UINT GetMax() const { return TMAX; }
UINT GetBitSize() const { return sizeof(TP_TYPE)*CHAR_BIT; }
// <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20>޼<EFBFBD><DEBC><EFBFBD> (<28>÷α<C3B7><CEB1><EFBFBD> <20><><EFBFBD>۰<EFBFBD><DBB0><EFBFBD> 1<><31><EFBFBD><EFBFBD> <20>̾<EFBFBD><CCBE><EFBFBD> <20><>)
BOOL IsSet(TTYPE pBitSet) const;
BOOL IsReset(TTYPE pBitSet) const;
BOOL IsSetOther(TTYPE pBitSet) const; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD> SET <20><><EFBFBD><EFBFBD>
VOID Set(TTYPE pBitSet);
VOID Set();
VOID Reset(TTYPE pBitSet);
VOID Reset();
TP_TYPE GetRaw() const;
BOOL operator[](ULONG pBitPos);
private:
TTYPE m_BitSet;
};
///////////////////////////////////////////////////////////////////
// IMPLEMENTATION
///////////////////////////////////////////////////////////////////
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CBitSetEx1::CBitSetEx1
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD>ʿ<EFBFBD>)
// PARM : 1 . init size
// 2 . init value
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<INT TMAX, class TTYPE>
inline CBitSetEx1<TMAX, TTYPE>::CBitSetEx1(TTYPE pBitSet) : m_BitSet(pBitSet)
{
DN_ASSERT(!CDebugUtil::IsOverflow(static_cast<TTYPE>(0), static_cast<TTYPE>(TMAX)), "Overflow!");
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CBitSetEx1::Get
//*---------------------------------------------------------------
// DESC : Ư<><C6AF> <20><>ġ<EFBFBD><C4A1> <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : Ư<><C6AF> <20><>ġ<EFBFBD><C4A1> <20><>Ʈ<EFBFBD><C6AE> <20><> (0/1)
// PRGM : B4nFter
//*---------------------------------------------------------------
template<INT TMAX, class TTYPE>
inline BOOL CBitSetEx1<TMAX, TTYPE>::Get(ULONG pBitPos)
{
if (!CHECK_LIMIT(pBitPos, GetBitSize())) {
DN_RETURN(FALSE);
}
return (m_BitSet >> pBitPos) & 1;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CBitSetEx1::IsSet
//*---------------------------------------------------------------
// DESC : <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 0 <20><> <20>ƴ<EFBFBD><C6B4><EFBFBD> üũ
// PARM : N/A
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
template<INT TMAX, class TTYPE>
inline BOOL CBitSetEx1<TMAX, TTYPE>::IsSet() const
{
return (0 != m_BitSet);
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CBitSetEx1::IsSet
//*---------------------------------------------------------------
// DESC : <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ư<><C6AF> <20><>Ʈ<EFBFBD><C6AE> 0 <20><> <20>ƴ<EFBFBD><C6B4><EFBFBD> üũ
// PARM : 1 . pBitSet - Ư<><C6AF> <20><>
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
template<INT TMAX, class TTYPE>
inline BOOL CBitSetEx1<TMAX, TTYPE>::IsSet(TTYPE pBitSet) const
{
DN_ASSERT((0 != pBitSet) && (pBitSet <= TMAX), "Invalid!");
return (0 != (pBitSet & m_BitSet));
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CBitSetEx1::IsReset
//*---------------------------------------------------------------
// DESC : <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ư<><C6AF> <20><>Ʈ<EFBFBD><C6AE> 0 <20><><EFBFBD><EFBFBD> üũ
// PARM : 1 . pBitSet - Ư<><C6AF> <20><>
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
template<INT TMAX, class TTYPE>
inline BOOL CBitSetEx1<TMAX, TTYPE>::IsReset(TTYPE pBitSet) const
{
DN_ASSERT((0 != pBitSet) && (pBitSet <= TMAX), "Invalid!");
return (0 == (pBitSet & m_BitSet));
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CBitSetEx1::IsSetOther
//*---------------------------------------------------------------
// DESC : <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ư<><C6AF> <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 0 <20><> <20>ƴ<EFBFBD><C6B4><EFBFBD> üũ
// PARM : 1 . pBitSet - Ư<><C6AF> <20><>
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
template<INT TMAX, class TTYPE>
inline BOOL CBitSetEx1<TMAX, TTYPE>::IsSetOther(TTYPE pBitSet) const
{
DN_ASSERT((0 != pBitSet) && (pBitSet <= TMAX), "Invalid!");
return (0 != ((~pBitSet) & m_BitSet));
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CBitSetEx1::Set
//*---------------------------------------------------------------
// DESC : <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> Ư<><C6AF> <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>
// PARM : 1 . pBitSet - Ư<><C6AF> <20><>
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<INT TMAX, class TTYPE>
inline VOID CBitSetEx1<TMAX, TTYPE>::Set(TTYPE pBitSet)
{
DN_ASSERT((0 != pBitSet) && (pBitSet <= TMAX), "Invalid!");
m_BitSet |= (pBitSet);
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CBitSetEx1::Set
//*---------------------------------------------------------------
// DESC : <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> 1 <20><> <20><><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<INT TMAX, class TTYPE>
inline VOID CBitSetEx1<TMAX, TTYPE>::Set()
{
SetAll(1);
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CBitSetEx1::Set
//*---------------------------------------------------------------
// DESC : Ư<><C6AF> <20><>ġ<EFBFBD><C4A1> <20><>Ʈ<EFBFBD><C6AE> Ư<><C6AF> <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>
// PARM : 1 . pBitPos - <20><>Ʈ <20><>ġ
// 2 . pBitVal - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD><C6AE>
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<INT TMAX, class TTYPE>
inline VOID CBitSetEx1<TMAX, TTYPE>::Set(ULONG pBitPos, BOOL pBitVal)
{
if (!CHECK_LIMIT(pBitPos, GetBitSize())) {
DN_ASSERT(0, "Invalid!");
return;
}
if (pBitVal) {
m_BitSet |= (static_cast<TTYPE>(1) << pBitPos);
}
else {
m_BitSet &= (~(static_cast<TTYPE>(1) << pBitPos));
}
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CBitSetEx1::SetAll
//*---------------------------------------------------------------
// DESC : <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> Ư<><C6AF> <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<INT TMAX, class TTYPE>
inline VOID CBitSetEx1<TMAX, TTYPE>::SetAll(BOOL pBitVal)
{
if (pBitVal) {
::memset(&m_BitSet, 0xFF, sizeof(m_BitSet));
}
else {
::memset(&m_BitSet, 0x00, sizeof(m_BitSet));
}
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CBitSetEx1::Reset
//*---------------------------------------------------------------
// DESC : <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<INT TMAX, class TTYPE>
VOID CBitSetEx1<TMAX, TTYPE>::Reset()
{
m_BitSet = static_cast<TTYPE>(0);
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CBitSetEx1::Reset
//*---------------------------------------------------------------
// DESC : <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ư<><C6AF> <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ݴ<EFBFBD><DDB4><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM :
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<INT TMAX, class TTYPE>
VOID CBitSetEx1<TMAX, TTYPE>::Reset(TTYPE pBitSet)
{
DN_ASSERT((0 != pBitSet) && (pBitSet <= TMAX), "Invalid!");
m_BitSet &= ~(pBitSet);
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CBitSetEx1::GetRaw
//*---------------------------------------------------------------
// DESC : <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : TTYPE Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
// PRGM : B4nFter
//*---------------------------------------------------------------
template<INT TMAX, class TTYPE>
typename CBitSetEx1<TMAX, TTYPE>::TP_TYPE CBitSetEx1<TMAX, TTYPE>::GetRaw() const
{
return m_BitSet;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CBitSetEx1::operator[]
//*---------------------------------------------------------------
// DESC : Ư<><C6AF> <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : Ư<><C6AF> <20><>Ʈ<EFBFBD><C6AE> <20><>
// PRGM : B4nFter
//*---------------------------------------------------------------
template<INT TMAX, class TTYPE>
inline BOOL CBitSetEx1<TMAX, TTYPE>::operator[](ULONG pBitPos)
{
return Get(pBitPos);
}