libsesstype  2.0.0
Library for Session Types programming.
for.h
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__
 All Classes Namespaces Files Functions