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