} // namespace
+Directive::~Directive() {}
+
Replace::Replace(const string &str)
: str(str) {}
Clone::Clone(initializer_list<Directive *> subdirectives)
: subdirectives(subdirectives) {}
+Clone::~Clone()
+{
+ for (auto it : subdirectives) {
+ delete it;
+ }
+}
+
void Clone::process(xmlNode *node, bool clean)
{
// We can't use xmlNewDocFragment, since xmlDOMWrapCloneNode only knows
Substitute::Substitute(initializer_list<pair<const string, Directive*>> substitution_map)
: substitution_map(substitution_map) {}
+Substitute::~Substitute()
+{
+ for (auto it : substitution_map) {
+ delete it.second;
+ }
+}
+
void Substitute::process(xmlNode *node, bool clean)
{
for (xmlNode *child = node->children; child != NULL; child = child->next) {
xmlDocPtr doc = xmlParseFile(input_filename.c_str());
root_directive->process(xmlDocGetRootElement(doc), true);
xmlSaveFile(output_filename.c_str(), doc);
+ xmlFreeDoc(doc);
xmlCleanupParser();
xmlMemoryDump();
class Directive {
public:
+ virtual ~Directive();
virtual void process(xmlNode *node, bool clean) = 0;
};
public:
Clone(const std::vector<Directive *> &subdirectives);
Clone(std::initializer_list<Directive *> subdirectives);
+ ~Clone();
virtual void process(xmlNode *node, bool clean);
private:
public:
Substitute(const std::unordered_map<std::string, Directive*> &substitution_map);
Substitute(std::initializer_list<std::pair<const std::string, Directive*>> substitution_map);
+ ~Substitute();
virtual void process(xmlNode *node, bool clean);