Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

I/O Stream-State Saver Library

Boost , ,

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Header <boost/io/ios_state.hpp >

Заголовокboost/io/ios_state.hppохватывает сохранение состояния потока объектов в системе C++ IOStreams.

Contents

  1. Содержание
  2. Обоснование
  3. Заголовок Синопсис
  4. Сбережения для базовых стандартных атрибутов
  5. Сбережения для расширенных стандартных атрибутов
  6. Сберегатели для пользовательских атрибутов
  7. Сберегатели для комбинированных атрибутов
  8. Пример
  9. Ссылки
  10. Кредиты

Rationale

Иногда определенное значение должно меняться только в ограниченном объеме. Защитные классы сохраняют копию текущего состояния какого-либо объекта (или аспекта объекта) и сбрасывают состояние объекта во время разрушения, отменяя любые изменения, через которые объект мог пройти.

Стратегия класса сохранения полезна при использовании потоковых объектов ввода/вывода. Объекты-манипуляторы могут изменять некоторый аспект потока во время ввода или вывода. Состояние, измененное манипулятором, обычно прилипает к его новой стоимости после транзакции ввода-вывода. Это может быть проблемой, если манипуляторы используются в функции, которая не должна внешне изменять состояние потока.

#include <ostream>
#include <ios>
void  hex_my_byte( std::ostream &os, char byte )
{
    os << std::hex << static_cast<unsigned>(byte);
}

Потокosсохранит свой новый шестидесятичный режим печати после призыва к<hex_my_byte>. Режим печати потока может быть сохранен и восстановлен с помощью ручных вызовов в состояние потока, инспектирующего и мутирующего функции члена. Ручной метод становится громоздким, если основная функциональность является сложной и/или должна быть безопасной. Класс сохранения может реализовать лучшую стратегию "приобретение ресурсов - инициализация".

См.примерниже для лучшего кода, используя классы сохранения.

Header Synopsis

#include <iosfwd>  // for std::char_traits (declaration)
namespace boost
{
namespace io
{
class ios_flags_saver;
class ios_precision_saver;
class ios_width_saver;
class ios_base_all_saver;
template < typename Ch, class Tr = ::std::char_traits<Ch> >
    class basic_ios_iostate_saver;
template < typename Ch, class Tr = ::std::char_traits<Ch> >
    class basic_ios_exception_saver;
template < typename Ch, class Tr = ::std::char_traits<Ch> >
    class basic_ios_tie_saver;
template < typename Ch, class Tr = ::std::char_traits<Ch> >
    class basic_ios_rdbuf_saver;
template < typename Ch, class Tr = ::std::char_traits<Ch> >
    class basic_ios_fill_saver;
template < typename Ch, class Tr = ::std::char_traits<Ch> >
    class basic_ios_locale_saver;
template < typename Ch, class Tr = ::std::char_traits<Ch> >
    class basic_ios_all_saver;
typedef basic_ios_iostate_saver<char>        ios_iostate_saver;
typedef basic_ios_iostate_saver<wchar_t>    wios_iostate_saver;
typedef basic_ios_exception_saver<char>      ios_exception_saver;
typedef basic_ios_exception_saver<wchar_t>  wios_exception_saver;
typedef basic_ios_tie_saver<char>            ios_tie_saver;
typedef basic_ios_tie_saver<wchar_t>        wios_tie_saver;
typedef basic_ios_rdbuf_saver<char>          ios_rdbuf_saver;
typedef basic_ios_rdbuf_saver<wchar_t>      wios_rdbuf_saver;
typedef basic_ios_fill_saver<char>           ios_fill_saver;
typedef basic_ios_fill_saver<wchar_t>       wios_fill_saver;
typedef basic_ios_locale_saver<char>         ios_locale_saver;
typedef basic_ios_locale_saver<wchar_t>     wios_locale_saver;
typedef basic_ios_all_saver<char>            ios_all_saver;
typedef basic_ios_all_saver<wchar_t>        wios_all_saver;
class ios_iword_saver;
class ios_pword_saver;
class ios_all_word_saver;
}
}

Savers for Basic Standard Attributes

Основные классы накопителей имеют такой формат:

class saver_class
{
    typedef std::ios_base           state_type;
    typedef implementation_defined  aspect_type;
    explicit  saver_class( state_type &s );
              saver_class( state_type &s, aspect_type const &new_value );
             ~saver_class();
    void  restore();
};

state_type— базовый класс IOStreams<std::ios_base>. Пользователь обычно размещает фактический объект ввода, вывода или комбинированного потока для параметра типа состояния, а не объект базового класса. Первый конструктор берет объект потока и сохраняет ссылку на поток и текущее значение конкретного атрибута потока. Второй конструктор работает так же, как первый, и использует свой второй аргумент, чтобы изменить атрибут потока на новое значениеaspect_type. Деструктор восстанавливает атрибут потока к сохраненному значению. Восстановление может быть активировано рано (и часто) с функцией<restore>.

Basic IOStreams State Saver Classes
Class Saved Attribute Attribute Type Reading Method Writing Method
<boost::io::ios_flags_saver> Флаги управления форматом <std::ios_base::fmtflags> <flags> <flags>
<boost::io::ios_precision_saver> Число цифр для печати после десятичной точки <std::streamsize> <precision> <precision>
<boost::io::ios_width_saver> Минимальная ширина поля для печати объектов <std::streamsize> <width> <width>

Savers for Advanced Standard Attributes

Шаблоны класса Saver имеют такой формат:

template < typename Ch, class Tr >
class saver_class
{
    typedef std::basic_ios<Ch, Tr>  state_type;
    typedef implementation_defined  aspect_type;
    explicit  saver_class( state_type &s );
              saver_class( state_type &s, aspect_type const &new_value );
             ~saver_class();
    void  restore();
};

state_typeявляется версией шаблона базового класса IOStreams<std::basic_ios<Ch, Tr>>, где<Ch>является типом персонажа и<Tr>является классом признаков персонажа. Пользователь обычно размещает фактический объект ввода, вывода или комбинированного потока для параметра типа состояния, а не объект базового класса. Первый конструктор берет объект потока и сохраняет ссылку на поток и текущее значение конкретного атрибута потока. Второй конструктор работает так же, как первый, и использует свой второй аргумент, чтобы изменить атрибут потока на новое значениеaspect_type. Деструктор восстанавливает атрибут потока к сохраненному значению. Восстановление может быть активировано рано (и часто) с помощью функции<restore>.

Advanced IOStreams State Saver Class Templates
Class Template Saved Attribute Attribute Type Reading Method Writing Method
<boost::io::basic_ios_iostate_saver<Ch, Tr>> Неисправность потока, <std::ios_base::iostate> <rdstate> <clear>
<boost::io::basic_ios_exception_saver<Ch, Tr>> В каких случаях возникает исключение <std::ios_base::iostate> <exceptions> <exceptions>
<boost::io::basic_ios_tie_saver<Ch, Tr>> Выходной поток синхронизирован с потоком <std::basic_ostream<Ch, Tr> *> <tie> <tie>
<boost::io::basic_ios_rdbuf_saver<Ch, Tr>> Буфер потока, связанный с потоком <std::basic_streambuf<Ch, Tr> *> <rdbuf> <rdbuf>
<boost::io::basic_ios_fill_saver<Ch, Tr>> Характер, используемый для прокладки негабаритной ширины поля <Ch> <fill> <fill>
<boost::io::basic_ios_locale_saver<Ch, Tr>> Локальная информация, связанная с потоком <std::locale> <getloc>(от<std::ios_base>) <imbue>(от<std::basic_ios<Ch, Tr>>)

Notes

  1. Когда флаги государств-неудачников и/или флаги государств-неудачников, наблюдающие за флагами, меняются, исключение бросается, если совпадение происходит между двумя наборами флагов. Это может означать, чтоконструктор или разрушитель этих шаблонов классов может бросить.
  2. Когда соответствующий буфер потока изменяется, набор состояния отказа потока сбрасывается на "good", если адрес данного буфера потока не является NULL, но состояние отказа "bad" устанавливается, если этот адрес является NULL. Это означает, что сохраненное состояние отказа "good" может быть восстановлено как "bad", если поток лишен связанного буфера потока. Хуже того, учитывая буферный адрес NULL потока, исключение бросается, если за состоянием отказа наблюдают. Это может означать, чтоконструктор или разрушитель этих шаблонов классов может бросить.
  3. Сохранительиспользует классstd::basic_ios<Ch, Tr>для извлечения информации, хотя он мог использовать функциональность вstd::ios_base. Проблема в том, что версии необходимых функций вios_baseне полиморфно связаны с теми, что вbasic_ios. Классы потоков, которые будут использоваться с классами сохранения, должны использовать версии функций-членов, наиболее близких к ним по наследству, что означает те, которые находятся вbasic_ios.

Savers for User-Defined Attributes

Классы сохранения для определяемой пользователем информации форматирования имеют этот формат:

#include <iosfwd>  // for std::ios_base (declaration)
class saver_class
{
    typedef std::ios_base           state_type;
    typedef int                     index_type;
    typedef implementation_defined  aspect_type;
    explicit  saver_class( state_type &s, index_type i );
              saver_class( state_type &s, index_type i, aspect_type const &new_value );
             ~saver_class();
    void  restore();
};

Индексiразличает определенные пользовательские атрибуты форматирования. Индекс может быть определен только во время выполнения (скорее всего, со статической функцией<std::ios_base::xalloc>).

state_type— базовый класс системы IOStreams,<std::ios_base>. Пользователь обычно размещает фактический объект ввода, вывода или комбинированного потока для параметра типа состояния, а не объект базового класса. Первый конструктор берет объект потока и индексирует и сохраняет ссылку на поток и текущее значение конкретного атрибута потока. Второй конструктор работает так же, как первый, и использует свой третий аргумент, чтобы изменить атрибут потока на новое значениеaspect_type. Деструктор восстанавливает атрибут потока к сохраненному значению. Восстановление может быть активировано рано (и часто) с функцией<restore>члена.

IOStream User-Defined State Saver Classes
Class Saved Attribute Attribute Type Reference Method
<boost::io::ios_iword_saver> Флаг определяемого пользователем формата <long> <iword>
<boost::io::ios_pword_saver> Флаг пользовательского формата Pointer <void *> <pword>

Savers for Combined Attributes

Существует три класса (шаблоны) для комбинированных вкладчиков атрибутов. Класс сохранения<boost:io::ios_base_all_saver>сочетает в себе функциональность всех основных классов сохранения атрибутов. У него есть конструктор, который берет поток, чтобы сохранить его состояние.<boost::io::basic_ios_all_saver>сочетает в себе функциональность всех расширенных шаблонов класса сохранения атрибутов и комбинированного базового класса сохранения атрибутов. У него есть конструктор, который берет поток, чтобы сохранить его состояние. Класс сохранения<boost::io::ios_all_word_saver>объединяет классы сохранения, которые сохраняют определяемую пользователем информацию форматирования. Его конструктор берет поток, чтобы сохранить его атрибуты и индекс пользовательских атрибутов. Деструктор для каждого класса восстанавливает сохраненное состояние. Восстановление может быть активировано рано (и часто) для класса с функцией<restore>члена.

Example

Код, используемый вобосновании, может быть улучшен в двух местах. Функция печати может использовать хранитель вокруг кода, который изменяет состояние форматирования. Или функция вызова может окружать вызов с помощью заставки. Или и то, и другое можно сделать, особенно если пользователь не знает, использует ли функция печати средство сохранения состояния. Если пользователю нужна серия изменений back & out, без окружения каждого изменения в отдельном блоке, функция<restore>участника может быть вызвана между каждым испытанием.

#include <boost/io/ios_state.hpp>
#include <ios>
#include <iostream>
#include <ostream>
void  new_hex_my_byte( std::ostream &os, char byte )
{
    boost::io::ios_flags_saver  ifs( os );
    os << std::hex << static_cast<unsigned>(byte);
}
int  main()
{
    using std::cout;
    using std::cerr;
    //...
    {
        boost::io::ios_all_saver  ias( cout );
        new_hex_my_byte( cout, 'A' );
    }
    //...
    {
        boost::io::ios_all_saver  ias( cerr );
        new_hex_my_byte( cerr, 'b' );
        ias.restore();
        new_hex_my_byte( cerr, 'C' );
    }
    //...
}

References

  • Заголовок библиотеки сохранения состояния ввода/вывода:boost/io/ios_state.hpp
  • Некоторый тестовый/примерный код:ios_state_test.cpp

Credits

Contributors

Daryle Walker
Started the library. Contributed the initial versions of the format flags, precision, width, and user-defined format flags saver classes. Contributed the initial versions of the success state, success state exception flags, output stream tie, stream buffer, character fill, and locale saver class templates. Contributed the combined attribute classes and class template. Contributed the test file ios_state_test.cpp.

History

28 Feb 2005, Daryle Walker
Added the restore member functions, based on suggestions by Gennadiy Rozental and Rob Stewart
13 Mar 2002, Daryle Walker
Initial version

Пересмотренный: 28 февраля 2005 года

Авторское право 2002, 2005 Дэрил Уокер. Использование, модификация и распространение регулируются Лицензией на программное обеспечение Boost версии 1.0. (См. сопроводительный файлLICENSE_1_0.txtили копию по адресу<http://www.boost.org/LICENSE_1_0.txt>.)

Статья I/O Stream-State Saver Library раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:46:39/0.0084719657897949/0