![]() |
libsesstype
2.0.0
Library for Session Types programming.
|
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__