diff options
| author | Léo Lam <leo@leolam.fr> | 2022-12-18 18:35:29 +0100 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2022-12-19 00:07:21 +0100 |
| commit | bdd2015a088f6331e809aad6a65ca8d239b5cae9 (patch) | |
| tree | d113f3b9b5a9ad683be533aa05d392a272573116 /src/KingSystem/Utils | |
| parent | 20be3a197a8296b0e3d7f07f87c2bc6d526aa203 (diff) | |
ksys/phys: Implement more RagdollController functions
Diffstat (limited to 'src/KingSystem/Utils')
| -rw-r--r-- | src/KingSystem/Utils/BitField.h | 13 |
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 |
