~blep/cppunit2/cpptl-range-xp

« back to all changes in this revision

Viewing changes to include/cpptl/range.h

  • Committer: Teho
  • Date: 2009-08-11 19:04:35 UTC
  • Revision ID: teho@microtux-20090811190435-57xiqul1xinsbhcq
added startsWith and search trivial algorithm implementation

Show diffs side-by-side

added added

removed removed

Lines of Context:
360
360
# define CPPTL_ARRAY_RANGE( array ) \
361
361
   ::CppTL::Range::range( array, array + CPPTL_ARRAY_SIZE(array) )
362
362
 
 
363
/// Range for a zero terminated string with known size
 
364
/// \code 
 
365
/// const char hello[] = "hello";
 
366
/// CppTL::Range::Array<char> r = CPPTL_ZSTRING_RANGE( hello );
 
367
/// assert( r.length() == 5 ); // terminal '\0' not included in range
 
368
/// \endcode
 
369
# define CPPTL_ZSTRING_RANGE( string ) \
 
370
   ::CppTL::Range::vector( string, CPPTL_ARRAY_SIZE(string) - 1 )
 
371
 
 
372
   template<typename T>
 
373
   Array<T> vector( T *begin, size_type length )
 
374
   {
 
375
      return Array<T>( begin, begin + length );
 
376
   }
 
377
 
 
378
   template<typename T>
 
379
   Array<const T> vector( const T *begin, size_type length )
 
380
   {
 
381
      return Array<const T>( begin, begin + length );
 
382
   }
 
383
 
 
384
# if !defined(CPPTL_NO_DEDUCTIBLE_ARRAY_SIZE)
363
385
   // Not portable syntax, only supported by modern C++ compiler 
364
386
   template <typename T, std::size_t arrayLength>
365
387
   Array<T> all( T (&buffer)[arrayLength] )
366
388
   {
367
389
      return Array<T>( buffer, buffer + arrayLength );
368
390
   }
 
391
# endif // if !defined(CPPTL_NO_DEDUCTIBLE_ARRAY_SIZE)
369
392
 
370
393
   template<typename T>
371
394
   Array<T> range( T *begin, T *end )
433
456
 
434
457
   template<class SliceRange, typename Separator>
435
458
   Splitter<SliceRange, Separator>
436
 
      split( SliceRange range, Separator separator )
 
459
   split( SliceRange range, Separator separator )
437
460
   {
438
461
      return Splitter<SliceRange, Separator>( range, separator );
439
462
   }
440
463
 
 
464
   template<class InputRange, class PatternRange>
 
465
   bool
 
466
   startsWith( InputRange input, PatternRange pattern )
 
467
   {
 
468
      while ( !pattern.empty() )
 
469
      {
 
470
         if ( input.empty() )
 
471
            return false;
 
472
         if ( input.front() != pattern.front() )
 
473
            return false;
 
474
         
 
475
         input.popFront();
 
476
         pattern.popFront();
 
477
      }
 
478
      return true;
 
479
   }
 
480
 
 
481
   // Returns the input range starting with the first occurrence pattern found.
 
482
   template<class InputRange, class SearchRange>
 
483
   InputRange search( InputRange input, SearchRange pattern )
 
484
   {
 
485
      // Non optimized
 
486
      for ( ; ; input.popFront() )
 
487
      {
 
488
         bool found = startsWith( input, pattern );
 
489
         if ( found  ||  input.empty() )
 
490
         {
 
491
            break;
 
492
         }
 
493
      }
 
494
      return input;
 
495
   }
 
496
 
441
497
 
442
498
} } // namespace CppTL { namespace Range {
443
499