GComm  0.2.3
types.hpp
1 /*
2  * Copyright (C) 2009-2012 Codership Oy <info@codership.com>
3  */
4 
5 #ifndef _GCOMM_TYPES_HPP_
6 #define _GCOMM_TYPES_HPP_
7 
8 
9 #include "gcomm/exception.hpp"
10 
11 #include "gu_byteswap.hpp"
12 #include "gu_buffer.hpp"
13 
14 #include <sstream>
15 #include <algorithm>
16 #include <string>
17 
18 
19 namespace gcomm
20 {
21  template <size_t SZ>
22  class String
23  {
24  public:
25 
26  String(const std::string& str = "") : str_(str)
27  {
28  if (str_.size() > str_size_)
29  {
30  gu_throw_error(EMSGSIZE);
31  }
32  }
33 
34  virtual ~String() { }
35 
36  size_t serialize(gu::byte_t* buf, size_t buflen, size_t offset) const
37  {
38  if (buflen < offset + str_size_)
39  {
40  gu_throw_error (EMSGSIZE) << str_size_
41  << " > " << (buflen-offset);
42  }
43  std::string ser_str(str_);
44  ser_str.resize(str_size_, '\0');
45  (void)std::copy(ser_str.data(), ser_str.data() + ser_str.size(),
46  buf + offset);
47  return offset + str_size_;
48  }
49 
50  size_t unserialize(const gu::byte_t* buf, size_t buflen, size_t offset)
51  {
52  if (buflen < offset + str_size_)
53  {
54  gu_throw_error (EMSGSIZE) << str_size_
55  << " > " << (buflen-offset);
56  }
57  str_.assign(reinterpret_cast<const char*>(buf) + offset, str_size_);
58  const size_t tc(str_.find_first_of('\0'));
59  if (tc != std::string::npos)
60  {
61  str_.resize(tc);
62  }
63  return offset + str_size_;
64  }
65 
66  static size_t serial_size()
67  {
68  return str_size_;
69  }
70 
71  const std::string& to_string() const { return str_; }
72 
73  bool operator==(const String<SZ>& cmp) const
74  { return (str_ == cmp.str_); }
75 
76  private:
77  static const size_t str_size_ = SZ ;
78  std::string str_; /* Human readable name if any */
79  };
80 
81  template <size_t SZ>
82  inline std::ostream& operator<<(std::ostream& os, const String<SZ>& str)
83  { return (os << str.to_string()); }
84 
85 } // namespace gcomm
86 
87 #endif /* _GCOMM_TYPES_HPP_ */
Definition: types.hpp:22
GComm exception definitions.