var_int_boost_serialization.h
上传用户:kx_jwh
上传日期:2021-09-03
资源大小:76k
文件大小:3k
源码类别:

STL

开发平台:

Visual C++

  1. /* vim: set tabstop=4 : */
  2. #ifndef __febird_io_var_int_for_boost_serialization_h__
  3. #define __febird_io_var_int_for_boost_serialization_h__
  4. #if defined(_MSC_VER) && (_MSC_VER >= 1020)
  5. # pragma once
  6. #endif
  7. #include <assert.h>
  8. #include <boost/serialization/serialization.hpp>
  9. #include <boost/serialization/split_free.hpp>
  10. #include "var_int.h"
  11. namespace boost { namespace serialization {
  12. template<class Archive>
  13. uint32_t load_var_uint32(Archive& ar)
  14. {
  15. uint32_t v = 0;
  16. for (int shift = 0; shift < 35; shift += 7)
  17. {
  18. unsigned char b; ar >> b;
  19. v |= uint32_t(b & 0x7F) << shift;
  20. if ((b & 0x80) == 0)
  21. return v;
  22. }
  23. assert(0); // should not get here
  24. return v; // avoid compile warning
  25. }
  26. template<class Archive>
  27. uint64_t load_var_uint64(Archive& ar)
  28. {
  29. uint64_t v = 0;
  30. unsigned char b;
  31. for (int shift = 0; shift < 56; shift += 7)
  32. {
  33. ar >> b;
  34. v |= uint64_t(b & 0x7F) << shift;
  35. if ((b & 0x80) == 0)
  36. return v;
  37. }
  38. ar >> b;
  39. v |= uint64_t(b) << 56;
  40. return v;
  41. }
  42. //////////////////////////////////////////////////////////////////////////
  43. template<class Archive>
  44. void load(Archive& ar, febird::var_uint32_t& x, unsigned ver)
  45. {
  46. x.t = load_var_uint32(ar);
  47. }
  48. template<class Archive>
  49. void load(Archive& ar, febird::var_int32_t& x, unsigned ver)
  50. {
  51. x.t = var_int32_u2s(load_var_uint32(ar));
  52. }
  53. template<class Archive>
  54. void save(Archive& ar, febird::var_uint32_t x, unsigned ver)
  55. {
  56. unsigned char buf[5];
  57. ar.save_binary(buf, febird::save_var_uint32(buf, x.t) - buf);
  58. }
  59. template<class Archive>
  60. void save(Archive& ar, febird::var_int32_t x, unsigned ver)
  61. {
  62. unsigned char buf[5];
  63. ar.save_binary(buf, febird::save_var_int32(buf, x.t) - buf);
  64. }
  65. //////////////////////////////////////////////////////////////////////////
  66. template<class Archive>
  67. void load(Archive& ar, febird::var_uint64_t& x, unsigned ver)
  68. {
  69. x.t = febird::load_var_uint64(ar);
  70. }
  71. template<class Archive>
  72. void load(Archive& ar, febird::var_int64_t& x, unsigned ver)
  73. {
  74. x.t = febird::var_int64_u2s(load_var_uint64(ar));
  75. }
  76. template<class Archive>
  77. void save(Archive& ar, febird::var_uint64_t x, unsigned ver)
  78. {
  79. unsigned char buf[9];
  80. ar.save_binary(buf, febird::save_var_uint64(buf, x.t) - buf);
  81. }
  82. template<class Archive>
  83. void save(Archive& ar, febird::var_int64_t x, unsigned ver)
  84. {
  85. unsigned char buf[9];
  86. ar.save_binary(buf, febird::save_var_int64(buf, x.t) - buf);
  87. }
  88. } } // namespace boost::serialization
  89. BOOST_SERIALIZATION_SPLIT_FREE(febird::var_uint32_t)
  90. BOOST_SERIALIZATION_SPLIT_FREE(febird::var_int32_t)
  91. BOOST_SERIALIZATION_SPLIT_FREE(febird::var_uint64_t)
  92. BOOST_SERIALIZATION_SPLIT_FREE(febird::var_int64_t)
  93. #endif // __febird_io_var_int_for_boost_serialization_h__