@@ -382,6 +382,10 @@ namespace pl::ptrn {
382382 return this ->m_entries ;
383383 }
384384
385+ [[nodiscard]] std::vector<std::shared_ptr<Pattern>> getSortedEntries () override {
386+ return this ->m_sortedEntries ;
387+ }
388+
385389 void setOffset (u64 offset) override {
386390 for (auto &entry : this ->m_entries ) {
387391 if (entry->getSection () == this ->getSection () && entry->getSection () != ptrn::Pattern::PatternLocalSectionId)
@@ -391,7 +395,7 @@ namespace pl::ptrn {
391395 PatternBitfieldMember::setOffset (offset);
392396 }
393397
394- void forEachEntry ( u64 start, u64 end, const std::function<void (u64 , const std::shared_ptr<Pattern>&)>& fn) override {
398+ void forEachEntryImpl ( const std::vector<std::shared_ptr<Pattern>> &patterns, u64 start, u64 end, const std::function<void (u64 , const std::shared_ptr<Pattern>&)>& fn) override {
395399 auto evaluator = this ->getEvaluator ();
396400 auto startArrayIndex = evaluator->getCurrentArrayIndex ();
397401
@@ -402,10 +406,10 @@ namespace pl::ptrn {
402406 evaluator->clearCurrentArrayIndex ();
403407 };
404408
405- for (u64 i = start; i < std::min<u64 >(end, this -> m_entries .size ()); i++) {
409+ for (u64 i = start; i < std::min<u64 >(end, patterns .size ()); i++) {
406410 evaluator->setCurrentArrayIndex (i);
407411
408- auto &entry = this -> m_entries [i];
412+ auto &entry = patterns [i];
409413 if (!entry->isPatternLocal () || entry->hasAttribute (" export" ))
410414 fn (i, entry);
411415 }
@@ -417,8 +421,6 @@ namespace pl::ptrn {
417421 for (auto &entry : this ->m_entries ) {
418422 if (!entry->hasOverriddenColor ())
419423 entry->setBaseColor (this ->getColor ());
420-
421- this ->m_sortedEntries .push_back (entry.get ());
422424 }
423425
424426 if (!this ->m_entries .empty ())
@@ -495,11 +497,14 @@ namespace pl::ptrn {
495497 void sort (const std::function<bool (const Pattern *, const Pattern *)> &comparator) override {
496498 this ->m_sortedEntries .clear ();
497499 for (auto &member : this ->m_entries )
498- this ->m_sortedEntries .push_back (member.get ());
500+ this ->m_sortedEntries .push_back (member);
501+
502+ std::ranges::sort (this ->m_sortedEntries , [&](const auto & a, const auto & b) {
503+ return comparator (a.get (), b.get ());
504+ });
499505
500- std::sort (this ->m_sortedEntries .begin (), this ->m_sortedEntries .end (), comparator);
501506 if (this ->isReversed ())
502- std::reverse (this ->m_sortedEntries . begin (), this -> m_sortedEntries . end () );
507+ std::ranges:: reverse (this ->m_sortedEntries );
503508
504509 for (auto &member : this ->m_entries )
505510 member->sort (comparator);
@@ -511,7 +516,7 @@ namespace pl::ptrn {
511516
512517 this ->getEvaluator ()->readData (this ->getOffset (), result.data (), result.size (), this ->getSection ());
513518 if (this ->getEndian () != std::endian::native)
514- std::reverse (result. begin (), result. end () );
519+ std::ranges:: reverse (result);
515520
516521 return result;
517522 }
@@ -526,7 +531,7 @@ namespace pl::ptrn {
526531
527532 private:
528533 std::vector<std::shared_ptr<Pattern>> m_entries;
529- std::vector<Pattern * > m_sortedEntries;
534+ std::vector<std::shared_ptr< Pattern> > m_sortedEntries;
530535 u8 m_firstBitOffset = 0 ;
531536 u128 m_totalBitSize = 0 ;
532537 bool m_reversed = false ;
@@ -638,7 +643,7 @@ namespace pl::ptrn {
638643
639644 for (const auto &field : this ->m_fields ) {
640645 field->setParent (this ->reference ());
641- this ->m_sortedFields .push_back (field. get () );
646+ this ->m_sortedFields .push_back (field);
642647 }
643648 }
644649
@@ -745,6 +750,10 @@ namespace pl::ptrn {
745750 return this ->m_fields ;
746751 }
747752
753+ [[nodiscard]] std::vector<std::shared_ptr<Pattern>> getSortedEntries () override {
754+ return this ->m_sortedFields ;
755+ }
756+
748757 void setEntries (const std::vector<std::shared_ptr<Pattern>> &entries) override {
749758 this ->m_fields = entries;
750759 }
@@ -758,12 +767,12 @@ namespace pl::ptrn {
758767 PatternBitfieldMember::setOffset (offset);
759768 }
760769
761- void forEachEntry ( u64 start, u64 end, const std::function<void (u64 , const std::shared_ptr<Pattern>&)> &fn) override {
770+ void forEachEntryImpl ( const std::vector<std::shared_ptr<Pattern>> &patterns, u64 start, u64 end, const std::function<void (u64 , const std::shared_ptr<Pattern>&)> &fn) override {
762771 if (this ->isSealed ())
763772 return ;
764773
765774 for (auto i = start; i < end; i++) {
766- auto &pattern = this -> m_fields [i];
775+ auto &pattern = patterns [i];
767776 if (!pattern->isPatternLocal () || pattern->hasAttribute (" export" ))
768777 fn (i, pattern);
769778 }
@@ -772,11 +781,13 @@ namespace pl::ptrn {
772781 void sort (const std::function<bool (const Pattern *, const Pattern *)> &comparator) override {
773782 this ->m_sortedFields .clear ();
774783 for (auto &member : this ->m_fields )
775- this ->m_sortedFields .push_back (member. get () );
784+ this ->m_sortedFields .push_back (member);
776785
777- std::sort (this ->m_sortedFields .begin (), this ->m_sortedFields .end (), comparator);
786+ std::ranges::sort (this ->m_sortedFields , [&](const auto & a, const auto & b) {
787+ return comparator (a.get (), b.get ());
788+ });
778789 if (this ->isReversed ())
779- std::reverse (this ->m_sortedFields . begin (), this -> m_sortedFields . end () );
790+ std::ranges:: reverse (this ->m_sortedFields );
780791
781792 for (auto &member : this ->m_fields )
782793 member->sort (comparator);
@@ -788,7 +799,7 @@ namespace pl::ptrn {
788799
789800 this ->getEvaluator ()->readData (this ->getOffset (), result.data (), result.size (), this ->getSection ());
790801 if (this ->getEndian () != std::endian::native)
791- std::reverse (result. begin (), result. end () );
802+ std::ranges:: reverse (result);
792803
793804 return result;
794805 }
@@ -803,7 +814,7 @@ namespace pl::ptrn {
803814
804815 private:
805816 std::vector<std::shared_ptr<Pattern>> m_fields;
806- std::vector<Pattern * > m_sortedFields;
817+ std::vector<std::shared_ptr< Pattern> > m_sortedFields;
807818
808819 u8 m_firstBitOffset = 0 ;
809820 u64 m_totalBitSize = 0 ;
0 commit comments