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:
Teon Banek 2017-04-03 11:15:38 +02:00
parent 0a47bace72
commit c09d237e05
2 changed files with 61 additions and 47 deletions

View File

@ -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

View File

@ -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