34 #if defined(SegmentComputerUtils_RECURSES)
35 #error Recursive header files inclusion detected in SegmentComputerUtils.h
36 #else // defined(SegmentComputerUtils_RECURSES)
38 #define SegmentComputerUtils_RECURSES
40 #if !defined SegmentComputerUtils_h
42 #define SegmentComputerUtils_h
45 #include "DGtal/base/Circulator.h"
70 template <
typename SC>
121 template<
typename IC>
131 unsigned int k = c/2;
149 template<
typename IC>
162 template <
typename SC>
165 while ( (s.end() != end)
166 && (s.extendForward()) ) {}
172 template <
typename SC>
176 const typename SC::ConstIterator newEnd( s.begin() );
177 while ( (s.extendForward())
178 && (s.end() != newEnd) ) {}
186 template <
typename SC>
196 template <
typename SC>
199 while ( (s.begin() != begin)
200 && (s.extendBackward()) ) {}
201 if (s.begin() == begin) s.extendBackward();
207 template <
typename SC>
210 const typename SC::ConstIterator newBegin( s.end() );
211 while ( (s.extendBackward())
212 && (s.begin() != newBegin) ) {}
221 template <
typename SC>
232 template <
typename SC>
234 const typename SC::ConstIterator& begin,
235 const typename SC::ConstIterator& end,
239 bool flagForward =
true;
245 if ( s.end() != end ) flagOk = s.extendForward();
249 if ( s.begin() != begin ) flagOk = s.extendBackward();
254 if (s.begin() != begin ) {
255 if (s.extendBackward())
return !s.extendForward();
266 template <
typename SC>
268 const typename SC::ConstIterator& begin,
269 const typename SC::ConstIterator& end,
273 bool flagForward =
true;
276 while ( (flagOk) && ( s.end() != s.begin() ) ) {
279 flagOk = s.extendForward();
282 flagOk = s.extendBackward();
297 template <
typename SC>
299 const typename SC::ConstIterator& begin,
300 const typename SC::ConstIterator& end) {
315 template <
typename SC>
318 if ( isNotEmpty<typename SC::ConstIterator>(s.end(),end) ) {
319 while ( (! s.isExtendableForward() )
320 &&(s.retractForward() ) ) {}
322 while ( s.retractForward() ) {}
333 template <
typename SC>
336 if ( isNotEmpty<typename SC::ConstIterator>(s.begin(),begin) ) {
337 while ( (! s.isExtendableBackward() )
338 &&(s.retractBackward() ) ) {}
340 while ( s.retractBackward() ) {}
351 template <
typename SC>
353 const typename SC::ConstIterator& i,
354 const typename SC::ConstIterator& end,
366 template <
typename SC>
368 const typename SC::ConstIterator& i,
369 const typename SC::ConstIterator& end,
383 template <
typename SC>
385 const typename SC::ConstIterator& i,
386 const typename SC::ConstIterator& end)
402 template <
typename SC>
404 const typename SC::ConstIterator& i,
405 const typename SC::ConstIterator& begin,
406 const typename SC::ConstIterator& end,
410 typedef typename SC::ConstIterator ConstIterator;
411 typedef typename SC::Reverse ReverseSegmentComputer;
412 typedef typename ReverseSegmentComputer::ConstIterator ConstReverseIterator;
414 if ( isNotEmpty<ConstIterator>(i,end) ) {
417 ConstIterator it( i ); ++it;
418 ConstReverseIterator rit( it );
419 ConstReverseIterator rend( begin );
420 ReverseSegmentComputer r( s.getReverse() );
424 ConstIterator it2( r.end().base() );
437 template <
typename SC>
439 const typename SC::ConstIterator& i,
440 const typename SC::ConstIterator& begin,
441 const typename SC::ConstIterator& end,
457 template <
typename SC>
459 const typename SC::ConstIterator& i,
460 const typename SC::ConstIterator& begin,
461 const typename SC::ConstIterator& end,
474 template <
typename SC>
476 const typename SC::ConstIterator& i,
477 const typename SC::ConstIterator& begin,
478 const typename SC::ConstIterator& end,
490 template <
typename SC>
492 const typename SC::ConstIterator& i,
493 const typename SC::ConstIterator& begin,
494 const typename SC::ConstIterator& end )
496 firstMaximalSegment<SC>(s, i, begin, end,
509 template <
typename SC>
511 const typename SC::ConstIterator& i,
512 const typename SC::ConstIterator& begin,
513 const typename SC::ConstIterator& end,
517 typedef typename SC::ConstIterator ConstIterator;
518 typedef typename SC::Reverse ReverseSegmentComputer;
519 typedef typename ReverseSegmentComputer::ConstIterator ConstReverseIterator;
528 ConstIterator k( s.begin() );
531 if ( isNotEmpty<ConstIterator>(s.end(),end) ) {
534 ConstIterator it( s.end() ); ++it;
535 ConstReverseIterator rit( it );
536 ConstReverseIterator rend( s.begin() );
537 ReverseSegmentComputer r( s.getReverse() );
539 ConstIterator newBegin = r.end().base();
540 ASSERT( newBegin != s.begin() );
565 template <
typename SC>
567 const typename SC::ConstIterator& i,
568 const typename SC::ConstIterator& begin,
569 const typename SC::ConstIterator& end,
599 template <
typename SC>
601 const typename SC::ConstIterator& i,
602 const typename SC::ConstIterator& begin,
603 const typename SC::ConstIterator& end,
616 template <
typename SC>
618 const typename SC::ConstIterator& i,
619 const typename SC::ConstIterator& begin,
620 const typename SC::ConstIterator& end,
632 template <
typename SC>
634 const typename SC::ConstIterator& i,
635 const typename SC::ConstIterator& begin,
636 const typename SC::ConstIterator& end )
638 mostCenteredMaximalSegment<SC>(s, i, begin, end,
651 template <
typename SC>
653 const typename SC::ConstIterator& i,
654 const typename SC::ConstIterator& begin,
655 const typename SC::ConstIterator& end,
659 typedef typename SC::ConstIterator ConstIterator;
660 typedef typename SC::Reverse ReverseSegmentComputer;
661 typedef typename ReverseSegmentComputer::ConstIterator ConstReverseIterator;
664 ConstIterator j( i );
668 ConstIterator it( s.end() );
669 ConstReverseIterator rit( it );
670 ConstReverseIterator rend( begin );
671 ReverseSegmentComputer r( s.getReverse() );
675 ConstIterator it2( r.end().base() );
685 template <
typename SC>
687 const typename SC::ConstIterator& i,
688 const typename SC::ConstIterator& begin,
689 const typename SC::ConstIterator& end,
705 template <
typename SC>
707 const typename SC::ConstIterator& i,
708 const typename SC::ConstIterator& begin,
709 const typename SC::ConstIterator& end,
722 template <
typename SC>
724 const typename SC::ConstIterator& i,
725 const typename SC::ConstIterator& begin,
726 const typename SC::ConstIterator& end,
738 template <
typename SC>
740 const typename SC::ConstIterator& i,
741 const typename SC::ConstIterator& begin,
742 const typename SC::ConstIterator& end )
744 lastMaximalSegment<SC>(s, i, begin, end,
758 template <
typename SC>
760 const typename SC::ConstIterator& end,
773 template <
typename SC>
775 const typename SC::ConstIterator& end,
787 template <
typename SC>
789 const typename SC::ConstIterator& end,
792 typedef typename SC::ConstIterator ConstIterator;
798 ConstIterator i( s.begin() ); ++i;
801 if ( i == s.end() ) {
802 if ( isNotEmpty<ConstIterator>(i, end) ) {
819 template <
typename SC>
821 const typename SC::ConstIterator& end,
833 template <
typename SC>
835 const typename SC::ConstIterator& end )
837 nextMaximalSegment<SC>(s, end,
851 template <
typename SC>
853 const typename SC::ConstIterator& begin,
856 if ( isNotEmpty<typename SC::ConstIterator>(s.begin(),begin) )
867 template <
typename SC>
869 const typename SC::ConstIterator& begin,
872 if ( isNotEmpty<typename SC::ConstIterator>(s.begin(),begin) )
882 template <
typename SC>
884 const typename SC::ConstIterator& begin,
888 typedef typename SC::ConstIterator ConstIterator;
894 ConstIterator i( s.end() ); --i;
897 if ( i == s.begin() ) {
898 if ( isNotEmpty<ConstIterator>(i, begin) ) {
916 template <
typename SC>
918 const typename SC::ConstIterator& end,
930 template <
typename SC>
932 const typename SC::ConstIterator& begin )
945 #endif // !defined SegmentComputerUtils_h
947 #undef SegmentComputerUtils_RECURSES
948 #endif // else defined(SegmentComputerUtils_RECURSES)