5 #ifndef _GCOMM_UTIL_HPP_
6 #define _GCOMM_UTIL_HPP_
8 #include "gcomm/datagram.hpp"
10 #include "gu_logger.hpp"
11 #include "gu_throw.hpp"
18 uri_string (
const std::string& scheme,
const std::string& addr,
19 const std::string& port = std::string(
""))
21 if (port.length() > 0)
22 return (scheme +
"://" + addr +
':' + port);
24 return (scheme +
"://" + addr);
28 inline bool host_is_any (
const std::string& host)
30 return (host.length() == 0 || host ==
"0.0.0.0" ||
31 host.find (
"::/128") <= 1);
36 size_t serialize(
const C& c, gu::Buffer& buf)
38 const size_t prev_size(buf.size());
39 buf.resize(buf.size() + c.serial_size());
41 gu_trace(ret = c.serialize(&buf[0] + prev_size, buf.size(),
43 assert(ret == prev_size + c.serial_size());
49 size_t unserialize(
const gu::Buffer& buf,
size_t offset, C& c)
52 gu_trace(ret = c.unserialize(buf, buf.size(), offset));
58 void push_header(
const M& msg, Datagram& dg)
60 if (dg.header_offset() < msg.serial_size())
64 msg.serialize(dg.header(),
66 dg.header_offset() - msg.serial_size());
67 dg.set_header_offset(dg.header_offset() - msg.serial_size());
72 void pop_header(
const M& msg, Datagram& dg)
74 assert(dg.header_size() >= dg.header_offset() + msg.serial_size());
75 dg.set_header_offset(dg.header_offset() + msg.serial_size());
79 inline const gu::byte_t* begin(
const Datagram& dg)
81 return (dg.offset() < dg.header_len() ?
82 dg.header() + dg.header_offset() + dg.offset() :
83 &dg.payload()[0] + (dg.offset() - dg.header_len()));
85 inline size_t available(
const Datagram& dg)
87 return (dg.offset() < dg.header_len() ?
88 dg.header_len() - dg.offset() :
89 dg.payload().size() - (dg.offset() - dg.header_len()));
97 Critical(M& monitor) : monitor_(monitor)
107 #endif // _GCOMM_UTIL_HPP_