#ifndef VISITOR_H
#define VISITOR_H
// With this defined, the virtual interfaces are
// declared and declared pure virtual so must be
// implemented. However the base class is here
// purely for checking the implementation of
// sub-classes meets the desired interface, the
// actual usage of sub-classes is using the CRTP
// and so we don't actually need virtual dispatch
// and can optionally not declare any virtual
// functions by not defining the below define and
// we won't pay any code to have a vtable and be
// doing virtual calls when we use this interface
#define VISITOR_INHERITED_INTERFACE_CHECK
class VisitorBase
{
public:
#ifdef VISITOR_INHERITED_INTERFACE_CHECK
virtual ~VisitorBase() {}
virtual void Enter(const char* name) = 0;
virtual void Exit(const char* name) = 0;
#endif
std::string quoted(const char* name)
{
return std::string("\"" + std::string(name) + "\"");
}
std::string indent(int spaces)
{
return std::string(spaces*2, ' ');
}
};
class Serializer : public VisitorBase
{
public:
#ifdef VISITOR_INHERITED_INTERFACE_CHECK
virtual const std::string& Output() = 0;
virtual void Reset() = 0;
#endif
};
class Deserializer : public VisitorBase
{
public:
#ifdef VISITOR_INHERITED_INTERFACE_CHECK
virtual void Reset(const std::string& a_input) = 0;
#endif
};
#endif // VISITOR_H