--- C++ Enum utilities
-- @module 02_Enum

--- Compare two enums and return a numerical value describing the similarity
-- @param e1 Enum value 1
-- @param e2 Enum value 2
-- @treturn number The difference between the enum values
function Enum:Compare(e1, e2)
	local Reverse = self:Reverse()
	local Value1 = Reverse[e1]
	local Value2 = Reverse[e2]

	assert(Value1, tostring(e1) .. " is not an enum of type " .. self:GetName())
	assert(Value2, tostring(e2) .. " is not an enum of type " .. self:GetName())

	-- Nil enums correspond to "invalid". These compare greater than any valid
	-- enum value, to line up with the equivalent C++ code.

	-- should this be changed to math.huge()? -shake
	if not e1 then
		Value1 = 99999999
	end
	if not e2 then
		Value2 = 99999999
	end
	return Value1 - Value2
end

--- Convert an enum value into its short form
-- This is based on the game enum convention that they are all named ENUM_value
-- This will return "value" instead of "ENUM_value"
-- @param e Enum value
-- @treturn string A substring made up of only the last part of the enum value string after the '_'
function ToEnumShortString(e)
	local pos = string.find(e, "_")
	assert(pos, "'" .. e .. "' is not an enum value")
	return string.sub(e, pos + 1)
end

-- (c) 2006 Glenn Maynard
-- All rights reserved.
--
-- Permission is hereby granted, free of charge, to any person obtaining a
-- copy of this software and associated documentation files (the
-- "Software"), to deal in the Software without restriction, including
-- without limitation the rights to use, copy, modify, merge, publish,
-- distribute, and/or sell copies of the Software, and to permit persons to
-- whom the Software is furnished to do so, provided that the above
-- copyright notice(s) and this permission notice appear in all copies of
-- the Software and that both the above copyright notice(s) and this
-- permission notice appear in supporting documentation.
--
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
-- THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
-- INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
-- OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-- OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-- PERFORMANCE OF THIS SOFTWARE.
