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

STL

开发平台:

Visual C++

  1. /* vim: set tabstop=4 : */
  2. #ifndef __febird_io_custom_int_h__
  3. #define __febird_io_custom_int_h__
  4. #if defined(_MSC_VER) && (_MSC_VER >= 1020)
  5. # pragma once
  6. #endif
  7. #include <boost/config.hpp>
  8. #include <boost/static_assert.hpp>
  9. #include "../stdtypes.h"
  10. // should be the last #include
  11. #include <boost/type_traits/detail/bool_trait_def.hpp>
  12. namespace febird {
  13. template<class BaseInt, int Bits>
  14. class custom_int
  15. {
  16. BaseInt m_val;
  17. BOOST_STATIC_ASSERT(Bits % 8 == 0);
  18. public:
  19. typedef BaseInt presentation_type;
  20. BOOST_STATIC_CONSTANT(int, bits  = Bits);
  21. BOOST_STATIC_CONSTANT(int, bytes = Bits / 8);
  22. custom_int(BaseInt val = BaseInt()) : m_val(val % (BaseInt(1) << Bits)) {}
  23. operator BaseInt() const { return m_val; }
  24. BaseInt& value() { return m_val; }
  25. BaseInt  value() const { return m_val; }
  26. #define FEBIRD_custom_int_gen_operator(op) 
  27. BaseInt operator op(custom_int y) const { return m_val op y.m_val; }
  28. FEBIRD_custom_int_gen_operator(+)
  29. FEBIRD_custom_int_gen_operator(-)
  30. FEBIRD_custom_int_gen_operator(*)
  31. FEBIRD_custom_int_gen_operator(/)
  32. FEBIRD_custom_int_gen_operator(%)
  33. FEBIRD_custom_int_gen_operator(^)
  34. FEBIRD_custom_int_gen_operator(&)
  35. FEBIRD_custom_int_gen_operator(|)
  36. FEBIRD_custom_int_gen_operator(<<)
  37. FEBIRD_custom_int_gen_operator(>>)
  38. #undef FEBIRD_custom_int_gen_operator
  39. bool operator&&(custom_int y) const { return m_val && y.m_val; }
  40. bool operator||(custom_int y) const { return m_val || y.m_val; }
  41. bool operator!() const { return !m_val; }
  42. BaseInt operator~() const { return ~m_val; }
  43. BaseInt operator-() const { return -m_val; }
  44. custom_int operator+() const { return +m_val; }
  45. custom_int operator++() { return m_val = ++m_val % (BaseInt(1) << Bits); }
  46. custom_int operator--() { return m_val = --m_val % (BaseInt(1) << Bits); }
  47. custom_int operator++(int)
  48. {
  49. BaseInt t = m_val;
  50. m_val = ++m_val % (BaseInt(1) << Bits);
  51. return t;
  52. }
  53. custom_int operator--(int)
  54. {
  55. BaseInt t = m_val;
  56. m_val = --m_val % (BaseInt(1) << Bits);
  57. return t;
  58. }
  59. #define FEBIRD_custom_int_gen_assign_op(op)
  60. custom_int& operator op(custom_int y)
  61. { m_val op y;
  62. m_val %= (BaseInt(1) << Bits);
  63. return *this;
  64. }
  65. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  66. FEBIRD_custom_int_gen_assign_op(+=)
  67. FEBIRD_custom_int_gen_assign_op(-=)
  68. FEBIRD_custom_int_gen_assign_op(*=)
  69. #undef FEBIRD_custom_int_gen_assign_op
  70. // not need: "m_val %= (BaseInt(1) << Bits);"
  71. #define FEBIRD_custom_int_gen_assign_op(op)
  72. custom_int& operator op(custom_int y)
  73. { m_val op y;
  74. return *this;
  75. }
  76. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  77. FEBIRD_custom_int_gen_assign_op(/=)
  78. FEBIRD_custom_int_gen_assign_op(%=)
  79. FEBIRD_custom_int_gen_assign_op(&=)
  80. FEBIRD_custom_int_gen_assign_op(|=)
  81. FEBIRD_custom_int_gen_assign_op(^=)
  82. FEBIRD_custom_int_gen_assign_op(<<=)
  83. FEBIRD_custom_int_gen_assign_op(>>=)
  84. #undef FEBIRD_custom_int_gen_assign_op
  85. template<class Input> friend void DataIO_loadObject(Input& input, custom_int& x)
  86. {
  87. unsigned char b;
  88. x.m_val = 0;
  89. for (int bytes = 0; bytes != Bits/8; ++bytes)
  90. {
  91. input >> b;
  92. x.m_val = x.m_val << 8 | b;
  93. }
  94. }
  95. template<class Output> friend void DataIO_saveObject(Output& output, custom_int x)
  96. {
  97. BaseInt y = x.m_val;
  98. for (int bytes = 0; bytes != Bits/8; ++bytes)
  99. {
  100. output << b;
  101. y >>= 8;
  102. }
  103. }
  104. };
  105. typedef custom_int<int32_t, 24> int24_t;
  106. typedef custom_int<int64_t, 40> int40_t;
  107. typedef custom_int<int64_t, 48> int48_t;
  108. typedef custom_int<int64_t, 56> int56_t;
  109. typedef custom_int<uint32_t, 24> uint24_t;
  110. typedef custom_int<uint64_t, 40> uint40_t;
  111. typedef custom_int<uint64_t, 48> uint48_t;
  112. typedef custom_int<uint64_t, 56> uint56_t;
  113. BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_custom_int, T, false)
  114. BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_custom_int, int24_t, true)
  115. BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_custom_int, int40_t, true)
  116. BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_custom_int, int48_t, true)
  117. BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_custom_int, int56_t, true)
  118. BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_custom_int, uint24_t, true)
  119. BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_custom_int, uint40_t, true)
  120. BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_custom_int, uint48_t, true)
  121. BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_custom_int, uint56_t, true)
  122. //! declaration
  123. template<class IntType> struct presentation_type;
  124. template<> struct presentation_type<int8_t>  { typedef int8_t type; };
  125. template<> struct presentation_type<int16_t> { typedef int16_t type; };
  126. template<> struct presentation_type<int32_t> { typedef int32_t type; };
  127. template<> struct presentation_type<int64_t> { typedef int64_t type; };
  128. template<> struct presentation_type<uint8_t>  { typedef uint8_t type; };
  129. template<> struct presentation_type<uint16_t> { typedef uint16_t type; };
  130. template<> struct presentation_type<uint32_t> { typedef uint32_t type; };
  131. template<> struct presentation_type<uint64_t> { typedef uint64_t type; };
  132. template<> struct presentation_type<int24_t> { typedef int32_t type; };
  133. template<> struct presentation_type<int40_t> { typedef int64_t type; };
  134. template<> struct presentation_type<int48_t> { typedef int64_t type; };
  135. template<> struct presentation_type<int56_t> { typedef int64_t type; };
  136. template<> struct presentation_type<uint24_t> { typedef uint32_t type; };
  137. template<> struct presentation_type<uint40_t> { typedef uint64_t type; };
  138. template<> struct presentation_type<uint48_t> { typedef uint64_t type; };
  139. template<> struct presentation_type<uint56_t> { typedef uint64_t type; };
  140. } // namespace febird
  141. #include "boost/type_traits/detail/bool_trait_undef.hpp"
  142. #endif // __febird_io_custom_int_h__