DDS  ver. 3.6
CustomIterator.h
Go to the documentation of this file.
1 // Copyright 2014 GSI, Inc. All rights reserved.
2 //
3 // Custom extensions to STL
4 //
5 #ifndef _DDS_CUSTOMITERATOR_H_
6 #define _DDS_CUSTOMITERATOR_H_
7 
8 namespace dds::misc
9 {
23  template <class T, class Ch = char, class Tr = std::char_traits<Ch>, class Dist = std::ptrdiff_t>
24  class custom_istream_iterator : public std::iterator<std::input_iterator_tag, T, Dist, const T*, const T&>
25  {
26  public:
28  typedef Ch char_type;
29  typedef Tr traits_type;
30  typedef std::basic_istream<Ch, Tr> istream_type;
31 
32  // construct singular iterator
34  : m_istream(0)
35  {
36  }
37 
38  // construct with input stream
40  : m_istream(&s)
41  {
42  getval();
43  }
44 
45  // return designated value
46  const T& operator*() const
47  {
48  return m_val;
49  }
50 
51  // return pointer to class object
52  const T* operator->() const
53  {
54  return &**this;
55  }
56 
57  // preincrement
59  {
60  getval();
61  return *this;
62  }
63 
64  // postincrement
66  {
67  m_it tmp = *this;
68  ++*this;
69  return tmp;
70  }
71 
72  // test for iterator equality
73  bool equal(const m_it& rhs) const
74  {
75  return m_istream == rhs.m_istream;
76  }
77 
78  protected:
79  // get a T value if possible
80  void getval()
81  {
82  if (m_istream != 0 && !(*m_istream >> m_val))
83  m_istream = 0;
84  }
85 
86  istream_type* m_istream; // pointer to input stream
87  T m_val; // lookahead value (valid if m_istream is not null)
88  };
89 
90  // specialization for std::string
91  template <>
92  inline void custom_istream_iterator<std::basic_string<char>, char, std::char_traits<char>, std::ptrdiff_t>::getval()
93  {
94  if (m_istream != 0 && !(std::getline(*m_istream, m_val)))
95  m_istream = 0;
96  }
97 
98  // m_istream_iterator template operators
99  // test for m_istream_iterator equality
100  template <class T, class Ch, class Tr, class Dist>
103  {
104  return lhs.equal(rhs);
105  }
106 
107  template <class T, class Ch, class Tr, class Dist>
110  {
111  return !(lhs == rhs);
112  }
113 }; // namespace dds::misc
114 
115 #endif /*_DDS_CUSTOMITERATOR_H_*/
istream_type * m_istream
Definition: CustomIterator.h:86
bool equal(const m_it &rhs) const
Definition: CustomIterator.h:73
Tr traits_type
Definition: CustomIterator.h:29
custom_istream_iterator< T, Ch, Tr, Dist > m_it
Definition: CustomIterator.h:27
custom_istream_iterator()
Definition: CustomIterator.h:33
This custom istream iterator helps to read input line by line without breaking lines after whitespace...
Definition: CustomIterator.h:24
custom_istream_iterator operator++(int)
Definition: CustomIterator.h:65
T m_val
Definition: CustomIterator.h:87
custom_istream_iterator(istream_type &s)
Definition: CustomIterator.h:39
bool operator==(const custom_istream_iterator< T, Ch, Tr, Dist > &lhs, const custom_istream_iterator< T, Ch, Tr, Dist > &rhs)
Definition: CustomIterator.h:101
std::basic_istream< Ch, Tr > istream_type
Definition: CustomIterator.h:30
custom_istream_iterator & operator++()
Definition: CustomIterator.h:58
Ch char_type
Definition: CustomIterator.h:28
void getval()
Definition: CustomIterator.h:80
const T * operator->() const
Definition: CustomIterator.h:52
bool operator!=(const custom_istream_iterator< T, Ch, Tr, Dist > &lhs, const custom_istream_iterator< T, Ch, Tr, Dist > &rhs)
Definition: CustomIterator.h:108
const T & operator *() const
Definition: CustomIterator.h:46
Definition: BoostHelper.h:14