split.h
Go to the documentation of this file.
1 #ifndef _utl_split_h_
2 #define _utl_split_h_
3 
4 #include <string>
5 
6 
7 namespace utl {
8 
15  template<class istream>
16  class split {
17 
18  public:
19  class iterator : public std::iterator<std::input_iterator_tag, std::string> {
20  public:
22  typedef const std::string value_type;
23  typedef const std::string& reference;
24  typedef const std::string* pointer;
25  typedef std::input_iterator_tag iterator_category;
26 
27  iterator() { } // = also end iterator
28  iterator(istream& is, const char delim = '\n') : _istream_ptr(&is), _delim(delim) { next(); }
29  iterator& operator++() { next(); return *this; }
30  const std::string& operator*() const { return _line; }
31  const std::string* operator->() const { return &operator*(); }
32 
33  bool
34  operator==(const iterator& it)
35  const
36  {
37  return
38  _istream_ptr == it._istream_ptr &&
39  _delim == it._delim &&
40  _line == it._line;
41  }
42 
43  bool operator!=(const iterator& it) const { return !operator==(it); }
44 
45  private:
46  void
47  next()
48  {
49  if (!_istream_ptr)
50  return;
51  if (!std::getline(*_istream_ptr, _line, _delim)) {
52  _istream_ptr = nullptr;
53  _delim = '\0';
54  _line.clear();
55  }
56  }
57 
58  istream* _istream_ptr = nullptr;
59  char _delim = '\0';
60  std::string _line;
61  };
62 
63  split(istream& is, const char delim = '\n') : _istream(is), _delim(delim) { }
64 
66  iterator end() { return iterator(); }
67 
68  operator std::vector<std::string>()
69  {
70  return std::vector<std::string>(begin(), end());
71  }
72 
73  private:
74  istream& _istream;
75  const char _delim;
76  };
77 
78 
79  template<class istream>
80  inline
82  make_split(istream& is)
83  {
84  return split<istream>(is);
85  }
86 
87 }
88 
89 
90 #endif
split(istream &is, const char delim= '\n')
Definition: split.h:63
const std::string * pointer
Definition: split.h:24
iterator begin()
Definition: split.h:65
bool is(const double a, const double b)
Definition: testlib.cc:113
iterator self_type
Definition: split.h:21
iterator(istream &is, const char delim= '\n')
Definition: split.h:28
std::input_iterator_tag iterator_category
Definition: split.h:25
std::string _line
Definition: split.h:60
iterator end()
Definition: split.h:66
bool operator==(const iterator &it) const
Definition: split.h:34
istream & _istream
Definition: split.h:74
const std::string * operator->() const
Definition: split.h:31
const char _delim
Definition: split.h:75
istream * _istream_ptr
Definition: split.h:58
const std::string & operator*() const
Definition: split.h:30
const std::string & reference
Definition: split.h:23
split< istream > make_split(istream &is)
Definition: split.h:82
bool operator!=(const iterator &it) const
Definition: split.h:43
iterator & operator++()
Definition: split.h:29
const std::string value_type
Definition: split.h:22

, generated on Tue Sep 26 2023.