wasSharp – Blame information for rev 7
?pathlinks?
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 | } |
136 | } |