aboutsummaryrefslogtreecommitdiff
path: root/bitops.lua
diff options
context:
space:
mode:
authorBruce Hill <bitbucket@bruce-hill.com>2018-08-29 19:38:14 -0700
committerBruce Hill <bitbucket@bruce-hill.com>2018-08-29 19:39:15 -0700
commit4f30e02acb666c52e0254eb9a3bf89a9cabb5e6d (patch)
treebacc6a2baf70c18d3d44db06dc2235ec42edd49f /bitops.lua
parentaae5ce31feb482a86d8ef96fb1f104194f26828c (diff)
Handling more compatibility stuff, including Lua 5.4, and a backup for
if openssl module is not found, and moving containers (List/Dict) into their own file, as well as bit operators (and support for __bxor, etc. metamethods in Lua 5.2/LuaJIT)
Diffstat (limited to 'bitops.lua')
-rw-r--r--bitops.lua123
1 files changed, 123 insertions, 0 deletions
diff --git a/bitops.lua b/bitops.lua
new file mode 100644
index 0000000..f87be64
--- /dev/null
+++ b/bitops.lua
@@ -0,0 +1,123 @@
+local bitlib
+if jit then
+ bitlib = require('bit')
+elseif _VERSION == "Lua 5.2" then
+ bitlib = bit32
+else
+ bitlib = error("no bit library for Lua 5.3+")
+end
+local ret
+do
+ local _tbl_0 = { }
+ for k, v in pairs(bitlib) do
+ _tbl_0[k] = v
+ end
+ ret = _tbl_0
+end
+ret.bnot = function(x)
+ do
+ local mt = getmetatable(x)
+ if mt then
+ if mt.__bnot then
+ return mt.__bnot(x)
+ end
+ end
+ end
+ return bitlib.bnot(x)
+end
+ret.band = function(x, y)
+ do
+ local mt_x = getmetatable(x)
+ if mt_x then
+ if mt_x.__band then
+ return mt_x.__band(x, y)
+ end
+ end
+ end
+ do
+ local mt_y = getmetatable(x)
+ if mt_y then
+ if mt_y.__band then
+ return mt_y.__band(x, y)
+ end
+ end
+ end
+ return bitlib.band(x, y)
+end
+ret.bor = function(x, y)
+ do
+ local mt_x = getmetatable(x)
+ if mt_x then
+ if mt_x.__bor then
+ return mt_x.__bor(x, y)
+ end
+ end
+ end
+ do
+ local mt_y = getmetatable(x)
+ if mt_y then
+ if mt_y.__bor then
+ return mt_y.__bor(x, y)
+ end
+ end
+ end
+ return bitlib.bor(x, y)
+end
+ret.bxor = function(x, y)
+ do
+ local mt_x = getmetatable(x)
+ if mt_x then
+ if mt_x.__bxor then
+ return mt_x.__bxor(x, y)
+ end
+ end
+ end
+ do
+ local mt_y = getmetatable(x)
+ if mt_y then
+ if mt_y.__bxor then
+ return mt_y.__bxor(x, y)
+ end
+ end
+ end
+ return bitlib.bxor(x, y)
+end
+ret.lshift = function(x, y)
+ do
+ local mt_x = getmetatable(x)
+ if mt_x then
+ if mt_x.__shl then
+ return mt_x.__shl(x, y)
+ end
+ end
+ end
+ do
+ local mt_y = getmetatable(x)
+ if mt_y then
+ if mt_y.__shl then
+ return mt_y.__shl(x, y)
+ end
+ end
+ end
+ return bitlib.lshift(x, y)
+end
+ret.rshift = function(x, y)
+ do
+ local mt_x = getmetatable(x)
+ if mt_x then
+ if mt_x.__shr then
+ return mt_x.__shr(x, y)
+ end
+ end
+ end
+ do
+ local mt_y = getmetatable(x)
+ if mt_y then
+ if mt_y.__shr then
+ return mt_y.__shr(x, y)
+ end
+ end
+ end
+ return bitlib.rshift(x, y)
+end
+return ret