108namespace socket_option {
109inline constexpr auto linger = zmq::sockopt::linger;
112inline constexpr auto conflate = zmq::sockopt::conflate;
115inline constexpr auto identity = zmq::sockopt::routing_id;
126 :
public zmq::context_t {
128 using zmq::context_t::context_t;
131 void terminate() { close(); }
142 :
public zmq::multipart_t {
144 using zmq::multipart_t::multipart_t;
147 message(zmq::multipart_t &&other) noexcept
148 : zmq::multipart_t(std::move(other)) {}
151 size_t parts()
const {
return size(); }
154 std::string get(
size_t n)
const {
return at(n).to_string(); }
157 template <
typename T> T get(
size_t n)
const {
159 const auto &frame = at(n);
160 std::memcpy(&value, frame.data(),
161 frame.size() <
sizeof(T) ? frame.size() : sizeof(T));
166 const void *raw_data(
size_t n)
const {
return at(n).data(); }
169 size_t size(
size_t n)
const {
return at(n).size(); }
172 size_t size()
const {
return zmq::multipart_t::size(); }
175 void add_raw(
const void *data,
size_t len) { addmem(data, len); }
178 message copy()
const {
return message(clone()); }
181 message &operator<<(
const std::string &part) {
185 message &operator<<(
const char *part) {
186 addstr(std::string(part));
191 message &operator>>(std::string &part) {
204 :
public zmq::socket_t {
206 using zmq::socket_t::socket_t;
208 socket(zmq::context_t &ctx, socket_type type) : zmq::socket_t(ctx, type) {}
211 void subscribe(
const std::string &topic) {
212 set(zmq::sockopt::subscribe, topic);
216 void unsubscribe(
const std::string &topic) {
217 set(zmq::sockopt::unsubscribe, topic);
221 bool send(zmq::multipart_t &msg,
bool dont_block =
false) {
222 return msg.send(*
this, dont_block ? ZMQ_DONTWAIT : 0);
226 bool send(
const std::string &payload,
bool dont_block =
false) {
227 return zmq::socket_t::send(zmq::buffer(payload),
228 dont_block ? zmq::send_flags::dontwait
229 : zmq::send_flags::none)
234 bool receive(zmq::multipart_t &msg,
bool dont_block =
false) {
235 return msg.recv(*
this, dont_block ? ZMQ_DONTWAIT : 0);
239 template <
typename Opt,
typename T>
void get(Opt opt, T &out)
const {
240 out = zmq::socket_t::get(opt);
243 using zmq::socket_t::get;