@@ -109,20 +109,18 @@ void ContainerBasePrivate::compute() {
109109template <Interface::Direction dir>
110110void ContainerBasePrivate::copyState (Interface::iterator external, const InterfacePtr& target, bool updated) {
111111 if (updated) {
112- // TODO(v4hn): This is inefficient, consider storing inverse mapping for each start/end pair in children
113- // for parallel containers there will be multiple internal states
114- std::for_each (internal_to_external_.begin (), internal_to_external_.end (), [&external](auto & p) {
115- if (p.second == &*external)
116- setStatus<dir>(p.first , external->priority ().status ());
117- });
112+ auto internals{ externalToInternalMap ().equal_range (&*external) };
113+ for (auto & i = internals.first ; i != internals.second ; ++i) {
114+ setStatus<dir>(i->second , external->priority ().status ());
115+ }
118116 return ;
119117 }
120118
121119 // create a clone of external state within target interface (child's starts() or ends())
122120 auto internal = states_.insert (states_.end (), InterfaceState (*external));
123121 target->add (*internal);
124122 // and remember the mapping between them
125- internal_to_external_ .insert (std::make_pair (&*internal, &*external));
123+ internalToExternalMap () .insert (std::make_pair (&*internal, &*external));
126124}
127125
128126void ContainerBasePrivate::liftSolution (const SolutionBasePtr& solution, const InterfaceState* internal_from,
@@ -131,12 +129,12 @@ void ContainerBasePrivate::liftSolution(const SolutionBasePtr& solution, const I
131129
132130 // map internal to external states
133131 auto find_or_create_external = [this ](const InterfaceState* internal, bool & created) -> InterfaceState* {
134- auto it = internal_to_external_ .find (internal);
135- if (it != internal_to_external_ .end ())
136- return it->second ;
132+ auto it = internalToExternalMap () .find (internal);
133+ if (it != internalToExternalMap () .end ())
134+ return const_cast <InterfaceState*>( it->second ) ;
137135
138136 InterfaceState* external = &*states_.insert (states_.end (), InterfaceState (*internal));
139- internal_to_external_ .insert (std::make_pair (internal, external));
137+ internalToExternalMap () .insert (std::make_pair (internal, external));
140138 created = true ;
141139 return external;
142140 };
@@ -240,7 +238,7 @@ void ContainerBase::reset() {
240238 impl->pending_backward_ ->clear ();
241239 impl->pending_forward_ ->clear ();
242240 // ... and state mapping
243- impl->internal_to_external_ .clear ();
241+ impl->internalToExternalMap () .clear ();
244242
245243 // interfaces depend on children which might change
246244 impl->required_interface_ = UNKNOWN;
0 commit comments