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