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 ();
}
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;

View File

@ -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 <struct CombinatorAndSelector> 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,