Advertisement
Guest User

Untitled

a guest
Nov 21st, 2021
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.90 KB | None | 0 0
  1. #include <iterator>
  2. #include <istream>
  3. #include <string>
  4.  
  5. class StreamedLines
  6. {
  7. public:
  8.   struct Iterator
  9.   {
  10.   public:
  11.     using iterator_category = std::input_iterator_tag;
  12.     using difference_type   = void;
  13.     using value_type        = std::string;
  14.     using reference         = std::string&;
  15.     using pointer           = std::string*;
  16.  
  17.     Iterator() = default;
  18.     Iterator(StreamedLines *pStreamHolder)
  19.       : m_pStreamHolder(pStreamHolder)
  20.     {
  21.       std::getline(m_pStreamHolder->m_in, m_currentLine);
  22.     }
  23.  
  24.     Iterator(const Iterator &other) = default;
  25.     Iterator(Iterator &&other)
  26.     {
  27.       m_pStreamHolder = other.m_pStreamHolder;
  28.       m_currentLine = move(other.m_currentLine);
  29.     }
  30.  
  31.     Iterator &operator=(const Iterator &other) = default;
  32.     Iterator &operator=(Iterator &&other)
  33.     {
  34.       m_pStreamHolder = other.m_pStreamHolder;
  35.       m_currentLine = move(other.m_currentLine);
  36.       return *this;
  37.     }
  38.  
  39.     std::string &operator*() { return m_currentLine; }
  40.     std::string *operator->() { return &m_currentLine; }
  41.  
  42.     Iterator &operator++()
  43.     {
  44.       std::getline(m_pStreamHolder->m_in, m_currentLine);
  45.       return *this;
  46.     }
  47.     Iterator operator++(int)
  48.     {
  49.       auto prev = *this;
  50.       ++*this;
  51.       return prev;
  52.     }
  53.  
  54.     bool operator==(const Iterator &other)
  55.     {
  56.       return m_pStreamHolder == other.m_pStreamHolder
  57.              || !m_pStreamHolder && other.m_pStreamHolder->m_in.eof()
  58.              || !other.m_pStreamHolder && m_pStreamHolder->m_in.eof();
  59.     }
  60.     bool operator!=(const Iterator &other)
  61.     {
  62.       return !(*this == other);
  63.     }
  64.  
  65.   private:
  66.     StreamedLines *m_pStreamHolder;
  67.     std::string m_currentLine;
  68.   };
  69.  
  70.   StreamedLines(std::istream &in)
  71.     : m_in(in)
  72.   {
  73.   }
  74.  
  75.   Iterator begin() { return Iterator(this); }
  76.   Iterator end() { return Iterator(); }
  77.  
  78. private:
  79.   std::istream &m_in;
  80. };
  81.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement