libsesstype  2.0.0
Library for Session Types programming.
visitor_tmpl.h
00001 #ifndef SESSTYPE__UTIL__VISITOR_TMPL_H__
00002 #define SESSTYPE__UTIL__VISITOR_TMPL_H__
00003 
00004 
00005 
00006 
00007 #ifdef __cplusplus
00008 namespace sesstype {
00009 namespace util {
00010 
00011 // Visitor template declaration.
00012 template <typename... Types>
00013 class Visitor;
00014 
00015 // Base case.
00016 template <typename T>
00017 class Visitor<T> {
00018   public:
00019     virtual void visit(T *visitable) = 0;
00020 };
00021 
00022 // Recursive case.
00023 template <typename T, typename... Types>
00024 class Visitor<T, Types...> : public Visitor<Types...> {
00025   public:
00026     // Promote functions from base class.
00027     using Visitor<Types...>::visit;
00028 
00029     virtual void visit(T *visitable) = 0;
00030 };
00031 
00032 template <typename T>
00033 class Visitable {
00034   public:
00035     virtual void accept(T &visitor) = 0;
00036 };
00037 
00038 template <typename T, typename... Types>
00039 class VisitableImpl : public Visitable<Types...> {
00040   public:
00041     virtual void accept(Visitor<Types...> &visitor) {
00042         visitor.visit(static_cast<T &>(*this));
00043     }
00044 };
00045 
00046 } // namespace util
00047 } // namespace sesstype
00048 #endif
00049 
00050 #endif//SESSTYPE__UTIL__VISITOR_TMPL_H__
 All Classes Namespaces Files Functions