GComm  0.2.3
util.hpp
1 /*
2  * Copyright (C) 2012 Codership Oy <info@codership.com>
3  */
4 
5 #ifndef _GCOMM_UTIL_HPP_
6 #define _GCOMM_UTIL_HPP_
7 
8 #include "gcomm/datagram.hpp"
9 
10 #include "gu_logger.hpp"
11 #include "gu_throw.hpp"
12 
13 #include <algorithm>
14 
15 namespace gcomm
16 {
17  inline std::string
18  uri_string (const std::string& scheme, const std::string& addr,
19  const std::string& port = std::string(""))
20  {
21  if (port.length() > 0)
22  return (scheme + "://" + addr + ':' + port);
23  else
24  return (scheme + "://" + addr);
25  }
26 
27 
28  inline bool host_is_any (const std::string& host)
29  {
30  return (host.length() == 0 || host == "0.0.0.0" ||
31  host.find ("::/128") <= 1);
32  }
33 
34 
35  template <class C>
36  size_t serialize(const C& c, gu::Buffer& buf)
37  {
38  const size_t prev_size(buf.size());
39  buf.resize(buf.size() + c.serial_size());
40  size_t ret;
41  gu_trace(ret = c.serialize(&buf[0] + prev_size, buf.size(),
42  prev_size));
43  assert(ret == prev_size + c.serial_size());
44  return ret;
45  }
46 
47 
48  template <class C>
49  size_t unserialize(const gu::Buffer& buf, size_t offset, C& c)
50  {
51  size_t ret;
52  gu_trace(ret = c.unserialize(buf, buf.size(), offset));
53  return ret;
54  }
55 
56 
57  template <class M>
58  void push_header(const M& msg, Datagram& dg)
59  {
60  if (dg.header_offset() < msg.serial_size())
61  {
62  gu_throw_fatal;
63  }
64  msg.serialize(dg.header(),
65  dg.header_size(),
66  dg.header_offset() - msg.serial_size());
67  dg.set_header_offset(dg.header_offset() - msg.serial_size());
68  }
69 
70 
71  template <class M>
72  void pop_header(const M& msg, Datagram& dg)
73  {
74  assert(dg.header_size() >= dg.header_offset() + msg.serial_size());
75  dg.set_header_offset(dg.header_offset() + msg.serial_size());
76  }
77 
78 
79  inline const gu::byte_t* begin(const Datagram& dg)
80  {
81  return (dg.offset() < dg.header_len() ?
82  dg.header() + dg.header_offset() + dg.offset() :
83  &dg.payload()[0] + (dg.offset() - dg.header_len()));
84  }
85  inline size_t available(const Datagram& dg)
86  {
87  return (dg.offset() < dg.header_len() ?
88  dg.header_len() - dg.offset() :
89  dg.payload().size() - (dg.offset() - dg.header_len()));
90  }
91 
92 
93  template <class M>
94  class Critical
95  {
96  public:
97  Critical(M& monitor) : monitor_(monitor)
98  { monitor_.enter(); }
99 
100  ~Critical() { monitor_.leave(); }
101  private:
102  M& monitor_;
103  };
104 
105 } // namespace gcomm
106 
107 #endif // _GCOMM_UTIL_HPP_
Definition: util.hpp:94