Another simple vector down.

This commit is contained in:
2025-08-10 22:37:23 -04:00
parent 3e16e85878
commit 6b3eb54b09
2 changed files with 22 additions and 37 deletions

View File

@ -106,22 +106,11 @@ void CssPropertyList::print () {
getRef (i)->print (); getRef (i)->print ();
} }
CssSelector::CssSelector () { CssSelector::CssSelector ()
struct CombinatorAndSelector *cs; {
selectorList.emplace_back( COMB_NONE, std::make_unique< CssSimpleSelector >() );
refCount = 0;
matchCacheOffset = -1;
selectorList.increase ();
cs = selectorList.getRef (selectorList.size () - 1);
cs->combinator = COMB_NONE;
cs->selector = new 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. * \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) if (i < 0)
return true; return true;
struct CombinatorAndSelector *cs = selectorList.getRef (i); CombinatorAndSelector *cs = &selectorList.at (i);
CssSimpleSelector *sel = cs->selector; CssSimpleSelector *sel = cs->selector.get();
switch (comb) { switch (comb) {
case COMB_NONE: case COMB_NONE:
@ -172,20 +161,17 @@ bool CssSelector::match (Doctree *docTree, const DoctreeNode *node,
return match (docTree, node, i - 1, cs->combinator, matchCache); return match (docTree, node, i - 1, cs->combinator, matchCache);
} }
void CssSelector::addSimpleSelector (Combinator c) { void
struct CombinatorAndSelector *cs; CssSelector::addSimpleSelector( const Combinator c )
{
assert (matchCacheOffset == -1); assert (matchCacheOffset == -1);
selectorList.increase ();
cs = selectorList.getRef (selectorList.size () - 1);
cs->combinator = c; selectorList.emplace_back( c, std::make_unique< CssSimpleSelector >() );
cs->selector = new CssSimpleSelector ();
} }
bool CssSelector::checksPseudoClass () { bool CssSelector::checksPseudoClass () {
for (int i = 0; i < selectorList.size (); i++) for (int i = 0; i < selectorList.size (); i++)
if (selectorList.getRef (i)->selector->getPseudoClass ()) if (selectorList.at(i).selector->getPseudoClass ())
return true; return true;
return false; return false;
} }
@ -200,17 +186,17 @@ int CssSelector::specificity () {
int spec = 0; int spec = 0;
for (int i = 0; i < selectorList.size (); i++) for (int i = 0; i < selectorList.size (); i++)
spec += selectorList.getRef (i)->selector->specificity (); spec += selectorList.at (i).selector->specificity ();
return spec; return spec;
} }
void CssSelector::print () { void CssSelector::print () {
for (int i = 0; i < selectorList.size (); i++) { for (int i = 0; i < selectorList.size (); i++) {
selectorList.getRef (i)->selector->print (); selectorList.at (i).selector->print ();
if (i < selectorList.size () - 1) { if (i < selectorList.size () - 1) {
switch (selectorList.getRef (i + 1)->combinator) { switch (selectorList.at (i + 1).combinator) {
case COMB_CHILD: case COMB_CHILD:
fprintf (stderr, "> "); fprintf (stderr, "> ");
break; break;

View File

@ -415,25 +415,24 @@ class CssSelector {
}; };
private: private:
struct CombinatorAndSelector { struct CombinatorAndSelector
{
Combinator combinator; Combinator combinator;
CssSimpleSelector *selector; std::unique_ptr< CssSimpleSelector > selector;
}; };
int refCount, matchCacheOffset; int refCount= 0;
lout::misc::SimpleVector <struct CombinatorAndSelector> selectorList; int matchCacheOffset= -1;
std::vector< CombinatorAndSelector > selectorList;
bool match (Doctree *dt, const DoctreeNode *node, int i, Combinator comb, bool match (Doctree *dt, const DoctreeNode *node, int i, Combinator comb,
MatchCache *matchCache); MatchCache *matchCache);
public: public:
CssSelector (); CssSelector ();
~CssSelector ();
void addSimpleSelector (Combinator c); void addSimpleSelector (Combinator c);
inline CssSimpleSelector *top () { CssSimpleSelector *top () { return selectorList.back().selector.get(); }
return selectorList.getRef (selectorList.size () - 1)->selector; int size () { return selectorList.size (); };
}
inline int size () { return selectorList.size (); };
inline bool match (Doctree *dt, const DoctreeNode *node, inline bool match (Doctree *dt, const DoctreeNode *node,
MatchCache *matchCache) { MatchCache *matchCache) {
return match (dt, node, selectorList.size () - 1, COMB_NONE, return match (dt, node, selectorList.size () - 1, COMB_NONE,