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