/* */ #include "LongestSequencePieceSelector.h" #include "bitfield.h" namespace aria2 { namespace { size_t getStartIndex(size_t from, const unsigned char* bitfield, size_t nbits) { while (from < nbits && !bitfield::test(bitfield, nbits, from)) { ++from; } if (nbits <= from) { return nbits; } else { return from; } } } // namespace namespace { size_t getEndIndex(size_t from, const unsigned char* bitfield, size_t nbits) { while (from < nbits && bitfield::test(bitfield, nbits, from)) { ++from; } return from; } } // namespace bool LongestSequencePieceSelector::select(size_t& index, const unsigned char* bitfield, size_t nbits) const { size_t mstartindex = 0; size_t mendindex = 0; size_t nextIndex = 0; while (nextIndex < nbits) { size_t startindex = getStartIndex(nextIndex, bitfield, nbits); if (startindex == nbits) { break; } size_t endindex = getEndIndex(startindex, bitfield, nbits); if (mendindex - mstartindex < endindex - startindex) { mstartindex = startindex; mendindex = endindex; } nextIndex = endindex; } if (mendindex - mstartindex > 0) { index = mendindex - 1; return true; } else { return false; } } } // namespace aria2