bool getNextPatternUnlocked(pattern_type & pattern) { if ( keep_pairs && pairflag ) { pairflag = false; return Preader->getNextPatternUnlocked(pattern); } else { while ( true ) { uint64_t const z = rand16() % d; // RNG keep if ( z < c ) { bool const ok = Preader->getNextPatternUnlocked(pattern); if ( ok ) { if ( keep_pairs ) pairflag = true; return true; } else { // no more reads return false; } } // RNG drop else { uint64_t const skipcnt = keep_pairs ? 2 : 1; for ( uint64_t i = 0; i < skipcnt; ++i ) { bool const ok = Preader->getNextPatternUnlocked(pattern); if ( ! ok ) return false; } } } } }
bool getBuffer(std::pair < char const *, ssize_t > & data) { if ( ! (reader.get()) ) return false; if ( reader->getBuffer(data) ) return true; if ( ita != ite ) { while ( ++ita != ite ) { reader.reset(); reader = UNIQUE_PTR_MOVE(reader_ptr_type(new AsynchronousBufferReader(*ita,numbuffers,bufsize,0))); if ( reader->getBuffer(data) ) return true; } } return false; }
/** * return the last block obtained via getBuffer **/ void returnBuffer() { if ( reader.get() ) reader->returnBuffer(); }
/** * destructor **/ ~AsynchronousBufferReaderList() { if ( reader.get() ) reader->flush(); }