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