XMLReaderAttribute::indicator(). git-svn-id: https://svn.microneil.com/svn/CodeDweller/branches/adeniz_1@105 d34b734f-a00e-4b39-a726-e4eeb87269abadeniz_1
@@ -21,6 +21,9 @@ | |||
// See XMLReader.hpp for details | |||
//debug | |||
#include <iostream> | |||
//end of debug | |||
#include "CodeDweller/XMLReader.hpp" | |||
using namespace std; | |||
@@ -653,6 +656,8 @@ void XMLReaderElement::initialize() { | |||
myIndex = 0; // no interpet() call has been made. | |||
myLength = 0; | |||
*wasProcessed = false; | |||
// At this point we know we are clean | |||
myCleanFlag = true; // Clean as a whistle! | |||
@@ -678,7 +683,6 @@ void XMLReaderElement::runEndXMLerators(XMLReaderData& D) { | |||
} | |||
bool XMLReaderElement::interpret(XMLReaderData& Data) { // (re) Interpret this data. | |||
int Index = Data.Index(); // Our working index. | |||
int Startdex = 0; // Where our data starts. | |||
int Stopdex = 0; // Where our data stops. | |||
@@ -806,6 +810,7 @@ bool XMLReaderElement::interpret(XMLReaderData& Data) { | |||
myEndex = Data.Index() - 1; | |||
myRawTranslator.translate(myIndex, myEndex, Data); | |||
runEndXMLerators(Data); // run the End XMLerators and return | |||
*wasProcessed = true; | |||
return true; // true to the caller. | |||
} | |||
@@ -964,6 +969,7 @@ bool XMLReaderElement::interpret(XMLReaderData& Data) { | |||
myRawTranslator.translate(myIndex, myEndex, Data); | |||
runEndXMLerators(Data); // Launch the End XMLerators. | |||
*wasProcessed = true; | |||
return true; // Return our success! | |||
} | |||
@@ -1061,6 +1067,7 @@ void XMLReaderAttribute::initialize() { | |||
myLine = 0; // Initialized means to be as if | |||
myIndex = 0; // no interpet() call has been made. | |||
myLength = 0; | |||
*wasProcessed = false; | |||
} | |||
bool XMLReaderAttribute::interpret(XMLReaderData& Data) { // (re) Interpret this data. | |||
@@ -1165,6 +1172,7 @@ bool XMLReaderAttribute::interpret(XMLReaderData& Data) { | |||
Data.Index(Stopdex + 1); // Move the Index. | |||
Data.addNewLines(NewLines); // Update the Line Number. | |||
*wasProcessed = true; | |||
return true; // If we got here, we succeeded! | |||
} |
@@ -183,6 +183,9 @@ class XMLReaderElement { | |||
bool myInitOnInterpretFlag; // Initialize() at each Interpret()? | |||
bool myWasProcessed; // true iff the element was processed. | |||
bool *wasProcessed; // Points to caller's variable. | |||
void runStartXMLerators(XMLReaderData& D); // Does what it says ;-) | |||
void runEndXMLerators(XMLReaderData& D); // Does what it says ;-) | |||
@@ -281,6 +284,8 @@ class XMLReaderElement { | |||
XMLReaderElement& RawIndex( // Copy indices of the entire | |||
int &Index, int &Endex); // element. | |||
XMLReaderElement& indicator(bool& x); // Set x to true iff element is found. | |||
// End methods for heading back up the tree at the end of an element. | |||
class EndNameDoesNotMatch {}; // Throw when End(name) doesn't match. | |||
@@ -407,6 +412,23 @@ class XMLReaderElement { | |||
}; | |||
//// Function object to call after ///////////////////////////////////////////////////// | |||
// | |||
// Elements make up the core of a configuration. That is, a configuration is a | |||
// tree of elements. Elements translate directly to well formed xml elements in | |||
// a configuration file or string. | |||
//// Attribute Functor ////////////////////////////////////////////////////////////// | |||
// | |||
// This functor is passed to XMLReaderAttribute::indicator() as an | |||
// optional parameter, and is called if the attribute is processed. | |||
class AttributeFunctor { | |||
public: | |||
virtual void operator()(XMLReaderAttribute& A, XMLReaderData& D) = 0; | |||
virtual ~AttributeFunctor() {} | |||
}; | |||
//// XMLReader Attribute /////////////////////////////////////////////////// | |||
// | |||
// Attributes translate directly to well formed xml attributes (within the | |||
@@ -426,6 +448,11 @@ class XMLReaderAttribute { | |||
int myIndex; // Last char position I was seen on. | |||
int myLength; // Last segment length. | |||
bool myWasProcessed; // true iff the attribute was processed. | |||
bool *wasProcessed; // Points to caller's variable. | |||
AttributeFunctor *attrFunc; // Call if attribute was processed. | |||
public: | |||
XMLReaderAttribute(const char* Name, XMLReaderElement& Parent); // Sub-elements are constructed with a | |||
@@ -563,6 +590,10 @@ class XMLReaderAttribute { | |||
const std::string Name, // requires a name, of course, | |||
bool& x, bool init = false); // Map to a boolean. | |||
XMLReaderAttribute& indicator(bool& x); // Set x to true iff attribute is found. | |||
XMLReaderAttribute& indicator(bool& x, AttributeFunctor &f); // Set x to true and invoke f() iff | |||
// attribute is found. | |||
//// Set Init On Interprete for the parent element. | |||
XMLReaderElement& setInitOnInterpret(); // Set the init on interpret flag. |
@@ -30,7 +30,9 @@ inline XMLReaderElement::XMLReaderElement(const char* Name) : | |||
myIndex(0), | |||
myLength(0), | |||
myCleanFlag(true), | |||
myInitOnInterpretFlag(false) { | |||
myInitOnInterpretFlag(false), | |||
myWasProcessed(false), | |||
wasProcessed(&myWasProcessed) { | |||
} | |||
inline XMLReaderElement::XMLReaderElement(const std::string Name) : // Construct with a c++ string. | |||
@@ -40,7 +42,9 @@ inline XMLReaderElement::XMLReaderElement(const std::string Name) : | |||
myIndex(0), | |||
myLength(0), | |||
myCleanFlag(true), | |||
myInitOnInterpretFlag(false) { | |||
myInitOnInterpretFlag(false), | |||
myWasProcessed(false), | |||
wasProcessed(&myWasProcessed) { | |||
} | |||
inline XMLReaderElement::XMLReaderElement( // Construct sub element w/ cstring. | |||
@@ -53,7 +57,9 @@ inline XMLReaderElement::XMLReaderElement( | |||
myIndex(0), | |||
myLength(0), | |||
myCleanFlag(true), | |||
myInitOnInterpretFlag(false) { | |||
myInitOnInterpretFlag(false), | |||
myWasProcessed(false), | |||
wasProcessed(&myWasProcessed) { | |||
} | |||
inline XMLReaderElement::XMLReaderElement( // Construct sub element w/ string. | |||
@@ -66,7 +72,9 @@ inline XMLReaderElement::XMLReaderElement( | |||
myIndex(0), | |||
myLength(0), | |||
myCleanFlag(true), | |||
myInitOnInterpretFlag(false) { | |||
myInitOnInterpretFlag(false), | |||
myWasProcessed(false), | |||
wasProcessed(&myWasProcessed) { | |||
} | |||
inline std::string XMLReaderElement::Name() { return myName; } // Get the name of this element. | |||
@@ -135,6 +143,11 @@ inline XMLReaderElement& XMLReaderElement::Element( | |||
return Element(std::string(Name), x, init); // Use the string name version | |||
} | |||
inline XMLReaderElement& XMLReaderElement::indicator(bool& x) { | |||
wasProcessed = &x; | |||
return *this; | |||
} | |||
inline XMLReaderElement& XMLReaderElement::End() { // Return this element's parent. | |||
return Parent(); // Borrow Parent() | |||
} | |||
@@ -233,7 +246,10 @@ inline XMLReaderAttribute::XMLReaderAttribute( | |||
myParent(Parent), // We just grab the parent. | |||
myLine(0), // Everything else gets zeroed. | |||
myIndex(0), | |||
myLength(0) { | |||
myLength(0), | |||
myWasProcessed(false), | |||
wasProcessed(&myWasProcessed), | |||
attrFunc(nullptr) { | |||
} | |||
inline XMLReaderAttribute::XMLReaderAttribute( // Attributes are constrictued with a | |||
@@ -242,7 +258,10 @@ inline XMLReaderAttribute::XMLReaderAttribute( | |||
myParent(Parent), | |||
myLine(0), | |||
myIndex(0), | |||
myLength(0) { | |||
myLength(0), | |||
myWasProcessed(false), | |||
wasProcessed(&myWasProcessed), | |||
attrFunc(nullptr) { | |||
} | |||
inline std::string XMLReaderAttribute::Name() { // Get the name of this attribute. | |||
@@ -417,6 +436,17 @@ inline XMLReaderAttribute& XMLReaderAttribute::Attribute( | |||
return myParent.Attribute(Name, x, init); | |||
} | |||
inline XMLReaderAttribute& XMLReaderAttribute::indicator(bool& x) { | |||
wasProcessed = &x; | |||
return *this; | |||
} | |||
inline XMLReaderAttribute& XMLReaderAttribute::indicator(bool& x, AttributeFunctor& f) { | |||
wasProcessed = &x; | |||
attrFunc = &f; | |||
return *this; | |||
} | |||
inline XMLReaderElement& XMLReaderAttribute::setInitOnInterpret() { // Set the init on interpret flag. | |||
return myParent.setInitOnInterpret(); | |||
} |