From 71b23c1b50dc2597e5361811d8cc6e496a52c203 Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 19 Dec 2022 00:04:32 +0100 Subject: Core/Misc: GCC build fix Closes #28604 --- .../game/Entities/Object/Updates/UpdateField.h | 176 +++++++++++---------- 1 file changed, 96 insertions(+), 80 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Object/Updates/UpdateField.h b/src/server/game/Entities/Object/Updates/UpdateField.h index 0c8266b9cf0..74b0176851c 100644 --- a/src/server/game/Entities/Object/Updates/UpdateField.h +++ b/src/server/game/Entities/Object/Updates/UpdateField.h @@ -44,7 +44,7 @@ namespace UF template class UpdateFieldBase; - template + template class UpdateField; template @@ -59,13 +59,13 @@ namespace UF template class DynamicUpdateFieldBase; - template + template class DynamicUpdateField; template class OptionalUpdateFieldBase; - template + template class OptionalUpdateField; template @@ -143,7 +143,7 @@ namespace UF struct DynamicUpdateFieldSetter { using value_type = T; - using insert_result = std::conditional_t::value, MutableFieldReference, T&>; + using insert_result = std::conditional_t, MutableFieldReference, T&>; template friend typename DynamicUpdateFieldSetter::insert_result AddDynamicUpdateFieldValue(DynamicUpdateFieldSetter& setter); @@ -252,25 +252,27 @@ namespace UF { } - template - std::enable_if_t::value, - std::conditional_t::value, + template + std::enable_if_t, + std::conditional_t, MutableFieldReference, - std::conditional_t::value, + std::conditional_t, MutableNestedFieldReference, std::conditional_t, UpdateFieldSetter>>>> ModifyValue(UpdateField(T::* field)) { - _value._changesMask.Set(BlockBit); + if constexpr (BlockBit >= 0) + _value._changesMask.Set(BlockBit); + _value._changesMask.Set(Bit); return { (_value.*field)._value }; } template - std::enable_if_t::value, - std::conditional_t::value, + std::enable_if_t, + std::conditional_t, MutableFieldReference, - std::conditional_t::value, + std::conditional_t, MutableNestedFieldReference, std::conditional_t, UpdateFieldSetter>>>> ModifyValue(UpdateFieldArray(T::* field), uint32 index) @@ -280,20 +282,22 @@ namespace UF return { (_value.*field)._values[index] }; } - template - std::enable_if_t::value, DynamicUpdateFieldSetter> + template + std::enable_if_t, DynamicUpdateFieldSetter> ModifyValue(DynamicUpdateField(T::* field)) { - _value._changesMask.Set(BlockBit); + if constexpr (BlockBit >= 0) + _value._changesMask.Set(BlockBit); + _value._changesMask.Set(Bit); return { (_value.*field)._values, (_value.*field)._updateMask }; } - template - std::enable_if_t::value, - std::conditional_t::value, + template + std::enable_if_t, + std::conditional_t, MutableFieldReference, - std::conditional_t::value, + std::conditional_t, MutableNestedFieldReference, std::conditional_t, UpdateFieldSetter>>>> ModifyValue(DynamicUpdateField(T::* field), uint32 index) @@ -305,26 +309,30 @@ namespace UF (_value.*field)._updateMask.resize(((_value.*field)._values.size() + 31) / 32); } - _value._changesMask.Set(BlockBit); + if constexpr (BlockBit >= 0) + _value._changesMask.Set(BlockBit); + _value._changesMask.Set(Bit); (_value.*field).MarkChanged(index); return { (_value.*field)._values[index] }; } - template - std::enable_if_t::value, OptionalUpdateFieldSetter> + template + std::enable_if_t, OptionalUpdateFieldSetter> ModifyValue(OptionalUpdateField(T::* field)) { - _value._changesMask.Set(BlockBit); + if constexpr (BlockBit >= 0) + _value._changesMask.Set(BlockBit); + _value._changesMask.Set(Bit); return { _value.*field }; } - template - std::enable_if_t::value, - std::conditional_t::value, + template + std::enable_if_t, + std::conditional_t, MutableFieldReference, - std::conditional_t::value, + std::conditional_t, MutableNestedFieldReference, std::conditional_t, UpdateFieldSetter>>>> ModifyValue(OptionalUpdateField(T::* field), uint32 /*dummy*/) @@ -332,13 +340,15 @@ namespace UF if (!(_value.*field).has_value()) (_value.*field).ConstructValue(); - _value._changesMask.Set(BlockBit); + if constexpr (BlockBit >= 0) + _value._changesMask.Set(BlockBit); + _value._changesMask.Set(Bit); return { *((_value.*field)._value) }; } template - std::enable_if_t::value && !std::is_array::value, + std::enable_if_t && !std::is_array_v, std::conditional_t, UpdateFieldSetter>> ModifyValue(V(T::* field)) { @@ -346,7 +356,7 @@ namespace UF } template - std::enable_if_t::value, + std::enable_if_t, std::conditional_t, UpdateFieldSetter>> ModifyValue(V(T::* field)[Size], uint32 index) { @@ -367,10 +377,10 @@ namespace UF } template - std::enable_if_t, U>::value, - std::conditional_t::value, + std::enable_if_t, U>, + std::conditional_t, MutableFieldReference, - std::conditional_t::value, + std::conditional_t, MutableNestedFieldReference, std::conditional_t, UpdateFieldSetter>>>> ModifyValue() @@ -379,10 +389,10 @@ namespace UF } template - std::enable_if_t, U>::value, - std::conditional_t::value, + std::enable_if_t, U>, + std::conditional_t, MutableFieldReference, - std::conditional_t::value, + std::conditional_t, MutableNestedFieldReference, std::conditional_t, UpdateFieldSetter>>>> ModifyValue(uint32 index) @@ -391,17 +401,17 @@ namespace UF } template - std::enable_if_t, U>::value, DynamicUpdateFieldSetter> + std::enable_if_t, U>, DynamicUpdateFieldSetter> ModifyValue() { return { _value._values, _value._updateMask }; } template - std::enable_if_t, U>::value, - std::conditional_t::value, + std::enable_if_t, U>, + std::conditional_t, MutableFieldReference, - std::conditional_t::value, + std::conditional_t, MutableNestedFieldReference, std::conditional_t, UpdateFieldSetter>>>> ModifyValue(uint32 index) @@ -418,17 +428,17 @@ namespace UF } template - std::enable_if_t, U>::value, OptionalUpdateFieldSetter> + std::enable_if_t, U>, OptionalUpdateFieldSetter> ModifyValue() { return { _value }; } template - std::enable_if_t, U>::value, - std::conditional_t::value, + std::enable_if_t, U>, + std::conditional_t, MutableFieldReference, - std::conditional_t::value, + std::conditional_t, MutableNestedFieldReference, std::conditional_t, UpdateFieldSetter>>>> ModifyValue(uint32 /*dummy*/) @@ -452,20 +462,20 @@ namespace UF template friend struct MutableFieldReference; - template + template friend class UpdateField; template friend class UpdateFieldArray; - template + template friend class DynamicUpdateField; public: using Base = HasChangesMask; using Mask = UpdateMask; - template + template MutableFieldReference ModifyValue(UpdateField(Derived::* field)) { MarkChanged(field); @@ -479,14 +489,14 @@ namespace UF return { (static_cast(this)->*field)._values[index] }; } - template + template MutableFieldReference ModifyValue(DynamicUpdateField(Derived::* field)) { MarkChanged(field); return { (static_cast(this)->*field)._values }; } - template + template MutableFieldReference ModifyValue(DynamicUpdateField(Derived::* field), uint32 index) { DynamicUpdateField& uf = (static_cast(this)->*field); @@ -502,53 +512,59 @@ namespace UF return { uf._values[index] }; } - template + template MutableFieldReference ModifyValue(OptionalUpdateField(Derived::* field)) { MarkChanged(field); return { *((static_cast(this)->*field)._value) }; } - template + template void MarkChanged(UpdateField(Derived::*)) { - static_assert(std::is_base_of::value, "Given field argument must belong to the same structure as this HasChangesMask"); + static_assert(std::is_base_of_v, "Given field argument must belong to the same structure as this HasChangesMask"); + + if constexpr (BlockBit >= 0) + _changesMask.Set(BlockBit); - _changesMask.Set(BlockBit); _changesMask.Set(Bit); } template void MarkChanged(UpdateFieldArray(Derived::*), uint32 index) { - static_assert(std::is_base_of::value, "Given field argument must belong to the same structure as this HasChangesMask"); + static_assert(std::is_base_of_v, "Given field argument must belong to the same structure as this HasChangesMask"); _changesMask.Set(Bit); _changesMask.Set(FirstElementBit + index); } - template + template void MarkChanged(DynamicUpdateField(Derived::*), uint32) { - static_assert(std::is_base_of::value, "Given field argument must belong to the same structure as this HasChangesMask"); + static_assert(std::is_base_of_v, "Given field argument must belong to the same structure as this HasChangesMask"); + + if constexpr (BlockBit >= 0) + _changesMask.Set(BlockBit); - _changesMask.Set(BlockBit); _changesMask.Set(Bit); } - template + template void MarkChanged(OptionalUpdateField(Derived::*)) { - static_assert(std::is_base_of::value, "Given field argument must belong to the same structure as this HasChangesMask"); + static_assert(std::is_base_of_v, "Given field argument must belong to the same structure as this HasChangesMask"); + + if constexpr (BlockBit >= 0) + _changesMask.Set(BlockBit); - _changesMask.Set(BlockBit); _changesMask.Set(Bit); } - template + template void ClearChanged(UpdateField(Derived::*)) { - static_assert(std::is_base_of::value, "Given field argument must belong to the same structure as this HasChangesMask"); + static_assert(std::is_base_of_v, "Given field argument must belong to the same structure as this HasChangesMask"); _changesMask.Reset(Bit); } @@ -556,22 +572,22 @@ namespace UF template void ClearChanged(UpdateFieldArray(Derived::*), uint32 index) { - static_assert(std::is_base_of::value, "Given field argument must belong to the same structure as this HasChangesMask"); + static_assert(std::is_base_of_v, "Given field argument must belong to the same structure as this HasChangesMask"); _changesMask.Reset(FirstElementBit + index); } - template + template void ClearChanged(DynamicUpdateField(Derived::* field), uint32 index) { _changesMask.Reset(Bit); (static_cast(this)->*field).ClearChanged(index); } - template + template void ClearChanged(OptionalUpdateField(Derived::*)) { - static_assert(std::is_base_of::value, "Given field argument must belong to the same structure as this HasChangesMask"); + static_assert(std::is_base_of_v, "Given field argument must belong to the same structure as this HasChangesMask"); _changesMask.Reset(Bit); } @@ -579,16 +595,16 @@ namespace UF Mask const& GetChangesMask() const { return _changesMask; } protected: - template + template void ClearChangesMask(UpdateField& field) { ClearChangesMask(field, std::is_base_of{}); } - template + template void ClearChangesMask(UpdateField&, std::false_type) { } - template + template void ClearChangesMask(UpdateField& field, std::true_type) { field._value.ClearChangesMask(); @@ -610,33 +626,33 @@ namespace UF field._values[i].ClearChangesMask(); } - template + template void ClearChangesMask(DynamicUpdateField& field) { ClearChangesMask(field, std::is_base_of{}); field.ClearChangesMask(); } - template + template void ClearChangesMask(DynamicUpdateField&, std::false_type) { } - template + template void ClearChangesMask(DynamicUpdateField& field, std::true_type) { for (uint32 i = 0; i < field._values.size(); ++i) field._values[i].ClearChangesMask(); } - template + template void ClearChangesMask(OptionalUpdateField& field) { ClearChangesMask(field, std::is_base_of{}); } - template + template void ClearChangesMask(OptionalUpdateField&, std::false_type) { } - template + template void ClearChangesMask(OptionalUpdateField& field, std::true_type) { if (field.has_value()) @@ -653,14 +669,14 @@ namespace UF { } - template + template MutableFieldReference ModifyValue(UpdateField(Derived::* field)) { _changesMask.Set(Bit); return { (static_cast(_owner)->*field)._value }; } - template + template void ClearChangesMask(UpdateField(Derived::* field)) { _changesMask.Reset(Bit); @@ -716,7 +732,7 @@ namespace UF T _value = {}; }; - template + template class UpdateField : public UpdateFieldBase { }; @@ -888,7 +904,7 @@ namespace UF std::vector _updateMask; }; - template + template class DynamicUpdateField : public DynamicUpdateFieldBase { }; @@ -960,7 +976,7 @@ namespace UF StorageType _value = { }; }; - template + template class OptionalUpdateField : public OptionalUpdateFieldBase { }; -- cgit v1.2.3