static std::pair<uint64_t,uint64_t> getParamPair(std::string const & filename, uint64_t const offset) { libmaus2::aio::InputStreamInstance istr(filename); istr.seekg ( offset, std::ios::beg ); uint64_t const b = deserializeNumber(istr); uint64_t const n = deserializeNumber(istr); return std::pair<uint64_t,uint64_t>(b,n); }
static std::pair<uint64_t,uint64_t> getParamPair(std::string const & filename, uint64_t const offset) { std::ifstream istr(filename.c_str(),std::ios::binary); assert ( istr.is_open() ); istr.seekg ( offset, std::ios::beg ); uint64_t const b = deserializeNumber(istr); uint64_t const n = deserializeNumber(istr); istr.close(); return std::pair<uint64_t,uint64_t>(b,n); }
libmaus2::util::Array864::Array864(std::istream & in) : n(deserializeNumber(in)), B(in), R(new ::libmaus2::rank::ERank222B(B.get(),B.size()*64)), A8(in), A64(in) { }
static unique_ptr_type concat( std::string const & filename, ::libmaus::autoarray::AutoArray<uint64_t> const & offsets, uint64_t const li, uint64_t const ri ) { unique_ptr_type ptr; if ( ri != li ) { assert ( ri > li ); uint64_t const b = getParamPair(filename,offsets[0]).first; uint64_t n = 0; for ( uint64_t i = li; i < ri; ++i ) { std::pair<uint64_t,uint64_t> const p = getParamPair(filename,offsets[i]); assert ( b == p.first ); n += p.second; } ptr = unique_ptr_type(new this_type(n,b)); uint64_t totalbits = 0; for ( uint64_t i = li; i < ri; ++i ) { std::ifstream istr(filename.c_str(),std::ios::binary); istr.seekg ( offsets[i], std::ios::beg ); assert ( istr.is_open() ); uint64_t const b = deserializeNumber(istr); uint64_t const n = deserializeNumber(istr); uint64_t const s = deserializeNumber(istr); uint64_t const as = deserializeNumber(istr); assert ( s == as ); uint64_t const blocksize = 16*1024; uint64_t wordsleft = (n*b+63)/64; ::libmaus::autoarray::AutoArray<uint64_t> B(blocksize,false); unsigned int const mod = totalbits % 64; unsigned int const mod64 = 64-mod; uint64_t * D = ptr->D + (totalbits/64); if ( !mod ) { while ( wordsleft ) { uint64_t const wordstoread = std::min(wordsleft,blocksize); uint64_t const bytestoread = wordstoread*sizeof(uint64_t); istr.read ( reinterpret_cast<char *>(B.get()), bytestoread ); assert ( istr ); assert ( istr.gcount() == static_cast<int64_t>(bytestoread) ); for ( uint64_t z = 0; z < wordstoread; ++z ) *(D++) = B[z]; wordsleft -= wordstoread; } } else { while ( wordsleft ) { uint64_t const wordstoread = std::min(wordsleft,blocksize); uint64_t const bytestoread = wordstoread*sizeof(uint64_t); istr.read ( reinterpret_cast<char *>(B.get()), bytestoread ); assert ( istr ); assert ( istr.gcount() == static_cast<int64_t>(bytestoread) ); for ( uint64_t z = 0; z < wordstoread; ++z ) { *(D++) |= (B[z] >> mod); *D |= B[z] << (mod64); } wordsleft -= wordstoread; } } istr.close(); totalbits += n*b; } }