From e6dda9a8fd62c84bc0e7efccdc524d2ac95fb100 Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Fri, 9 May 2003 11:12:31 +0000 Subject: [PATCH] all relational operators added to luabind::object --- luabind/object.hpp | 72 +++++++++++++++++++++++++++++++++----------- src/object.cpp | 88 ++++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 124 insertions(+), 36 deletions(-) diff --git a/luabind/object.hpp b/luabind/object.hpp index b950c1a..914fbda 100644 --- a/luabind/object.hpp +++ b/luabind/object.hpp @@ -1290,29 +1290,67 @@ private: } +#define LUABIND_DECLARE_OPERATOR(MACRO)\ + MACRO(object, object) \ + MACRO(object, detail::proxy_object) \ + MACRO(object, detail::proxy_array_object) \ + MACRO(object, detail::proxy_raw_object) \ + MACRO(detail::proxy_object, object) \ + MACRO(detail::proxy_object, detail::proxy_object) \ + MACRO(detail::proxy_object, detail::proxy_array_object) \ + MACRO(detail::proxy_object, detail::proxy_raw_object) \ + MACRO(detail::proxy_array_object, object) \ + MACRO(detail::proxy_array_object, detail::proxy_object) \ + MACRO(detail::proxy_array_object, detail::proxy_array_object) \ + MACRO(detail::proxy_array_object, detail::proxy_raw_object) \ + MACRO(detail::proxy_raw_object, object) \ + MACRO(detail::proxy_raw_object, detail::proxy_object) \ + MACRO(detail::proxy_raw_object, detail::proxy_array_object) \ + MACRO(detail::proxy_raw_object, detail::proxy_raw_object) + + #define LUABIND_EQUALITY_OPERATOR(lhs, rhs) bool operator==(const lhs&, const rhs&); + LUABIND_DECLARE_OPERATOR(LUABIND_EQUALITY_OPERATOR) +#undef LUABIND_EQUALITY_OPERATOR - LUABIND_EQUALITY_OPERATOR(object, object) - LUABIND_EQUALITY_OPERATOR(object, detail::proxy_object) - LUABIND_EQUALITY_OPERATOR(object, detail::proxy_array_object) - LUABIND_EQUALITY_OPERATOR(object, detail::proxy_raw_object) +#define LUABIND_LESSTHAN_OPERATOR(lhs, rhs) bool operator<(const lhs&, const rhs&); + LUABIND_DECLARE_OPERATOR(LUABIND_LESSTHAN_OPERATOR) +#undef LUABIND_LESSTHAN_OPERATOR - LUABIND_EQUALITY_OPERATOR(detail::proxy_object, object) - LUABIND_EQUALITY_OPERATOR(detail::proxy_object, detail::proxy_object) - LUABIND_EQUALITY_OPERATOR(detail::proxy_object, detail::proxy_array_object) - LUABIND_EQUALITY_OPERATOR(detail::proxy_object, detail::proxy_raw_object) +#define LUABIND_LESSOREQUAL_OPERATOR(lhs_t, rhs_t) bool operator<=(const lhs_t&, const rhs_t&); + LUABIND_DECLARE_OPERATOR(LUABIND_LESSOREQUAL_OPERATOR) +#undef LUABIND_LESSOREQUAL_OPERATOR - LUABIND_EQUALITY_OPERATOR(detail::proxy_array_object, object) - LUABIND_EQUALITY_OPERATOR(detail::proxy_array_object, detail::proxy_object) - LUABIND_EQUALITY_OPERATOR(detail::proxy_array_object, detail::proxy_array_object) - LUABIND_EQUALITY_OPERATOR(detail::proxy_array_object, detail::proxy_raw_object) +#define LUABIND_INEQUALITY_OPERATOR(lhs_t, rhs_t)\ + inline bool operator!=(const rhs_t& rhs, const lhs_t& lhs) \ + { \ + return !(rhs == lhs); \ + } - LUABIND_EQUALITY_OPERATOR(detail::proxy_raw_object, object) - LUABIND_EQUALITY_OPERATOR(detail::proxy_raw_object, detail::proxy_object) - LUABIND_EQUALITY_OPERATOR(detail::proxy_raw_object, detail::proxy_array_object) - LUABIND_EQUALITY_OPERATOR(detail::proxy_raw_object, detail::proxy_raw_object) + LUABIND_DECLARE_OPERATOR(LUABIND_INEQUALITY_OPERATOR) -#undef LUABIND_EQUALITY_OPERATOR +#undef LUABIND_INEQUALITY_OPERATOR + +#define LUABIND_GREATEROREQUAL_OPERATOR(lhs_t, rhs_t)\ + inline bool operator>=(const rhs_t& rhs, const lhs_t& lhs) \ + { \ + return !(rhs < lhs); \ + } + + LUABIND_DECLARE_OPERATOR(LUABIND_GREATEROREQUAL_OPERATOR) + +#undef LUABIND_GREATEROREQUAL_OPERATOR + +#define LUABIND_GREATERTHAN_OPERATOR(lhs_t, rhs_t)\ + inline bool operator>(const lhs_t& lhs, const rhs_t& rhs) \ + { \ + return !(lhs <= rhs); \ + } + + LUABIND_DECLARE_OPERATOR(LUABIND_GREATERTHAN_OPERATOR) +#undef LUABIND_GREATERTHAN_OPERATOR + +#undef LUABIND_DECLARE_OPERATOR } diff --git a/src/object.cpp b/src/object.cpp index a1e241e..81e9747 100755 --- a/src/object.cpp +++ b/src/object.cpp @@ -179,6 +179,25 @@ LUABIND_RAW_PROXY_ASSIGNMENT_OPERATOR(proxy_array_object) } // detail +#define LUABIND_DECLARE_OPERATOR(MACRO)\ + MACRO(object, object) \ + MACRO(object, detail::proxy_object) \ + MACRO(object, detail::proxy_array_object) \ + MACRO(object, detail::proxy_raw_object) \ + MACRO(detail::proxy_object, object) \ + MACRO(detail::proxy_object, detail::proxy_object) \ + MACRO(detail::proxy_object, detail::proxy_array_object) \ + MACRO(detail::proxy_object, detail::proxy_raw_object) \ + MACRO(detail::proxy_array_object, object) \ + MACRO(detail::proxy_array_object, detail::proxy_object) \ + MACRO(detail::proxy_array_object, detail::proxy_array_object) \ + MACRO(detail::proxy_array_object, detail::proxy_raw_object) \ + MACRO(detail::proxy_raw_object, object) \ + MACRO(detail::proxy_raw_object, detail::proxy_object) \ + MACRO(detail::proxy_raw_object, detail::proxy_array_object) \ + MACRO(detail::proxy_raw_object, detail::proxy_raw_object) + + // ***************************** // OPERATOR == @@ -198,25 +217,7 @@ LUABIND_RAW_PROXY_ASSIGNMENT_OPERATOR(proxy_array_object) return result; \ } - LUABIND_EQUALITY_OPERATOR(object, object) - LUABIND_EQUALITY_OPERATOR(object, detail::proxy_object) - LUABIND_EQUALITY_OPERATOR(object, detail::proxy_array_object) - LUABIND_EQUALITY_OPERATOR(object, detail::proxy_raw_object) - - LUABIND_EQUALITY_OPERATOR(detail::proxy_object, object) - LUABIND_EQUALITY_OPERATOR(detail::proxy_object, detail::proxy_object) - LUABIND_EQUALITY_OPERATOR(detail::proxy_object, detail::proxy_array_object) - LUABIND_EQUALITY_OPERATOR(detail::proxy_object, detail::proxy_raw_object) - - LUABIND_EQUALITY_OPERATOR(detail::proxy_array_object, object) - LUABIND_EQUALITY_OPERATOR(detail::proxy_array_object, detail::proxy_object) - LUABIND_EQUALITY_OPERATOR(detail::proxy_array_object, detail::proxy_array_object) - LUABIND_EQUALITY_OPERATOR(detail::proxy_array_object, detail::proxy_raw_object) - - LUABIND_EQUALITY_OPERATOR(detail::proxy_raw_object, object) - LUABIND_EQUALITY_OPERATOR(detail::proxy_raw_object, detail::proxy_object) - LUABIND_EQUALITY_OPERATOR(detail::proxy_raw_object, detail::proxy_array_object) - LUABIND_EQUALITY_OPERATOR(detail::proxy_raw_object, detail::proxy_raw_object) + LUABIND_DECLARE_OPERATOR(LUABIND_EQUALITY_OPERATOR) #undef LUABIND_EQUALITY_OPERATOR @@ -238,5 +239,54 @@ LUABIND_RAW_PROXY_ASSIGNMENT_OPERATOR(proxy_array_object) LUABIND_ASSIGNMENT_OPERATOR(proxy_array_object) LUABIND_ASSIGNMENT_OPERATOR(proxy_raw_object) + + + // ***************************** + // OPERATOR == + + + +#define LUABIND_LESSTHAN_OPERATOR(lhs_t, rhs_t)\ + bool operator<(const lhs_t& lhs, const rhs_t& rhs) \ + { \ + if (!lhs.is_valid()) return false; \ + if (!rhs.is_valid()) return false; \ + assert((lhs.lua_state() == rhs.lua_state()) && "you cannot compare objects from different lua states"); \ + lua_State* L = lhs.lua_state(); \ + lhs.pushvalue(); \ + rhs.pushvalue(); \ + bool result = lua_lessthan(L, -1, -2) != 0; \ + lua_pop(L, 2); \ + return result; \ + } + + LUABIND_DECLARE_OPERATOR(LUABIND_LESSTHAN_OPERATOR) + +#undef LUABIND_LESSTHAN_OPERATOR + +#define LUABIND_LESSOREQUAL_OPERATOR(lhs_t, rhs_t)\ + bool operator<=(const lhs_t& lhs, const rhs_t& rhs) \ + { \ + if (!lhs.is_valid()) return false; \ + if (!rhs.is_valid()) return false; \ + assert((lhs.lua_state() == rhs.lua_state()) && "you cannot compare objects from different lua states"); \ + lua_State* L = lhs.lua_state(); \ + lhs.pushvalue(); \ + rhs.pushvalue(); \ + bool result1 = lua_lessthan(L, -1, -2) != 0; \ + bool result2 = lua_equal(L, -1, -2) != 0; \ + lua_pop(L, 2); \ + return result1 || result2; \ + } + + LUABIND_DECLARE_OPERATOR(LUABIND_LESSOREQUAL_OPERATOR) + +#undef LUABIND_LESSOREQUAL_OPERATOR + +#undef LUABIND_GREATERTHAN_OPERATOR + + +#undef LUABIND_DECLARE_OPERATOR + } -- 2.11.4.GIT