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

STL

开发平台:

Visual C++

  1. /* vim: set tabstop=4 : */
  2. #ifndef __febird_io_DataInputIterator_h__
  3. #define __febird_io_DataInputIterator_h__
  4. #if defined(_MSC_VER) && (_MSC_VER >= 1020)
  5. # pragma once
  6. #endif
  7. #ifndef __febird_io_DataInput_h__
  8. #include "DataInput.h"
  9. #endif
  10. namespace febird {
  11. template<class StreamClass>
  12. LittleEndianDataInput<StreamClass*> LittleEndianDataInputer(StreamClass* stream)
  13. {
  14. return LittleEndianDataInput<StreamClass*>(stream);
  15. }
  16. template<class StreamClass>
  17. PortableDataInput<StreamClass*> PortableDataInputer(StreamClass* stream)
  18. {
  19. return PortableDataInput<StreamClass*>(stream);
  20. }
  21. //////////////////////////////////////////////////////////////////////////
  22. template<class DataInput, class T>
  23. class DataInputIterator :
  24. public boost::input_iterator_helper<DataInputIterator<DataInput, T>, T>
  25. {
  26. DataInput m_input;
  27. size_t m_count;
  28. public:
  29. //! 序列的 count 已知,构造这个序列 iterator
  30. DataInputIterator(DataInput input, size_t count)
  31. : m_input(input), m_count(count)
  32. {
  33. assert(m_count > 0);
  34. }
  35. //! 序列的 count 还在 stream 中,构造时读取它(var_uint32_t 的 count)
  36. DataInputIterator(DataInput input)
  37. : m_input(input)
  38. {
  39. var_uint32_t x;  input >> x;
  40. m_count = x.t;
  41. }
  42. DataInputIterator()
  43. : m_count(0) {}
  44. //! 读取之后立即往前走,所以,同一个位置只能读取一次
  45. T operator*()
  46. {
  47. assert(m_count > 0);
  48. --m_count;
  49. T x; m_input >> x;
  50. return x;
  51. }
  52. //! 无操作
  53. DataInputIterator& operator++()
  54. {
  55. assert(m_count >= 0);
  56. return *this;
  57. }
  58. bool operator==(const DataInputIterator& r) const
  59. {
  60. return r.m_count == this->m_count;
  61. }
  62. bool is_end() const { return 0 == m_count; }
  63. size_t count() const { return m_count; }
  64. };
  65. //////////////////////////////////////////////////////////////////////////
  66. }
  67. #endif // __febird_io_DataInputIterator_h__