![]() |
libsesstype
2.0.0
Library for Session Types programming.
|
00001 #ifndef SESSTYPE__PARAMETERIED__NODE__FOR__H__ 00002 #define SESSTYPE__PARAMETERIED__NODE__FOR__H__ 00003 00004 #ifdef __cplusplus 00005 #include <iostream> 00006 #endif 00007 00008 #include "sesstype/node/block.h" 00009 #include "sesstype/util/visitor_tmpl.h" 00010 00011 #include "sesstype/parameterised/msg.h" 00012 #include "sesstype/parameterised/role.h" 00013 #include "sesstype/parameterised/node.h" 00014 #include "sesstype/parameterised/expr/rng.h" 00015 00016 #ifdef __cplusplus 00017 namespace sesstype { 00018 namespace parameterised { 00019 #endif 00020 00021 #ifdef __cplusplus 00022 00025 template <class BaseNode, class RoleType, class MessageType, class VisitorType> 00026 class ForNodeTmpl : public BlockNodeTmpl<BaseNode, RoleType, MessageType, VisitorType> { 00027 RngExpr *bindexpr_; 00028 Expr *except_; 00029 00030 public: 00033 ForNodeTmpl(RngExpr *bindexpr) 00034 : BlockNodeTmpl<BaseNode, RoleType, MessageType, VisitorType>(ST_NODE_FOR), 00035 bindexpr_(bindexpr), except_(0) { } 00036 00038 ForNodeTmpl(const ForNodeTmpl &node) 00039 : BlockNodeTmpl<BaseNode, RoleType, MessageType, VisitorType>(ST_NODE_FOR), 00040 bindexpr_(node.bindexpr_), except_(node.except_) { } 00041 00043 ~ForNodeTmpl() override 00044 { 00045 delete bindexpr_; 00046 delete except_; 00047 } 00048 00050 ForNodeTmpl *clone() const override 00051 { 00052 return new ForNodeTmpl(*this); 00053 } 00054 00057 void set_bindexpr(RngExpr *bindexpr) 00058 { 00059 delete bindexpr_; 00060 bindexpr_ = bindexpr; 00061 } 00062 00064 RngExpr *bindexpr() const 00065 { 00066 if (bindexpr_ == nullptr) { 00067 std::cerr << "Warning: bind_expr is NULL.\n"; 00068 } 00069 return bindexpr_; 00070 } 00071 00072 void set_except(Expr *except) 00073 { 00074 delete except_; 00075 except_ = except; 00076 } 00077 00078 Expr *except() const 00079 { 00080 return except_; 00081 } 00082 00083 virtual void accept(VisitorType &v) override; 00084 }; 00085 00086 using ForNode = ForNodeTmpl<Node, Role, MsgSig, util::NodeVisitor>; 00087 #endif 00088 00089 #ifdef __cplusplus 00090 extern "C" { 00091 #endif 00092 00093 st_node *st_mk_for_node(st_rng_expr *bindexpr); 00094 00095 st_rng_expr *st_for_node_get_bindexpr(st_node *const node); 00096 00097 st_node *st_for_node_set_bindexpr(st_node *const node, st_rng_expr *bindexpr); 00098 00099 #ifdef __cplusplus 00100 } // extern "C" 00101 #endif 00102 00103 #ifdef __cplusplus 00104 } // namespace parameterised 00105 } // namespace sesstype 00106 #endif 00107 00108 #endif//SESSTYPE__PARAMETERIED__NODE__FOR__H__