Skip to content

Commit 4c250b2

Browse files
authored
Merge branch 'main' into docs/1037-primers
2 parents 0f63b48 + 0c187b1 commit 4c250b2

File tree

8 files changed

+1547
-1253
lines changed

8 files changed

+1547
-1253
lines changed

dart/common/Composite.cpp

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ void Composite::matchAspects(const Composite* otherComposite)
243243
}
244244

245245
for (auto& aspect : mAspectMap)
246-
aspect.second = nullptr;
246+
_replaceAspect(aspect.second, nullptr);
247247

248248
duplicateAspects(otherComposite);
249249
}
@@ -262,22 +262,29 @@ void Composite::removeFromComposite(Aspect* aspect)
262262
aspect->loseComposite(this);
263263
}
264264

265+
//==============================================================================
266+
void Composite::_replaceAspect(
267+
std::unique_ptr<Aspect>& slot, std::unique_ptr<Aspect> replacement)
268+
{
269+
removeFromComposite(slot.get());
270+
slot = std::move(replacement);
271+
addToComposite(slot.get());
272+
}
273+
265274
//==============================================================================
266275
void Composite::_set(std::type_index type_idx, const Aspect* aspect)
267276
{
268-
if (aspect) {
269-
mAspectMap[type_idx] = aspect->cloneAspect();
270-
addToComposite(mAspectMap[type_idx].get());
271-
} else {
272-
mAspectMap[type_idx] = nullptr;
273-
}
277+
auto insertion = mAspectMap.insert(AspectMap::value_type(type_idx, nullptr));
278+
auto& slot = insertion.first->second;
279+
_replaceAspect(slot, aspect ? aspect->cloneAspect() : nullptr);
274280
}
275281

276282
//==============================================================================
277283
void Composite::_set(std::type_index type_idx, std::unique_ptr<Aspect> aspect)
278284
{
279-
mAspectMap[type_idx] = std::move(aspect);
280-
addToComposite(mAspectMap[type_idx].get());
285+
auto insertion = mAspectMap.insert(AspectMap::value_type(type_idx, nullptr));
286+
auto& slot = insertion.first->second;
287+
_replaceAspect(slot, std::move(aspect));
281288
}
282289

283290
} // namespace common

dart/common/Composite.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,13 @@ class DART_API Composite
173173
/// to call the protected Aspect::loseComposite function.
174174
void removeFromComposite(Aspect* aspect);
175175

176+
/// Replace the Aspect stored in a given slot.
177+
///
178+
/// This ensures that the old Aspect is notified that it is losing its
179+
/// Composite and that the new Aspect is notified of its new Composite.
180+
void _replaceAspect(
181+
std::unique_ptr<Aspect>& slot, std::unique_ptr<Aspect> replacement);
182+
176183
/// Non-templated version of set(const T*)
177184
void _set(std::type_index type_idx, const Aspect* aspect);
178185

dart/common/detail/Composite.hpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,14 @@ void Composite::set(std::unique_ptr<T>&& aspect)
9393
template <class T, typename... Args>
9494
T* Composite::createAspect(Args&&... args)
9595
{
96-
T* aspect = new T(std::forward<Args>(args)...);
97-
mAspectMap[typeid(T)] = std::unique_ptr<T>(aspect);
98-
addToComposite(aspect);
96+
auto insertion = mAspectMap.insert(AspectMap::value_type(typeid(T), nullptr));
97+
auto& slot = insertion.first->second;
9998

100-
return aspect;
99+
auto aspect = std::make_unique<T>(std::forward<Args>(args)...);
100+
T* raw = aspect.get();
101+
_replaceAspect(slot, std::move(aspect));
102+
103+
return raw;
101104
}
102105

103106
//==============================================================================
@@ -106,10 +109,8 @@ void Composite::removeAspect()
106109
{
107110
AspectMap::iterator it = mAspectMap.find(typeid(T));
108111
DART_COMMON_CHECK_ILLEGAL_ASPECT_ERASE(removeAspect, T, DART_BLANK)
109-
if (mAspectMap.end() != it) {
110-
removeFromComposite(it->second.get());
111-
it->second = nullptr;
112-
}
112+
if (mAspectMap.end() != it)
113+
_replaceAspect(it->second, nullptr);
113114
}
114115

115116
//==============================================================================

dart/common/detail/CompositeData.hpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -154,15 +154,14 @@ class CompositeData : public CloneableMap<MapType>
154154
using Data = typename GetData<AspectT>::Type;
155155
using AspectType = typename GetAspect<AspectT>::Type;
156156

157-
auto& it = this->mMap.insert(
158-
std::make_pair<std::type_index, std::unique_ptr<Data>>(
159-
typeid(AspectType), nullptr));
157+
auto insertion = this->mMap.insert(
158+
typename MapType::value_type(typeid(AspectType), nullptr));
159+
auto& it = insertion.first;
160160

161-
const bool exists = !it.second;
162-
if (!exists)
163-
it.first = std::make_unique<Data>(std::forward<Args>(args)...);
161+
if (insertion.second || !it->second)
162+
it->second = std::make_unique<Data>(std::forward<Args>(args)...);
164163

165-
return static_cast<Data&>(*it.first);
164+
return static_cast<Data&>(*it->second);
166165
}
167166

168167
template <class AspectT>

dart/common/detail/SpecializedForAspect.hpp

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -206,12 +206,8 @@ void SpecializedForAspect<SpecAspect>::_set(
206206
usedSpecializedAspectAccess = true;
207207
#endif // DART_UNITTEST_SPECIALIZED_ASPECT_ACCESS
208208

209-
if (aspect) {
210-
mSpecAspectIterator->second = aspect->cloneAspect();
211-
addToComposite(mSpecAspectIterator->second.get());
212-
} else {
213-
mSpecAspectIterator->second = nullptr;
214-
}
209+
_replaceAspect(
210+
mSpecAspectIterator->second, aspect ? aspect->cloneAspect() : nullptr);
215211
}
216212

217213
//==============================================================================
@@ -232,8 +228,7 @@ void SpecializedForAspect<SpecAspect>::_set(
232228
usedSpecializedAspectAccess = true;
233229
#endif // DART_UNITTEST_SPECIALIZED_ASPECT_ACCESS
234230

235-
mSpecAspectIterator->second = std::move(aspect);
236-
addToComposite(mSpecAspectIterator->second.get());
231+
_replaceAspect(mSpecAspectIterator->second, std::move(aspect));
237232
}
238233

239234
//==============================================================================
@@ -254,11 +249,11 @@ SpecAspect* SpecializedForAspect<SpecAspect>::_createAspect(
254249
usedSpecializedAspectAccess = true;
255250
#endif // DART_UNITTEST_SPECIALIZED_ASPECT_ACCESS
256251

257-
SpecAspect* aspect = new SpecAspect(std::forward<Args>(args)...);
258-
mSpecAspectIterator->second = std::unique_ptr<SpecAspect>(aspect);
259-
addToComposite(aspect);
252+
auto aspect = std::make_unique<SpecAspect>(std::forward<Args>(args)...);
253+
SpecAspect* raw = aspect.get();
254+
_replaceAspect(mSpecAspectIterator->second, std::move(aspect));
260255

261-
return aspect;
256+
return raw;
262257
}
263258

264259
//==============================================================================
@@ -279,8 +274,7 @@ void SpecializedForAspect<SpecAspect>::_removeAspect(type<SpecAspect>)
279274

280275
DART_COMMON_CHECK_ILLEGAL_ASPECT_ERASE(erase, SpecAspect, DART_BLANK);
281276

282-
removeFromComposite(mSpecAspectIterator->second.get());
283-
mSpecAspectIterator->second = nullptr;
277+
_replaceAspect(mSpecAspectIterator->second, nullptr);
284278
}
285279

286280
//==============================================================================

docs/onboarding/aspect-system.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ This is used for copy/clone/serialization-style workflows:
120120

121121
### Typed bundles (`Composite::MakeState` / `Composite::MakeProperties`)
122122

123-
When you *know at compile time* which Aspects you care about, you can use the typed bundling helpers:
123+
When you _know at compile time_ which Aspects you care about, you can use the typed bundling helpers:
124124

125125
- `Composite::MakeState<Aspects...>`
126126
- `Composite::MakeProperties<Aspects...>`

0 commit comments

Comments
 (0)