From 675a2fcd3b4e46b79c57ead0fc455c4f6e4b03db Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 27 Apr 2015 00:33:27 +0200 Subject: Core/Util: Fixed flag128 and removed flag96 - previously if flag128 and flag96 were used in together the result was always a bool instead of expected flag result due to implicit boolean conversion --- src/server/shared/Utilities/Util.h | 129 +++++++++++++++++++------------------ 1 file changed, 67 insertions(+), 62 deletions(-) (limited to 'src/server/shared/Utilities/Util.h') diff --git a/src/server/shared/Utilities/Util.h b/src/server/shared/Utilities/Util.h index 0886b625370..9605efe18ec 100644 --- a/src/server/shared/Utilities/Util.h +++ b/src/server/shared/Utilities/Util.h @@ -383,32 +383,41 @@ class HookList } }; -template -class flag +class flag128 { -protected: - uint32 part[T_size]; +private: + uint32 part[4]; public: - flag() + flag128(uint32 p1 = 0, uint32 p2 = 0, uint32 p3 = 0, uint32 p4 = 0) + { + part[0] = p1; + part[1] = p2; + part[2] = p3; + part[3] = p4; + } + + inline bool IsEqual(uint32 p1 = 0, uint32 p2 = 0, uint32 p3 = 0, uint32 p4 = 0) const { - memset(part, 0, sizeof(uint32)*T_size); + return (part[0] == p1 && part[1] == p2 && part[2] == p3 && part[3] == p4); } - flag(uint32 first, ...) + inline bool HasFlag(uint32 p1 = 0, uint32 p2 = 0, uint32 p3 = 0, uint32 p4 = 0) const { - va_list ap; - part[0] = first; + return (part[0] & p1 || part[1] & p2 || part[2] & p3 || part[3] & p4); + } - va_start(ap, first); - for (int i = 1; i < T_size; ++i) - part[i] = va_arg(ap, uint32); - va_end(ap); + inline void Set(uint32 p1 = 0, uint32 p2 = 0, uint32 p3 = 0, uint32 p4 = 0) + { + part[0] = p1; + part[1] = p2; + part[2] = p3; + part[3] = p4; } - inline bool operator <(const flag& right) const + inline bool operator <(const flag128 &right) const { - for (uint8 i = T_size; i > 0; --i) + for (uint8 i = 4; i > 0; --i) { if (part[i - 1] < right.part[i - 1]) return true; @@ -418,85 +427,84 @@ public: return false; } - inline bool operator ==(const flag& right) const + inline bool operator ==(const flag128 &right) const { - for (uint8 i = 0; i < T_size; ++i) - if (part[i] != right.part[i]) - return false; - return true; + return + ( + part[0] == right.part[0] && + part[1] == right.part[1] && + part[2] == right.part[2] && + part[3] == right.part[3] + ); } - inline bool operator !=(const flag& right) const + inline bool operator !=(const flag128 &right) const { return !this->operator ==(right); } - inline flag& operator =(const flag& right) + inline flag128 & operator =(const flag128 &right) { - for (uint8 i = 0; i < T_size; ++i) - part[i] = right.part[i]; + part[0] = right.part[0]; + part[1] = right.part[1]; + part[2] = right.part[2]; + part[3] = right.part[3]; return *this; } - inline flag operator &(const flag &right) const + inline flag128 operator &(const flag128 &right) const { - flag fl; - for (uint8 i = 0; i < T_size; ++i) - fl.part[i] = part[i] & right.part[i]; - return fl; + return flag128(part[0] & right.part[0], part[1] & right.part[1], + part[2] & right.part[2], part[3] & right.part[3]); } - inline flag& operator &=(const flag &right) + inline flag128 & operator &=(const flag128 &right) { - for (uint8 i = 0; i < T_size; ++i) - part[i] &= right.part[i]; + part[0] &= right.part[0]; + part[1] &= right.part[1]; + part[2] &= right.part[2]; + part[3] &= right.part[3]; return *this; } - inline flag operator |(const flag &right) const + inline flag128 operator |(const flag128 &right) const { - flag fl; - for (uint8 i = 0; i < T_size; ++i) - fl.part[i] = part[i] | right.part[i]; - return fl; + return flag128(part[0] | right.part[0], part[1] | right.part[1], + part[2] | right.part[2], part[3] | right.part[3]); } - inline flag& operator |=(const flag &right) + inline flag128 & operator |=(const flag128 &right) { - for (uint8 i = 0; i < T_size; ++i) - part[i] |= right.part[i]; + part[0] |= right.part[0]; + part[1] |= right.part[1]; + part[2] |= right.part[2]; + part[3] |= right.part[3]; return *this; } - inline flag operator ~() const + inline flag128 operator ~() const { - flag fl; - for (uint8 i = 0; i < T_size; ++i) - fl.part[i] = ~part[i]; - return fl; + return flag128(~part[0], ~part[1], ~part[2], ~part[3]); } - inline flag operator ^(const flag& right) const + inline flag128 operator ^(const flag128 &right) const { - flag fl; - for (uint8 i = 0; i < T_size; ++i) - fl.part[i] = part[i] ^ right.part[i]; - return fl; + return flag128(part[0] ^ right.part[0], part[1] ^ right.part[1], + part[2] ^ right.part[2], part[3] ^ right.part[3]); } - inline flag& operator ^=(const flag& right) + inline flag128 & operator ^=(const flag128 &right) { - for (uint8 i = 0; i < T_size; ++i) - part[i] ^= right.part[i]; + part[0] ^= right.part[0]; + part[1] ^= right.part[1]; + part[2] ^= right.part[2]; + part[3] ^= right.part[3]; return *this; } inline operator bool() const { - for (uint8 i = 0; i < T_size; ++i) - if (part[i] != 0) - return true; - return false; + return (part[0] != 0 || part[1] != 0 || part[2] != 0 || part[3] != 0); } inline bool operator !() const @@ -504,20 +512,17 @@ public: return !this->operator bool(); } - inline uint32& operator [](uint8 el) + inline uint32 & operator [](uint8 el) { return part[el]; } - inline const uint32& operator [](uint8 el) const + inline const uint32 & operator [](uint8 el) const { return part[el]; } }; -typedef flag<3> flag96; -typedef flag<4> flag128; - enum ComparisionType { COMP_TYPE_EQ = 0, -- cgit v1.2.3