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: string_pointer.h,v 1.3 2009/10/12 16:00:57 langmead Exp $
19 ==========================================================================*/
21 #ifndef SEQAN_HEADER_SEQUENCE_POINTER_H
22 #define SEQAN_HEADER_SEQUENCE_POINTER_H
26 namespace SEQAN_NAMESPACE_MAIN
28 //////////////////////////////////////////////////////////////////////////////
32 ..summary:Zero terminated $char[]$ or $wchar_t[]$.
33 ..remarks:Char arrays only support the Insist @Tag.Overflow Strategy.overflow strategy@.
37 //////////////////////////////////////////////////////////////////////////////
40 .Adaption.char array.remarks:The default overflow strategy
41 (both @Metafunction.DefaultOverflowImplicit@ and @Metafunction.DefaultOverflowExplicit@)
42 for all operations on char arrays is @Tag.Overflow Strategy.insist@.
45 template <typename TValue>
46 struct DefaultOverflowImplicit;
48 template <typename TValue>
49 struct DefaultOverflowImplicit< TValue * >
53 template <typename TValue>
54 struct DefaultOverflowImplicit< TValue * const>
58 template <typename TValue, size_t SIZE>
59 struct DefaultOverflowImplicit< TValue [SIZE] >
63 template <typename TValue, size_t SIZE>
64 struct DefaultOverflowImplicit< TValue const [SIZE] >
68 //____________________________________________________________________________
70 template <typename TValue>
71 struct DefaultOverflowExplicit;
73 template <typename TValue>
74 struct DefaultOverflowExplicit< TValue * >
78 template <typename TValue>
79 struct DefaultOverflowExplicit< TValue * const>
83 template <typename TValue, size_t SIZE>
84 struct DefaultOverflowExplicit< TValue [SIZE] >
88 template <typename TValue, size_t SIZE>
89 struct DefaultOverflowExplicit< TValue const [SIZE] >
94 //////////////////////////////////////////////////////////////////////////////
96 ///.Metafunction.IsContiguous.param.T.type:Adaption.char array
98 template <typename TValue>
101 template <typename TValue>
102 struct IsContiguous< TValue * >
105 enum { VALUE = true };
107 template <typename TValue, size_t SIZE>
108 struct IsContiguous< TValue [SIZE] >
111 enum { VALUE = true };
113 template <typename TValue, size_t SIZE>
114 struct IsContiguous< TValue const [SIZE] >
117 enum { VALUE = true };
121 .Metafunction.IsString.param.T.type:Adaption.char array
124 template <typename TValue>
125 struct IsSequence< TValue * >
128 enum { VALUE = true };
130 template <typename TValue, size_t SIZE>
131 struct IsSequence< TValue [SIZE] >
134 enum { VALUE = true };
136 template <typename TValue, size_t SIZE>
137 struct IsSequence< TValue const [SIZE] >
140 enum { VALUE = true };
143 //////////////////////////////////////////////////////////////////////////////
146 template <typename T>
147 inline typename Iterator<T *, typename DefaultGetIteratorSpec<T>::Type>::Type
151 return begin(me, typename DefaultGetIteratorSpec<T>::Type()) ;
154 ///.Function.begin.param.object.type:Adaption.char array
156 template <typename TValue>
157 inline typename Iterator<TValue *, Standard>::Type
165 //folgende Versionen wurde wegen seltsamer Phaenomene bei VC++ 2003 hinzugenommen
166 template <typename TValue>
167 inline typename Iterator<TValue const *, Standard>::Type
168 begin(TValue const * me,
175 template <typename TValue, typename TSpec>
176 inline typename Iterator<TValue *, Tag<TSpec> const>::Type
181 typedef typename Iterator<TValue *, Tag<TSpec> const>::Type TIterator;
182 return TIterator(me, begin(me, Standard()));
185 template <typename TValue, typename TSpec>
186 inline typename Iterator<TValue const *, Tag<TSpec> const>::Type
187 begin(TValue const * me,
191 typedef typename Iterator<TValue const *, Tag<TSpec> const>::Type TIterator;
192 return TIterator(me, begin(me, Standard()));
195 //////////////////////////////////////////////////////////////////////////////
197 ///.Function.end.param.object.type:Adaption.char array
199 template <typename TValue>
200 inline typename Iterator<TValue *, Standard>::Type
205 return begin(me, Standard()) + length(me);
208 //folgende Version wurde wegen eines seltsamen Phaenomens bei VC++ hinzugenommen
209 template <typename TValue>
210 inline typename Iterator<TValue const *, Standard>::Type
211 end(TValue const * me,
215 return begin(me, Standard()) + length(me);
218 template <typename TValue, typename TSpec>
219 inline typename Iterator<TValue *, Tag<TSpec> const>::Type
221 Tag<TSpec> const tag_)
224 return begin(me, tag_) + length(me);
227 template <typename TValue, typename TSpec>
228 inline typename Iterator<TValue const *, Tag<TSpec> const>::Type
229 end(TValue const * me,
230 Tag<TSpec> const tag_)
233 return begin(me, tag_) + length(me);
237 //////////////////////////////////////////////////////////////////////////////
239 ///.Function.value.param.container.type:Adaption.char array
241 template <typename TValue, typename TPos>
250 template <typename TValue, typename TPos>
251 inline TValue const &
252 value(TValue const * me,
259 //////////////////////////////////////////////////////////////////////////////
261 //////////////////////////////////////////////////////////////////////////////
263 template <typename TValue, typename TPos>
265 assignValue(TValue * me,
267 TValue const & _value)
270 assign(value(me, pos), _value);
273 //////////////////////////////////////////////////////////////////////////////
275 //////////////////////////////////////////////////////////////////////////////
277 template <typename TValue, typename TPos>
279 moveValue(TValue * me,
281 TValue const & _value)
284 move(value(me, pos), _value);
287 //////////////////////////////////////////////////////////////////////////////
289 template <typename TValue>
297 //____________________________________________________________________________
299 template <typename TValue>
302 TValue const * container)
308 //////////////////////////////////////////////////////////////////////////////
310 ///.Function.length.param.object.type:Adaption.char array
312 template <typename TValue>
318 TValue zero = TValue();
319 while ( *it != zero) ++it;
323 template <typename TValue>
325 length(TValue const * me)
328 TValue const * it = me;
329 TValue const zero = TValue();
330 while ( *it != zero) ++it;
342 length(char const * me)
348 //////////////////////////////////////////////////////////////////////////////
350 template <typename TValue>
352 _setLength(TValue * me,
359 //////////////////////////////////////////////////////////////////////////////
361 ///.Function.clear.param.object.type:Adaption.char array
363 template <typename TValue>
368 //arrayDestruct(begin(me), length(me)); //??? Die Laengenbestimmung ist meistens nutzlos, braucht man sowieso nur fuer non-pod
372 //////////////////////////////////////////////////////////////////////////////
374 ///.Function.empty.param.object.type:Adaption.char array
376 template <typename TValue>
381 return !me || (*me == TValue());
384 //////////////////////////////////////////////////////////////////////////////
387 template<typename TValue, typename TExpand>
389 _clearSpace(TValue * me,
394 return _ClearSpace_String_Base_<Tag<TExpand> const>::_clearSpace_(me, size);
397 template<typename TValue, typename TExpand>
399 _clearSpace(TValue * me,
405 return _ClearSpace_String_Base_<Tag<TExpand> const>::_clearSpace_(me, size, limit);
408 template<typename TValue, typename TPosition, typename TExpand>
410 _clearSpace(TValue * me,
417 return _ClearSpace_String_Base_<Tag<TExpand> const>::_clearSpace_(me, size, pos_begin, pos_end);
420 template<typename TValue, typename TPosition, typename TExpand>
422 _clearSpace(TValue * me,
430 return _ClearSpace_String_Base_<Tag<TExpand> const>::_clearSpace_(me, size, pos_begin, pos_end, limit);
433 //////////////////////////////////////////////////////////////////////////////
435 //////////////////////////////////////////////////////////////////////////////
437 ///.Function.assign.param.target.type:.Adaption.char array
438 ///.Function.assign.param.source.type:.Adaption.char array
440 //overload of binary version for strings:
442 template<typename TTargetValue, typename TSource>
444 assign(TTargetValue * target,
448 typedef TTargetValue * TTarget;
449 assign(target, source, typename DefaultOverflowImplicit<TTarget>::Type());
451 template<typename TTargetValue, typename TSource>
453 assign(TTargetValue * target,
454 TSource const & source)
457 typedef TTargetValue * TTarget;
458 assign(target, source, typename DefaultOverflowImplicit<TTarget>::Type());
461 //____________________________________________________________________________
463 template<typename TTargetValue, typename TSource, typename TExpand>
465 assign(TTargetValue * target,
466 TSource const & source,
470 _Assign_String<Tag<TExpand> const>::assign_(target, source);
473 template<typename TTargetValue, typename TSource, typename TExpand>
475 assign(TTargetValue * target,
476 TSource const & source,
481 _Assign_String<Tag<TExpand> const>::assign_(target, source, limit);
484 //____________________________________________________________________________
485 //this variant is a workaround for the "const array"-bug of VC++
487 template<typename TTargetValue, typename TSourceValue, typename TExpand>
489 assign(TTargetValue * target,
490 TSourceValue const * source,
494 _Assign_String<Tag<TExpand> const>::assign_(target, source);
497 template<typename TTargetValue, typename TSourceValue, typename TExpand>
499 assign(TTargetValue * target,
500 TSourceValue const * source,
505 _Assign_String<Tag<TExpand> const>::assign_(target, source, limit);
508 //////////////////////////////////////////////////////////////////////////////
510 //////////////////////////////////////////////////////////////////////////////
512 //overload of binary version for strings:
514 template<typename TTargetValue, typename TSource>
516 move(TTargetValue * & target,
522 template<typename TTargetValue, typename TSource>
524 move(TTargetValue * & target,
525 TSource const & source)
532 //////////////////////////////////////////////////////////////////////////////
534 //////////////////////////////////////////////////////////////////////////////
536 ///.Function.append.param.target.type:.Adaption.char array
537 ///.Function.append.param.source.type:.Adaption.char array
539 template<typename TTargetValue, typename TSource, typename TExpand>
541 append(TTargetValue * target,
542 TSource const & source,
546 _Append_String<Tag<TExpand> const>::append_(target, source);
549 template<typename TTargetValue, typename TSource, typename TExpand>
551 append(TTargetValue * target,
552 TSource const & source,
557 _Append_String<Tag<TExpand> const>::append_(target, source, limit);
560 //____________________________________________________________________________
561 //this variant is a workaround for the "const array"-bug of VC++
563 template<typename TTargetValue, typename TSourceValue, typename TExpand>
565 append(TTargetValue * target,
566 TSourceValue const * source,
570 _Append_String<Tag<TExpand> const>::append_(target, source);
573 template<typename TTargetValue, typename TSourceValue, typename TExpand>
575 append(TTargetValue * target,
576 TSourceValue const * source,
581 _Append_String<Tag<TExpand> const>::append_(target, source, limit);
584 //////////////////////////////////////////////////////////////////////////////
586 //////////////////////////////////////////////////////////////////////////////
588 ///.Function.replace.param.target.type:.Adaption.char array
589 ///.Function.replace.param.source.type:.Adaption.char array
591 template<typename TTargetValue, typename TSource, typename TExpand>
593 replace(TTargetValue * target,
596 TSource const & source,
600 _Replace_String<Tag<TExpand> const>::replace_(target, pos_begin, pos_end, source);
603 template<typename TTargetValue, typename TSource, typename TExpand>
605 replace(TTargetValue * target,
608 TSource const & source,
613 _Replace_String<Tag<TExpand> const>::replace_(target, pos_begin, pos_end, source, limit);
615 //____________________________________________________________________________
616 //this variant is a workaround for the "const array"-bug of VC++
618 template<typename TTargetValue, typename TSourceValue, typename TExpand>
620 replace(TTargetValue * target,
623 TSourceValue const * source,
627 _Replace_String<Tag<TExpand> const>::replace_(target, pos_begin, pos_end, source);
630 template<typename TTargetValue, typename TSourceValue, typename TExpand>
632 replace(TTargetValue * target,
635 TSourceValue const * source,
640 _Replace_String<Tag<TExpand> const>::replace_(target, pos_begin, pos_end, source, limit);
643 //////////////////////////////////////////////////////////////////////////////
644 // handling of iterators as begin and and
646 template<typename TTargetValue, typename TSource, typename TExpand>
648 replace(TTargetValue * target,
649 typename Iterator<TTargetValue *, Rooted>::Type pos_begin,
650 typename Iterator<TTargetValue *, Rooted>::Type pos_end,
651 TSource const & source,
652 Tag<TExpand> const tag)
654 replace(target, position(pos_begin), position(pos_end), source, tag);
656 template<typename TTargetValue, typename TSource, typename TExpand>
658 replace(TTargetValue * target,
659 typename Iterator<TTargetValue *, Rooted>::Type pos_begin,
660 typename Iterator<TTargetValue *, Rooted>::Type pos_end,
661 TSource const & source,
663 Tag<TExpand> const tag)
665 replace(target, position(pos_begin), position(pos_end), source, limit, tag);
668 //////////////////////////////////////////////////////////////////////////////
669 ///.Function.resize.param.object.type:Adaption.char array
671 template <typename TValue, typename TExpand>
676 Tag<TExpand> const &)
679 return _Resize_String<Tag<TExpand> const>::resize_(me, new_length);
682 //////////////////////////////////////////////////////////////////////////////
683 ///.Function.fill.param.object.type:Adaption.char array
685 template <typename TValue, typename TExpand>
691 Tag<TExpand> const &)
694 return _Fill_String<Tag<TExpand> const>::fill_(me, new_length, val);
697 //////////////////////////////////////////////////////////////////////////////
698 //PROBLEM: ambiguitiy "pointer/iterator" and "c-style string"
699 //workaround: disable all operators
701 template <typename TLeftValue, typename TRight >
703 operator += (TLeftValue * left,
704 TRight const & right)
711 //////////////////////////////////////////////////////////////////////////////
713 template <typename TLeftValue, typename TRight >
715 isEqual(TLeftValue * left,
716 TRight const & right)
719 typename Comparator<TLeftValue *>::Type _lex(left, right);
720 return isEqual(_lex);
723 template <typename TLeftValue, typename TRight >
725 operator == (TLeftValue * left,
726 TRight const & right)
729 typename Comparator<TLeftValue *>::Type _lex(left, right);
730 return isEqual(_lex);
733 //////////////////////////////////////////////////////////////////////////////
735 template <typename TLeftValue, typename TRight >
737 isNotEqual(TLeftValue * left,
738 TRight const & right)
741 typename Comparator<TLeftValue *>::Type _lex(left, right);
742 return isNotEqual(_lex);
745 template <typename TLeftValue, typename TRight >
747 operator != (TLeftValue * left,
748 TRight const & right)
751 typename Comparator<TLeftValue *>::Type _lex(left, right);
752 return isNotEqual(_lex);
756 //////////////////////////////////////////////////////////////////////////////
758 template <typename TLeftValue, typename TRight>
760 isLess(TLeftValue * left,
761 TRight const & right)
764 return isLess(left, right, typename DefaultPrefixOrder<TLeftValue *>::Type());
767 template <typename TLeftValue, typename TRight>
769 operator < (TLeftValue * left,
770 TRight const & right)
773 return isLess(left, right, typename DefaultPrefixOrder<TLeftValue *>::Type());
776 //////////////////////////////////////////////////////////////////////////////
778 template <typename TLeftValue, typename TRight>
780 isLessOrEqual(TLeftValue * left,
781 TRight const & right)
784 return isLessOrEqual(left, right, typename DefaultPrefixOrder<TLeftValue *>::Type());
787 template <typename TLeftValue, typename TRight>
789 operator <= (TLeftValue * left,
790 TRight const & right)
793 return isLessOrEqual(left, right, typename DefaultPrefixOrder<TLeftValue *>::Type());
796 //////////////////////////////////////////////////////////////////////////////
798 template <typename TLeftValue, typename TRight>
800 isGreater(TLeftValue * left,
801 TRight const & right)
804 return isGreater(left, right, typename DefaultPrefixOrder<TLeftValue *>::Type());
807 template <typename TLeftValue, typename TRight>
809 operator > (TLeftValue * left,
810 TRight const & right)
813 return isGreater(left, right, typename DefaultPrefixOrder<TLeftValue *>::Type());
816 //////////////////////////////////////////////////////////////////////////////
818 template <typename TLeftValue, typename TRight>
820 isGreaterOrEqual(TLeftValue * left,
821 TRight const & right)
824 return isGreaterOrEqual(left, right, typename DefaultPrefixOrder<TLeftValue *>::Type());
827 template <typename TLeftValue, typename TRight>
829 operator >= (TLeftValue * left,
830 TRight const & right)
833 return isGreaterOrEqual(left, right, typename DefaultPrefixOrder<TLeftValue *>::Type());
836 //////////////////////////////////////////////////////////////////////////////
838 } //namespace SEQAN_NAMESPACE_MAIN
840 //____________________________________________________________________________
842 #endif //#ifndef SEQAN_HEADER_...