Vaucanson  1.4.1
window.hxx
Go to the documentation of this file.
1 // window.hxx: this file is part of the Vaucanson project.
2 //
3 // Vaucanson, a generic library for finite state machines.
4 //
5 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 The Vaucanson Group.
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License
9 // as published by the Free Software Foundation; either version 2
10 // of the License, or (at your option) any later version.
11 //
12 // The complete GNU General Public Licence Notice can be found as the
13 // `COPYING' file in the root directory.
14 //
15 // The Vaucanson Group consists of people listed in the `AUTHORS' file.
16 //
17 #ifndef VCSN_MISC_WINDOW_HXX
18 # define VCSN_MISC_WINDOW_HXX
19 
28 # include <vaucanson/misc/window.hh>
30 
31 namespace vcsn {
32  namespace misc {
33 
36  template <class InputIterator, class Letter>
37  Window<InputIterator, Letter>::Window (const iterator_t& stream,
38  const iterator_t& eof,
39  letter_t eol,
40  length_t length) :
41  begin_ (stream),
42  stream_ (stream),
43  end_ (eof),
44  eol_ (eol),
45  length_ (length)
46  {
47  precondition (length > 0);
48 
49  compute_size ();
50  }
51 
52  template <class InputIterator, class Letter>
53  bool
55  {
56  return stream_ == end_;
57  }
58 
59  template <class InputIterator, class Letter>
60  bool
62  {
63  return eof () || (*stream_ == eol_);
64  }
65 
66  template <class InputIterator, class Letter>
67  void
69  {
70  precondition (n <= size_);
71 
72  if ((stream_ != end_) && (*stream_ == eol_))
73  ++stream_;
74  else
75  stream_ += n;
76  compute_size ();
77  }
78 
79  template <class InputIterator, class Letter>
80  void
82  {
83  shift (size ());
84  }
85 
86  template <class InputIterator, class Letter>
87  void
89  {
90  stream_ = begin_ + offset;
91  compute_size ();
92  }
93 
94  template <class InputIterator, class Letter>
95  void
97  {
98  stream_ = position;
99  compute_size ();
100  }
101 
102  template <class InputIterator, class Letter>
103  typename Window<InputIterator, Letter>::length_t
105  {
106  return size_;
107  }
108 
109  template <class InputIterator, class Letter>
110  typename Window<InputIterator, Letter>::letter_t
112  {
113  precondition (i < size_);
114 
115  return stream_[i];
116  }
117 
118  template <class InputIterator, class Letter>
119  std::ostream&
120  Window<InputIterator, Letter>::print (std::ostream& ostr) const
121  {
122  return ostr << window ();
123  }
124 
125  template <class InputIterator, class Letter>
126  typename Window<InputIterator, Letter>::letter_t
128  {
129  return eol_;
130  }
131 
132  template <class InputIterator, class Letter>
133  typename Window<InputIterator, Letter>::iterator_t
135  {
136  return begin_;
137  }
138 
139  template <class InputIterator, class Letter>
140  typename Window<InputIterator, Letter>::iterator_t
142  {
143  return stream_;
144  }
145 
146  template <class InputIterator, class Letter>
147  typename Window<InputIterator, Letter>::iterator_t
149  {
150  return end_;
151  }
152 
153  template <class InputIterator, class Letter>
154  size_t
156  {
157  return stream_ - begin_;
158  }
159 
160  template <class InputIterator, class Letter>
161  typename Window<InputIterator, Letter>::length_t
163  {
164  return length_;
165  }
166 
167  template <class InputIterator, class Letter>
168  typename Window<InputIterator, Letter>::string_t
170  {
171  return string_t (stream_, stream_ + size_);
172  }
173 
174  template <class InputIterator, class Letter>
175  void
177  {
178  size_ = 0;
179  while ((size_ < length_) &&
180  (stream_ + size_ != end_) &&
181  (stream_[size_] != eol_))
182  ++size_;
183  }
184 
185  template <class InputIterator, class Letter>
186  std::ostream&
187  operator<< (std::ostream& ostr, const Window<InputIterator, Letter>& w)
188  {
189  return w.print (ostr);
190  }
191 
194  } // misc
195 } // vcsn
196 
197 #endif // ! VCSN_MISC_WINDOW_HXX