@@ -35,6 +35,11 @@ namespace dsm {
3535
3636 using TimePoint = long long unsigned int ;
3737
38+ template <typename T>
39+ std::unique_ptr<T> clone (const std::unique_ptr<T>& ptr) {
40+ return std::make_unique<T>(*ptr);
41+ }
42+
3843 // / @brief The Measurement struct represents the mean of a quantity and its standard deviation
3944 // / @tparam T The type of the quantity
4045 // / @param mean The mean
@@ -415,7 +420,7 @@ namespace dsm {
415420 requires (is_numeric_v<Delay>)
416421 Id Dynamics<Delay>::m_nextStreetId(Id agentId, Id nodeId, std::optional<Id> streetId) {
417422 auto possibleMoves = m_graph.adjMatrix ().getRow (nodeId, true );
418- if (this ->m_itineraries .size () > 0 &&
423+ if (! this ->m_itineraries .empty () &&
419424 this ->m_uniformDist (this ->m_generator ) > this ->m_errorProbability ) {
420425 const auto & it = this ->m_itineraries [this ->m_agents [agentId]->itineraryId ()];
421426 if (it->destination () != nodeId) {
@@ -664,9 +669,10 @@ namespace dsm {
664669 template <typename Delay>
665670 requires (is_numeric_v<Delay>)
666671 void Dynamics<Delay>::setItineraries(std::span<Itinerary> itineraries) {
667- std::ranges::for_each (itineraries, [this ](const auto & itinerary) {
668- this ->m_itineraries .insert (std::make_unique<Itinerary>(itinerary));
669- });
672+ std::transform (itineraries.cbegin (),
673+ itineraries.cend (),
674+ m_itineraries.begin (),
675+ [this ](const auto & pItinerary) { return clone (pItinerary); });
670676 }
671677
672678 template <typename Delay>
@@ -704,15 +710,17 @@ namespace dsm {
704710 requires (is_numeric_v<Delay>)
705711 void Dynamics<Delay>::setDestinationNodes(const std::span<Id>& destinationNodes,
706712 bool updatePaths) {
707- m_itineraries.clear ();
708- m_itineraries.reserve (destinationNodes.size ());
709- for (const auto & nodeId : destinationNodes) {
710- if (!m_graph.nodeSet ().contains (nodeId)) {
711- throw std::invalid_argument (
712- buildLog (std::format (" Node with id {} not found" , nodeId)));
713- }
714- this ->addItinerary (Itinerary{nodeId});
715- }
713+ m_itineraries.resize (destinationNodes.size ());
714+ std::transform (
715+ destinationNodes.cbegin (),
716+ destinationNodes.cend (),
717+ m_itineraries.begin ()[m_graph](auto nodeId) {
718+ if (!m_graph.nodeSet ().contains (nodeId)) {
719+ throw std::invalid_argument (
720+ buildLog (std::format (" Node with id {} not found" , nodeId)));
721+ }
722+ this ->addItinerary (Itinerary{nodeId});
723+ });
716724 if (updatePaths) {
717725 this ->updatePaths ();
718726 }
@@ -721,12 +729,12 @@ namespace dsm {
721729 template <typename Delay>
722730 requires (is_numeric_v<Delay>)
723731 const std::unique_ptr<Itinerary>& Dynamics<Delay>::itinerary(Id destination) const {
724- for ( auto const & pItinerary : m_itineraries) {
725- if (pItinerary-> destination () == destination) {
726- return pItinerary;
727- }
728- }
729- return nullptr ;
732+ auto foundIt = std::find_if ( m_itineraries. begin (),
733+ m_itineraries. end (),
734+ [destination]( const auto & pItinerary) {
735+ pItinerary-> destination () == destination;
736+ });
737+ return (foundIt == m_itineraries. end ()) ? nullptr : *foundIt ;
730738 }
731739
732740 template <typename Delay>
@@ -1157,13 +1165,13 @@ namespace dsm {
11571165 template <typename Delay>
11581166 requires (is_numeric_v<Delay>)
11591167 void Dynamics<Delay>::addItinerary(const Itinerary& itinerary) {
1160- m_itineraries.emplace_back (std::make_unique<Itinerary>(itinerary));
1168+ m_itineraries.push_back (std::make_unique<Itinerary>(itinerary));
11611169 }
11621170
11631171 template <typename Delay>
11641172 requires (is_numeric_v<Delay>)
11651173 void Dynamics<Delay>::addItinerary(std::unique_ptr<Itinerary> itinerary) {
1166- m_itineraries.emplace_back (std::move (itinerary));
1174+ m_itineraries.push_back (std::move (itinerary));
11671175 }
11681176
11691177 template <typename Delay>
@@ -1178,7 +1186,7 @@ namespace dsm {
11781186 requires (is_numeric_v<Delay>)
11791187 void Dynamics<Delay>::addItineraries(std::span<Itinerary> itineraries) {
11801188 std::ranges::for_each (itineraries, [this ](const auto & itinerary) -> void {
1181- this ->m_itineraries .insert (std::make_unique<Itinerary>(itinerary));
1189+ this ->m_itineraries .push_back (std::make_unique<Itinerary>(itinerary));
11821190 });
11831191 }
11841192
0 commit comments