The Battle for Wesnoth  1.13.4+dev
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
ucs4_iterator_base.hpp
Go to the documentation of this file.
1 #ifndef UCS4_ITERATOR_BASE_HPP_INCLUDED
2 #define UCS4_ITERATOR_BASE_HPP_INCLUDED
3 
4 #include <iterator> //input_iterator_tag
5 #include <utility> //pair
6 #include <cstddef> //ptrdiff_t
7 #include <cassert> //assert
8 
9 #include "unicode_types.hpp"
10 
11 namespace ucs4
12 {
13  template<typename string_type, typename update_implementation>
15  {
16  public:
17  typedef std::input_iterator_tag iterator_category;
19  typedef ptrdiff_t difference_type;
22 
23  iterator_base(const string_type& str)
24  : current_char(0)
25  , string_end(str.end())
26  , current_substr(std::make_pair(str.begin(), str.begin()))
27  {
28  update();
29  }
30 
31  iterator_base(typename string_type::const_iterator const &begin, typename string_type::const_iterator const &end)
32  : current_char(0)
33  , string_end(end)
34  , current_substr(std::make_pair(begin, begin))
35  {
36  update();
37  }
38 
39  static iterator_base begin(const string_type& str)
40  {
41  return iterator_base(str.begin(), str.end());
42  }
43 
44  static iterator_base end(const string_type& str)
45  {
46  return iterator_base(str.end(), str.end());
47  }
48 
49  bool operator==(const iterator_base& a) const
50  {
51  return current_substr.first == a.current_substr.first;
52  }
53 
54  bool operator!=(const iterator_base& a) const
55  {
56  return ! (*this == a);
57  }
58 
60  {
61  current_substr.first = current_substr.second;
62  update();
63  return *this;
64  }
65 
67  {
68  return current_char;
69  }
70 
71  bool next_is_end() const
72  {
73  if(current_substr.second == string_end)
74  return true;
75  return false;
76  }
77 
78  const std::pair<typename string_type::const_iterator, typename string_type::const_iterator>& substr() const
79  {
80  return current_substr;
81  }
82  private:
83  void update()
84  {
85  assert(current_substr.first == current_substr.second);
86  if(current_substr.first == string_end)
87  return;
89  }
90 
92  typename string_type::const_iterator string_end;
93  std::pair<typename string_type::const_iterator, typename string_type::const_iterator> current_substr;
94  };
95 
96 }
97 
98 #endif
bool operator==(const iterator_base &a) const
static iterator_base begin(const string_type &str)
iterator_base(typename string_type::const_iterator const &begin, typename string_type::const_iterator const &end)
ucs4::char_t operator*() const
STL namespace.
iterator_base & operator++()
std::input_iterator_tag iterator_category
iterator_base(const string_type &str)
GLuint GLuint end
Definition: glew.h:1221
bool operator!=(const iterator_base &a) const
GLboolean GLboolean GLboolean GLboolean a
Definition: glew.h:7319
boost::uint32_t char_t
void read(config &cfg, std::istream &in, abstract_validator *validator)
Definition: parser.cpp:400
static iterator_base end(const string_type &str)
const std::pair< typename string_type::const_iterator, typename string_type::const_iterator > & substr() const
std::pair< typename string_type::const_iterator, typename string_type::const_iterator > current_substr
string_type::const_iterator string_end