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_adapt_std.h,v 1.1 2008/08/25 16:20:01 langmead Exp $
19 ==========================================================================*/
21 #ifndef SEQAN_HEADER_BASIC_ITERATOR_ADAPT_STD_H
22 #define SEQAN_HEADER_BASIC_ITERATOR_ADAPT_STD_H
24 //////////////////////////////////////////////////////////////////////////////
26 //adapt SeqAn iterator to std
29 template<typename TContainer, typename TSpec>
30 struct iterator_traits<seqan::Iter<TContainer, TSpec> >
32 typedef ::seqan::Iter<TContainer, TSpec> TIter;
34 typedef random_access_iterator_tag iterator_category;
35 typedef typename ::seqan::Value<TIter>::Type value_type;
36 typedef typename ::seqan::Difference<TIter>::Type difference_type;
37 typedef typename ::seqan::Value<TIter>::Type * pointer;
38 typedef typename ::seqan::Reference<TIter>::Type reference;
42 //////////////////////////////////////////////////////////////////////////////
43 //////////////////////////////////////////////////////////////////////////////
45 namespace SEQAN_NAMESPACE_MAIN
50 /* This simple, general implementation cannot be used due to strange VC++ 2003 behavior
52 template <typename TStdContainer>
53 struct StdContainerIterator
55 typedef typename TStdContainer::iterator Type;
58 template <typename TStdContainer>
59 struct StdContainerIterator<TStdContainer const>
61 typedef typename TStdContainer::const_iterator Type;
65 //we use this instead: specialize StdContainerIterator for each std-container
66 template <typename TStdContainer>
67 struct StdContainerIterator
69 typedef void * Type; //dummy, just to make VC++ 2003 happy
72 template <typename TChar, typename TCharTraits, typename TAlloc>
73 struct StdContainerIterator< ::std::basic_string<TChar, TCharTraits, TAlloc> >
75 typedef ::std::basic_string<TChar, TCharTraits, TAlloc> TContainer;
76 typedef typename TContainer::iterator Type;
78 template <typename TChar, typename TCharTraits, typename TAlloc>
79 struct StdContainerIterator< ::std::basic_string<TChar, TCharTraits, TAlloc> const>
81 typedef ::std::basic_string<TChar, TCharTraits, TAlloc> TContainer;
82 typedef typename TContainer::const_iterator Type;
85 //////////////////////////////////////////////////////////////////////////////
86 //adapt std iterator to SeqAn
89 struct StdIteratorAdaptor;
91 template <typename TContainer>
92 class Iter<TContainer, StdIteratorAdaptor>
95 typedef typename StdContainerIterator<TContainer>::Type TIterator;
96 TIterator data_iterator;
99 Iter(Iter const & other_): data_iterator(other_.data_iterator) {}
100 Iter(TIterator const & iter_): data_iterator(iter_) {}
101 Iter(TContainer const & cont_): data_iterator(begin(cont_)) {}
103 Iter const & operator = (Iter const & other_)
105 data_iterator = other_.data_iterator;
108 Iter const & operator = (TIterator const & iter_)
110 data_iterator = iter_;
114 operator TIterator &()
116 return data_iterator;
122 //////////////////////////////////////////////////////////////////////////////
124 //////////////////////////////////////////////////////////////////////////////
126 template <typename TContainer>
127 inline typename StdContainerIterator<TContainer>::Type &
128 hostIterator(Iter<TContainer, StdIteratorAdaptor> & me)
130 return me.data_iterator;
132 template <typename TContainer>
133 inline typename StdContainerIterator<TContainer>::Type const &
134 hostIterator(Iter<TContainer, StdIteratorAdaptor> const & me)
136 return me.data_iterator;
139 //////////////////////////////////////////////////////////////////////////////
141 //////////////////////////////////////////////////////////////////////////////
143 template <typename TContainer>
144 inline typename Reference<Iter<TContainer, StdIteratorAdaptor> >::Type
145 value(Iter<TContainer, StdIteratorAdaptor> & me)
147 return *(me.data_iterator);
149 template <typename TContainer>
150 inline typename Reference<Iter<TContainer, StdIteratorAdaptor> const>::Type
151 value(Iter<TContainer, StdIteratorAdaptor> const & me)
153 return *(me.data_iterator);
157 /////////////////////////////////////////////////////////////////////////////
159 //////////////////////////////////////////////////////////////////////////////
161 template <typename TContainer, typename TValue>
163 assignValue(Iter<TContainer, StdIteratorAdaptor> & me,
166 *(me.data_iterator) = val;
168 template <typename TContainer, typename TValue>
170 assignValue(Iter<TContainer, StdIteratorAdaptor> & me,
173 *(me.data_iterator) = val;
176 /////////////////////////////////////////////////////////////////////////////
178 //////////////////////////////////////////////////////////////////////////////
180 template <typename TContainer, typename TValue>
182 moveValue(Iter<TContainer, StdIteratorAdaptor> & me,
185 move(*(me.data_iterator), val);
187 template <typename TContainer, typename TValue>
189 moveValue(Iter<TContainer, StdIteratorAdaptor> & me,
192 move(*(me.data_iterator), val);
195 //////////////////////////////////////////////////////////////////////////////
197 //////////////////////////////////////////////////////////////////////////////
199 template <typename TContainer>
201 operator == (Iter<TContainer, StdIteratorAdaptor> const & left,
202 Iter<TContainer, StdIteratorAdaptor> const & right)
205 return hostIterator(left) == hostIterator(right);
208 //////////////////////////////////////////////////////////////////////////////
210 //////////////////////////////////////////////////////////////////////////////
212 template <typename TContainer>
214 operator != (Iter<TContainer, StdIteratorAdaptor> const & left,
215 Iter<TContainer, StdIteratorAdaptor> const & right)
218 return hostIterator(left) != hostIterator(right);
221 //////////////////////////////////////////////////////////////////////////////
223 //////////////////////////////////////////////////////////////////////////////
225 template <typename TContainer>
227 operator < (Iter<TContainer, StdIteratorAdaptor> const & left,
228 Iter<TContainer, StdIteratorAdaptor> const & right)
231 return hostIterator(left) < hostIterator(right);
234 //////////////////////////////////////////////////////////////////////////////
236 //////////////////////////////////////////////////////////////////////////////
238 template <typename TContainer>
240 operator > (Iter<TContainer, StdIteratorAdaptor> const & left,
241 Iter<TContainer, StdIteratorAdaptor> const & right)
244 return hostIterator(left) > hostIterator(right);
247 //////////////////////////////////////////////////////////////////////////////
249 //////////////////////////////////////////////////////////////////////////////
251 template <typename TContainer>
253 operator <= (Iter<TContainer, StdIteratorAdaptor> const & left,
254 Iter<TContainer, StdIteratorAdaptor> const & right)
257 return hostIterator(left) <= hostIterator(right);
260 //////////////////////////////////////////////////////////////////////////////
262 //////////////////////////////////////////////////////////////////////////////
264 template <typename TContainer>
266 operator >= (Iter<TContainer, StdIteratorAdaptor> const & left,
267 Iter<TContainer, StdIteratorAdaptor> const & right)
270 return hostIterator(left) >= hostIterator(right);
273 //////////////////////////////////////////////////////////////////////////////
275 //////////////////////////////////////////////////////////////////////////////
277 template <typename TContainer>
279 goNext(Iter<TContainer, StdIteratorAdaptor> & me)
282 goNext(hostIterator(me));
285 //////////////////////////////////////////////////////////////////////////////
287 //////////////////////////////////////////////////////////////////////////////
289 template <typename TContainer>
291 goPrevious(Iter<TContainer, StdIteratorAdaptor> & me)
294 goPrevious(hostIterator(me));
297 //////////////////////////////////////////////////////////////////////////////
299 //////////////////////////////////////////////////////////////////////////////
301 template <typename TContainer, typename TIntegral>
302 inline Iter<TContainer, StdIteratorAdaptor>
303 operator + (Iter<TContainer, StdIteratorAdaptor> const & left,
307 return Iter<TContainer, StdIteratorAdaptor>(hostIterator(left) + right);
309 // for <anonymous enum> types
310 template <typename TContainer>
311 inline Iter<TContainer, StdIteratorAdaptor>
312 operator + (Iter<TContainer, StdIteratorAdaptor> const & left,
316 return Iter<TContainer, StdIteratorAdaptor>(hostIterator(left) + right);
319 template <typename TContainer, typename TIntegral>
320 inline Iter<TContainer, StdIteratorAdaptor>
321 operator + (TIntegral left,
322 Iter<TContainer, StdIteratorAdaptor> const & right)
325 return Iter<TContainer, StdIteratorAdaptor>(hostIterator(right) + left);
327 // for <anonymous enum> types
328 template <typename TContainer>
329 inline Iter<TContainer, StdIteratorAdaptor>
330 operator + (int left,
331 Iter<TContainer, StdIteratorAdaptor> const & right)
334 return Iter<TContainer, StdIteratorAdaptor>(hostIterator(right) + left);
337 //////////////////////////////////////////////////////////////////////////////
339 //////////////////////////////////////////////////////////////////////////////
341 template <typename TContainer, typename TIntegral>
342 inline Iter<TContainer, StdIteratorAdaptor> &
343 operator += (Iter<TContainer, StdIteratorAdaptor> & left,
347 hostIterator(left) += right;
350 // for <anonymous enum> types
351 template <typename TContainer>
352 inline Iter<TContainer, StdIteratorAdaptor> &
353 operator += (Iter<TContainer, StdIteratorAdaptor> & left,
357 hostIterator(left) += right;
361 //////////////////////////////////////////////////////////////////////////////
363 //////////////////////////////////////////////////////////////////////////////
365 template <typename TContainer, typename TIntegral>
366 inline Iter<TContainer, StdIteratorAdaptor>
367 operator - (Iter<TContainer, StdIteratorAdaptor> const & left,
371 return Iter<TContainer, StdIteratorAdaptor>(hostIterator(left) - right);
373 // for <anonymous enum> types
374 template <typename TContainer>
375 inline Iter<TContainer, StdIteratorAdaptor>
376 operator - (Iter<TContainer, StdIteratorAdaptor> const & left,
380 return Iter<TContainer, StdIteratorAdaptor>(hostIterator(left) - right);
383 //____________________________________________________________________________
385 template <typename TContainer>
386 inline typename Difference<Iter<TContainer, StdIteratorAdaptor> >::Type
387 operator - (Iter<TContainer, StdIteratorAdaptor> const & left,
388 Iter<TContainer, StdIteratorAdaptor> const & right)
391 return hostIterator(left) - hostIterator(right);
394 //////////////////////////////////////////////////////////////////////////////
396 //////////////////////////////////////////////////////////////////////////////
398 template <typename TContainer, typename TIntegral>
399 inline Iter<TContainer, StdIteratorAdaptor> &
400 operator -= (Iter<TContainer, StdIteratorAdaptor> & left,
404 hostIterator(left) -= right;
407 // for <anonymous enum> types
408 template <typename TContainer>
409 inline Iter<TContainer, StdIteratorAdaptor> &
410 operator -= (Iter<TContainer, StdIteratorAdaptor> & left,
414 hostIterator(left) -= right;
418 //////////////////////////////////////////////////////////////////////////////
419 //////////////////////////////////////////////////////////////////////////////
420 // assign (Conversion)
421 //////////////////////////////////////////////////////////////////////////////
423 template <typename TTargetContainer, typename TSource>
425 assign(Iter<TTargetContainer, StdIteratorAdaptor> & target,
426 TSource const & source)
429 target.data_iterator = begin(container(source)) + position(source);
432 //////////////////////////////////////////////////////////////////////////////
434 } //namespace SEQAN_NAMESPACE_MAIN
436 #endif //#ifndef SEQAN_HEADER_...