TuttleOFX  1
FileNumbers.cpp
Go to the documentation of this file.
00001 #include "FileNumbers.hpp"
00002 
00003 namespace sequenceParser {
00004 namespace detail {
00005 
00006 
00007 bool FileNumbers::SortByNumber::operator()( const FileNumbers& a, const FileNumbers& b ) const
00008 {
00009         // can't have multiple size, if multiple size they must have a
00010         // different SeqId
00011         BOOST_ASSERT( a._numbers.size() == b._numbers.size() );
00012         for( FileNumbers::Vec::const_iterator i = a._numbers.begin(), iEnd = a._numbers.end(), vi = b._numbers.begin(); i != iEnd; ++i, ++vi )
00013         {
00014                 if( i->first < vi->first )
00015                         return true;
00016                 else if( i->first > vi->first )
00017                         return false;
00018         }
00019         return false; // equals
00020 }
00021 
00022 bool FileNumbers::SortByPadding::operator()( const FileNumbers& a, const FileNumbers& b ) const
00023 {
00024         // can't have multiple size, if multiple size they must have a
00025         // different SeqId
00026         BOOST_ASSERT( a._numbers.size() == b._numbers.size() );
00027         for( FileNumbers::Vec::const_iterator i = a._numbers.begin(), iEnd = a._numbers.end(), vi = b._numbers.begin(); i != iEnd; ++i, ++vi )
00028         {
00029                 const std::size_t iPadding = extractPadding( i->second );
00030                 const std::size_t viPadding = extractPadding( vi->second );
00031                 if( iPadding < viPadding )
00032                         return true;
00033                 else if( iPadding > viPadding )
00034                         return false;
00035 
00036                 if( i->first < vi->first )
00037                         return true;
00038                 else if( i->first > vi->first )
00039                         return false;
00040         }
00041         return false; // equals
00042 }
00043 
00044 bool FileNumbers::SortByDigit::operator()( const FileNumbers& a, const FileNumbers& b ) const
00045 {
00046         // can't have multiple size, if multiple size they must have a
00047         // different SeqId
00048         BOOST_ASSERT( a._numbers.size() == b._numbers.size() );
00049         for( FileNumbers::Vec::const_iterator i = a._numbers.begin(), iEnd = a._numbers.end(), vi = b._numbers.begin(); i != iEnd; ++i, ++vi )
00050         {
00051                 const std::size_t iDigits = extractNbDigits( i->second );
00052                 const std::size_t viDigits = extractNbDigits( vi->second );
00053                 if( iDigits < viDigits )
00054                         return true;
00055                 else if( iDigits > viDigits )
00056                         return false;
00057 
00058                 if( i->first < vi->first )
00059                         return true;
00060                 else if( i->first > vi->first )
00061                         return false;
00062         }
00063         return false; // equals
00064 }
00065 
00066 std::ostream& operator<<(std::ostream& os, const FileNumbers& p)
00067 {
00068     os << "[";
00069     BOOST_FOREACH( const FileNumbers::Vec::value_type & v, p._numbers )
00070                 {
00071                     os << v.second << ",";
00072                 }
00073     os << "]";
00074     return os;
00075 }
00076 
00077 }
00078 }