Module:IP: Difference between revisions

From the Croc Wiki, the Croc encyclopedia
Jump to navigationJump to search
need to use __index to have a unique key which is really private - if outside code gets uniqueKey with getmetatable then they can set it in another table's __eq metamethod, thus foiling isSubnetObject
(mt can still be defined outside the constructor, though - it can just return true for uniqueKey instead of an upvalue)
(need to use __index to have a unique key which is really private - if outside code gets uniqueKey with getmetatable then they can set it in another table's __eq metamethod, thus foiling isSubnetObject)
 
Line 489:
-- is a Subnet object.
local uniqueKey = setmetatable({}, {__metatable = false})
 
-- Metatable
local mt = {
__index = function (self, key)
if key == uniqueKey then
return true
end
end,
__eq = function (self, obj)
return self:getCIDR() == obj:getCIDR()
end,
__concat = function (self, obj)
return tostring(self) .. tostring(obj)
end,
__tostring = function (self)
return self:getCIDR()
end,
__metatable = false
}
 
-- Private static methods
local function isSubnetObject(val)
-- Return true if val is a Subnet object, and false otherwise.
return typegetmetatable(val) == 'table' and val[uniqueKey] ~= nil
end
 
Line 521 ⟶ 502:
-- arg - the argument to be validated
validateSubnet = makeValidationFunction('Subnet', isSubnetObject)
 
-- Metamethods that don't need upvalues
local function subnetEquals(subnet1, subnet2)
return selfsubnet1:getCIDR() == objsubnet2:getCIDR()
end,
 
local function concatenateSubnets(subnet1, subnet2)
return tostring(selfsubnet1) .. tostring(objsubnet2)
end,
 
local function subnetToString(subnet)
return selfsubnet:getCIDR()
end,
 
-- Constructors
makeSubnetFromRaw = function (rawIP, bitLength)
-- Set up structure
local obj = setmetatable({}, mt)
local data = {
rawIP = rawIP,
Line 641 ⟶ 635:
end
 
return setmetatable(obj, {
__index = function (self, key)
if key == uniqueKey then
return true
end
end,
__eq = subnetEquals,
__concat = concatenateSubnets,
__tostring = function (self)subnetToString,
__metatable = false,
})
end
 
Cookies help us deliver our services. By using our services, you agree to our use of cookies.

Navigation menu