![]() |
libsesstype
2.0.0
Library for Session Types programming.
|
00001 00005 #ifndef SESSTYPE__MSG_H__ 00006 #define SESSTYPE__MSG_H__ 00007 00008 #ifdef __cplusplus 00009 #include <algorithm> 00010 #include <stdexcept> 00011 #include <string> 00012 #include <vector> 00013 #endif 00014 00015 #include "sesstype/util/clonable.h" 00016 00017 #ifdef __cplusplus 00018 namespace sesstype { 00019 #endif 00020 00021 #ifdef __cplusplus 00022 00030 class MsgPayload : public util::Clonable { 00031 std::string name_; 00032 std::string type_; 00033 00034 public: 00036 MsgPayload(std::string type) : name_(), type_(type) { } 00037 00041 MsgPayload(std::string type, std::string name) : name_(name), 00042 type_(type) { } 00043 00045 MsgPayload(const MsgPayload &payload) : name_(payload.name_), 00046 type_(payload.type_) { } 00047 00049 ~MsgPayload() { } 00050 00051 MsgPayload *clone() const override 00052 { 00053 return new MsgPayload(*this); 00054 } 00055 00057 std::string name() const 00058 { 00059 return name_; 00060 } 00061 00063 std::string type() const 00064 { 00065 return type_; 00066 } 00067 00068 }; 00069 00077 class MsgSig : public util::Clonable { 00078 std::string label_; 00079 std::vector<MsgPayload *> payloads_; 00080 00081 public: 00082 typedef std::vector<MsgPayload *> PayloadContainer; 00083 00086 MsgSig(std::string label) : label_(label), payloads_() { } 00087 00089 MsgSig(const MsgSig &msgsig) : label_(msgsig.label_), payloads_() 00090 { 00091 for (auto payload : msgsig.payloads_) { 00092 payloads_.push_back(payload); 00093 } 00094 } 00095 00097 virtual ~MsgSig() 00098 { 00099 for (auto payload : payloads_) { 00100 delete payload; 00101 } 00102 } 00103 00105 virtual MsgSig *clone() const override 00106 { 00107 return new MsgSig(*this); 00108 } 00109 00111 std::string label() const 00112 { 00113 return label_; 00114 } 00115 00118 void add_payload(MsgPayload *payload) 00119 { 00120 payloads_.push_back(payload->clone()); 00121 } 00122 00124 unsigned int num_payloads() const 00125 { 00126 return payloads_.size(); 00127 } 00128 00130 bool has_payload(std::string name) const 00131 { 00132 return (std::find_if(payloads_.begin(), payloads_.end(), 00133 [name](const MsgPayload *const payload) 00134 -> bool { return payload->name() == name; }) != payloads_.end()); 00135 } 00136 00138 MsgPayload *payload(unsigned int idx) const 00139 { 00140 return payloads_.at(idx); 00141 } 00142 00144 MsgPayload *payload(std::string name) const 00145 { 00146 auto it = std::find_if(payloads_.begin(), payloads_.end(), 00147 [name](const MsgPayload *const payload) 00148 -> bool { return payload->name() == name; }); 00149 if (it == payloads_.end()) { 00150 throw std::out_of_range("Payload "+name+" not found"); 00151 } 00152 return *it; 00153 } 00154 00155 PayloadContainer::const_iterator payload_begin() const 00156 { 00157 return payloads_.begin(); 00158 } 00159 00160 PayloadContainer::const_iterator payload_end() const 00161 { 00162 return payloads_.end(); 00163 } 00164 }; 00165 #endif // __cplusplus 00166 00167 #ifdef __cplusplus 00168 extern "C" { 00169 #endif 00170 00171 #ifdef __cplusplus 00172 typedef MsgSig st_msg; 00173 typedef MsgPayload st_msg_payload; 00174 #else 00175 typedef struct MsgSig st_msg; 00176 typedef struct MsgPayload st_msg_payload; 00177 #endif 00178 00181 st_msg *st_mk_msg(const char *op); 00182 00185 st_msg *st_msg_add_payload(st_msg *msg, st_msg_payload *payload); 00186 00188 void st_msg_free(st_msg *msg); 00189 00192 st_msg_payload *st_mk_msg_payload(const char *type); 00193 00197 st_msg_payload *st_mk_msg_payload_annotated(const char *type, const char *name); 00198 00200 void st_msg_payload_free(st_msg_payload *payload); 00201 00202 #ifdef __cplusplus 00203 } // extern "C" 00204 #endif 00205 00206 #ifdef __cplusplus 00207 } // namespace sesstype 00208 #endif 00209 00210 #endif//SESSTYPE__MSG_H__