18#ifndef UpdateField_h__
19#define UpdateField_h__
27#include <unordered_map>
50 template<
typename T,
int32 BlockBit, u
int32 Bit>
56 template<
typename T, std::
size_t Size>
59 template<
typename T, std::
size_t Size, u
int32 Bit,
int32 FirstElementBit>
65 template<
typename T,
int32 BlockBit, u
int32 Bit>
68 template<
typename K,
typename V>
71 template<
typename K,
typename V,
int32 BlockBit, u
int32 Bit>
77 template<
typename T,
int32 BlockBit, u
int32 Bit>
83 template<
typename T,
int32 BlockBit, u
int32 Bit>
89 template<
typename... Types>
92 template<
int32 BlockBit,
uint32 Bit,
typename... Types>
95 template<
typename T,
bool PublicSet>
98 template<
typename T,
bool PublicSet>
101 template<
typename T,
bool PublicSet>
143 _value = std::move(value);
169 _value = std::move(value);
176 template<
typename T,
bool PublicSet>
179 template<
typename T,
bool PublicSet>
210 T& value =
_values.emplace_back();
211 if constexpr (std::is_base_of_v<HasChangesMaskTag, T>)
212 value._changesMask.SetAll();
219 for (std::size_t i = index; i <
_values.size(); ++i)
223 if constexpr (std::is_base_of_v<HasChangesMaskTag, T>)
224 _values[i]._changesMask.SetAll();
233 for (std::size_t i = index; i <
_values.size(); ++i)
237 if constexpr (std::is_base_of_v<HasChangesMaskTag, T>)
238 _values[i]._changesMask.SetAll();
265 template<
typename K,
typename V>
268 template<
typename F,
typename G>
313 std::unordered_map<T, MapUpdateFieldState>&
_values;
338 template<
typename T,
bool PublicSet>
345 template<
typename V,
int32 BlockBit, u
int32 Bit>
346 std::conditional_t<std::is_base_of_v<IsUpdateFieldStructureTag, V>,
348 std::conditional_t<std::is_base_of_v<IsUpdateFieldHolderTag, V>,
353 if constexpr (BlockBit >= 0)
354 _value._changesMask.Set(BlockBit);
356 _value._changesMask.Set(Bit);
360 template<
typename V, std::
size_t Size, u
int32 Bit,
int32 FirstElementBit>
361 std::conditional_t<std::is_base_of_v<IsUpdateFieldStructureTag, V>,
363 std::conditional_t<std::is_base_of_v<IsUpdateFieldHolderTag, V>,
368 _value._changesMask.Set(Bit);
369 if constexpr (FirstElementBit >= 0)
371 if constexpr (!std::is_base_of_v<IsUpdateFieldHolderTag, V>)
372 _value._changesMask.Set(FirstElementBit + index);
374 _value._changesMask.Set(FirstElementBit);
377 return { (
_value.*field)._values[index] };
380 template<
typename V,
int32 BlockBit, u
int32 Bit>
383 if constexpr (BlockBit >= 0)
384 _value._changesMask.Set(BlockBit);
386 _value._changesMask.Set(Bit);
387 return { (
_value.*field)._values, (
_value.*field)._updateMask };
390 template<
typename V,
int32 BlockBit, u
int32 Bit>
391 std::conditional_t<std::is_base_of_v<IsUpdateFieldStructureTag, V>,
393 std::conditional_t<std::is_base_of_v<IsUpdateFieldHolderTag, V>,
398 if (index >= (
_value.*field).size())
401 (
_value.*field)._values.resize(index + 1);
402 (
_value.*field)._updateMask.resize((index + 1 + 31) / 32);
405 if constexpr (BlockBit >= 0)
406 _value._changesMask.Set(BlockBit);
408 _value._changesMask.Set(Bit);
409 (
_value.*field).MarkChanged(index);
410 return { (
_value.*field)._values[index] };
413 template<
typename K,
typename V,
int32 BlockBit, u
int32 Bit>
417 if constexpr (BlockBit >= 0)
418 _value._changesMask.Set(BlockBit);
420 _value._changesMask.Set(Bit);
421 return { (
_value.*field)._values };
424 template<
typename K,
typename V,
int32 BlockBit, u
int32 Bit>
425 std::conditional_t<std::is_base_of_v<IsUpdateFieldStructureTag, V>,
427 std::conditional_t<std::is_base_of_v<IsUpdateFieldHolderTag, V>,
432 if constexpr (BlockBit >= 0)
433 _value._changesMask.Set(BlockBit);
435 _value._changesMask.Set(Bit);
437 auto itr = (
_value.*field)._values.try_emplace(key).first;
439 return { itr->second.value };
442 template<
typename V,
int32 BlockBit, u
int32 Bit>
445 if constexpr (BlockBit >= 0)
446 _value._changesMask.Set(BlockBit);
448 _value._changesMask.Set(Bit);
449 return { (
_value.*field)._values };
452 template<
typename V,
int32 BlockBit, u
int32 Bit>
455 if constexpr (BlockBit >= 0)
456 _value._changesMask.Set(BlockBit);
458 _value._changesMask.Set(Bit);
462 template<
typename V,
int32 BlockBit, u
int32 Bit>
463 std::conditional_t<std::is_base_of_v<IsUpdateFieldStructureTag, V>,
465 std::conditional_t<std::is_base_of_v<IsUpdateFieldHolderTag, V>,
470 if (!(
_value.*field).has_value())
471 (
_value.*field).ConstructValue();
473 if constexpr (BlockBit >= 0)
474 _value._changesMask.Set(BlockBit);
476 _value._changesMask.Set(Bit);
480 template<
typename V,
int32 BlockBit,
uint32 Bit,
typename... Types>
481 std::conditional_t<std::is_base_of_v<IsUpdateFieldStructureTag, V>,
483 std::conditional_t<std::is_base_of_v<IsUpdateFieldHolderTag, V>,
488 if (!(
_value.*field).template Is<V>())
489 (
_value.*field).
template ConstructValue<V>();
491 if constexpr (BlockBit >= 0)
492 _value._changesMask.Set(BlockBit);
494 _value._changesMask.Set(Bit);
495 return { *((
_value.*field).
template Get<V>()) };
502 template<
typename T,
bool PublicSet>
515 template<
typename V, std::
size_t Size>
518 return { (
_value.*field)[index] };
525 template<
typename T,
bool PublicSet>
534 template<
typename U = T>
535 std::enable_if_t<std::is_base_of_v<UpdateFieldBase<value_type>, U>,
536 std::conditional_t<std::is_base_of_v<IsUpdateFieldStructureTag, value_type>,
538 std::conditional_t<std::is_base_of_v<IsUpdateFieldHolderTag, value_type>,
546 template<
typename U = T>
547 std::enable_if_t<std::is_base_of_v<UpdateFieldArrayBaseWithoutSize<value_type>, U>,
548 std::conditional_t<std::is_base_of_v<IsUpdateFieldStructureTag, value_type>,
550 std::conditional_t<std::is_base_of_v<IsUpdateFieldHolderTag, value_type>,
555 return {
_value._values[index] };
558 template<
typename U = T>
565 template<
typename U = T>
566 std::enable_if_t<std::is_base_of_v<DynamicUpdateFieldBase<value_type>, U>,
567 std::conditional_t<std::is_base_of_v<IsUpdateFieldStructureTag, value_type>,
569 std::conditional_t<std::is_base_of_v<IsUpdateFieldHolderTag, value_type>,
574 if (index >=
_value.size())
577 _value._values.resize(index + 1);
578 _value._updateMask.resize((index + 1 + 31) / 32);
581 _value.MarkChanged(index);
582 return {
_value._values[index] };
585 template<
typename U = T>
592 template<
typename U = T>
593 std::enable_if_t<std::is_base_of_v<OptionalUpdateFieldBase<value_type>, U>,
594 std::conditional_t<std::is_base_of_v<IsUpdateFieldStructureTag, value_type>,
596 std::conditional_t<std::is_base_of_v<IsUpdateFieldHolderTag, value_type>,
604 return { *(
_value._value) };
611 template<std::
size_t Bits>
617 template<
typename K,
typename V>
620 template<
typename T,
bool PublicSet>
623 template<
typename T,
bool PublicSet>
626 template<
typename T,
int32 BlockBit, u
int32 Bit>
629 template<
typename T, std::
size_t Size, u
int32 Bit,
int32 FirstElementBit>
632 template<
typename T,
int32 BlockBit, u
int32 Bit>
639 template<
typename Derived,
typename T,
int32 BlockBit, u
int32 Bit>
642 static_assert(std::is_base_of_v<Base, Derived>,
"Given field argument must belong to the same structure as this HasChangesMask");
644 if constexpr (BlockBit >= 0)
650 template<
typename Derived,
typename T, std::
size_t Size, u
int32 Bit,
int32 FirstElementBit>
653 static_assert(std::is_base_of_v<Base, Derived>,
"Given field argument must belong to the same structure as this HasChangesMask");
656 if constexpr (FirstElementBit >= 0)
658 if constexpr (!std::is_base_of_v<IsUpdateFieldHolderTag, T>)
665 template<
typename Derived,
typename T,
int32 BlockBit, u
int32 Bit>
668 static_assert(std::is_base_of_v<Base, Derived>,
"Given field argument must belong to the same structure as this HasChangesMask");
670 if constexpr (BlockBit >= 0)
676 template<
typename Derived,
typename K,
typename V,
int32 BlockBit, u
int32 Bit>
679 static_assert(std::is_base_of_v<Base, Derived>,
"Given field argument must belong to the same structure as this HasChangesMask");
681 if constexpr (BlockBit >= 0)
687 template<
typename Derived,
typename T,
int32 BlockBit, u
int32 Bit>
690 static_assert(std::is_base_of_v<Base, Derived>,
"Given field argument must belong to the same structure as this HasChangesMask");
692 if constexpr (BlockBit >= 0)
698 template<
typename Derived,
typename T,
int32 BlockBit, u
int32 Bit>
701 static_assert(std::is_base_of_v<Base, Derived>,
"Given field argument must belong to the same structure as this HasChangesMask");
703 if constexpr (BlockBit >= 0)
709 template<
typename Derived,
int32 BlockBit,
uint32 Bit,
typename... Types>
712 static_assert(std::is_base_of_v<Base, Derived>,
"Given field argument must belong to the same structure as this HasChangesMask");
714 if constexpr (BlockBit >= 0)
720 template<
typename Derived,
typename T,
int32 BlockBit, u
int32 Bit>
723 static_assert(std::is_base_of_v<Base, Derived>,
"Given field argument must belong to the same structure as this HasChangesMask");
728 template<
typename Derived,
typename T, std::
size_t Size, u
int32 Bit,
int32 FirstElementBit>
731 static_assert(std::is_base_of_v<Base, Derived>,
"Given field argument must belong to the same structure as this HasChangesMask");
733 if constexpr (FirstElementBit >= 0)
735 if constexpr (!std::is_base_of_v<IsUpdateFieldHolderTag, T>)
742 template<
typename Derived,
typename T,
int32 BlockBit, u
int32 Bit>
745 static_assert(std::is_base_of_v<Base, Derived>,
"Given field argument must belong to the same structure as this HasChangesMask");
750 template<
typename Derived,
typename K,
typename V,
int32 BlockBit, u
int32 Bit>
753 static_assert(std::is_base_of_v<Base, Derived>,
"Given field argument must belong to the same structure as this HasChangesMask");
758 template<
typename Derived,
typename T,
int32 BlockBit, u
int32 Bit>
761 static_assert(std::is_base_of_v<Base, Derived>,
"Given field argument must belong to the same structure as this HasChangesMask");
766 template<
typename Derived,
typename T,
int32 BlockBit, u
int32 Bit>
769 static_assert(std::is_base_of_v<Base, Derived>,
"Given field argument must belong to the same structure as this HasChangesMask");
774 template<
typename Derived,
int32 BlockBit,
uint32 Bit,
typename... Types>
777 static_assert(std::is_base_of_v<Base, Derived>,
"Given field argument must belong to the same structure as this HasChangesMask");
788 if constexpr (std::is_base_of_v<HasChangesMaskTag, T>)
789 field.
_value.ClearChangesMask();
792 template<
typename T, std::
size_t Size>
795 if constexpr (std::disjunction_v<std::is_base_of<HasChangesMaskTag, T>, std::is_base_of<IsUpdateFieldHolderTag, T>>)
797 value.ClearChangesMask();
803 if constexpr (std::is_base_of_v<HasChangesMaskTag, T>)
805 value.ClearChangesMask();
810 template<
typename K,
typename V>
813 for (
auto itr = field.
_values.begin(); itr != field.
_values.end(); )
815 switch (itr->second.state)
820 if constexpr (std::is_base_of_v<HasChangesMaskTag, K>)
821 const_cast<K&
>(itr->first).ClearChangesMask();
823 if constexpr (std::is_base_of_v<HasChangesMaskTag, V>)
824 itr->second.value.ClearChangesMask();
829 itr = field.
_values.erase(itr++);
842 for (
auto itr = field.
_values.begin(); itr != field.
_values.end(); )
849 if constexpr (std::is_base_of_v<HasChangesMaskTag, T>)
850 const_cast<T&
>(itr->first).ClearChangesMask();
855 itr = field.
_values.erase(itr++);
868 if constexpr (std::is_base_of_v<HasChangesMaskTag, T>)
870 field.
_value->ClearChangesMask();
873 template<
typename... Types>
876 if constexpr ((std::is_base_of_v<HasChangesMaskTag, Types> || ...))
877 std::visit([]<
typename T>(T& value)
879 if constexpr (std::is_base_of_v<HasChangesMaskTag, T>)
880 value.ClearChangesMask();
890 template<
typename F,
bool PublicSet>
893 template<
typename F,
bool PublicSet>
896 template<
typename F,
bool PublicSet>
899 template<std::
size_t Bits>
907 operator T
const& ()
const
924 template<
typename T,
int32 BlockBit, u
int32 Bit>
934 template<
typename T, std::
size_t Size>
937 template<
typename F,
bool PublicSet>
940 template<
typename F,
bool PublicSet>
943 template<
typename F,
bool PublicSet>
946 template<std::
size_t Bits>
962 static constexpr std::size_t
size()
986 return sizeof(
typename T::value_type);
989 template<
typename T, std::
size_t Size, u
int32 Bit,
int32 FirstElementBit>
999 template<
typename F,
bool PublicSet>
1002 template<
typename F,
bool PublicSet>
1005 template<
typename F,
bool PublicSet>
1008 template<std::
size_t Bits>
1019 typename std::vector<T>::const_iterator
begin()
const
1024 typename std::vector<T>::const_iterator
end()
const
1053 template<
typename Pred>
1056 auto itr = std::find_if(
_values.begin(),
_values.end(), std::ref(pred));
1093 template<
typename T,
int32 BlockBit, u
int32 Bit>
1098 template<
typename K,
typename V>
1101 template<
typename F,
bool PublicSet>
1104 template<
typename F,
bool PublicSet>
1107 template<
typename F,
bool PublicSet>
1110 template<std::
size_t Bits>
1124 typename std::unordered_map<K, Value>::const_iterator
begin()
const
1129 typename std::unordered_map<K, Value>::const_iterator
end()
const
1144 V
const*
Get(K
const& key)
const
1148 return &itr->second.value;
1153 template <Trinity::invocable_r<
bool, V const&> Pred>
1154 std::pair<K const*, V const*>
FindIf(Pred&& pred)
const
1156 auto itr = std::ranges::find_if(
_values, std::forward<Pred>(pred),
1157 [](
value_type const& pair) -> V
const& {
return pair.second.value; });
1159 return std::make_pair(&itr->first, &itr->second.value);
1161 return {
nullptr,
nullptr };
1168 template<
typename K,
typename V,
int32 BlockBit, u
int32 Bit>
1173 template<
typename T>
1176 template<
typename F,
bool PublicSet>
1179 template<
typename F,
bool PublicSet>
1182 template<
typename F,
bool PublicSet>
1185 template<std::
size_t Bits>
1193 typename std::unordered_map<T, MapUpdateFieldState>::const_iterator
begin()
const
1198 typename std::unordered_map<T, MapUpdateFieldState>::const_iterator
end()
const
1214 std::unordered_map<T, MapUpdateFieldState>
_values;
1217 template<
typename T,
int32 BlockBit, u
int32 Bit>
1222 template<
typename T>
1225 template<
typename F,
bool PublicSet>
1228 template<
typename F,
bool PublicSet>
1231 template<
typename F,
bool PublicSet>
1234 template<std::
size_t Bits>
1237 template<
typename F>
1244 using IsLarge = std::integral_constant<bool,
sizeof(
void*) * 3 <
sizeof(T)>;
1252 operator bool()
const
1268 if constexpr (IsLarge::value)
1269 _value = std::make_unique<T>();
1282 template<
typename T,
int32 BlockBit, u
int32 Bit>
1287 template<
typename... Types>
1290 template<
typename F,
bool PublicSet>
1293 template<
typename F,
bool PublicSet>
1296 template<
typename F,
bool PublicSet>
1299 template<std::
size_t Bits>
1303 template<
typename T>
1304 bool Is()
const {
return std::holds_alternative<T>(
_value); }
1306 template<
typename T>
1309 if (std::holds_alternative<T>(
_value))
1310 return &std::get<T>(
_value);
1314 template<
typename Visitor>
1315 decltype(
auto)
Visit(Visitor&& visitor)
const noexcept
1317 return std::visit(std::forward<Visitor>(visitor),
_value);
1321 template<
typename T>
1324 _value.template emplace<T>();
1327 template<
typename T>
1330 if (std::holds_alternative<T>(
_value))
1331 return &std::get<T>(
_value);
1335 std::variant<std::monostate, Types...>
_value;
1338 template<
int32 BlockBit,
uint32 Bit,
typename... Types>
1343 template<
typename T>
#define DEFINE_ENUM_FLAG(enumType)
std::optional< T > Optional
Optional helper class to wrap optional values within.
std::vector< T >::const_iterator begin() const
void ClearChanged(std::size_t index)
std::vector< T >::const_iterator end() const
bool HasChanged(uint32 index) const
void MarkChanged(std::size_t index)
T const & operator[](std::size_t index) const
void WriteUpdateMask(ByteBuffer &data, int32 bitsForSize=32) const
std::vector< uint32 > _updateMask
int32 FindIndexIf(Pred pred) const
int32 FindIndex(T const &value) const
static void ClearChangesMask(OptionalUpdateFieldBase< T > &field)
void ClearChanged(UpdateField< T, BlockBit, Bit >(Derived::*))
static void ClearChangesMask(UpdateFieldArrayBase< T, Size > &field)
static void ClearChangesMask(UpdateFieldBase< T > &field)
void MarkChanged(VariantUpdateField< BlockBit, Bit, Types... >(Derived::*))
void ClearChanged(MapUpdateField< K, V, BlockBit, Bit >(Derived::*))
void ClearChanged(OptionalUpdateField< T, BlockBit, Bit >(Derived::*))
void MarkChanged(OptionalUpdateField< T, BlockBit, Bit >(Derived::*))
Mask const & GetChangesMask() const
void MarkChanged(MapUpdateField< K, V, BlockBit, Bit >(Derived::*))
void ClearChanged(VariantUpdateField< BlockBit, Bit, Types... >(Derived::*))
void MarkChanged(DynamicUpdateField< T, BlockBit, Bit >(Derived::*))
void ClearChanged(UpdateFieldArray< T, Size, Bit, FirstElementBit >(Derived::*), uint32 index)
void MarkChanged(SetUpdateField< T, BlockBit, Bit >(Derived::*))
static void ClearChangesMask(VariantUpdateFieldBase< Types... > &field)
void ClearChanged(SetUpdateField< T, BlockBit, Bit >(Derived::*))
static void ClearChangesMask(SetUpdateFieldBase< T > &field)
void MarkChanged(UpdateFieldArray< T, Size, Bit, FirstElementBit >(Derived::*), uint32 index)
void MarkChanged(UpdateField< T, BlockBit, Bit >(Derived::*))
static void ClearChangesMask(MapUpdateFieldBase< K, V > &field)
void ClearChanged(DynamicUpdateField< T, BlockBit, Bit >(Derived::*))
static void ClearChangesMask(DynamicUpdateFieldBase< T > &field)
std::unordered_map< K, Value > _values
V const * Get(K const &key) const
std::unordered_map< K, Value >::const_iterator end() const
std::pair< K const *, V const * > FindIf(Pred &&pred) const
std::unordered_map< K, Value >::const_iterator begin() const
std::pair< key_type const, mapped_type > value_type
T const & operator*() const
std::integral_constant< bool, sizeof(void *) *3< sizeof(T)> IsLarge
std::conditional_t< IsLarge::value, std::unique_ptr< T >, Optional< T > > StorageType
T const * operator->() const
std::unordered_map< T, MapUpdateFieldState >::const_iterator begin() const
std::unordered_map< T, MapUpdateFieldState >::const_iterator end() const
std::unordered_map< T, MapUpdateFieldState > _values
std::pair< key_type const, mapped_type > value_type
static constexpr std::size_t size()
T const & operator[](std::size_t index) const
T const & operator*() const
T const * operator->() const
T const * Get() const noexcept
decltype(auto) Visit(Visitor &&visitor) const noexcept
std::variant< std::monostate, Types... > _value
constexpr void Reset(uint32 index)
constexpr void Set(uint32 index)
constexpr std::size_t size()
constexpr std::type_identity< T > VariantCase
std::conditional_t< PublicSet, UpdateFieldPublicSetter< T >, UpdateFieldPrivateSetter< T > > UpdateFieldSetter
void WriteDynamicFieldUpdateMask(std::size_t size, std::vector< uint32 > const &updateMask, ByteBuffer &data, int32 bitsForSize=32)
constexpr std::size_t size_of_value_type()
std::conditional_t< std::is_base_of_v< HasChangesMaskTag, T >, MutableFieldReferenceWithChangesMask< T, PublicSet >, MutableFieldReferenceNoChangesMask< T, PublicSet > > MutableFieldReference
constexpr std::size_t GetBlockIndex(std::size_t bit)
constexpr uint32 GetBlockFlag(std::size_t bit)
DynamicUpdateFieldSetter(std::vector< T > &values, std::vector< uint32 > &updateMask)
friend void ClearDynamicUpdateFieldValues(DynamicUpdateFieldSetter< F > &setter)
friend DynamicUpdateFieldSetter< F >::insert_result InsertDynamicUpdateFieldValue(DynamicUpdateFieldSetter< F > &setter, uint32 index)
friend DynamicUpdateFieldSetter< F >::insert_result AddDynamicUpdateFieldValue(DynamicUpdateFieldSetter< F > &setter)
friend void RemoveDynamicUpdateFieldValue(DynamicUpdateFieldSetter< F > &setter, uint32 index)
std::conditional_t< std::is_base_of_v< HasChangesMaskTag, T >, MutableFieldReference< T, true >, T & > insert_result
void RemoveValue(std::size_t index)
std::vector< T > & _values
void MarkChanged(std::size_t index)
std::vector< uint32 > & _updateMask
insert_result InsertValue(std::size_t index)
MapUpdateFieldState state
bool RemoveKey(K const &key)
friend bool RemoveMapUpdateFieldValue(MapUpdateFieldSetter< F, G > &setter, std::type_identity_t< F > const &key)
std::unordered_map< K, V > & _values
MapUpdateFieldSetter(std::unordered_map< K, V > &values)
MutableFieldReferenceNoChangesMask(T &value)
UpdateFieldSetter< V, PublicSet > ModifyValue(V(T::*field)[Size], uint32 index)
UpdateFieldSetter< V, PublicSet > ModifyValue(V(T::*field))
DynamicUpdateFieldSetter< V > ModifyValue(DynamicUpdateField< V, BlockBit, Bit >(T::*field))
std::conditional_t< std::is_base_of_v< IsUpdateFieldStructureTag, V >, MutableFieldReference< V, PublicSet >, std::conditional_t< std::is_base_of_v< IsUpdateFieldHolderTag, V >, MutableNestedFieldReference< V, PublicSet >, UpdateFieldSetter< V, PublicSet > > > ModifyValue(UpdateField< V, BlockBit, Bit >(T::*field))
MapUpdateFieldSetter< K, typename MapUpdateField< K, V, BlockBit, Bit >::mapped_type > ModifyValue(MapUpdateField< K, V, BlockBit, Bit >(T::*field))
std::conditional_t< std::is_base_of_v< IsUpdateFieldStructureTag, V >, MutableFieldReference< V, PublicSet >, std::conditional_t< std::is_base_of_v< IsUpdateFieldHolderTag, V >, MutableNestedFieldReference< V, PublicSet >, UpdateFieldSetter< V, PublicSet > > > ModifyValue(DynamicUpdateField< V, BlockBit, Bit >(T::*field), uint32 index)
MutableFieldReferenceWithChangesMask(T &value)
OptionalUpdateFieldSetter< V > ModifyValue(OptionalUpdateField< V, BlockBit, Bit >(T::*field))
std::conditional_t< std::is_base_of_v< IsUpdateFieldStructureTag, V >, MutableFieldReference< V, PublicSet >, std::conditional_t< std::is_base_of_v< IsUpdateFieldHolderTag, V >, MutableNestedFieldReference< V, PublicSet >, UpdateFieldSetter< V, PublicSet > > > ModifyValue(UpdateFieldArray< V, Size, Bit, FirstElementBit >(T::*field), uint32 index)
std::conditional_t< std::is_base_of_v< IsUpdateFieldStructureTag, V >, MutableFieldReference< V, PublicSet >, std::conditional_t< std::is_base_of_v< IsUpdateFieldHolderTag, V >, MutableNestedFieldReference< V, PublicSet >, UpdateFieldSetter< V, PublicSet > > > ModifyValue(OptionalUpdateField< V, BlockBit, Bit >(T::*field), uint32)
SetUpdateFieldSetter< V > ModifyValue(SetUpdateField< V, BlockBit, Bit >(T::*field))
std::conditional_t< std::is_base_of_v< IsUpdateFieldStructureTag, V >, MutableFieldReference< V, PublicSet >, std::conditional_t< std::is_base_of_v< IsUpdateFieldHolderTag, V >, MutableNestedFieldReference< V, PublicSet >, UpdateFieldSetter< V, PublicSet > > > ModifyValue(VariantUpdateField< BlockBit, Bit, Types... >(T::*field), std::type_identity< V > type)
std::conditional_t< std::is_base_of_v< IsUpdateFieldStructureTag, V >, MutableFieldReference< V, PublicSet >, std::conditional_t< std::is_base_of_v< IsUpdateFieldHolderTag, V >, MutableNestedFieldReference< V, PublicSet >, UpdateFieldSetter< V, PublicSet > > > ModifyValue(MapUpdateField< K, V, BlockBit, Bit >(T::*field), std::type_identity_t< K > const &key)
typename T::value_type value_type
MutableNestedFieldReference(T &value)
std::enable_if_t< std::is_base_of_v< DynamicUpdateFieldBase< value_type >, U >, std::conditional_t< std::is_base_of_v< IsUpdateFieldStructureTag, value_type >, MutableFieldReference< value_type, PublicSet >, std::conditional_t< std::is_base_of_v< IsUpdateFieldHolderTag, value_type >, MutableNestedFieldReference< value_type, PublicSet >, UpdateFieldSetter< value_type, PublicSet > > > > ModifyValue(uint32 index)
std::enable_if_t< std::is_base_of_v< OptionalUpdateFieldBase< value_type >, U >, std::conditional_t< std::is_base_of_v< IsUpdateFieldStructureTag, value_type >, MutableFieldReference< value_type, PublicSet >, std::conditional_t< std::is_base_of_v< IsUpdateFieldHolderTag, value_type >, MutableNestedFieldReference< value_type, PublicSet >, UpdateFieldSetter< value_type, PublicSet > > > > ModifyValue(uint32)
std::enable_if_t< std::is_base_of_v< DynamicUpdateFieldBase< value_type >, U >, DynamicUpdateFieldSetter< value_type > > ModifyValue()
std::enable_if_t< std::is_base_of_v< UpdateFieldArrayBaseWithoutSize< value_type >, U >, std::conditional_t< std::is_base_of_v< IsUpdateFieldStructureTag, value_type >, MutableFieldReference< value_type, PublicSet >, std::conditional_t< std::is_base_of_v< IsUpdateFieldHolderTag, value_type >, MutableNestedFieldReference< value_type, PublicSet >, UpdateFieldSetter< value_type, PublicSet > > > > ModifyValue(uint32 index)
std::enable_if_t< std::is_base_of_v< UpdateFieldBase< value_type >, U >, std::conditional_t< std::is_base_of_v< IsUpdateFieldStructureTag, value_type >, MutableFieldReference< value_type, PublicSet >, std::conditional_t< std::is_base_of_v< IsUpdateFieldHolderTag, value_type >, MutableNestedFieldReference< value_type, PublicSet >, UpdateFieldSetter< value_type, PublicSet > > > > ModifyValue()
std::enable_if_t< std::is_base_of_v< OptionalUpdateFieldBase< value_type >, U >, OptionalUpdateFieldSetter< value_type > > ModifyValue()
friend bool RemoveOptionalUpdateFieldValue(OptionalUpdateFieldSetter< F > &setter)
OptionalUpdateFieldSetter(OptionalUpdateFieldBase< T > &field)
OptionalUpdateFieldBase< T > & _field
bool Remove(T const &key)
friend bool RemoveSetUpdateFieldValue(SetUpdateFieldSetter< F > &setter, std::type_identity_t< F > const &key)
std::unordered_map< T, MapUpdateFieldState > & _values
bool Insert(T const &key)
SetUpdateFieldSetter(std::unordered_map< T, MapUpdateFieldState > &values)
UpdateFieldPrivateSetter(T &value)
friend bool SetUpdateFieldValue(UpdateFieldPrivateSetter< F > &setter, typename UpdateFieldPrivateSetter< F >::value_type &&value)
UpdateFieldPublicSetter(T &value)