Use doxygen style comments for Visitor and Visitable
Summary: Update the documentation to be picked up by doxygen. Additionally, don't use anonymous namespace in header file. Reviewers: buda Reviewed By: buda Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D212
This commit is contained in:
parent
0a47bace72
commit
c09d237e05
@ -1,33 +1,42 @@
|
||||
/// @file visitable.hpp
|
||||
|
||||
#pragma once
|
||||
|
||||
namespace utils {
|
||||
|
||||
// Inherit from this class to allow visiting from TVisitor class.
|
||||
// Example usage:
|
||||
// class Expression : public Visitable<ExpressionVisitor> {
|
||||
// };
|
||||
// class Identifier : public ExpressionVisitor {
|
||||
// public:
|
||||
// DEFVISITABLE(ExpressionVisitor) // Use default Accept implementation
|
||||
// ....
|
||||
// };
|
||||
// class Literal : public Expression {
|
||||
// public:
|
||||
// void Accept(ExpressionVisitor &visitor) override {
|
||||
// // Implement custom Accept.
|
||||
// }
|
||||
// };
|
||||
/// Inherit from this class to allow visiting from TVisitor class.
|
||||
/// Example usage:
|
||||
///
|
||||
/// class Expression : public Visitable<ExpressionVisitor> {
|
||||
/// };
|
||||
/// class Identifier : public ExpressionVisitor {
|
||||
/// public:
|
||||
/// DEFVISITABLE(ExpressionVisitor) // Use default Accept implementation
|
||||
/// ....
|
||||
/// };
|
||||
/// class Literal : public Expression {
|
||||
/// public:
|
||||
/// void Accept(ExpressionVisitor &visitor) override {
|
||||
/// // Implement custom Accept.
|
||||
/// }
|
||||
/// };
|
||||
///
|
||||
/// @sa DEFVISITABLE
|
||||
/// @sa Visitor
|
||||
template <class TVisitor>
|
||||
class Visitable {
|
||||
public:
|
||||
virtual ~Visitable() = default;
|
||||
virtual void Accept(TVisitor&) = 0;
|
||||
|
||||
#define DEFVISITABLE(TVisitor) \
|
||||
void Accept(TVisitor &visitor) override \
|
||||
{ visitor.Visit(*this); visitor.PostVisit(*this); }
|
||||
|
||||
virtual void Accept(TVisitor &) = 0;
|
||||
|
||||
/// Default implementation for @c Accept, which works for visitors of
|
||||
/// @c TVisitor type.
|
||||
/// @sa utils::Visitable
|
||||
#define DEFVISITABLE(TVisitor) \
|
||||
void Accept(TVisitor &visitor) override { \
|
||||
visitor.Visit(*this); \
|
||||
visitor.PostVisit(*this); \
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace utils
|
||||
|
@ -1,22 +1,26 @@
|
||||
#pragma once
|
||||
|
||||
namespace {
|
||||
namespace utils {
|
||||
|
||||
// Don't use anonymous namespace, because each translation unit will then get a
|
||||
// unique type. This may cause errors if one wants to check the type.
|
||||
namespace detail {
|
||||
|
||||
template <typename T>
|
||||
class VisitorBase {
|
||||
public:
|
||||
virtual ~VisitorBase() = default;
|
||||
|
||||
virtual void Visit(T&) {}
|
||||
virtual void PostVisit(T&) {}
|
||||
virtual void Visit(T &) {}
|
||||
virtual void PostVisit(T &) {}
|
||||
};
|
||||
|
||||
template <typename... T>
|
||||
class RecursiveVisitorBase;
|
||||
|
||||
template <typename Head, typename... Tail>
|
||||
class RecursiveVisitorBase<Head, Tail...> : public VisitorBase<Head>,
|
||||
public RecursiveVisitorBase<Tail...> {
|
||||
class RecursiveVisitorBase<Head, Tail...>
|
||||
: public VisitorBase<Head>, public RecursiveVisitorBase<Tail...> {
|
||||
public:
|
||||
using VisitorBase<Head>::Visit;
|
||||
using VisitorBase<Head>::PostVisit;
|
||||
@ -32,28 +36,29 @@ class RecursiveVisitorBase<T> : public VisitorBase<T> {
|
||||
using VisitorBase<T>::PostVisit;
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace detail
|
||||
|
||||
namespace utils {
|
||||
|
||||
// Inherit from this class if you want to visit TVisitable types.
|
||||
// Example usage:
|
||||
// // Typedef for convenience or to establish a base class of visitors.
|
||||
// typedef Visitor<Identifier, Literal> ExpressionVisitorBase;
|
||||
// class ExpressionVisitor : public ExpressionVisitorBase {
|
||||
// public:
|
||||
// using ExpressionVisitorBase::Visit;
|
||||
// using ExpressionVisitorBase::PostVisit;
|
||||
//
|
||||
// void Visit(Identifier &identifier) override {
|
||||
// // Custom implementation of visiting Identifier.
|
||||
// }
|
||||
// };
|
||||
/// Inherit from this class if you want to visit TVisitable types.
|
||||
/// Example usage:
|
||||
///
|
||||
/// // Typedef for convenience or to establish a base class of visitors.
|
||||
/// typedef Visitor<Identifier, Literal> ExpressionVisitorBase;
|
||||
/// class ExpressionVisitor : public ExpressionVisitorBase {
|
||||
/// public:
|
||||
/// using ExpressionVisitorBase::Visit;
|
||||
/// using ExpressionVisitorBase::PostVisit;
|
||||
///
|
||||
/// void Visit(Identifier &identifier) override {
|
||||
/// // Custom implementation of visiting Identifier.
|
||||
/// }
|
||||
/// };
|
||||
///
|
||||
/// @sa Visitable
|
||||
template <typename... TVisitable>
|
||||
class Visitor : public RecursiveVisitorBase<TVisitable...> {
|
||||
class Visitor : public detail::RecursiveVisitorBase<TVisitable...> {
|
||||
public:
|
||||
using RecursiveVisitorBase<TVisitable...>::Visit;
|
||||
using RecursiveVisitorBase<TVisitable...>::PostVisit;
|
||||
using detail::RecursiveVisitorBase<TVisitable...>::Visit;
|
||||
using detail::RecursiveVisitorBase<TVisitable...>::PostVisit;
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace utils
|
||||
|
Loading…
Reference in New Issue
Block a user