/*//=============================================================== << BIT SET EX (1) >> PRGM : B4nFter FILE : BITSETEX1.HPP DESC : ºñÆ®ÁýÇÕ Å¬·¡½º ±¸Çö (Á¤Àû, Å©±âÁ¦ÇÑ, ¼Óµµºü¸§) INIT BUILT DATE : 2004. 06. 06 LAST BUILT DATE : 2008. 05. 20 Copyright¨Ï 2002~2009 B4nFter (b4nfter@gmail.com) and Co-Writers. All Rights Reserved. P.S.> - ÀÏ¹Ý ºñÆ®¿¬»ê°ú ºñÆ® Ç÷¡±× ¿¬»êÀ» µ¿½Ã¿¡ Áö¿øÇϵµ·Ï µðÀÚÀÎ µÊ (¸Þ¼­µå ±¸ºÐÀº Ŭ·¡½º ¼±¾ð ÂüÁ¶) - TTYPE ŸÀÔ¸¸Å­ÀÇ Á¦ÇÑµÈ Å©±â¸¦ °¡Áö´Â ´ë½Å ¿¬»êÀÌ ´Ü¼øÈ­µÇ¾î ¼Óµµ ºü¸§ *///=============================================================== #pragma once /////////////////////////////////////////////////////////////////// // INCLUDE /////////////////////////////////////////////////////////////////// #include "COMMONMACROS.H" #include "BASESET.H" #include "DEBUGUTIL.H" #include "SAFESTRINGMACROS.H" /////////////////////////////////////////////////////////////////// // DEFINE /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // DECLARATION /////////////////////////////////////////////////////////////////// //*--------------------------------------------------------------- // TYPE : CLASS // NAME : CBitSetEx1 //*--------------------------------------------------------------- // DESC : ºñÆ®ÁýÇÕ Å¬·¡½º (Á¤Àû, Å©±âÁ¦ÇÑ, ¼Óµµºü¸§) // PRGM : B4nFter //*--------------------------------------------------------------- template class CBitSetEx1 { public: typedef TTYPE TP_TYPE; public: explicit CBitSetEx1(TTYPE pBitSet = static_cast(0)); // ºñÆ® ¿¬»ê ¸Þ¼­µå 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; } // Ç÷¡±× ¿¬»ê ¸Þ¼­µå (Ç÷α×ÀÇ ½ÃÀÛ°ªÀÌ 1ºÎÅÍ À̾î¾ß ÇÔ) BOOL IsSet(TTYPE pBitSet) const; BOOL IsReset(TTYPE pBitSet) const; BOOL IsSetOther(TTYPE pBitSet) const; // ÁöÁ¤µÈ Ç÷¡±× ¿ÜÀÇ Ç÷¡±× µéÀÇ SET ¿©ºÎ 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 : »ý¼ºÀÚ (ÀÎÀÚÇÊ¿ä) // PARM : 1 . init size // 2 . init value // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template inline CBitSetEx1::CBitSetEx1(TTYPE pBitSet) : m_BitSet(pBitSet) { DN_ASSERT(!CDebugUtil::IsOverflow(static_cast(0), static_cast(TMAX)), "Overflow!"); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CBitSetEx1::Get //*--------------------------------------------------------------- // DESC : ƯÁ¤ À§Ä¡ÀÇ ºñÆ®ÀÇ °ªÀ» ¾òÀ½ // PARM : N/A // RETV : ƯÁ¤ À§Ä¡ÀÇ ºñÆ®ÀÇ °ª (0/1) // PRGM : B4nFter //*--------------------------------------------------------------- template inline BOOL CBitSetEx1::Get(ULONG pBitPos) { if (!CHECK_LIMIT(pBitPos, GetBitSize())) { DN_RETURN(FALSE); } return (m_BitSet >> pBitPos) & 1; } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CBitSetEx1::IsSet //*--------------------------------------------------------------- // DESC : ºñÆ®ÁýÇÕÀÇ °ªÀÌ 0 ÀÌ ¾Æ´ÑÁö üũ // PARM : N/A // RETV : TRUE - ¼º°ø / FALSE - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- template inline BOOL CBitSetEx1::IsSet() const { return (0 != m_BitSet); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CBitSetEx1::IsSet //*--------------------------------------------------------------- // DESC : ºñÆ®ÁýÇÕÀÇ Æ¯Á¤ ºñÆ®°¡ 0 ÀÌ ¾Æ´ÑÁö üũ // PARM : 1 . pBitSet - ƯÁ¤ °ª // RETV : TRUE - ¼º°ø / FALSE - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- template inline BOOL CBitSetEx1::IsSet(TTYPE pBitSet) const { DN_ASSERT((0 != pBitSet) && (pBitSet <= TMAX), "Invalid!"); return (0 != (pBitSet & m_BitSet)); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CBitSetEx1::IsReset //*--------------------------------------------------------------- // DESC : ºñÆ®ÁýÇÕÀÇ Æ¯Á¤ ºñÆ®°¡ 0 ÀÎÁö üũ // PARM : 1 . pBitSet - ƯÁ¤ °ª // RETV : TRUE - ¼º°ø / FALSE - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- template inline BOOL CBitSetEx1::IsReset(TTYPE pBitSet) const { DN_ASSERT((0 != pBitSet) && (pBitSet <= TMAX), "Invalid!"); return (0 == (pBitSet & m_BitSet)); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CBitSetEx1::IsSetOther //*--------------------------------------------------------------- // DESC : ºñÆ®ÁýÇÕÀÇ Æ¯Á¤ ºñÆ®¸¦ Á¦¿ÜÇÑ ³ª¸ÓÁö °ªÀÌ 0 ÀÌ ¾Æ´ÑÁö üũ // PARM : 1 . pBitSet - ƯÁ¤ °ª // RETV : TRUE - ¼º°ø / FALSE - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- template inline BOOL CBitSetEx1::IsSetOther(TTYPE pBitSet) const { DN_ASSERT((0 != pBitSet) && (pBitSet <= TMAX), "Invalid!"); return (0 != ((~pBitSet) & m_BitSet)); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CBitSetEx1::Set //*--------------------------------------------------------------- // DESC : ºñÆ®ÁýÇÕ Àüü¸¦ ƯÁ¤ ºñÆ®·Î ¼¼ÆÃ // PARM : 1 . pBitSet - ƯÁ¤ °ª // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template inline VOID CBitSetEx1::Set(TTYPE pBitSet) { DN_ASSERT((0 != pBitSet) && (pBitSet <= TMAX), "Invalid!"); m_BitSet |= (pBitSet); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CBitSetEx1::Set //*--------------------------------------------------------------- // DESC : ºñÆ®ÁýÇÕ Àüü¸¦ 1 ·Î ¼¼ÆÃ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template inline VOID CBitSetEx1::Set() { SetAll(1); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CBitSetEx1::Set //*--------------------------------------------------------------- // DESC : ƯÁ¤ À§Ä¡ÀÇ ºñÆ®¸¦ ƯÁ¤ ºñÆ®·Î ÁöÁ¤ // PARM : 1 . pBitPos - ºñÆ® À§Ä¡ // 2 . pBitVal - ÁöÁ¤ÇÒ ºñÆ®°ª // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template inline VOID CBitSetEx1::Set(ULONG pBitPos, BOOL pBitVal) { if (!CHECK_LIMIT(pBitPos, GetBitSize())) { DN_ASSERT(0, "Invalid!"); return; } if (pBitVal) { m_BitSet |= (static_cast(1) << pBitPos); } else { m_BitSet &= (~(static_cast(1) << pBitPos)); } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CBitSetEx1::SetAll //*--------------------------------------------------------------- // DESC : ºñÆ®ÁýÇÕ Àüü¸¦ ƯÁ¤ ºñÆ®·Î ¼¼ÆÃ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template inline VOID CBitSetEx1::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 : ºñÆ®ÁýÇÕÀ» ÃʱâÈ­ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template VOID CBitSetEx1::Reset() { m_BitSet = static_cast(0); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CBitSetEx1::Reset //*--------------------------------------------------------------- // DESC : ºñÆ®ÁýÇÕÀ» ƯÁ¤ ºñÆ®ÁýÇÕÀÇ °ª°ú ¹Ý´ë·Î ¼¼ÆÃ // PARM : // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template VOID CBitSetEx1::Reset(TTYPE pBitSet) { DN_ASSERT((0 != pBitSet) && (pBitSet <= TMAX), "Invalid!"); m_BitSet &= ~(pBitSet); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CBitSetEx1::GetRaw //*--------------------------------------------------------------- // DESC : ºñÆ®ÁýÇÕÀÇ ½ÇÁ¦ °ªÀ» ¾òÀ½ // PARM : N/A // RETV : TTYPE ŸÀÔÀÇ ½ÇÁ¦ °ª // PRGM : B4nFter //*--------------------------------------------------------------- template typename CBitSetEx1::TP_TYPE CBitSetEx1::GetRaw() const { return m_BitSet; } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CBitSetEx1::operator[] //*--------------------------------------------------------------- // DESC : ƯÁ¤ ºñÆ®ÀÇ °ªÀ» ¾òÀ½ // PARM : N/A // RETV : ƯÁ¤ ºñÆ®ÀÇ °ª // PRGM : B4nFter //*--------------------------------------------------------------- template inline BOOL CBitSetEx1::operator[](ULONG pBitPos) { return Get(pBitPos); }