-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFlags64.xojo_code
219 lines (170 loc) · 5.28 KB
/
Flags64.xojo_code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
#tag Class
Protected Class Flags64
#tag Method, Flags = &h21
Private Sub CheckFlagNumber(flagNumber As Integer)
If flagNumber<0 Or flagNumber>63 Then
MsgBox "Fatal. Flag64 invalid bit range" // warn and abort due to unexpected fatal failure
Quit
End
End Sub
#tag EndMethod
#tag Method, Flags = &h0
Sub Constructor(initValue As UInt64 = 0)
Flags(initValue) // sets all flags with a predefined set passed (0=all false)
flagNames = New Dictionary // Used by optional named flags
End Sub
#tag EndMethod
#tag Method, Flags = &h0
Function Flag(flagNumber As Integer) As Boolean
// Return value of flag(n) - True or False
Return FlagValue(flagNumber)<>0 // True if bit is set
End Function
#tag EndMethod
#tag Method, Flags = &h0
Sub Flag(flagNumber As Integer, flagValue As Boolean)
// Set flag 0 to 63 to True or False
CheckFlagNumber(flagNumber)
If flagValue Then // set True
flags64 = BitOr(flags64, ShiftLeft(1, flagNumber))
Else
flags64 = BitAnd(flags64, Not ShiftLeft(1, flagNumber))
End
End Sub
#tag EndMethod
#tag Method, Flags = &h0
Sub Flag(flagNumber As Integer, name As String)
// Sets a name for a flag
CheckFlagNumber(flagNumber) // 0 to 63 only
name=name.Trim().Lowercase // case insensitive
If name="" Then
MsgBox "Flags64 fatal error: Missing flag name."
Quit
End
If flagNames.HasKey(name) Then
MsgBox "Flags64 fatal error: Name already taken: "+name
Quit
End
flagNames.Value(name)=flagNumber // set the flag number for this name
End Sub
#tag EndMethod
#tag Method, Flags = &h0
Function Flag(flagName As String) As Boolean
// Return value of flag(flagName) - True or False
// Invalid name raises KeyNotFoundException
Return FlagValue(flagNames.Value(flagName.Trim.Lowercase()))<>0 // True if bit is set
End Function
#tag EndMethod
#tag Method, Flags = &h0
Sub Flag(flagName As String, flagValue As Boolean)
// Set flag named to True or False
// Invalid name raises KeyNotFoundException
If flagValue Then
flags64 = BitOr(flags64, ShiftLeft(1, flagNames.Value(flagName.Trim.Lowercase()))) // Set True
Else
flags64 = BitAnd(flags64, Not ShiftLeft(1, flagNames.Value(flagName.Trim.Lowercase()))) // Set False
End
End Sub
#tag EndMethod
#tag Method, Flags = &h0
Function Flags() As Int64
// Return a Int64 containing the 64 flags
Return flags64
End Function
#tag EndMethod
#tag Method, Flags = &h0
Sub Flags(value As UInt64)
// Set all flags at once, like:
// Flags(37)=100101=flag(5,True); flag(4,False); flag(3,False); flag(2,True); flag(1,False); flag(0,True);
flags64=value
End Sub
#tag EndMethod
#tag Method, Flags = &h0
Function FlagValue(flagNumber As Integer) As UInt64
// Return the flag bit isolated
CheckFlagNumber(flagNumber)
Return BitAnd(flags64, ShiftLeft(1,flagNumber))
// val ...10011001, bit 3 = ...00001000
// val ...10011001, bit 0 = ...00000001
// val ...10011001, bit 1 = ...00000000
End Function
#tag EndMethod
#tag Method, Flags = &h0
Function UFlags() As UInt64
// Return a UInt64 containing the 64 flags
Return flags64
End Function
#tag EndMethod
#tag Note, Name = Info
Flags64 Class
v 1.1 (C) 2018 - Rick.A. (Ricardo Araujo)
Sets and retrieves 64 binary flags in a Int64 that can be stored in a database at once
Usage:
Dim f As New Flags64 // All false
or...
Dim f As New Flags64(oldValueStored) // Any value, -1 becomes all true
f.Flag(n, true|false) // sets a flag (0 to 63) to true or false
f.Flag(n, "my flag name") // set a name for flag n
f.Flag(n) // returns the flag value (true or false)
f.Flag("my flag name", true|false) // sets a named flag to true or false
f.Flag("my flag name") // returns the named flag value (true or false)
f.Flags(value) // sets all the flags encoded in a Int64 value
f.Flags() // Returns the Int64 representing all those flags, useful to store in a Database
f.UFlags // Returns the same, but as an Unsigned Int64 useful to peek the bits like f.UFlags.ToBinary
#tag EndNote
#tag Note, Name = Version
1.0:
Public release
2.0:
Small bitwise speed enhancement.
Introduced named flags
#tag EndNote
#tag Property, Flags = &h0
flagNames As Dictionary
#tag EndProperty
#tag Property, Flags = &h21
Private flags64 As UInt64 = 0
#tag EndProperty
#tag ViewBehavior
#tag ViewProperty
Name="Name"
Visible=true
Group="ID"
InitialValue=""
Type="String"
EditorType=""
#tag EndViewProperty
#tag ViewProperty
Name="Index"
Visible=true
Group="ID"
InitialValue="-2147483648"
Type="Integer"
EditorType=""
#tag EndViewProperty
#tag ViewProperty
Name="Super"
Visible=true
Group="ID"
InitialValue=""
Type="String"
EditorType=""
#tag EndViewProperty
#tag ViewProperty
Name="Left"
Visible=true
Group="Position"
InitialValue="0"
Type="Integer"
EditorType=""
#tag EndViewProperty
#tag ViewProperty
Name="Top"
Visible=true
Group="Position"
InitialValue="0"
Type="Integer"
EditorType=""
#tag EndViewProperty
#tag EndViewBehavior
End Class
#tag EndClass