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

STL

开发平台:

Visual C++

  1. /* vim: set tabstop=4 : */
  2. #ifndef __febird_int_diff_coding_h__
  3. #define __febird_int_diff_coding_h__
  4. #if defined(_MSC_VER) && (_MSC_VER >= 1020)
  5. # pragma once
  6. #endif
  7. //#include <febird/io/var_int.h>
  8. //#include <febird/io/DataIO.h>
  9. namespace febird {
  10. template<class FirstIntType, class DiffIntType = FirstIntType>
  11. class DecodeIntDiff
  12. {
  13. FirstIntType m_cur;
  14. public:
  15. template<class Input>
  16. explicit DecodeIntDiff(Input& input, bool firstIsVarInt=true)
  17. {
  18. init(input, firstIsVarInt);
  19. }
  20. DecodeIntDiff() {}
  21. template<class Input>
  22. void init(Input& input, bool firstIsVarInt=true)
  23. {
  24. if (firstIsVarInt) {
  25. typename febird::var_int<FirstIntType>::type x;
  26. input >> x;
  27. m_cur = x.t;
  28. } else
  29. input >> m_cur;
  30. }
  31. FirstIntType value() const { return m_cur; }
  32. operator FirstIntType() const { return m_cur; }
  33. template<class Input>
  34. friend void DataIO_loadObject(Input& in, DecodeIntDiff<FirstIntType, DiffIntType>& x)
  35. {
  36. typename febird::var_int<DiffIntType>::type diff;
  37. in >> diff;
  38. x.m_cur += diff.t;
  39. }
  40. template<class Output>
  41. friend void DataIO_saveObject(Output&, const DecodeIntDiff<FirstIntType, DiffIntType>& x)
  42. {
  43. Output::do_not_support_serialize_this_class(x);
  44. }
  45. };
  46. template<class FirstIntType, class DiffIntType = FirstIntType>
  47. class EncodeIntDiff
  48. {
  49. FirstIntType m_cur;
  50. public:
  51. template<class Output>
  52. EncodeIntDiff(Output& output, FirstIntType first, bool firstIsVarInt=true)
  53. {
  54. init(output, first, firstIsVarInt);
  55. }
  56. EncodeIntDiff() {}
  57. template<class Output>
  58. void init(Output& output, FirstIntType first, bool firstIsVarInt=true)
  59. {
  60. m_cur = first;
  61. if (firstIsVarInt)
  62. output << febird::as_var_int(first);
  63. else
  64. output << first;
  65. }
  66. // FirstIntType value() const { return m_cur; }
  67. // operator FirstIntType() const { return m_cur; }
  68. //! used as:
  69. //! @code
  70. //!   EncodeIntDiff<uint32_t, int32_t> encode_diff(output, iVal);
  71. //!   for (...)
  72. //!   {
  73. //!      iVal = get_next_value(...);
  74. //!      output << encode_diff(iVal);
  75. //!   }
  76. //! @endcode
  77. typename febird::var_int<DiffIntType>::type operator()(FirstIntType next)
  78. {
  79. DiffIntType diff = next - m_cur;
  80. m_cur = next;
  81. return typename febird::var_int<DiffIntType>::type(diff);
  82. }
  83. };
  84. } // namespace febird
  85. #endif // __febird_int_diff_coding_h__