|
|
@@ -909,10 +909,14 @@ normalize() {
|
|
|
*/
|
|
|
void BitArray::
|
|
|
write_datagram(BamWriter *manager, Datagram &dg) const {
|
|
|
- dg.add_uint32(_array.size());
|
|
|
- Array::const_iterator ai;
|
|
|
- for (ai = _array.begin(); ai != _array.end(); ++ai) {
|
|
|
- dg.add_uint32((*ai).get_word());
|
|
|
+ dg.add_uint32(_array.size() * (num_bits_per_word >> 5));
|
|
|
+
|
|
|
+ for (MaskType &item : _array) {
|
|
|
+ WordType word = item.get_word();
|
|
|
+ for (size_t i = 0; i < num_bits_per_word; i += 32) {
|
|
|
+ dg.add_uint32(word);
|
|
|
+ word >>= 32;
|
|
|
+ }
|
|
|
}
|
|
|
dg.add_uint8(_highest_bits);
|
|
|
}
|
|
|
@@ -922,10 +926,16 @@ write_datagram(BamWriter *manager, Datagram &dg) const {
|
|
|
*/
|
|
|
void BitArray::
|
|
|
read_datagram(DatagramIterator &scan, BamReader *manager) {
|
|
|
- size_t num_words = scan.get_uint32();
|
|
|
- _array = Array::empty_array(num_words);
|
|
|
- for (size_t i = 0; i < num_words; ++i) {
|
|
|
- _array[i] = WordType(scan.get_uint32());
|
|
|
+ size_t num_words32 = scan.get_uint32();
|
|
|
+ size_t num_bits = num_words32 << 5;
|
|
|
+
|
|
|
+ _array = Array::empty_array((num_bits + num_bits_per_word - 1) / num_bits_per_word);
|
|
|
+
|
|
|
+ for (size_t i = 0; i < num_bits; i += 32) {
|
|
|
+ int w = i / num_bits_per_word;
|
|
|
+ int b = i % num_bits_per_word;
|
|
|
+
|
|
|
+ _array[w].store(scan.get_uint32(), b, 32);
|
|
|
}
|
|
|
_highest_bits = scan.get_uint8();
|
|
|
}
|