--------------------- PatchSet 472 Date: 2002/12/24 09:53:35 Author: rbcollins Branch: esi Tag: (none) Log: extract array management code Members: src/ESI.cc:1.1.2.77->1.1.2.78 Index: squid3/src/ESI.cc =================================================================== RCS file: /cvsroot/squid-sf//squid3/src/ESI.cc,v retrieving revision 1.1.2.77 retrieving revision 1.1.2.78 diff -u -r1.1.2.77 -r1.1.2.78 --- squid3/src/ESI.cc 24 Dec 2002 09:04:02 -0000 1.1.2.77 +++ squid3/src/ESI.cc 24 Dec 2002 09:53:35 -0000 1.1.2.78 @@ -1,6 +1,6 @@ /* - * $Id: ESI.cc,v 1.1.2.77 2002/12/24 09:04:02 rbcollins Exp $ + * $Id: ESI.cc,v 1.1.2.78 2002/12/24 09:53:35 rbcollins Exp $ * * DEBUG: section 86 ESI processing * AUTHOR: Robert Collins @@ -224,6 +224,26 @@ }; MemPool *esiLiteral::pool = NULL; +class ElementList { +public: + ElementList(); + ~ElementList(); + + ESIElement::Pointer &operator[](int); + ESIElement::Pointer const &operator[](int)const; + ESIElement::Pointer * elements; /* unprocessed or rendered nodes */ + void push_back(ESIElement::Pointer &); + size_t size() const; + void setNULL (int start, int end); + + int allocedcount; + size_t allocedsize; + int elementcount; +private: + ElementList(ElementList const &); + ElementList &operator=(ElementList const&); +}; + /* esiSequence */ class esiSequence : public ESIElement{ public: @@ -246,6 +266,7 @@ void makeUsableElements(esiSequence const &old, esiVarState &); Pointer makeUsable(esiTreeParentPtr, esiVarState &) const; +// ElementList elements; ESIElement::Pointer * elements; /* unprocessed or rendered nodes */ int allocedcount; size_t allocedsize; @@ -403,13 +424,9 @@ void provideData (ESISegment::Pointer data, ESIElement *source); Pointer makeCacheable() const; Pointer makeUsable(esiTreeParentPtr, esiVarState &) const; - void NULLElements (int start, int end); void NULLUnChosen(); - ESIElement::Pointer * elements; /* unprocessed nodes */ - int allocedcount; - size_t allocedsize; - int elementcount; + ElementList elements; int chosenelement; ESIElement::Pointer otherwise; void finish(); @@ -3472,13 +3489,7 @@ /* esiChoose */ esiChoose::~esiChoose() { - int i; debug (86,5)("esiChoose::~esiChoose %p\n", this); - for (i = 0; i < elementcount; ++i) { - elements[i] = NULL; - } - if (elements) - memFreeBuf (allocedsize, elements); } void * @@ -3502,7 +3513,7 @@ delete this; } -esiChoose::esiChoose(esiTreeParentPtr aParent) : elements (NULL), chosenelement (-1),parent (aParent) +esiChoose::esiChoose(esiTreeParentPtr aParent) : elements (), chosenelement (-1),parent (aParent) { } @@ -3511,7 +3522,7 @@ { /* append all processed elements, and trim processed and rendered elements */ assert (output->next == NULL); - assert (elementcount || otherwise.getRaw()); + assert (elements.size() || otherwise.getRaw()); debug (86,5)("esiChooseRender: rendering\n"); if (chosenelement >= 0) elements[chosenelement]->render(output); @@ -3541,17 +3552,14 @@ } otherwise = element; } else { - elements = (ESIElement::Pointer *)memReallocBuf (elements, ++elementcount * sizeof (ESIElement::Pointer), - &allocedsize); - assert (elements); - allocedcount = elementcount; - elements[elementcount - 1] = element; - debug (86,3)("esiChooseAdd: Added a new element, elements = %d\n", elementcount); + elements.push_back (element); + + debug (86,3)("esiChooseAdd: Added a new element, elements = %d\n", elements.size()); if (chosenelement == -1) if ((dynamic_cast(element.getRaw()))->testsTrue()) { - chosenelement = elementcount - 1; - debug (86,3)("esiChooseAdd: Chose element %d\n", elementcount); + chosenelement = elements.size() - 1; + debug (86,3)("esiChooseAdd: Chose element %d\n", elements.size()); } } return true; @@ -3560,7 +3568,7 @@ void esiChoose::finish() { - NULLElements (0, elementcount); + elements.setNULL(0, elements.size()); if (otherwise.getRaw()) otherwise->finish(); otherwise = NULL; @@ -3568,7 +3576,7 @@ } void -esiChoose::NULLElements (int start, int end) +ElementList::setNULL (int start, int end) { assert (start >= 0 && start <= elementcount); assert (end >= 0 && end <= elementcount); @@ -3586,10 +3594,10 @@ if (otherwise.getRaw()) otherwise->finish(); otherwise = NULL; - NULLElements (0, chosenelement); - NULLElements (chosenelement + 1, elementcount); + elements.setNULL (0, chosenelement); + elements.setNULL (chosenelement + 1, elements.size()); } else if (otherwise.getRaw()) { - NULLElements(0, elementcount); + elements.setNULL (0, elements.size()); } } @@ -3601,7 +3609,7 @@ */ /* We MUST have a when clause */ NULLUnChosen(); - if (!elementcount) { + if (!elements.size()) { parent->fail(this); if (otherwise.getRaw()) otherwise->finish(); @@ -3620,7 +3628,7 @@ void esiChoose::checkValidSource (ESIElement::Pointer source) const { - if (!elementcount) + if (!elements.size()) fatal ("invalid callback = no when clause\n"); if (chosenelement >= 0) assert (source == elements[chosenelement]); @@ -3634,7 +3642,7 @@ esiChoose::fail(ESIElement * source) { checkValidSource (source); - NULLElements(0, elementcount); + elements.setNULL (0, elements.size()); if (otherwise.getRaw()) otherwise->finish(); otherwise = NULL; @@ -3649,14 +3657,10 @@ parent->provideData (data, this); } + esiChoose::esiChoose(esiChoose const &old) : chosenelement(-1), otherwise (old.otherwise.getRaw() ? old.otherwise->makeCacheable() : NULL), parent (NULL) { - elements = NULL; - elementcount = 0; - allocedcount = 0; - allocedsize = 0; - - for (int counter = 0; counter < old.elementcount; ++counter) { + for (int counter = 0; counter < old.elements.elementcount; ++counter) { ESIElement::Pointer newElement = old.elements[counter]->makeCacheable(); if (newElement.getRaw()) assert (addElement(newElement)); @@ -3676,6 +3680,51 @@ return NULL; } +/* ElementList */ +ElementList::ElementList () : elements(NULL), allocedcount(0), allocedsize(0), elementcount (0) +{ + +} + +ElementList::~ElementList() +{ + int i; + debug (86,5)("ElementList::~ElementList %p\n", this); + for (i = 0; i < elementcount; ++i) { + elements[i] = NULL; + } + if (elements) + memFreeBuf (allocedsize, elements); +} + +ESIElement::Pointer & +ElementList::operator [] (int index) +{ + return elements[index]; +} + +ESIElement::Pointer const & +ElementList::operator [] (int index) const +{ + return elements[index]; +} + +void +ElementList::push_back(ESIElement::Pointer &newElement) +{ + elements = (ESIElement::Pointer *)memReallocBuf (elements, ++elementcount * sizeof (ESIElement::Pointer), + &allocedsize); + assert (elements); + allocedcount = elementcount; + elements[elementcount - 1] = newElement; +} + +size_t +ElementList::size() const +{ + return elementcount; +} + /* esiWhen */ void * esiWhen::operator new(size_t byteCount)