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 
String(const std::string & str="")26         String(const std::string& str = "") : str_(str)
27         {
28             if (str_.size() > str_size_)
29             {
30                 gu_throw_error(EMSGSIZE);
31             }
32         }
33 
~String()34         virtual ~String() { }
35 
serialize(gu::byte_t * buf,size_t buflen,size_t offset) const36         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 
unserialize(const gu::byte_t * buf,size_t buflen,size_t offset)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 
serial_size()66         static size_t serial_size()
67         {
68             return str_size_;
69         }
70 
to_string() const71         const std::string& to_string() const { return str_; }
72 
operator ==(const String<SZ> & cmp) const73         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>
operator <<(std::ostream & os,const String<SZ> & str)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_ */
88