1 /*==========================================================================
2 SeqAn - The Library for Sequence Analysis
4 ============================================================================
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 3 of the License, or (at your option) any later version.
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 ============================================================================
18 $Id: basic_iterator_position.h,v 1.1 2008/08/25 16:20:01 langmead Exp $
19 ==========================================================================*/
21 #ifndef SEQAN_HEADER_BASIC_ITERATOR_POSITION_H
22 #define SEQAN_HEADER_BASIC_ITERATOR_POSITION_H
24 namespace SEQAN_NAMESPACE_MAIN
26 //////////////////////////////////////////////////////////////////////////////
29 struct PositionIterator;
31 //////////////////////////////////////////////////////////////////////////////
33 //////////////////////////////////////////////////////////////////////////////
36 .Spec.Position Iterator:
39 ..summary:Adapts @Metafunction.Position.position@ to @Concept.Rooted Iterator.iterator@.
40 ..signature:Iter<TContainer, PositionIterator>
41 ..param.TContainer:Type of the container.
42 ...metafunction:Metafunction.Container
44 ...text:Position Iterators provide the concept @Concept.Rooted Iterator@.
45 ..see:Metafunction.Position
48 template <typename TContainer>
49 class Iter<TContainer, PositionIterator>
52 typedef typename Position<TContainer>::Type TPosition;
54 typename _Pointer<TContainer>::Type data_container;
55 TPosition data_position;
56 //____________________________________________________________________________
60 .Memfunc.PositionIterator#Iter:
61 ..class:Spec.Position Iterator
64 ..signature:Iter(iter)
65 ..signature:Iter(container [, position])
66 ..param.iter:Another position iterator object.
67 ..param.container:The corresponding container object.
68 ...metafunction:Metafunction.Container
69 ..param.position:A position in $container$. (optional)
70 ...metafunction:Metafunction.Position
71 ...remarks.text:If this argument is omitted, the adaptor iterator is initialized to the @Function.beginPosition.begin position@ of $container$.
77 Iter(typename _Parameter<TContainer>::Type container_, TPosition position_ = 0):
78 data_container(_toPointer(container_)),
79 data_position(position_)
83 Iter(Iter const & other_):
84 data_container(other_.data_container),
85 data_position(other_.data_position)
89 template <typename TContainer2, typename TSpec2>
90 Iter(Iter<TContainer2, TSpec2> const & other_)
93 assign(*this, other_);
100 operator = (Iter const & other_)
103 data_container = other_.data_container;
104 data_position = other_.data_position;
107 //____________________________________________________________________________
109 friend inline typename _Parameter<TContainer>::Type
113 return _toParameter<TContainer>(me.data_container);
115 friend inline typename _Parameter<TContainer>::Type
116 container(Iter const & me)
119 return _toParameter<TContainer>(me.data_container);
121 //____________________________________________________________________________
124 setContainer(Iter & me, typename _Parameter<TContainer>::Type container_)
127 typename Position<Iter>::Type pos = position(me);
128 me.data_container = _toPointer(container_);
129 setPosition(me, pos);
132 //____________________________________________________________________________
134 friend inline TPosition &
138 return me.data_position;
140 friend inline TPosition const &
141 position(Iter const & me)
144 return me.data_position;
146 //____________________________________________________________________________
149 setPosition(Iter & me, TPosition position_)
152 me.data_position = position_;
154 //____________________________________________________________________________
157 //////////////////////////////////////////////////////////////////////////////
159 //////////////////////////////////////////////////////////////////////////////
161 template <typename TContainer>
162 inline typename Reference<Iter<TContainer, PositionIterator> >::Type
163 value(Iter<TContainer, PositionIterator> & me)
166 return value(container(me), position(me));
168 template <typename TContainer>
169 inline typename Reference<Iter<TContainer, PositionIterator> >::Type
170 value(Iter<TContainer, PositionIterator> const & me)
173 return value(container(me), position(me));
176 /////////////////////////////////////////////////////////////////////////////
178 //////////////////////////////////////////////////////////////////////////////
180 template <typename TContainer, typename TValue>
182 assignValue(Iter<TContainer, PositionIterator> & me,
186 assignValue(container(me), position(me), _value);
188 template <typename TContainer, typename TValue>
190 assignValue(Iter<TContainer, PositionIterator> const & me,
194 assignValue(container(me), position(me), _value);
197 /////////////////////////////////////////////////////////////////////////////
199 //////////////////////////////////////////////////////////////////////////////
201 template <typename TContainer, typename TValue>
203 moveValue(Iter<TContainer, PositionIterator> & me,
207 moveValue(container(me), position(me), _value);
209 template <typename TContainer, typename TValue>
211 moveValue(Iter<TContainer, PositionIterator> const & me,
215 moveValue(container(me), position(me), _value);
218 //////////////////////////////////////////////////////////////////////////////
220 //////////////////////////////////////////////////////////////////////////////
222 template <typename TContainer>
224 operator == (Iter<TContainer, PositionIterator> const & left,
225 Iter<TContainer, PositionIterator> const & right)
228 return position(left) == position(right);
231 //////////////////////////////////////////////////////////////////////////////
233 //////////////////////////////////////////////////////////////////////////////
235 template <typename TContainer>
237 operator != (Iter<TContainer, PositionIterator> const & left,
238 Iter<TContainer, PositionIterator> const & right)
241 return position(left) != position(right);
244 //////////////////////////////////////////////////////////////////////////////
246 //////////////////////////////////////////////////////////////////////////////
248 template <typename TContainer>
250 operator < (Iter<TContainer, PositionIterator> const & left,
251 Iter<TContainer, PositionIterator> const & right)
254 return position(left) < position(right);
257 template <typename TContainer>
259 operator > (Iter<TContainer, PositionIterator> const & left,
260 Iter<TContainer, PositionIterator> const & right)
263 return position(left) > position(right);
266 //////////////////////////////////////////////////////////////////////////////
268 //////////////////////////////////////////////////////////////////////////////
270 template <typename TContainer>
272 operator <= (Iter<TContainer, PositionIterator> const & left,
273 Iter<TContainer, PositionIterator> const & right)
276 return position(left) <= position(right);
279 template <typename TContainer>
281 operator >= (Iter<TContainer, PositionIterator> const & left,
282 Iter<TContainer, PositionIterator> const & right)
285 return position(left) >= position(right);
288 //////////////////////////////////////////////////////////////////////////////
290 //////////////////////////////////////////////////////////////////////////////
292 template <typename TContainer>
294 goNext(Iter<TContainer, PositionIterator> & me)
297 setPosition(me, position(me) + 1);
300 //////////////////////////////////////////////////////////////////////////////
302 //////////////////////////////////////////////////////////////////////////////
304 template <typename TContainer>
306 goPrevious(Iter<TContainer, PositionIterator> & me)
309 setPosition(me, position(me) - 1);
312 //////////////////////////////////////////////////////////////////////////////
314 //////////////////////////////////////////////////////////////////////////////
315 template <typename TContainer, typename TIntegral>
316 inline Iter<TContainer, PositionIterator>
317 operator + (Iter<TContainer, PositionIterator> const & left,
321 return Iter<TContainer, PositionIterator>(container(left), position(left) + right);
323 // for <anonymous enum> types
324 template <typename TContainer>
325 inline Iter<TContainer, PositionIterator>
326 operator + (Iter<TContainer, PositionIterator> const & left,
330 return Iter<TContainer, PositionIterator>(container(left), position(left) + right);
333 template <typename TContainer, typename TIntegral>
334 inline Iter<TContainer, PositionIterator>
335 operator + (TIntegral left,
336 Iter<TContainer, PositionIterator> const & right)
339 return Iter<TContainer, PositionIterator>(container(right), position(right) + left);
341 // for <anonymous enum> types
342 template <typename TContainer>
343 inline Iter<TContainer, PositionIterator>
344 operator + (int left,
345 Iter<TContainer, PositionIterator> const & right)
348 return Iter<TContainer, PositionIterator>(container(right), position(right) + left);
351 //////////////////////////////////////////////////////////////////////////////
353 //////////////////////////////////////////////////////////////////////////////
355 template <typename TContainer, typename TIntegral>
356 inline Iter<TContainer, PositionIterator> &
357 operator += (Iter<TContainer, PositionIterator> & left,
361 setPosition(left, position(left) + right);
364 // for <anonymous enum> types
365 template <typename TContainer>
366 inline Iter<TContainer, PositionIterator> &
367 operator += (Iter<TContainer, PositionIterator> & left,
371 setPosition(left, position(left) + right);
375 //////////////////////////////////////////////////////////////////////////////
377 //////////////////////////////////////////////////////////////////////////////
379 template <typename TContainer, typename TIntegral>
380 inline Iter<TContainer, PositionIterator>
381 operator - (Iter<TContainer, PositionIterator> const & left,
385 return Iter<TContainer, PositionIterator>(container(left), position(left) - right);
387 // for <anonymous enum> types
388 template <typename TContainer>
389 inline Iter<TContainer, PositionIterator>
390 operator - (Iter<TContainer, PositionIterator> const & left,
394 return Iter<TContainer, PositionIterator>(container(left), position(left) - right);
397 //____________________________________________________________________________
399 template <typename TContainer>
400 inline typename Difference<TContainer>::Type
401 operator - (Iter<TContainer, PositionIterator> const & left,
402 Iter<TContainer, PositionIterator> const & right)
405 return position(left) - position(right);
408 //////////////////////////////////////////////////////////////////////////////
410 //////////////////////////////////////////////////////////////////////////////
412 template <typename TContainer, typename TIntegral>
413 inline Iter<TContainer, PositionIterator> &
414 operator -= (Iter<TContainer, PositionIterator> & left,
418 setPosition(left, position(left) - right);
421 // for <anonymous enum> types
422 template <typename TContainer>
423 inline Iter<TContainer, PositionIterator> &
424 operator -= (Iter<TContainer, PositionIterator> & left,
428 setPosition(left, position(left) - right);
432 //////////////////////////////////////////////////////////////////////////////
433 // assign (Conversion)
434 //////////////////////////////////////////////////////////////////////////////
436 template <typename TTargetContainer, typename TSource>
438 assign(Iter<TTargetContainer, PositionIterator> & target,
439 TSource const & source)
442 target.data_container = container(source);
443 target.data_position = position(source);
446 //////////////////////////////////////////////////////////////////////////////
448 } //namespace SEQAN_NAMESPACE_MAIN
450 #endif //#ifndef SEQAN_HEADER_...