libsesstype  2.0.0
Library for Session Types programming.
msg.h
Go to the documentation of this file.
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__
 All Classes Namespaces Files Functions