1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     ut_Flag.h
4 
5   Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Revision: 18106 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NW_UT_FLAG_H_
17 #define NW_UT_FLAG_H_
18 
19 #include <nw/types.h>
20 
21 #define NW_FLAG_DECLARE(mflag, mbit)    \
22     FLAG_##mflag##_SHIFT = (mbit),      \
23     FLAG_##mflag = 0x1 << (mbit)
24 
25 #define NW_FLAG_VALUE_DECLARE(mflag, mbit, msize)   \
26     FLAG_##mflag##_VALUE_SHIFT = (mbit),            \
27     FLAG_##mflag##_VALUE_MASK = (((0x1UL << (msize)) - 0x1) << (mbit))
28 
29 //#define NW_GET_FLAG_VALUE(MFLAGS, MNAME) \
30 //    GetFlagValue((MFLAGS), (FLAG_##MNAME##_VALUE_SHIFT), (FLAG_##MNAME##_VALUE_MASK))
31 
32 namespace nw {
33 namespace ut {
34 
35 //----------------------------------------
36 //! @name フラグ操作関連
37 //@{
38 
39 //---------------------------------------------------------------------------
40 //! @brief        ビットフィールドの指定のマスクのビットが全て真かチェックします。
41 //!
42 //! @tparam       flags   現在のビットフィールドです。
43 //! @tparam       mask    チェックに用いるマスクです。
44 //---------------------------------------------------------------------------
45 template<typename TFlags, typename TMask>
46 NW_INLINE bool
CheckFlag(const TFlags & flags,const TMask & mask)47 CheckFlag(const TFlags& flags, const TMask& mask)
48 {
49     //NW_STATIC_ASSERT(!ut::IsPointer(TValue));
50     return (flags & static_cast<TFlags>(mask)) == static_cast<TFlags>(mask);
51 }
52 
53 //---------------------------------------------------------------------------
54 //! @brief        ビットフィールドの指定のマスクのビットのいずれかが真かチェックします。
55 //!
56 //! @tparam       flags   現在のビットフィールドです。
57 //! @tparam       mask    チェックに用いるマスクです。
58 //---------------------------------------------------------------------------
59 template<typename TFlags, typename TMask>
60 NW_INLINE bool
CheckFlagOr(const TFlags & flags,const TMask & mask)61 CheckFlagOr(const TFlags& flags, const TMask& mask)
62 {
63     //NW_STATIC_ASSERT(!ut::IsPointer(TValue));
64     return (flags & static_cast<TFlags>(mask)) != 0;
65 }
66 
67 //---------------------------------------------------------------------------
68 //! @brief        ビットフィールドの指定のビット値を真にします。
69 //!
70 //! @tparam       flags   現在のビットフィールドです。
71 //! @tparam       value   真にしたいビット値です。
72 //---------------------------------------------------------------------------
73 template<typename TFlags, typename TValue>
74 NW_INLINE TFlags
EnableFlag(const TFlags & flags,const TValue & value)75 EnableFlag(const TFlags& flags, const TValue& value)
76 {
77     return flags | static_cast<TFlags>(value);
78 }
79 
80 //---------------------------------------------------------------------------
81 //! @brief        ビットフィールドの指定のビット値を偽にします。
82 //!
83 //! @tparam       flags   現在のビットフィールドです。
84 //! @tparam       value   偽にしたいビット値です。
85 //---------------------------------------------------------------------------
86 template<typename TFlags, typename TValue>
87 NW_INLINE TFlags
DisableFlag(const TFlags & flags,const TValue & value)88 DisableFlag(const TFlags& flags, const TValue& value)
89 {
90     return flags & ~(static_cast<TFlags>(value));
91 }
92 
93 //---------------------------------------------------------------------------
94 //! @brief        ビットフィールドの指定のマスクのビット値を取得します。
95 //!
96 //! @param[in]   flags   現在のビットフィールドです。
97 //! @param[in]   shift   取得に用いるビットシフトです。
98 //! @param[in]   mask    取得に用いるマスクです。
99 //!
100 //! @return 指定のマスクのビット値を返します。
101 //---------------------------------------------------------------------------
102 template<typename TResult, typename TFlags, typename TMask>
103 NW_INLINE TResult
GetFlagValue(const TFlags & flags,int shift,const TMask & mask)104 GetFlagValue(const TFlags& flags, int shift, const TMask& mask)
105 {
106     return static_cast<TResult>((flags & static_cast<TFlags>(mask)) >> shift);
107 }
108 
109 //---------------------------------------------------------------------------
110 //! @brief        ビットフィールドの指定のマスクのビット値を設定します。
111 //!
112 //! @param[in]  flags   現在のビットフィールドです。
113 //! @param[in]  shift   設定に用いるビットシフトです。
114 //! @param[in]  mask    設定に用いるマスクです。
115 //! @param[in]  value   設定したいビット値です。
116 //!
117 //! @return ビット値をセットしたフラグの値を返します。
118 //---------------------------------------------------------------------------
119 template<typename TFlags, typename TMask, typename TValue>
120 NW_INLINE TFlags
SetFlagValue(const TFlags & flags,int shift,const TMask & mask,const TValue & value)121 SetFlagValue(const TFlags& flags, int shift, const TMask& mask, const TValue& value)
122 {
123     return (flags & ~(static_cast<TFlags>(mask))) | ((value << shift) & static_cast<TFlags>(mask));
124 }
125 
126 //@}
127 
128 } /* namespace ut */
129 } /* namespace nw */
130 
131 #endif //  NW_UT_FLAG_H_
132