![]() |
libsesstype
2.0.0
Library for Session Types programming.
|
00001 #ifndef SESSTYPE__PARAMETERISED__NODE__ONEOF_H__ 00002 #define SESSTYPE__PARAMETERISED__NODE__ONEOF_H__ 00003 00004 #ifdef __cplusplus 00005 #include <string> 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/expr.h" 00013 #include "sesstype/parameterised/expr/rng.h" 00014 #include "sesstype/parameterised/role.h" 00015 #include "sesstype/parameterised/node.h" 00016 00017 #ifdef __cplusplus 00018 namespace sesstype { 00019 namespace parameterised { 00020 #endif 00021 00022 #ifdef __cplusplus 00023 00026 template <class BaseNode, class RoleType, class MessageType, class VisitorType> 00027 class OneofNodeTmpl : public BlockNodeTmpl<BaseNode, RoleType, MessageType, VisitorType> { 00028 RoleType *selector_role_; 00029 unsigned int selector_dimen_; 00030 RngExpr *range_; 00031 std::string var_; 00032 bool unordered_; 00033 bool repeat_; 00034 00035 public: 00039 OneofNodeTmpl(RoleType *selector, unsigned int dimen) 00040 : BlockNodeTmpl<BaseNode, RoleType, MessageType, VisitorType>(ST_NODE_ONEOF), 00041 selector_role_(selector), 00042 selector_dimen_(dimen), 00043 range_(), 00044 var_(), 00045 unordered_(false), 00046 repeat_(false) { } 00047 00049 OneofNodeTmpl(const OneofNodeTmpl &node) 00050 : BlockNodeTmpl<BaseNode, RoleType, MessageType, VisitorType>(node), 00051 selector_role_(node.selector_role_), 00052 selector_dimen_(node.selector_dimen_), 00053 range_(), 00054 var_(), 00055 unordered_(false), 00056 repeat_(false) { } 00057 00059 OneofNodeTmpl *clone() const override 00060 { 00061 return new OneofNodeTmpl(*this); 00062 } 00063 00065 void set_var(std::string var) 00066 { 00067 var_ = var; 00068 } 00069 00071 std::string var() const 00072 { 00073 return var_; 00074 } 00075 00077 void set_repeat(bool repeat) 00078 { 00079 repeat_ = repeat; 00080 } 00081 00083 bool is_repeat() const 00084 { 00085 return repeat_; 00086 } 00087 00089 void set_range(RngExpr *range) 00090 { 00091 range_ = range; 00092 } 00093 00095 RngExpr *range() const 00096 { 00097 return range_; 00098 } 00099 00102 void set_selector(RoleType *selector, unsigned int dimen) 00103 { 00104 selector_role_ = selector; 00105 selector_dimen_ = dimen; 00106 } 00107 00109 RoleType *selector_role() const 00110 { 00111 return selector_role_; 00112 } 00113 00115 unsigned int selector_dimen() const 00116 { 00117 return selector_dimen_; 00118 } 00119 00121 void set_unordered(bool unordered) 00122 { 00123 unordered_ = unordered; 00124 } 00125 00127 bool is_unordered() const 00128 { 00129 return unordered_; 00130 } 00131 00132 virtual void accept(VisitorType &v) override; 00133 }; 00134 00135 using OneofNode = OneofNodeTmpl<Node, Role, MsgSig, util::NodeVisitor>; 00136 #endif // __cplusplus 00137 00138 #ifdef __cplusplus 00139 extern "C" { 00140 #endif 00141 00142 st_node *st_mk_oneof_node(st_role *selector_role, unsigned int dimen); 00143 00144 #ifdef __cplusplus 00145 } // extern "C" 00146 #endif 00147 00148 #ifdef __cplusplus 00149 } // namespace parameterised 00150 } // namespace sesstype 00151 #endif 00152 00153 00154 #endif//SESSTYPE__PARAMETERISED__NODE__ONEOF_H__