...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
boost::date_time::period_formatter — Not a facet, but a class used to specify and control period formats.
template<typename CharT, typename OutItrT = std::ostreambuf_iterator<CharT, std::char_traits<CharT> > > class period_formatter { public: // types typedef std::basic_string< CharT > string_type; typedef CharT char_type; typedef std::basic_string< char_type >::const_iterator const_itr_type; typedef std::vector< std::basic_string< CharT > > collection_type; enum range_display_options { AS_OPEN_RANGE, AS_CLOSED_RANGE }; // construct/copy/destruct period_formatter(range_display_options = AS_CLOSED_RANGE, const char_type *const = default_period_separator, const char_type *const = default_period_start_delimeter, const char_type *const = default_period_open_range_end_delimeter, const char_type *const = default_period_closed_range_end_delimeter); // public member functions OutItrT put_period_separator(OutItrT &) const; OutItrT put_period_start_delimeter(OutItrT &) const; OutItrT put_period_end_delimeter(OutItrT &) const; range_display_options range_option() const; void range_option(range_display_options) const; void delimiter_strings(const string_type &, const string_type &, const string_type &, const string_type &) ; template<typename period_type, typename facet_type> OutItrT put_period(OutItrT, std::ios_base &, char_type, const period_type &, const facet_type &) const; static const char_type default_period_separator; static const char_type default_period_start_delimeter; static const char_type default_period_open_range_end_delimeter; static const char_type default_period_closed_range_end_delimeter; };
Provides settings for the following:
period_separator -- default '/'
period_open_start_delimeter -- default '['
period_open_range_end_delimeter -- default ')'
period_closed_range_end_delimeter -- default ']'
display_as_open_range, display_as_closed_range -- default closed_range
Thus the default formatting for a period is as follows:
[period.start()/period.last()] *
So for a typical date_period this would be
[2004-Jan-04/2004-Feb-01] *
where the date formatting is controlled by the date facet
period_formatter
public
construct/copy/destructperiod_formatter(range_display_options range_option_in = AS_CLOSED_RANGE, const char_type *const period_separator = default_period_separator, const char_type *const period_start_delimeter = default_period_start_delimeter, const char_type *const period_open_range_end_delimeter = default_period_open_range_end_delimeter, const char_type *const period_closed_range_end_delimeter = default_period_closed_range_end_delimeter);
period_formatter
public member functionsOutItrT put_period_separator(OutItrT & oitr) const;
OutItrT put_period_start_delimeter(OutItrT & oitr) const;
OutItrT put_period_end_delimeter(OutItrT & oitr) const;
range_display_options range_option() const;
void range_option(range_display_options option) const;
void delimiter_strings(const string_type & separator, const string_type & start_delim, const string_type & open_end_delim, const string_type & closed_end_delim) ;
template<typename period_type, typename facet_type> OutItrT put_period(OutItrT next, std::ios_base & a_ios, char_type a_fill, const period_type & p, const facet_type & facet) const;
This generic code will output any period using a facet to to output the 'elements'. For example, in the case of a date_period the elements will be instances of a date which will be formatted according the to setup in the passed facet parameter.
The steps for formatting a period are always the same:
put the start delimiter
put start element
put the separator
put either last or end element depending on range settings
put end delimeter depending on range settings
Thus for a typical date period the result might look like this:
[March 01, 2004/June 07, 2004] <-- closed range [March 01, 2004/June 08, 2004) <-- open range *