summaryrefslogtreecommitdiff
path: root/src/KingSystem/Utils
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2022-12-18 18:35:29 +0100
committerLéo Lam <leo@leolam.fr>2022-12-19 00:07:21 +0100
commitbdd2015a088f6331e809aad6a65ca8d239b5cae9 (patch)
treed113f3b9b5a9ad683be533aa05d392a272573116 /src/KingSystem/Utils
parent20be3a197a8296b0e3d7f07f87c2bc6d526aa203 (diff)
ksys/phys: Implement more RagdollController functions
Diffstat (limited to 'src/KingSystem/Utils')
-rw-r--r--src/KingSystem/Utils/BitField.h13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/KingSystem/Utils/BitField.h b/src/KingSystem/Utils/BitField.h
index 45a4645d..1766a048 100644
--- a/src/KingSystem/Utils/BitField.h
+++ b/src/KingSystem/Utils/BitField.h
@@ -223,4 +223,17 @@ constexpr void clearBitFields(Storage* storage, const BitFields&... fields) {
*storage &= ~mask;
}
+/// Set several BitFields at once.
+///
+/// This can sometimes produce better codegen compared to setting each BitField individually.
+/// (This function builds a mask for all the BitFields and clears those bits in one pass,
+/// then ORs in the new values all at once.)
+template <typename Storage, typename... BitFieldAndValuePairs>
+constexpr void setBitFields(Storage* storage, const BitFieldAndValuePairs&... pairs) {
+ constexpr Storage mask =
+ getMaskForBitFields<Storage, typename BitFieldAndValuePairs::first_type...>();
+ *storage =
+ ((static_cast<Storage>(pairs.second) << pairs.first.StartBit()) | ...) | (*storage & ~mask);
+}
+
} // namespace ksys::util