Skip to content

Commit 966e27d

Browse files
authored
Add NotifyTargetSet (#1251)
1 parent 3d02f7f commit 966e27d

21 files changed

Lines changed: 709 additions & 258 deletions

src/RA_Integration.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@
224224
<ClInclude Include="data\models\LocalBadgesModel.hh" />
225225
<ClInclude Include="data\models\RichPresenceModel.hh" />
226226
<ClInclude Include="data\models\TriggerValidation.hh" />
227+
<ClInclude Include="data\NotifyTargetSet.hh" />
227228
<ClInclude Include="data\search\MemBlock.hh" />
228229
<ClInclude Include="data\Types.hh" />
229230
<ClInclude Include="Exports.hh" />

src/RA_Integration.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1103,6 +1103,9 @@
11031103
<ClInclude Include="api\UpdateRichPresence.hh">
11041104
<Filter>API</Filter>
11051105
</ClInclude>
1106+
<ClInclude Include="data\NotifyTargetSet.hh">
1107+
<Filter>Data</Filter>
1108+
</ClInclude>
11061109
</ItemGroup>
11071110
<ItemGroup>
11081111
<ResourceCompile Include="RA_Shared.rc">

src/RA_Log.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
#ifdef RA_UTEST
88

99
#define RA_LOG_LEVEL(lvl, ...)
10-
#define RA_LOG(...)
1110

1211
#else
1312

src/data/DataModelBase.cpp

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,12 @@ void DataModelBase::OnValueChanged(const BoolModelProperty::ChangeArgs& args)
3131
}
3232
}
3333

34-
if (!m_vNotifyTargets.empty())
34+
if (m_vNotifyTargets.LockIfNotEmpty())
3535
{
36-
// create a copy of the list of pointers in case it's modified by one of the callbacks
37-
NotifyTargetSet vNotifyTargets(m_vNotifyTargets);
38-
for (NotifyTarget* target : vNotifyTargets)
39-
{
40-
Expects(target != nullptr);
41-
target->OnDataModelBoolValueChanged(args);
42-
}
36+
for (auto& target : m_vNotifyTargets.Targets())
37+
target.OnDataModelBoolValueChanged(args);
38+
39+
m_vNotifyTargets.Unlock();
4340
}
4441

4542
ModelBase::OnValueChanged(args);
@@ -88,15 +85,12 @@ void DataModelBase::OnValueChanged(const StringModelProperty::ChangeArgs& args)
8885
}
8986
}
9087

91-
if (!m_vNotifyTargets.empty())
88+
if (m_vNotifyTargets.LockIfNotEmpty())
9289
{
93-
// create a copy of the list of pointers in case it's modified by one of the callbacks
94-
NotifyTargetSet vNotifyTargets(m_vNotifyTargets);
95-
for (NotifyTarget* target : vNotifyTargets)
96-
{
97-
Expects(target != nullptr);
98-
target->OnDataModelStringValueChanged(args);
99-
}
90+
for (auto& target : m_vNotifyTargets.Targets())
91+
target.OnDataModelStringValueChanged(args);
92+
93+
m_vNotifyTargets.Unlock();
10094
}
10195

10296
ModelBase::OnValueChanged(args);
@@ -145,15 +139,12 @@ void DataModelBase::OnValueChanged(const IntModelProperty::ChangeArgs& args)
145139
}
146140
}
147141

148-
if (!m_vNotifyTargets.empty())
142+
if (m_vNotifyTargets.LockIfNotEmpty())
149143
{
150-
// create a copy of the list of pointers in case it's modified by one of the callbacks
151-
NotifyTargetSet vNotifyTargets(m_vNotifyTargets);
152-
for (NotifyTarget* target : vNotifyTargets)
153-
{
154-
Expects(target != nullptr);
155-
target->OnDataModelIntValueChanged(args);
156-
}
144+
for (auto& target : m_vNotifyTargets.Targets())
145+
target.OnDataModelIntValueChanged(args);
146+
147+
m_vNotifyTargets.Unlock();
157148
}
158149

159150
ModelBase::OnValueChanged(args);

src/data/DataModelBase.hh

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#pragma once
44

55
#include "ModelBase.hh"
6+
#include "NotifyTargetSet.hh"
67

78
namespace ra {
89
namespace data {
@@ -25,24 +26,18 @@ public:
2526
virtual void OnDataModelIntValueChanged([[maybe_unused]] const IntModelProperty::ChangeArgs& args) noexcept(false) {}
2627
};
2728

28-
void AddNotifyTarget(NotifyTarget& pTarget) noexcept { GSL_SUPPRESS_F6 m_vNotifyTargets.insert(&pTarget); }
29+
void AddNotifyTarget(NotifyTarget& pTarget) noexcept { m_vNotifyTargets.Add(pTarget); }
2930

3031
void RemoveNotifyTarget(NotifyTarget& pTarget) noexcept
3132
{
3233
#ifdef RA_UTEST
3334
GSL_SUPPRESS_F6 Expects(!m_bDestructed);
3435
#endif
35-
GSL_SUPPRESS_F6 m_vNotifyTargets.erase(&pTarget);
36+
m_vNotifyTargets.Remove(pTarget);
3637
}
3738

3839
private:
39-
using NotifyTargetSet = std::set<NotifyTarget*>;
40-
41-
/// <summary>
42-
/// A collection of pointers to other objects. These are not allocated object and do not need to be free'd. It's
43-
/// impossible to create a set of <c>NotifyTarget</c> references.
44-
/// </summary>
45-
NotifyTargetSet m_vNotifyTargets;
40+
NotifyTargetSet<NotifyTarget> m_vNotifyTargets;
4641

4742
public:
4843
/// <summary>

src/data/DataModelCollection.cpp

Lines changed: 44 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -5,115 +5,106 @@ namespace data {
55

66
void DataModelCollectionBase::OnFrozen() noexcept
77
{
8-
m_vNotifyTargets.clear();
8+
m_vNotifyTargets.Clear();
99
}
1010

1111
void DataModelCollectionBase::OnModelValueChanged(gsl::index nIndex,
1212
const BoolModelProperty::ChangeArgs& args)
1313
{
14-
// create a copy of the list of pointers in case it's modified by one of the callbacks
15-
NotifyTargetSet vNotifyTargets(m_vNotifyTargets);
16-
for (NotifyTarget* target : vNotifyTargets)
14+
if (m_vNotifyTargets.LockIfNotEmpty())
1715
{
18-
Expects(target != nullptr);
19-
target->OnDataModelBoolValueChanged(nIndex, args);
16+
for (auto& target : m_vNotifyTargets.Targets())
17+
target.OnDataModelBoolValueChanged(nIndex, args);
18+
19+
m_vNotifyTargets.Unlock();
2020
}
2121
}
2222

2323
void DataModelCollectionBase::OnModelValueChanged(gsl::index nIndex,
2424
const StringModelProperty::ChangeArgs& args)
2525
{
26-
// create a copy of the list of pointers in case it's modified by one of the callbacks
27-
NotifyTargetSet vNotifyTargets(m_vNotifyTargets);
28-
for (NotifyTarget* target : vNotifyTargets)
26+
if (m_vNotifyTargets.LockIfNotEmpty())
2927
{
30-
Expects(target != nullptr);
31-
target->OnDataModelStringValueChanged(nIndex, args);
28+
for (auto& target : m_vNotifyTargets.Targets())
29+
target.OnDataModelStringValueChanged(nIndex, args);
30+
31+
m_vNotifyTargets.Unlock();
3232
}
3333
}
3434

3535
void DataModelCollectionBase::OnModelValueChanged(gsl::index nIndex,
3636
const IntModelProperty::ChangeArgs& args)
3737
{
38-
// create a copy of the list of pointers in case it's modified by one of the callbacks
39-
NotifyTargetSet vNotifyTargets(m_vNotifyTargets);
40-
for (NotifyTarget* target : vNotifyTargets)
38+
if (m_vNotifyTargets.LockIfNotEmpty())
4139
{
42-
Expects(target != nullptr);
43-
target->OnDataModelIntValueChanged(nIndex, args);
40+
for (auto& target : m_vNotifyTargets.Targets())
41+
target.OnDataModelIntValueChanged(nIndex, args);
42+
43+
m_vNotifyTargets.Unlock();
4444
}
4545
}
4646

4747
void DataModelCollectionBase::OnBeginUpdate()
4848
{
49-
// create a copy of the list of pointers in case it's modified by one of the callbacks
50-
NotifyTargetSet vNotifyTargets(m_vNotifyTargets);
51-
for (NotifyTarget* target : vNotifyTargets)
49+
if (m_vNotifyTargets.LockIfNotEmpty())
5250
{
53-
Expects(target != nullptr);
54-
target->OnBeginDataModelCollectionUpdate();
51+
for (auto& target : m_vNotifyTargets.Targets())
52+
target.OnBeginDataModelCollectionUpdate();
53+
54+
m_vNotifyTargets.Unlock();
5555
}
5656
}
5757

5858
void DataModelCollectionBase::OnEndUpdate()
5959
{
60-
// create a copy of the list of pointers in case it's modified by one of the callbacks
61-
NotifyTargetSet vNotifyTargets(m_vNotifyTargets);
62-
for (NotifyTarget* target : vNotifyTargets)
60+
if (m_vNotifyTargets.LockIfNotEmpty())
6361
{
64-
Expects(target != nullptr);
65-
target->OnEndDataModelCollectionUpdate();
62+
for (auto& target : m_vNotifyTargets.Targets())
63+
target.OnEndDataModelCollectionUpdate();
64+
65+
m_vNotifyTargets.Unlock();
6666
}
6767
}
6868

6969
void DataModelCollectionBase::OnItemsRemoved(const std::vector<gsl::index>& vDeletedIndices)
7070
{
71-
if (!m_vNotifyTargets.empty())
71+
if (m_vNotifyTargets.LockIfNotEmpty())
7272
{
73-
// create a copy of the list of pointers in case it's modified by one of the callbacks
74-
NotifyTargetSet vNotifyTargets(m_vNotifyTargets);
75-
for (auto nDeletedIndex : vDeletedIndices)
73+
for (auto& target : m_vNotifyTargets.Targets())
7674
{
77-
for (NotifyTarget* target : vNotifyTargets)
78-
{
79-
Expects(target != nullptr);
80-
target->OnDataModelRemoved(nDeletedIndex);
81-
}
75+
for (auto nDeletedIndex : vDeletedIndices)
76+
target.OnDataModelRemoved(nDeletedIndex);
8277
}
78+
79+
m_vNotifyTargets.Unlock();
8380
}
8481
}
8582

8683
void DataModelCollectionBase::OnItemsAdded(const std::vector<gsl::index>& vNewIndices)
8784
{
88-
if (!m_vNotifyTargets.empty())
85+
if (m_vNotifyTargets.LockIfNotEmpty())
8986
{
90-
// create a copy of the list of pointers in case it's modified by one of the callbacks
91-
NotifyTargetSet vNotifyTargets(m_vNotifyTargets);
92-
for (auto vNewIndex : vNewIndices)
87+
for (auto& target : m_vNotifyTargets.Targets())
9388
{
94-
for (NotifyTarget* target : vNotifyTargets)
95-
{
96-
Expects(target != nullptr);
97-
target->OnDataModelAdded(vNewIndex);
98-
}
89+
for (auto vNewIndex : vNewIndices)
90+
target.OnDataModelAdded(vNewIndex);
9991
}
92+
93+
m_vNotifyTargets.Unlock();
10094
}
10195
}
10296

10397
void DataModelCollectionBase::OnItemsChanged(const std::vector<gsl::index>& vChangedIndices)
10498
{
105-
if (!m_vNotifyTargets.empty())
99+
if (m_vNotifyTargets.LockIfNotEmpty())
106100
{
107-
// create a copy of the list of pointers in case it's modified by one of the callbacks
108-
NotifyTargetSet vNotifyTargets(m_vNotifyTargets);
109-
for (auto vChangedIndex : vChangedIndices)
101+
for (auto& target : m_vNotifyTargets.Targets())
110102
{
111-
for (NotifyTarget* target : vNotifyTargets)
112-
{
113-
Expects(target != nullptr);
114-
target->OnDataModelChanged(vChangedIndex);
115-
}
103+
for (auto vChangedIndex : vChangedIndices)
104+
target.OnDataModelChanged(vChangedIndex);
116105
}
106+
107+
m_vNotifyTargets.Unlock();
117108
}
118109
}
119110

src/data/DataModelCollection.hh

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,14 @@ public:
4747
virtual void OnEndDataModelCollectionUpdate() noexcept(false) {}
4848
};
4949

50-
void AddNotifyTarget(NotifyTarget& pTarget)
50+
void AddNotifyTarget(NotifyTarget& pTarget) noexcept
5151
{
5252
if (!IsFrozen())
5353
{
54-
if (m_vNotifyTargets.empty())
54+
if (m_vNotifyTargets.IsEmpty())
5555
StartWatching();
5656

57-
m_vNotifyTargets.insert(&pTarget);
57+
m_vNotifyTargets.Add(pTarget);
5858
}
5959
}
6060

@@ -64,11 +64,11 @@ public:
6464
Expects(!m_bDisposed);
6565
#endif
6666

67-
if (!m_vNotifyTargets.empty())
67+
if (!m_vNotifyTargets.IsEmpty())
6868
{
69-
m_vNotifyTargets.erase(&pTarget);
69+
m_vNotifyTargets.Remove(pTarget);
7070

71-
if (m_vNotifyTargets.empty())
71+
if (m_vNotifyTargets.IsEmpty())
7272
StopWatching();
7373
}
7474
}
@@ -80,7 +80,7 @@ protected:
8080

8181
bool IsWatching() const noexcept override
8282
{
83-
return !IsFrozen() && !m_vNotifyTargets.empty();
83+
return !IsFrozen() && !m_vNotifyTargets.IsEmpty();
8484
}
8585

8686
void OnFrozen() noexcept override;
@@ -92,13 +92,7 @@ protected:
9292
void OnItemsChanged(const std::vector<gsl::index>& vChangedIndices) override;
9393

9494
private:
95-
using NotifyTargetSet = std::set<NotifyTarget*>;
96-
97-
/// <summary>
98-
/// A collection of pointers to other objects. These are not allocated object and do not need to be free'd. It's
99-
/// impossible to create a set of <c>NotifyTarget</c> references.
100-
/// </summary>
101-
NotifyTargetSet m_vNotifyTargets;
95+
NotifyTargetSet<NotifyTarget> m_vNotifyTargets;
10296
};
10397

10498
template<class T>

0 commit comments

Comments
 (0)