예제 #1
0
			void bps(uint64_t node, writer_type & bitout) const
			{
				bitout.writeBit(1);

				if ( CartesianTree<key_type>::getLeft(node) != CartesianTree<key_type>::n )
					bps(CartesianTree<key_type>::getLeft(node),bitout);

				if ( CartesianTree<key_type>::getRight(node) != CartesianTree<key_type>::n )
					bps(CartesianTree<key_type>::getRight(node),bitout);

				bitout.writeBit(0);
			}
예제 #2
0
파일: RLEncoder.hpp 프로젝트: dkj/libmaus2
			static void writeIndex(
				writer_type & writer,
				std::vector < IndexEntry > const & index,
				uint64_t const indexpos,
				uint64_t const numsyms)
			{
				uint64_t const maxpos = index.size() ? index[index.size()-1].pos : 0;
				unsigned int const posbits = ::libmaus2::math::bitsPerNum(maxpos);

				uint64_t const kacc = std::accumulate(index.begin(),index.end(),0ull,IndexEntryKeyAdd());
				unsigned int const kbits = ::libmaus2::math::bitsPerNum(kacc);

				uint64_t const vacc = std::accumulate(index.begin(),index.end(),0ull,IndexEntryValueAdd());
				unsigned int const vbits = ::libmaus2::math::bitsPerNum(vacc);

				// index size (number of blocks)
				writer.writeElias2(index.size());
				// write number of bits per file position
				writer.writeElias2(posbits);
				
				// write vbits
				writer.writeElias2(kbits);
				// write vacc
				writer.writeElias2(kacc);

				// write vbits
				writer.writeElias2(vbits);
				// write vacc
				writer.writeElias2(vacc);
				
				// align
				writer.flushBitStream();
				
				uint64_t tkacc = 0, tvacc = 0;
				// write index
				for ( uint64_t i = 0; i < index.size(); ++i )
				{
					writer.write(index[i].pos,posbits);

					writer.write(tkacc,kbits);
					tkacc += index[i].kcnt;

					writer.write(tvacc,vbits);
					tvacc += index[i].vcnt;
				}
				writer.write(0,posbits);
				writer.write(tkacc,kbits);
				writer.write(tvacc,vbits);
				writer.flushBitStream();
				
				assert ( numsyms == vacc );
				
				for ( uint64_t i = 0; i < 64; ++i )
					writer.writeBit( (indexpos & (1ull<<(63-i))) != 0 );
				writer.flushBitStream();
			}