v4raw.hpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. //
  2. // MessagePack for C++ static resolution routine
  3. //
  4. // Copyright (C) 2008-2016 FURUHASHI Sadayuki and KONDO Takatoshi
  5. //
  6. // Distributed under the Boost Software License, Version 1.0.
  7. // (See accompanying file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. #ifndef MSGPACK_V1_TYPE_V4RAW_HPP
  11. #define MSGPACK_V1_TYPE_V4RAW_HPP
  12. #include "msgpack/v1/adaptor/v4raw_decl.hpp"
  13. #include <cstring>
  14. #include <string>
  15. namespace msgpack {
  16. /// @cond
  17. MSGPACK_API_VERSION_NAMESPACE(v1) {
  18. /// @endcond
  19. namespace type {
  20. struct v4raw_ref {
  21. v4raw_ref() : size(0), ptr(MSGPACK_NULLPTR) {}
  22. v4raw_ref(const char* p, uint32_t s) : size(s), ptr(p) {}
  23. uint32_t size;
  24. const char* ptr;
  25. std::string str() const { return std::string(ptr, size); }
  26. bool operator== (const v4raw_ref& x) const
  27. {
  28. return size == x.size && std::memcmp(ptr, x.ptr, size) == 0;
  29. }
  30. bool operator!= (const v4raw_ref& x) const
  31. {
  32. return !(*this == x);
  33. }
  34. bool operator< (const v4raw_ref& x) const
  35. {
  36. if(size == x.size) { return std::memcmp(ptr, x.ptr, size) < 0; }
  37. else { return size < x.size; }
  38. }
  39. bool operator> (const v4raw_ref& x) const
  40. {
  41. if(size == x.size) { return std::memcmp(ptr, x.ptr, size) > 0; }
  42. else { return size > x.size; }
  43. }
  44. };
  45. } // namespace type
  46. namespace adaptor {
  47. template <>
  48. struct convert<type::v4raw_ref> {
  49. msgpack::object const& operator()(msgpack::object const& o, type::v4raw_ref& v) const {
  50. if(o.type != msgpack::type::STR) { throw msgpack::type_error(); }
  51. v.ptr = o.via.str.ptr;
  52. v.size = o.via.str.size;
  53. return o;
  54. }
  55. };
  56. template <>
  57. struct pack<type::v4raw_ref> {
  58. template <typename Stream>
  59. msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const type::v4raw_ref& v) const {
  60. o.pack_v4raw(v.size);
  61. o.pack_v4raw_body(v.ptr, v.size);
  62. return o;
  63. }
  64. };
  65. template <>
  66. struct object<type::v4raw_ref> {
  67. void operator()(msgpack::object& o, const type::v4raw_ref& v) const {
  68. o.type = msgpack::type::STR;
  69. o.via.str.ptr = v.ptr;
  70. o.via.str.size = v.size;
  71. }
  72. };
  73. template <>
  74. struct object_with_zone<type::v4raw_ref> {
  75. void operator()(msgpack::object::with_zone& o, const type::v4raw_ref& v) const {
  76. static_cast<msgpack::object&>(o) << v;
  77. }
  78. };
  79. } // namespace adaptor
  80. /// @cond
  81. } // MSGPACK_API_VERSION_NAMESPACE(v1)
  82. /// @endcond
  83. } // namespace msgpack
  84. #endif // MSGPACK_V1_TYPE_V4RAW_HPP