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