32struct IONGSMSChunkUnpackingCtx
34 static constexpr uint8_t word_bitsize_ =
sizeof(WT) * 8;
36 const GnssMetadata::Chunk::WordShift word_shift_direction_;
37 WT* iterator_ =
nullptr;
39 uint8_t bitshift_ = 0;
41 IONGSMSChunkUnpackingCtx(
42 const GnssMetadata::Chunk::WordShift word_shift,
44 uint8_t data_buffer_word_count) : word_shift_direction_(word_shift)
46 if (word_shift_direction_ == GnssMetadata::Chunk::Left)
48 iterator_ = data_buffer;
50 else if (word_shift_direction_ == GnssMetadata::Chunk::Right)
52 iterator_ = &data_buffer[data_buffer_word_count];
63 if (word_shift_direction_ == GnssMetadata::Chunk::Left)
67 else if (word_shift_direction_ == GnssMetadata::Chunk::Right)
75 void shift_current_word(uint8_t n)
77 if ((n % word_bitsize_) == 0)
79 for (uint8_t i = 0; i < (n / word_bitsize_); ++i)
86 if (word_shift_direction_ == GnssMetadata::Chunk::Left)
90 else if (word_shift_direction_ == GnssMetadata::Chunk::Right)
96 if (bitshift_ >= word_bitsize_)
99 bitshift_ -= word_bitsize_;
103 void shift_padding(uint8_t n_bits)
110 if ((n_bits + (bitshift_ % word_bitsize_)) >= word_bitsize_)
112 const uint8_t bits_shifted = word_bitsize_ - (bitshift_ % word_bitsize_);
114 shift_current_word(bits_shifted);
115 shift_padding(n_bits - bits_shifted);
119 shift_current_word(n_bits);
123 template <
typename OT>
124 void shift_sample(uint8_t sample_bitsize, OT* output, uint8_t output_bit_offset = 0)
126 if (sample_bitsize % word_bitsize_ == 0)
128 const uint8_t words_per_sample = sample_bitsize / word_bitsize_;
129 for (uint8_t i = 0; i < words_per_sample; ++i)
131 if (word_shift_direction_ == GnssMetadata::Chunk::Left)
133 *output |= (current_word_ << ((words_per_sample - 1 - i) * word_bitsize_));
135 else if (word_shift_direction_ == GnssMetadata::Chunk::Right)
137 *output |= (current_word_ << (i * word_bitsize_));
143 else if ((sample_bitsize + (bitshift_ % word_bitsize_)) > word_bitsize_)
145 const uint8_t bits_shifted = word_bitsize_ - (bitshift_ % word_bitsize_);
147 if (word_shift_direction_ == GnssMetadata::Chunk::Left)
149 WT mask = ~((1 << (word_bitsize_ - bits_shifted)) - 1);
150 *output |= ((current_word_ & mask) >> output_bit_offset);
152 else if (word_shift_direction_ == GnssMetadata::Chunk::Right)
154 WT mask = ((1 << (bits_shifted)) - 1);
155 *output |= (current_word_ & mask) << output_bit_offset;
159 shift_current_word(bits_shifted);
160 shift_sample(sample_bitsize - bits_shifted, output, bits_shifted);
164 if (word_shift_direction_ == GnssMetadata::Chunk::Left)
166 WT mask = ~((1 << (word_bitsize_ - sample_bitsize)) - 1);
167 OT sample = (current_word_ & mask) >> (word_bitsize_ - sample_bitsize);
168 *output |= (sample) >> output_bit_offset;
170 else if (word_shift_direction_ == GnssMetadata::Chunk::Right)
172 WT mask = ((1 << (sample_bitsize)) - 1);
173 *output |= (current_word_ & mask) << output_bit_offset;
177 shift_current_word(sample_bitsize);