TuttleOFX
1
|
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 }