unpack.hpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. //
  2. // MessagePack for C++ deserializing routine
  3. //
  4. // Copyright (C) 2018 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_V3_UNPACK_HPP
  11. #define MSGPACK_V3_UNPACK_HPP
  12. #include "msgpack/unpack_decl.hpp"
  13. #include "msgpack/parse.hpp"
  14. #include "msgpack/create_object_visitor.hpp"
  15. namespace msgpack {
  16. /// @cond
  17. MSGPACK_API_VERSION_NAMESPACE(v3) {
  18. /// @endcond
  19. inline msgpack::object_handle unpack(
  20. const char* data, std::size_t len, std::size_t& off, bool& referenced,
  21. msgpack::unpack_reference_func f, void* user_data,
  22. msgpack::unpack_limit const& limit
  23. )
  24. {
  25. msgpack::object obj;
  26. msgpack::unique_ptr<msgpack::zone> z(new msgpack::zone);
  27. referenced = false;
  28. parse_return ret = detail::unpack_imp(
  29. data, len, off, *z, obj, referenced, f, user_data, limit);
  30. switch(ret) {
  31. case msgpack::PARSE_SUCCESS:
  32. return msgpack::object_handle(obj, msgpack::move(z));
  33. case msgpack::PARSE_EXTRA_BYTES:
  34. return msgpack::object_handle(obj, msgpack::move(z));
  35. default:
  36. break;
  37. }
  38. return msgpack::object_handle();
  39. }
  40. inline msgpack::object_handle unpack(
  41. const char* data, std::size_t len, std::size_t& off,
  42. msgpack::unpack_reference_func f, void* user_data,
  43. msgpack::unpack_limit const& limit)
  44. {
  45. bool referenced;
  46. return msgpack::v3::unpack(data, len, off, referenced, f, user_data, limit);
  47. }
  48. inline msgpack::object_handle unpack(
  49. const char* data, std::size_t len, bool& referenced,
  50. msgpack::unpack_reference_func f, void* user_data,
  51. msgpack::unpack_limit const& limit)
  52. {
  53. std::size_t off = 0;
  54. return msgpack::v3::unpack(data, len, off, referenced, f, user_data, limit);
  55. }
  56. inline msgpack::object_handle unpack(
  57. const char* data, std::size_t len,
  58. msgpack::unpack_reference_func f, void* user_data,
  59. msgpack::unpack_limit const& limit)
  60. {
  61. bool referenced;
  62. std::size_t off = 0;
  63. return msgpack::v3::unpack(data, len, off, referenced, f, user_data, limit);
  64. }
  65. inline void unpack(
  66. msgpack::object_handle& result,
  67. const char* data, std::size_t len, std::size_t& off, bool& referenced,
  68. msgpack::unpack_reference_func f, void* user_data,
  69. msgpack::unpack_limit const& limit)
  70. {
  71. msgpack::object obj;
  72. msgpack::unique_ptr<msgpack::zone> z(new msgpack::zone);
  73. referenced = false;
  74. parse_return ret = detail::unpack_imp(
  75. data, len, off, *z, obj, referenced, f, user_data, limit);
  76. switch(ret) {
  77. case msgpack::PARSE_SUCCESS:
  78. result.set(obj);
  79. result.zone() = msgpack::move(z);
  80. return;
  81. case msgpack::PARSE_EXTRA_BYTES:
  82. result.set(obj);
  83. result.zone() = msgpack::move(z);
  84. return;
  85. default:
  86. return;
  87. }
  88. }
  89. inline void unpack(
  90. msgpack::object_handle& result,
  91. const char* data, std::size_t len, std::size_t& off,
  92. msgpack::v3::unpack_reference_func f, void* user_data,
  93. msgpack::unpack_limit const& limit)
  94. {
  95. bool referenced;
  96. msgpack::v3::unpack(result, data, len, off, referenced, f, user_data, limit);
  97. }
  98. inline void unpack(
  99. msgpack::object_handle& result,
  100. const char* data, std::size_t len, bool& referenced,
  101. msgpack::unpack_reference_func f, void* user_data,
  102. msgpack::unpack_limit const& limit)
  103. {
  104. std::size_t off = 0;
  105. msgpack::v3::unpack(result, data, len, off, referenced, f, user_data, limit);
  106. }
  107. inline void unpack(
  108. msgpack::object_handle& result,
  109. const char* data, std::size_t len,
  110. msgpack::unpack_reference_func f, void* user_data,
  111. msgpack::unpack_limit const& limit)
  112. {
  113. bool referenced;
  114. std::size_t off = 0;
  115. msgpack::v3::unpack(result, data, len, off, referenced, f, user_data, limit);
  116. }
  117. inline msgpack::object unpack(
  118. msgpack::zone& z,
  119. const char* data, std::size_t len, std::size_t& off, bool& referenced,
  120. msgpack::unpack_reference_func f, void* user_data,
  121. msgpack::unpack_limit const& limit)
  122. {
  123. msgpack::object obj;
  124. referenced = false;
  125. parse_return ret = detail::unpack_imp(
  126. data, len, off, z, obj, referenced, f, user_data, limit);
  127. switch(ret) {
  128. case msgpack::PARSE_SUCCESS:
  129. return obj;
  130. case msgpack::PARSE_EXTRA_BYTES:
  131. return obj;
  132. default:
  133. break;
  134. }
  135. return obj;
  136. }
  137. inline msgpack::object unpack(
  138. msgpack::zone& z,
  139. const char* data, std::size_t len, std::size_t& off,
  140. msgpack::unpack_reference_func f, void* user_data,
  141. msgpack::unpack_limit const& limit)
  142. {
  143. bool referenced;
  144. return msgpack::v3::unpack(z, data, len, off, referenced, f, user_data, limit);
  145. }
  146. inline msgpack::object unpack(
  147. msgpack::zone& z,
  148. const char* data, std::size_t len, bool& referenced,
  149. msgpack::unpack_reference_func f, void* user_data,
  150. msgpack::unpack_limit const& limit)
  151. {
  152. std::size_t off = 0;
  153. return msgpack::v3::unpack(z, data, len, off, referenced, f, user_data, limit);
  154. }
  155. inline msgpack::object unpack(
  156. msgpack::zone& z,
  157. const char* data, std::size_t len,
  158. msgpack::unpack_reference_func f, void* user_data,
  159. msgpack::unpack_limit const& limit)
  160. {
  161. bool referenced;
  162. std::size_t off = 0;
  163. return msgpack::v3::unpack(z, data, len, off, referenced, f, user_data, limit);
  164. }
  165. /// @cond
  166. } // MSGPACK_API_VERSION_NAMESPACE(v3)
  167. /// @endcond
  168. } // namespace msgpack
  169. #endif // MSGPACK_V3_UNPACK_HPP