/*
Ousía
Copyright (C) 2014 Benjamin Paaßen, Andreas Stöckel
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef _OUSIA_XML_XML_ELEMENT_HANDLER_HPP_
#define _OUSIA_XML_XML_ELEMENT_HANDLER_HPP_
#include
namespace ousia {
namespace xml {
/**
* Structure used internally for representing a function that is capable of
* handling a certain xml element tag.
*/
class XmlElementHandler {
private:
/**
* Name of the XML element the handler is capable of handling.
*/
const char *name;
/**
* Handler function.
*/
std::function handler;
/**
* Counter that can be used in order to realize elements that may only
* appear a certain number of times.
*/
int count;
/**
* Contains the current count of matches. Contains the maximum count a
* certain element must appear. If -1 the element may appear a unlimited
* number of times.
*/
int maxCount;
/**
* A certain other handler this one depends on (the other element must have
* appeared at least once in order for this handler to match). If set to
* nullptr no requirement relationship is established.
*/
const XmlElementHandler *requiredElement;
public:
/**
* Constructor of the XmlElementHandler structure.
*/
XmlElementHandler(const char *name, const std::function &handler,
int maxCount = -1, const XmlElementHandler *requiredElement = nullptr) :
name(name), handler(handler), count(0), maxCount(maxCount),
requiredElement(requiredElement)
{
// Do nothing here
}
/**
* Returns the name of the handler.
*/
const char* getName() const
{
return name;
}
/**
* Returns true if this handler is currently valid.
*/
bool valid() const
{
return ((maxCount < 0) || (count < maxCount))
&& (!requiredElement || (requiredElement->count > 0));
}
/**
* Returns true if this handler matches the current state of the given
* QXmlStreamReader.
*/
template
bool matches(const StrType &tagName) const
{
return valid() && (tagName == name);
}
/**
* Executes the given handler.
*/
bool execute()
{
count++;
return handler();
}
/**
* Function which assembles a string containing the names of the expected
* element types. Used for displaying error messages.
*/
static std::string expectedElementsStr(const std::vector &handlers)
{
// Calculate a list of valid element handlers
std::vector validHandlers;
for (auto &h : handlers) {
if (h.valid()) {
validHandlers.push_back(&h);
}
}
// Assemble the string containing the list of expected elements
std::stringstream ss;
bool first = true;
for (auto &h : validHandlers) {
if (!first) {
ss << ", ";
}
ss << h->getName();
first = false;
}
return ss.str();
}
};
}
}
#endif /* _OUSIA_XML_XML_ELEMENT_HANDLER_HPP_ */