From 458cdd7cab0683befcd383e67192ccadb27f77d2 Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 16 Mar 2015 18:02:17 +0100 Subject: [PATCH] (Bitset) Added equality operator Former-commit-id: b5145a1a0ad8031001927c29c49e0f1faae2d7af --- include/Nazara/Core/Bitset.hpp | 6 ++++++ include/Nazara/Core/Bitset.inl | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/include/Nazara/Core/Bitset.hpp b/include/Nazara/Core/Bitset.hpp index 85ec7e459..4eda7fef7 100644 --- a/include/Nazara/Core/Bitset.hpp +++ b/include/Nazara/Core/Bitset.hpp @@ -99,6 +99,12 @@ class NzBitset unsigned int m_bitCount; }; +template +bool operator==(const NzBitset& lhs, const NzBitset& rhs); + +template +bool operator!=(const NzBitset& lhs, const NzBitset& rhs); + template NzBitset operator&(const NzBitset& lhs, const NzBitset& rhs); diff --git a/include/Nazara/Core/Bitset.inl b/include/Nazara/Core/Bitset.inl index 2c00daf5e..b55e55312 100644 --- a/include/Nazara/Core/Bitset.inl +++ b/include/Nazara/Core/Bitset.inl @@ -493,6 +493,39 @@ template unsigned int NzBitset::npos = std::numeric_limits::max(); +template +bool operator==(const NzBitset& lhs, const NzBitset& rhs) +{ + // La comparaison part du principe que (uint8) 00001100 == (uint16) 00000000 00001100 + // et conserve donc cette propriété + const NzBitset& greater = (lhs.GetBlockCount() > rhs.GetBlockCount()) ? lhs : rhs; + const NzBitset& lesser = (lhs.GetBlockCount() > rhs.GetBlockCount()) ? rhs : lhs; + + unsigned int maxBlockCount = greater.GetBlockCount(); + unsigned int minBlockCount = lesser.GetBlockCount(); + + // Nous testons les blocs en commun pour vérifier l'égalité des bits + for (unsigned int i = 0; i < minBlockCount; ++i) + { + if (lhs.GetBlock(i) != rhs.GetBlock(i)) + return false; + } + + // Nous vérifions maintenant les blocs que seul le plus grand bitset possède, pour prétendre à l'égalité + // ils doivent tous être nuls + for (unsigned int i = minBlockCount; i < maxBlockCount; ++i) + if (greater.GetBlock(i)) + return false; + + return true; +} + +template +bool operator!=(const NzBitset& lhs, const NzBitset& rhs) +{ + return !(lhs == rhs); +} + template NzBitset operator&(const NzBitset& lhs, const NzBitset& rhs) {