From cc79883ca972be7f666d2cef63f53578ec54d1fb Mon Sep 17 00:00:00 2001 From: xezon <4720891+xezon@users.noreply.github.com> Date: Wed, 18 Mar 2026 20:56:02 +0100 Subject: [PATCH 1/4] refactor(bitflags): Simplify functions in BitFlags class --- .../Code/GameEngine/Include/Common/BitFlags.h | 41 +++++-------------- 1 file changed, 10 insertions(+), 31 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Include/Common/BitFlags.h b/GeneralsMD/Code/GameEngine/Include/Common/BitFlags.h index 59aef62235b..f1b6563f760 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/BitFlags.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/BitFlags.h @@ -126,12 +126,12 @@ class BitFlags Bool operator==(const BitFlags& that) const { - return this->m_bits == that.m_bits; + return m_bits == that.m_bits; } Bool operator!=(const BitFlags& that) const { - return this->m_bits != that.m_bits; + return m_bits != that.m_bits; } void set(Int i, Int val = 1) @@ -147,26 +147,19 @@ class BitFlags //Tests for any bits that are set in both. Bool testForAny( const BitFlags& that ) const { - BitFlags tmp = *this; - tmp.m_bits &= that.m_bits; - return tmp.m_bits.any(); + return (m_bits & that.m_bits).any(); } //All argument bits must be set in our bits too in order to return TRUE Bool testForAll( const BitFlags& that ) const { - BitFlags tmp = *this; - tmp.m_bits.flip(); - tmp.m_bits &= that.m_bits; - return !tmp.m_bits.any(); + return (m_bits & that.m_bits) == that.m_bits; } //None of the argument bits must be set in our bits in order to return TRUE Bool testForNone( const BitFlags& that ) const { - BitFlags tmp = *this; - tmp.m_bits &= that.m_bits; - return !tmp.m_bits.any(); + return (m_bits & that.m_bits).none(); } Int size() const @@ -196,25 +189,17 @@ class BitFlags Int countIntersection(const BitFlags& that) const { - BitFlags tmp = *this; - tmp.m_bits &= that.m_bits; - return tmp.m_bits.count(); + return (m_bits & that.m_bits).count(); } Int countInverseIntersection(const BitFlags& that) const { - BitFlags tmp = *this; - tmp.m_bits.flip(); - tmp.m_bits &= that.m_bits; - return tmp.m_bits.count(); + return (~m_bits & that.m_bits).count(); } Bool anyIntersectionWith(const BitFlags& that) const { - /// @todo srj -- improve me. - BitFlags tmp = that; - tmp.m_bits &= m_bits; - return tmp.m_bits.any(); + return (m_bits & that.m_bits).any(); } void clear(const BitFlags& clr) @@ -235,16 +220,10 @@ class BitFlags Bool testSetAndClear(const BitFlags& mustBeSet, const BitFlags& mustBeClear) const { - /// @todo srj -- improve me. - BitFlags tmp = *this; - tmp.m_bits &= mustBeClear.m_bits; - if (tmp.m_bits.any()) + if ((m_bits & mustBeClear.m_bits).any()) return false; - tmp = *this; - tmp.m_bits.flip(); - tmp.m_bits &= mustBeSet.m_bits; - if (tmp.m_bits.any()) + if ((~m_bits & mustBeSet.m_bits).any()) return false; return true; From 94921490169d4b8a5a99b1369362d605b1b4901f Mon Sep 17 00:00:00 2001 From: xezon <4720891+xezon@users.noreply.github.com> Date: Thu, 19 Mar 2026 19:01:46 +0100 Subject: [PATCH 2/4] Simplify more --- .../Code/GameEngine/Include/Common/BitFlags.h | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Include/Common/BitFlags.h b/GeneralsMD/Code/GameEngine/Include/Common/BitFlags.h index f1b6563f760..6ad91ab61a0 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/BitFlags.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/BitFlags.h @@ -202,31 +202,25 @@ class BitFlags return (m_bits & that.m_bits).any(); } - void clear(const BitFlags& clr) + void clear(const BitFlags& flagsToClear) { - m_bits &= ~clr.m_bits; + m_bits &= ~flagsToClear.m_bits; } - void set(const BitFlags& set) + void set(const BitFlags& flagsToSet) { - m_bits |= set.m_bits; + m_bits |= flagsToSet.m_bits; } - void clearAndSet(const BitFlags& clr, const BitFlags& set) + void clearAndSet(const BitFlags& flagsToClear, const BitFlags& flagsToSet) { - m_bits &= ~clr.m_bits; - m_bits |= set.m_bits; + clear(flagsToClear); + set(flagsToSet); } Bool testSetAndClear(const BitFlags& mustBeSet, const BitFlags& mustBeClear) const { - if ((m_bits & mustBeClear.m_bits).any()) - return false; - - if ((~m_bits & mustBeSet.m_bits).any()) - return false; - - return true; + return testForNone(mustBeClear) && testForAll(mustBeSet); } // TheSuperHackers @info Function for rare use cases where we must access the flags as an integer. From e7a3a70442e406c511e64664a51fb4015dba5541 Mon Sep 17 00:00:00 2001 From: xezon <4720891+xezon@users.noreply.github.com> Date: Thu, 19 Mar 2026 19:02:13 +0100 Subject: [PATCH 3/4] Replicate in Generals --- .../Code/GameEngine/Include/Common/BitFlags.h | 59 +++++-------------- 1 file changed, 16 insertions(+), 43 deletions(-) diff --git a/Generals/Code/GameEngine/Include/Common/BitFlags.h b/Generals/Code/GameEngine/Include/Common/BitFlags.h index 47242c0d7ca..bff2e5cd33c 100644 --- a/Generals/Code/GameEngine/Include/Common/BitFlags.h +++ b/Generals/Code/GameEngine/Include/Common/BitFlags.h @@ -126,12 +126,12 @@ class BitFlags Bool operator==(const BitFlags& that) const { - return this->m_bits == that.m_bits; + return m_bits == that.m_bits; } Bool operator!=(const BitFlags& that) const { - return this->m_bits != that.m_bits; + return m_bits != that.m_bits; } void set(Int i, Int val = 1) @@ -147,26 +147,19 @@ class BitFlags //Tests for any bits that are set in both. Bool testForAny( const BitFlags& that ) const { - BitFlags tmp = *this; - tmp.m_bits &= that.m_bits; - return tmp.m_bits.any(); + return (m_bits & that.m_bits).any(); } //All argument bits must be set in our bits too in order to return TRUE Bool testForAll( const BitFlags& that ) const { - BitFlags tmp = *this; - tmp.m_bits.flip(); - tmp.m_bits &= that.m_bits; - return !tmp.m_bits.any(); + return (m_bits & that.m_bits) == that.m_bits; } //None of the argument bits must be set in our bits in order to return TRUE Bool testForNone( const BitFlags& that ) const { - BitFlags tmp = *this; - tmp.m_bits &= that.m_bits; - return !tmp.m_bits.any(); + return (m_bits & that.m_bits).none(); } Int size() const @@ -196,58 +189,38 @@ class BitFlags Int countIntersection(const BitFlags& that) const { - BitFlags tmp = *this; - tmp.m_bits &= that.m_bits; - return tmp.m_bits.count(); + return (m_bits & that.m_bits).count(); } Int countInverseIntersection(const BitFlags& that) const { - BitFlags tmp = *this; - tmp.m_bits.flip(); - tmp.m_bits &= that.m_bits; - return tmp.m_bits.count(); + return (~m_bits & that.m_bits).count(); } Bool anyIntersectionWith(const BitFlags& that) const { - /// @todo srj -- improve me. - BitFlags tmp = that; - tmp.m_bits &= m_bits; - return tmp.m_bits.any(); + return (m_bits & that.m_bits).any(); } - void clear(const BitFlags& clr) + void clear(const BitFlags& flagsToClear) { - m_bits &= ~clr.m_bits; + m_bits &= ~flagsToClear.m_bits; } - void set(const BitFlags& set) + void set(const BitFlags& flagsToSet) { - m_bits |= set.m_bits; + m_bits |= flagsToSet.m_bits; } - void clearAndSet(const BitFlags& clr, const BitFlags& set) + void clearAndSet(const BitFlags& flagsToClear, const BitFlags& flagsToSet) { - m_bits &= ~clr.m_bits; - m_bits |= set.m_bits; + clear(flagsToClear); + set(flagsToSet); } Bool testSetAndClear(const BitFlags& mustBeSet, const BitFlags& mustBeClear) const { - /// @todo srj -- improve me. - BitFlags tmp = *this; - tmp.m_bits &= mustBeClear.m_bits; - if (tmp.m_bits.any()) - return false; - - tmp = *this; - tmp.m_bits.flip(); - tmp.m_bits &= mustBeSet.m_bits; - if (tmp.m_bits.any()) - return false; - - return true; + return testForNone(mustBeClear) && testForAll(mustBeSet); } // TheSuperHackers @info Function for rare use cases where we must access the flags as an integer. From a3938113e723b3a306bc30879d5eb7a4698db020 Mon Sep 17 00:00:00 2001 From: xezon <4720891+xezon@users.noreply.github.com> Date: Thu, 19 Mar 2026 19:05:22 +0100 Subject: [PATCH 4/4] Simplify argument names --- Generals/Code/GameEngine/Include/Common/BitFlags.h | 8 ++++---- GeneralsMD/Code/GameEngine/Include/Common/BitFlags.h | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Generals/Code/GameEngine/Include/Common/BitFlags.h b/Generals/Code/GameEngine/Include/Common/BitFlags.h index bff2e5cd33c..f0e91b7c99a 100644 --- a/Generals/Code/GameEngine/Include/Common/BitFlags.h +++ b/Generals/Code/GameEngine/Include/Common/BitFlags.h @@ -202,14 +202,14 @@ class BitFlags return (m_bits & that.m_bits).any(); } - void clear(const BitFlags& flagsToClear) + void clear(const BitFlags& that) { - m_bits &= ~flagsToClear.m_bits; + m_bits &= ~that.m_bits; } - void set(const BitFlags& flagsToSet) + void set(const BitFlags& that) { - m_bits |= flagsToSet.m_bits; + m_bits |= that.m_bits; } void clearAndSet(const BitFlags& flagsToClear, const BitFlags& flagsToSet) diff --git a/GeneralsMD/Code/GameEngine/Include/Common/BitFlags.h b/GeneralsMD/Code/GameEngine/Include/Common/BitFlags.h index 6ad91ab61a0..9b6a10d8dbd 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/BitFlags.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/BitFlags.h @@ -202,14 +202,14 @@ class BitFlags return (m_bits & that.m_bits).any(); } - void clear(const BitFlags& flagsToClear) + void clear(const BitFlags& that) { - m_bits &= ~flagsToClear.m_bits; + m_bits &= ~that.m_bits; } - void set(const BitFlags& flagsToSet) + void set(const BitFlags& that) { - m_bits |= flagsToSet.m_bits; + m_bits |= that.m_bits; } void clearAndSet(const BitFlags& flagsToClear, const BitFlags& flagsToSet)