wasSharp – Blame information for rev 52

Subversion Repositories:
Rev:
Rev Author Line No. Line
3 eva 1 ///////////////////////////////////////////////////////////////////////////
2 // Copyright (C) Wizardry and Steamworks 2013 - License: GNU GPLv3 //
3 // Please see: http://www.gnu.org/licenses/gpl.html for legal details, //
4 // rights of fair usage, the disclaimer and warranty conditions. //
5 ///////////////////////////////////////////////////////////////////////////
6  
7 office 7 using System.Collections.Generic;
8 using System.Linq;
9  
3 eva 10 namespace wasSharp
11 {
7 office 12 public static class BitTwiddling
3 eva 13 {
14 ///////////////////////////////////////////////////////////////////////////
15 // Copyright (C) 2014 Wizardry and Steamworks - License: GNU GPLv3 //
16 ///////////////////////////////////////////////////////////////////////////
17 /// <summary>
18 /// Swaps two integers passed by reference using XOR.
19 /// </summary>
20 /// <param name="q">first integer to swap</param>
21 /// <param name="p">second integer to swap</param>
5 eva 22 public static void XORSwap(ref int q, ref int p)
3 eva 23 {
24 q ^= p;
25 p ^= q;
26 q ^= p;
27 }
7 office 28  
29 ///////////////////////////////////////////////////////////////////////////
30 // Copyright (C) 2016 Wizardry and Steamworks - License: GNU GPLv3 //
31 ///////////////////////////////////////////////////////////////////////////
32 /// <summary>
33 /// Checks whether a flag is set for a bitmask.
34 /// </summary>
35 /// <typeparam name="T">a data type</typeparam>
36 /// <typeparam name="U">a data type</typeparam>
37 /// <param name="mask">the mask to check the flag for</param>
38 /// <param name="flag">the flag to check</param>
39 /// <returns>true in case the flag is set</returns>
40 public static bool IsMaskFlagSet<T, U>(this T mask, U flag) where T : struct where U : struct
41 {
42 return unchecked(mask as dynamic & flag as dynamic) != 0;
43 }
44  
45 ///////////////////////////////////////////////////////////////////////////
46 // Copyright (C) 2016 Wizardry and Steamworks - License: GNU GPLv3 //
47 ///////////////////////////////////////////////////////////////////////////
48 /// <summary>
49 /// Sets a flag for a bitmask.
50 /// </summary>
51 /// <typeparam name="T">a data type</typeparam>
52 /// <typeparam name="U">a data type</typeparam>
53 /// <param name="mask">the mask to set the flag on</param>
54 /// <param name="flag">the flag to set</param>
55 public static void SetMaskFlag<T, U>(ref T mask, U flag) where T : struct where U : struct
56 {
57 mask = unchecked(mask as dynamic | flag as dynamic);
58 }
59  
60 ///////////////////////////////////////////////////////////////////////////
61 // Copyright (C) 2016 Wizardry and Steamworks - License: GNU GPLv3 //
62 ///////////////////////////////////////////////////////////////////////////
63 /// <summary>
64 /// Create a bitmask from multiple flags.
65 /// </summary>
66 /// <typeparam name="T">a data type</typeparam>
67 /// <param name="flag">the flags to set</param>
68 /// <returns>a bitmask</returns>
69 public static T CreateMask<T>(this IEnumerable<T> flag) where T : struct
70 {
71 return flag.Aggregate((o, p) => unchecked(o as dynamic | p as dynamic));
72 }
73  
74 ///////////////////////////////////////////////////////////////////////////
75 // Copyright (C) 2016 Wizardry and Steamworks - License: GNU GPLv3 //
76 ///////////////////////////////////////////////////////////////////////////
77 /// <summary>
78 /// Unset a flag for a bitmask.
79 /// </summary>
80 /// <typeparam name="T">a data type</typeparam>
81 /// <typeparam name="U">a data type</typeparam>
82 /// <param name="mask">the mask to unset the flag on</param>
83 /// <param name="flag">the flag to unset</param>
84 public static void UnsetMaskFlag<T, U>(ref T mask, U flag)
85 {
86 mask = unchecked(mask as dynamic & ~(flag as dynamic));
87 }
88  
89 ///////////////////////////////////////////////////////////////////////////
90 // Copyright (C) 2016 Wizardry and Steamworks - License: GNU GPLv3 //
91 ///////////////////////////////////////////////////////////////////////////
92 /// <summary>
93 /// Toggle a flag for a bitmask.
94 /// </summary>
95 /// <typeparam name="T">a data type</typeparam>
96 /// <typeparam name="U">a data type</typeparam>
97 /// <param name="mask">the mask to toggle the flag on</param>
98 /// <param name="flag">the flag to toggle</param>
99 public static void ToggleMaskFlag<T, U>(ref T mask, U flag)
100 {
101 mask = unchecked(mask as dynamic ^ flag as dynamic);
102 }
103  
104 /// <summary>
105 /// Computes the previous power of two.
106 /// </summary>
107 /// <param name="x">the integer</param>
108 /// <returns>the previous power of two</returns>
109 /// <remarks>Adapted from Hacker's Delight ISBN-10:0201914654</remarks>
110 public static T PreviousPowerOfTwo<T>(this T x)
111 {
112 var y = x as dynamic;
113 unchecked
114 {
115 y = y | (y >> 1);
116 y = y | (y >> 2);
117 y = y | (y >> 4);
118 y = y | (y >> 8);
119 y = y | (y >> 16);
120 return y - (y >> 1);
121 }
122 }
123  
124 /// <summary>
125 /// Determines if a number is a power of two.
126 /// </summary>
127 /// <typeparam name="T">the number type</typeparam>
128 /// <param name="x">the number</param>
129 /// <returns>true of the number is a power of two</returns>
130 public static bool IsPowerOfTwo<T>(this T x)
131 {
132 var y = x as dynamic;
133 return (y != 0) && ((y & (y - 1)) == 0);
134 }
3 eva 135 }
27 office 136 }