deque.hpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. //
  2. // MessagePack for C++ static resolution routine
  3. //
  4. // Copyright (C) 2008-2015 FURUHASHI Sadayuki
  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_DEQUE_HPP
  11. #define MSGPACK_V1_TYPE_DEQUE_HPP
  12. #include "msgpack/versioning.hpp"
  13. #include "msgpack/adaptor/adaptor_base.hpp"
  14. #include "msgpack/object.hpp"
  15. #include "msgpack/adaptor/check_container_size.hpp"
  16. #include <deque>
  17. namespace msgpack {
  18. /// @cond
  19. MSGPACK_API_VERSION_NAMESPACE(v1) {
  20. /// @endcond
  21. namespace adaptor {
  22. #if !defined(MSGPACK_USE_CPP03)
  23. template <typename T, typename Alloc>
  24. struct as<std::deque<T, Alloc>, typename std::enable_if<msgpack::has_as<T>::value>::type> {
  25. std::deque<T, Alloc> operator()(const msgpack::object& o) const {
  26. if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
  27. std::deque<T, Alloc> v;
  28. if (o.via.array.size > 0) {
  29. msgpack::object* p = o.via.array.ptr;
  30. msgpack::object* const pend = o.via.array.ptr + o.via.array.size;
  31. do {
  32. v.push_back(p->as<T>());
  33. ++p;
  34. } while (p < pend);
  35. }
  36. return v;
  37. }
  38. };
  39. #endif // !defined(MSGPACK_USE_CPP03)
  40. template <typename T, typename Alloc>
  41. struct convert<std::deque<T, Alloc> > {
  42. msgpack::object const& operator()(msgpack::object const& o, std::deque<T, Alloc>& v) const {
  43. if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
  44. v.resize(o.via.array.size);
  45. msgpack::object* p = o.via.array.ptr;
  46. msgpack::object* const pend = o.via.array.ptr + o.via.array.size;
  47. typename std::deque<T, Alloc>::iterator it = v.begin();
  48. for(; p < pend; ++p, ++it) {
  49. p->convert(*it);
  50. }
  51. return o;
  52. }
  53. };
  54. template <typename T, typename Alloc>
  55. struct pack<std::deque<T, Alloc> > {
  56. template <typename Stream>
  57. msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::deque<T, Alloc>& v) const {
  58. uint32_t size = checked_get_container_size(v.size());
  59. o.pack_array(size);
  60. for(typename std::deque<T, Alloc>::const_iterator it(v.begin()), it_end(v.end());
  61. it != it_end; ++it) {
  62. o.pack(*it);
  63. }
  64. return o;
  65. }
  66. };
  67. template <typename T, typename Alloc>
  68. struct object_with_zone<std::deque<T, Alloc> > {
  69. void operator()(msgpack::object::with_zone& o, const std::deque<T, Alloc>& v) const {
  70. o.type = msgpack::type::ARRAY;
  71. if(v.empty()) {
  72. o.via.array.ptr = MSGPACK_NULLPTR;
  73. o.via.array.size = 0;
  74. } else {
  75. uint32_t size = checked_get_container_size(v.size());
  76. msgpack::object* p = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*size, MSGPACK_ZONE_ALIGNOF(msgpack::object)));
  77. msgpack::object* const pend = p + size;
  78. o.via.array.ptr = p;
  79. o.via.array.size = size;
  80. typename std::deque<T, Alloc>::const_iterator it(v.begin());
  81. do {
  82. *p = msgpack::object(*it, o.zone);
  83. ++p;
  84. ++it;
  85. } while(p < pend);
  86. }
  87. }
  88. };
  89. } // namespace adaptor
  90. /// @cond
  91. } // MSGPACK_API_VERSION_NAMESPACE(v1)
  92. /// @endcond
  93. } // namespace msgpack
  94. #endif // MSGPACK_V1_TYPE_DEQUE_HPP