Repository navigation
Expand file tree
/
Copy pathEnum.lua
More file actions
130 lines (112 loc) · 3.28 KB
/
Copy pathEnum.lua
File metadata and controls
130 lines (112 loc) · 3.28 KB
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
--[[
Copyright 2017 YANG Huan ([email protected]).
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
--]]
local System = System
local throw = System.throw
local Int = System.Int
local Number = System.Number
local band = System.band
local ArgumentNullException = System.ArgumentNullException
local ArgumentException = System.ArgumentException
local pairs = pairs
local tostring = tostring
local Enum = {}
Enum.CompareToObj = Int.CompareToObj
Enum.EqualsObj = Int.EqualsObj
Enum.default = Int.default
local function toString(this, cls)
if cls then
for k, v in pairs(cls) do
if v == this then
return k
end
end
end
return tostring(this)
end
Enum.ToString = toString
Number.ToEnumString = toString
local function hasFlag(this, flag)
return band(this, flag) ~= 0
end
Enum.HasFlag = hasFlag
Number.HasFlag = hasFlag
function Enum.GetName(enumType, value)
if enumType == nil then throw(ArgumentNullException("enumType")) end
if value == nil then throw(ArgumentNullException("value")) end
if not enumType:getIsEnum() then throw(ArgumentException("Arg_MustBeEnum")) end
for k, v in pairs(enumType.c) do
if v == value then
return k
end
end
throw(ArgumentException())
end
function Enum.GetNames(enumType)
if enumType == nil then throw(ArgumentNullException("enumType")) end
if not enumType:getIsEnum() then throw(ArgumentException("Arg_MustBeEnum")) end
local t = {}
local count = 1
for k, v in pairs(enumType.c) do
t[count] = k
count = count + 1
end
return System.arrayFromTable(t, System.String)
end
function Enum.GetValues(enumType)
if enumType == nil then throw(ArgumentNullException("enumType")) end
if not enumType:getIsEnum() then throw(ArgumentException("Arg_MustBeEnum")) end
local t = {}
local count = 1
for k, v in pairs(enumType.c) do
t[count] = v
count = count + 1
end
return System.arrayFromTable(t, Int)
end
local function tryParseEnum(enumType, value, ignoreCase)
if enumType == nil then throw(ArgumentNullException("enumType")) end
if not enumType:getIsEnum() then throw(ArgumentException("Arg_MustBeEnum")) end
if value == nil then
return
end
value = value:Trim()
if #value == 0 then
return
end
if ignoreCase then
value = value:lower()
end
for k, v in pairs(enumType.c) do
if ignoreCase then
k = k:lower()
end
if k == value then
return v
end
end
end
function Enum.Parse(enumType, value, ignoreCase)
local result = tryParseEnum(enumType, value, ignoreCase)
if result == nil then
throw(ArgumentException("parse enum fail: ".. value))
end
return result
end
function Enum.TryParse(TEnum, value, ignoreCase)
local result = tryParseEnum(System.typeof(TEnum), value, ignoreCase)
if result == nil then
return false, 0
end
return true, result
end
System.define("System.Enum", Enum)