Skip to content
Snippets Groups Projects
Commit c3bb7889 authored by Rainer Kartmann's avatar Rainer Kartmann
Browse files

Added Visitor

parent f59cf10d
No related branches found
No related tags found
No related merge requests found
......@@ -328,6 +328,7 @@ SET(SOURCES
MJCF/elements/core/Element.cpp
MJCF/elements/core/exceptions.cpp
MJCF/elements/core/mjcf_utils.cpp
MJCF/elements/core/Visitor.cpp
Nodes/CameraSensor.cpp
Nodes/CameraSensorFactory.cpp
......@@ -534,6 +535,7 @@ SET(INCLUDES
MJCF/elements/core/Element.h
MJCF/elements/core/exceptions.h
MJCF/elements/core/mjcf_utils.h
MJCF/elements/core/Visitor.h
Nodes/CameraSensor.h
Nodes/CameraSensorFactory.h
......
#include "Visitor.h"
#include "AnyElement.h"
namespace mjcf
{
namespace detail
{
VisitorAdapter::VisitorAdapter(Visitor& owner) :
owner(owner)
{}
bool VisitorAdapter::visitEnter(const tinyxml2::XMLElement& element)
{
return owner.visitEnter(owner.cast(element));
}
bool VisitorAdapter::visitExit(const tinyxml2::XMLElement& element)
{
return owner.visitExit(owner.cast(element));
}
}
Visitor::Visitor(Document& document) : document(document)
{}
detail::VisitorAdapter* Visitor::adapter()
{
return &_adapter;
}
const detail::VisitorAdapter* Visitor::adapter() const
{
return &_adapter;
}
const AnyElement Visitor::cast(const tinyxml2::XMLElement& element)
{
// The constructor of Element requires a non-const element pointer.
// As AnyElement is passed as const& to the user-provided visit method,
// this const cast should be sufficiently safe.
return { &document, const_cast<tinyxml2::XMLElement*>(&element) };
}
}
#pragma once
#include <VirtualRobot/Util/xml/tinyxml2.h>
namespace mjcf
{
class AnyElement;
class Document;
class Visitor;
namespace detail
{
class VisitorAdapter : public tinyxml2::XMLVisitor
{
public:
VisitorAdapter(Visitor& owner);
virtual bool visitEnter(const tinyxml2::XMLElement& element);
virtual bool visitExit(const tinyxml2::XMLElement& element);
private:
Visitor& owner;
};
}
class Visitor
{
public:
Visitor(Document& document);
virtual ~Visitor() = default;
virtual bool visitEnter(const AnyElement&) { return true; }
virtual bool visitExit(const AnyElement&) { return true; }
detail::VisitorAdapter* adapter();
const detail::VisitorAdapter* adapter() const;
private:
friend class detail::VisitorAdapter;
const AnyElement cast(const tinyxml2::XMLElement& element);
Document& document;
detail::VisitorAdapter _adapter { *this };
};
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment