1 #ifndef RESIZE_ITER__HPP
2 #define RESIZE_ITER__HPP
53 template <
class TSeq,
class TOut =
int>
101 template <
class TSeq,
class TVal =
int>
161 template <
class TIterator>
168 template <
class TIterator,
class TOut>
170 size_t& bit_offset,
size_t bit_count)
174 const TOut kMask = (1 << bit_count) - 1;
175 static const TOut kMask2 = (1 << kBitsPerElement) - 1;
180 }
else if (bit_offset + bit_count <= kBitsPerElement) {
182 bit_offset += bit_count;
183 value = (*start >> (kBitsPerElement - bit_offset)) & kMask;
184 if (bit_offset == kBitsPerElement) {
190 value = *start & ((1 << (kBitsPerElement - bit_offset)) - 1);
192 for (bit_offset += bit_count - kBitsPerElement;
193 bit_offset >= kBitsPerElement;
194 bit_offset -= kBitsPerElement) {
195 value <<= kBitsPerElement;
197 value |= *start & kMask2;
202 value <<= bit_offset;
204 value |= ((*start >> (kBitsPerElement - bit_offset))
205 & ((1 << bit_offset) - 1));
213 template <
class TIterator,
class TVal,
class TElement>
215 size_t& bit_offset,
size_t bit_count,
216 TElement partial, TVal data)
218 static const size_t kBitsPerElement =
CHAR_BIT *
sizeof(TElement);
221 partial = (TElement)(partial &
222 (~(TElement)0) << (kBitsPerElement - bit_offset));
227 if (bit_offset + bit_count <= kBitsPerElement) {
229 bit_offset += bit_count;
230 partial = (TElement)(partial |
231 (data << (kBitsPerElement - bit_offset)));
232 if (bit_count == kBitsPerElement) {
233 *(start++) = partial;
239 *(start++) = (TElement)(partial |
240 ((data >> (bit_count + bit_offset - kBitsPerElement))
241 & ((1 << (kBitsPerElement - bit_offset)) - 1)) );
242 for (bit_offset += bit_count - kBitsPerElement;
243 bit_offset >= kBitsPerElement;
244 bit_offset -= kBitsPerElement) {
246 *(start++) = (TElement)(data >> (bit_offset - kBitsPerElement));
250 partial = (TElement)(data << (kBitsPerElement - bit_offset));
262 template <
class TSeq,
class TOut>
271 for (m_BitOffset += m_NewSize;
272 m_BitOffset >= kBitsPerElement && m_RawIterator != m_End;
273 m_BitOffset -= kBitsPerElement) {
277 m_ValueKnown =
false;
282 template <
class TSeq,
class TOut>
292 template <
class TSeq,
class TOut>
299 return m_Value = ExtractBits<TRawIterator, TOut>
300 (m_RawIterator, m_End, m_BitOffset, m_NewSize);
305 template <
class TSeq,
class TOut>
308 size_t avail = 0, goal = m_BitOffset + m_NewSize;
309 for (
TRawIterator it2 = m_RawIterator; it2 != m_End && avail < goal;
320 template <
class TSeq,
class TVal>
326 for (m_BitOffset += m_NewSize;
327 m_BitOffset >= kBitsPerElement && m_RawIterator != m_End;
328 m_BitOffset -= kBitsPerElement) {
335 template <
class TSeq,
class TVal>
345 template <
class TSeq,
class TVal>
350 size_t offset = m_BitOffset;
353 tmp = StoreBits<TRawIterator, TVal, TRawValue>
355 if (
offset > 0 && it != m_End) {
361 template <
class TSeq,
class TVal>
366 size_t offset = m_BitOffset;
368 return ExtractBits<TRawIterator, TVal>(it, m_End,
offset, m_NewSize);
372 template <
class TSeq,
class TVal>
375 size_t avail = 0, goal = m_BitOffset + m_NewSize;
376 for (
TRawIterator it2 = m_RawIterator; it2 != m_End && avail < goal;
Include a standard set of the NCBI C++ Toolkit most basic headers.
CResizingIterator(TSeq &s, size_t new_size)
TElement StoreBits(TIterator &start, const TIterator &end, size_t &bit_offset, size_t bit_count, TElement partial, TVal data)
size_t xx_BitsPerElement(const T *)
TSeq::const_iterator TRawIterator
size_t x_BitsPerElement(const TIterator &)
TOut ExtractBits(TIterator &start, const TIterator &end, size_t &bit_offset, size_t bit_count)
forward_iterator_tag iterator_category
TRawIterator m_RawIterator
TSeq::value_type TRawValue
void operator=(TVal value)
CConstResizingIterator(const TSeq &s, size_t new_size)
CConstResizingIterator(const TRawIterator &it, const TRawIterator &end, size_t new_size)
TRawIterator m_RawIterator
TSeq::value_type TRawValue
CResizingIterator< TSeq, TVal > & operator++()
CResizingIterator(const TRawIterator &start, const TRawIterator &end, size_t new_size)
CConstResizingIterator< TSeq, TOut > & operator++()
input_iterator_tag iterator_category
TSeq::iterator TRawIterator
CResizingIterator< TSeq, TVal > operator*()
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
vector< CSeq_align const * >::const_iterator TIterator
double value_type
The numeric datatype used by the parser.
void copy(Njn::Matrix< S > *matrix_, const Njn::Matrix< T > &matrix0_)