BOOST C++: шаблоны для создания целочисленных масок

Шаблонный класс в заголовочном файле <boost/integer/integer_mask.hpp> позволяет получить битовые маски для определенного положения единичного бита либо для непрерывной группы битов определенной длины. Типы для создаваемых масок берутся из шаблонов, объявленнных в хидере integer type selection templates.

Содержание

Описание

Шаблон для создания однобитовой маски

Шаблон для создлания маски из группы битов

Пример

Демонстрационная программа

Обоснование

Благодарности

Описание

#include <cstddef>  // for std::size_t

namespace boost
{

template < std::size_t Bit >
struct high_bit_mask_t
{
    typedef implementation_supplied  least;
    typedef implementation_supplied   fast;

    static const least  high_bit = implementation_defined;
    static const fast   high_bit_fast = implementation_defined;

    static const std::size_t  bit_position = Bit;

};

template < std::size_t Bits >
struct low_bits_mask_t
{
    typedef implementation_supplied  least;
    typedef implementation_supplied   fast;

    static const least  sig_bits = implementation_defined;
    static const fast   sig_bits_fast = implementation_defined;

    static const std::size_t  bit_count = Bits;

};

// Specializations for low_bits_mask_t exist for certain bit counts.

}  // namespace boost

Шаблон для однобитовой маски

Шаблонный класс boost::high_bit_mask_t объявляет константы для масок, представляющих бит в заданной позиции. Эти маски соответствуют величине 2Bit, где Bit является параметром шаблона. Положение бита должно быть неотрицательной величиной от нуля до Max, где Max на 1 меньше числа битов, которые может хранить самый большой встроенный целый беззнаковый тип. Следующая таблица описывает члены шаблона high_bit_mask_t.

член класса значение
least самый маленький беззнаковый встроенный целый тип, который может хранить бит в указанной позиции
fast максимально эффективный аналог поля least

high_bit

Константа типа  least с созданной маской
high_bit_fast Аналог поля high_bit, но типа fast
bit_position Значение параметра шаблона для случаев, когда она нужна из переименованной конкретизации шаблона.

 

Шаблон для маски с группой битов

Шаблонный класс boost::low_bits_mask_t обеспечивает получение группы битов. Маски получаются как числа вида (2Bitss - 1), где Bits является параметром шаблона. Количество битов должно быть неотрицательным числом от 0 до Max,  где Max на 1 меньше числа битов, которые может хранить самый большой встроенный целый беззнаковый тип. Следующая таблица описывает члены шаблона low_bits_mask_t.

член класса значение
least самый маленький встроенный беззнаковый тип, поддерживающий хранение заданного количества битов.
fast самый эффективный аналог типа least.
sig_bits Константа типа least, хранящая созданную маску
sig_bits_fast Аналог константы sig_bits с типом fast
bit_count величина параметра шаблона, для случаев, когда она нужна в переименованной конкретизации шаблона.

Замечание: когда Bits в точности равна размеру встроенного беззнакового типа, реализацию необходимо корректировать для предотвращения неопределенного поведения. Поэтому есть специализация шаблона low_bits_mask_t для таких значений параметра шаблона.

Пример

#include <boost/integer/integer_mask.hpp>

//...

int main()
{
    typedef boost::high_bit_mask_t<29>  mask1_type;
    typedef boost::low_bits_mask_t<15>  mask2_type;

    mask1_type::least  my_var1;
    mask2_type::fast   my_var2;
    //...

    my_var1 |= mask1_type::high_bit;
    my_var2 &= mask2_type::sig_bits_fast;

    //...
}

Демонстрационная программа

Программа integer_mask_test.cpp является упрощенной демонстрацией использования шаблонов.

 

Обоснование

Данные шаблонные классы являются расширением для шаблонов выбора целого типа. Новые шаблонные классы обеспечивают те же типы заданного размера, но также создают удобные маски для выделения самого старшего из значащих битов в числе, содержащем множество единичных битов. Это может предотвратить загрязнение старших, неиспользуемых битов.

 

Благодарности

Автором шаблонов является Daryle Walker.


Revised September 23, 2001

© Copyright Daryle Walker 2001. Permission to copy, use, modify, sell and distribute this document is granted provided this copyright notice appears in all copies. This document is provided "as is" without express or implied warranty, and with no claim as to its suitability for any purpose.

Последняя правка: 12.05.2005

библиотека BOOST C++ http://www.boost.org
перевод Elijah Koziev www.solarix.ru

  © Mental Computing 2010