From 6b3eb54b098effaf7355427b7eba0676691bd398f4d60c9c723117d6071862fe Mon Sep 17 00:00:00 2001 From: ADAM David Alan Martin Date: Sun, 10 Aug 2025 22:37:23 -0400 Subject: [PATCH] Another simple vector down. --- src/css.cc | 42 ++++++++++++++---------------------------- src/css.hh | 17 ++++++++--------- 2 files changed, 22 insertions(+), 37 deletions(-) diff --git a/src/css.cc b/src/css.cc index 4f68345..377ec63 100644 --- a/src/css.cc +++ b/src/css.cc @@ -106,22 +106,11 @@ void CssPropertyList::print () { getRef (i)->print (); } -CssSelector::CssSelector () { - struct CombinatorAndSelector *cs; - - refCount = 0; - matchCacheOffset = -1; - selectorList.increase (); - cs = selectorList.getRef (selectorList.size () - 1); - - cs->combinator = COMB_NONE; - cs->selector = new CssSimpleSelector (); +CssSelector::CssSelector () +{ + selectorList.emplace_back( COMB_NONE, std::make_unique< CssSimpleSelector >() ); } -CssSelector::~CssSelector () { - for (int i = selectorList.size () - 1; i >= 0; i--) - delete selectorList.getRef (i)->selector; -} /** * \brief Return whether selector matches at a given node in the document tree. @@ -134,8 +123,8 @@ bool CssSelector::match (Doctree *docTree, const DoctreeNode *node, if (i < 0) return true; - struct CombinatorAndSelector *cs = selectorList.getRef (i); - CssSimpleSelector *sel = cs->selector; + CombinatorAndSelector *cs = &selectorList.at (i); + CssSimpleSelector *sel = cs->selector.get(); switch (comb) { case COMB_NONE: @@ -172,20 +161,17 @@ bool CssSelector::match (Doctree *docTree, const DoctreeNode *node, return match (docTree, node, i - 1, cs->combinator, matchCache); } -void CssSelector::addSimpleSelector (Combinator c) { - struct CombinatorAndSelector *cs; +void +CssSelector::addSimpleSelector( const Combinator c ) +{ + assert (matchCacheOffset == -1); - assert (matchCacheOffset == -1); - selectorList.increase (); - cs = selectorList.getRef (selectorList.size () - 1); - - cs->combinator = c; - cs->selector = new CssSimpleSelector (); + selectorList.emplace_back( c, std::make_unique< CssSimpleSelector >() ); } bool CssSelector::checksPseudoClass () { for (int i = 0; i < selectorList.size (); i++) - if (selectorList.getRef (i)->selector->getPseudoClass ()) + if (selectorList.at(i).selector->getPseudoClass ()) return true; return false; } @@ -200,17 +186,17 @@ int CssSelector::specificity () { int spec = 0; for (int i = 0; i < selectorList.size (); i++) - spec += selectorList.getRef (i)->selector->specificity (); + spec += selectorList.at (i).selector->specificity (); return spec; } void CssSelector::print () { for (int i = 0; i < selectorList.size (); i++) { - selectorList.getRef (i)->selector->print (); + selectorList.at (i).selector->print (); if (i < selectorList.size () - 1) { - switch (selectorList.getRef (i + 1)->combinator) { + switch (selectorList.at (i + 1).combinator) { case COMB_CHILD: fprintf (stderr, "> "); break; diff --git a/src/css.hh b/src/css.hh index 82e7ba4..90bedf4 100644 --- a/src/css.hh +++ b/src/css.hh @@ -415,25 +415,24 @@ class CssSelector { }; private: - struct CombinatorAndSelector { + struct CombinatorAndSelector + { Combinator combinator; - CssSimpleSelector *selector; + std::unique_ptr< CssSimpleSelector > selector; }; - int refCount, matchCacheOffset; - lout::misc::SimpleVector selectorList; + int refCount= 0; + int matchCacheOffset= -1; + std::vector< CombinatorAndSelector > selectorList; bool match (Doctree *dt, const DoctreeNode *node, int i, Combinator comb, MatchCache *matchCache); public: CssSelector (); - ~CssSelector (); void addSimpleSelector (Combinator c); - inline CssSimpleSelector *top () { - return selectorList.getRef (selectorList.size () - 1)->selector; - } - inline int size () { return selectorList.size (); }; + CssSimpleSelector *top () { return selectorList.back().selector.get(); } + int size () { return selectorList.size (); }; inline bool match (Doctree *dt, const DoctreeNode *node, MatchCache *matchCache) { return match (dt, node, selectorList.size () - 1, COMB_NONE,