|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r75577 - in trunk: boost/chrono/io libs/chrono/example
From: vicente.botet_at_[hidden]
Date: 2011-11-20 13:32:49
Author: viboes
Date: 2011-11-20 13:32:48 EST (Sun, 20 Nov 2011)
New Revision: 75577
URL: http://svn.boost.org/trac/boost/changeset/75577
Log:
Chrono: removed put functions in duration_units/time_point_units facets and the OutputIterator parameters
Text files modified:
trunk/boost/chrono/io/duration_put.hpp | 55 +++--
trunk/boost/chrono/io/duration_units.hpp | 370 ++++++++++++++-------------------------
trunk/boost/chrono/io/time_point_put.hpp | 69 +-----
trunk/boost/chrono/io/time_point_units.hpp | 88 --------
trunk/libs/chrono/example/french.cpp | 8
5 files changed, 197 insertions(+), 393 deletions(-)
Modified: trunk/boost/chrono/io/duration_put.hpp
==============================================================================
--- trunk/boost/chrono/io/duration_put.hpp (original)
+++ trunk/boost/chrono/io/duration_put.hpp 2011-11-20 13:32:48 EST (Sun, 20 Nov 2011)
@@ -42,6 +42,10 @@
*/
typedef CharT char_type;
/**
+ * Type of character string passed to member functions.
+ */
+ typedef std::basic_string<CharT> string_type;
+ /**
* Type of iterator used to write in the character buffer.
*/
typedef OutputIterator iter_type;
@@ -91,21 +95,21 @@
iter_type put(iter_type s, std::ios_base& ios, char_type fill, duration<Rep, Period> const& d, const CharT* pattern,
const CharT* pat_end) const
{
- if (std::has_facet<duration_units<CharT, OutputIterator> >(ios.getloc()))
+ if (std::has_facet<duration_units<CharT> >(ios.getloc()))
{
- duration_units<CharT, OutputIterator> const&facet = std::use_facet<duration_units<CharT, OutputIterator> >(
+ duration_units<CharT> const&facet = std::use_facet<duration_units<CharT> >(
ios.getloc());
return put(facet, s, ios, fill, d, pattern, pat_end);
}
else
{
- duration_units_default<CharT, OutputIterator> facet;
+ duration_units_default<CharT> facet;
return put(facet, s, ios, fill, d, pattern, pat_end);
}
}
template <typename Rep, typename Period>
- iter_type put(duration_units<CharT, OutputIterator> const& units_facet, iter_type s, std::ios_base& ios, char_type fill,
+ iter_type put(duration_units<CharT> const& units_facet, iter_type s, std::ios_base& ios, char_type fill,
duration<Rep, Period> const& d, const CharT* pattern, const CharT* pat_end) const
{
@@ -129,16 +133,9 @@
}
case 'u':
{
- s = put_unit(units_facet, s, ios, d);
+ s = put_unit(units_facet, s, ios, fill, d);
break;
}
- // case 'x':
- // {
- // std::basic_string<CharT> pat = units_facet.get_pattern();
- // pattern = pat.data();
- // pat_end = pattern + pat.size();
- // break;
- // }
default:
BOOST_ASSERT(false && "Boost::Chrono internal error.");
break;
@@ -165,16 +162,16 @@
template <typename Rep, typename Period>
iter_type put(iter_type s, std::ios_base& ios, char_type fill, duration<Rep, Period> const& d) const
{
- if (std::has_facet<duration_units<CharT, OutputIterator> >(ios.getloc()))
+ if (std::has_facet<duration_units<CharT> >(ios.getloc()))
{
- duration_units<CharT, OutputIterator> const&facet = std::use_facet<duration_units<CharT, OutputIterator> >(
+ duration_units<CharT> const&facet = std::use_facet<duration_units<CharT> >(
ios.getloc());
std::basic_string<CharT> str = facet.get_pattern();
return put(facet, s, ios, fill, d, str.data(), str.data() + str.size());
}
else
{
- duration_units_default<CharT, OutputIterator> facet;
+ duration_units_default<CharT> facet;
std::basic_string<CharT> str = facet.get_pattern();
return put(facet, s, ios, fill, d, str.data(), str.data() + str.size());
}
@@ -206,26 +203,38 @@
* @Returns An iterator pointing immediately after the last character produced.
*/
template <typename Rep, typename Period>
- iter_type put_unit(iter_type s, std::ios_base& ios, duration<Rep, Period> const& d) const
+ iter_type put_unit(iter_type s, std::ios_base& ios, char_type fill, duration<Rep, Period> const& d) const
{
- if (std::has_facet<duration_units<CharT, OutputIterator> >(ios.getloc()))
+ if (std::has_facet<duration_units<CharT> >(ios.getloc()))
{
- duration_units<CharT, OutputIterator> const&facet = std::use_facet<duration_units<CharT, OutputIterator> >(
+ duration_units<CharT> const&facet = std::use_facet<duration_units<CharT> >(
ios.getloc());
- return put_unit(facet, s, ios, d);
+ return put_unit(facet, s, ios, fill, d);
}
else
{
- duration_units_default<CharT, OutputIterator> facet;
- return put_unit(facet, s, ios, d);
+ duration_units_default<CharT> facet;
+ return put_unit(facet, s, ios, fill, d);
}
}
template <typename Rep, typename Period>
- iter_type put_unit(duration_units<CharT, OutputIterator> const& facet, iter_type s, std::ios_base& ios,
+ iter_type put_unit(duration_units<CharT> const& facet, iter_type s, std::ios_base& ios, char_type fill,
duration<Rep, Period> const& d) const
{
- return facet.put_unit(s, ios, d);
+ if (facet.template is_named_unit<Period>()) {
+ string_type str = facet.get_unit(get_duration_style(ios), d);
+ std::copy(str.begin(), str.end(), s);
+ } else {
+ *s++ = CharT('[');
+ std::use_facet<std::num_put<CharT, iter_type> >(ios.getloc()).put(s, ios, fill, Period::num);
+ *s++ = CharT('/');
+ std::use_facet<std::num_put<CharT, iter_type> >(ios.getloc()).put(s, ios, fill, Period::den);
+ *s++ = CharT(']');
+ string_type str = facet.get_n_d_unit(get_duration_style(ios), d);
+ std::copy(str.begin(), str.end(), s);
+ }
+ return s;
}
/**
Modified: trunk/boost/chrono/io/duration_units.hpp
==============================================================================
--- trunk/boost/chrono/io/duration_units.hpp (original)
+++ trunk/boost/chrono/io/duration_units.hpp 2011-11-20 13:32:48 EST (Sun, 20 Nov 2011)
@@ -135,7 +135,7 @@
* as the number of plural forms, the plural form associated to a duration,
* the text associated to a plural form and a duration's period,
*/
- template <typename CharT = char, class OutputIterator = std::ostreambuf_iterator<CharT> >
+ template <typename CharT = char>
class duration_units: public std::locale::facet
{
public:
@@ -147,10 +147,6 @@
* Type of character string passed to member functions.
*/
typedef std::basic_string<CharT> string_type;
- /**
- * Type of iterator used to scan the character buffer.
- */
- typedef OutputIterator iter_type;
static std::locale::id id;
@@ -159,59 +155,6 @@
{
}
- /**
- *
- * @tparam Rep
- * @tparam Period
- * @Requires Rep must be explicitly convertible to int_least64_t.
- * @Requires Period is named.
- *
- * @param s
- * @param ios
- * @param d
- * @Effects puts the unit associated to the duration @c d in @c s taken in account the @c ios state flags.
- * The implementation uses the non template virtual function do_put_unit as if
- * @code
- * return do_put_unit(s, ios, get_duration_style(ios), Period(), int_least64_t(d.count()));
- * @codeend
- *
- * where @get_duration_style gives the duration style associated to @ios.
- * @return s
- */
- template <typename Rep, typename Period>
- typename enable_if<detail::is_localizable<Period>, iter_type>::type put_unit(iter_type s, std::ios_base& ios,
- duration<Rep, Period> const& d) const
- {
- return do_put_unit(s, ios, get_duration_style(ios), Period(), int_least64_t(d.count()));
- }
-
- /**
- *
- * @tparam Rep
- * @tparam Period
- * @Requires Rep must be explicitly convertible to int_least64_t.
- * @Requires Period is not named, that is its textual representation is in the form [N/D].
- *
- * @param s
- * @param ios
- * @param d
- * @Effects puts the unit associated to the duration @c d in @c s taken in account the @c ios state flags.
- * The implementation uses the non template virtual function do_put_unit as if
- * @code
- * return do_put_unit(s, ios, get_duration_style(ios), rt_ratio(Period()), int_least64_t(d.count()));
- * @codeend
- *
- * where @get_duration_style gives the duration style associated to @ios and
- * rt_ratio is a class that flats the template ration on a run-time ration so we can use it in virtual functions.
- * @return s
- */
- template <typename Rep, typename Period>
- typename disable_if<detail::is_localizable<Period>, iter_type>::type put_unit(iter_type s, std::ios_base& ios,
- duration<Rep, Period> const& d) const
- {
- return do_put_unit(s, ios, get_duration_style(ios), rt_ratio(Period()), int_least64_t(d.count()));
- }
-
const string_type* get_n_d_prefix_units_start() const
{
return do_get_n_d_prefix_units_start();
@@ -247,6 +190,31 @@
{
return do_get_pattern();
}
+ /**
+ *
+ * @return the unit associated to this duration.
+ */
+ template <typename Rep, typename Period>
+ string_type get_unit(duration_style::type style, duration<Rep, Period> const& d) const
+ {
+ return do_get_unit(style, rt_ratio(Period()), d.count());
+ }
+ /**
+ *
+ * @return the unit associated to this duration.
+ */
+ template <typename Rep, typename Period>
+ string_type get_n_d_unit(duration_style::type style, duration<Rep, Period> const& d) const
+ {
+ return do_get_n_d_unit(style, rt_ratio(Period()), d.count());
+ }
+
+ template <typename Period>
+ bool is_named_unit() const
+ {
+ return do_is_named_unit(rt_ratio(Period()));
+ }
+
protected:
@@ -260,65 +228,27 @@
virtual const string_type* do_get_prefix_units_end() const = 0;
virtual bool do_match_n_d_prefix_unit(const string_type* k) const = 0;
virtual bool do_match_prefix_unit(const string_type* k, rt_ratio& rt) const = 0;
-
- // used for ouput
- virtual iter_type
- do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, atto, int_least64_t) const = 0;
- virtual iter_type
- do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, femto, int_least64_t) const = 0;
- virtual iter_type
- do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, pico, int_least64_t) const = 0;
- virtual iter_type
- do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, nano, int_least64_t) const = 0;
- virtual iter_type
- do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, micro, int_least64_t) const = 0;
- virtual iter_type
- do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, milli, int_least64_t) const = 0;
- virtual iter_type
- do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, centi, int_least64_t) const = 0;
- virtual iter_type
- do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, deci, int_least64_t) const = 0;
- virtual iter_type
- do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, ratio<1> , int_least64_t) const = 0;
- virtual iter_type
- do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, deca, int_least64_t) const = 0;
- virtual iter_type
- do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, hecto, int_least64_t) const = 0;
- virtual iter_type
- do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, kilo, int_least64_t) const = 0;
- virtual iter_type
- do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, mega, int_least64_t) const = 0;
- virtual iter_type
- do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, tera, int_least64_t) const = 0;
- virtual iter_type
- do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, peta, int_least64_t) const = 0;
- virtual iter_type
- do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, exa, int_least64_t) const = 0;
- virtual iter_type
- do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, rt_ratio, int_least64_t) const = 0;
- virtual iter_type
- do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, ratio<60> , int_least64_t) const = 0;
- virtual iter_type
- do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, ratio<3600> , int_least64_t) const = 0;
+ virtual string_type do_get_n_d_unit(duration_style::type style, rt_ratio rt, intmax_t v) const = 0;
+ virtual string_type do_get_unit(duration_style::type style,rt_ratio rt, intmax_t v) const = 0;
+ virtual bool do_is_named_unit(rt_ratio rt) const =0;
};
- template <typename CharT, class OutputIterator>
- std::locale::id duration_units<CharT, OutputIterator>::id;
+ template <typename CharT>
+ std::locale::id duration_units<CharT>::id;
// This class is used to define the strings for the default English
- template <typename CharT = char, class OutputIterator = std::ostreambuf_iterator<CharT> >
- class duration_units_default: public duration_units<CharT, OutputIterator>
+ template <typename CharT = char>
+ class duration_units_default: public duration_units<CharT>
{
static const std::size_t pfs_ = 2;
public:
typedef CharT char_type;
typedef std::basic_string<CharT> string_type;
- typedef OutputIterator iter_type;
explicit duration_units_default(size_t refs = 0) :
- duration_units<CharT, OutputIterator> (refs)
+ duration_units<CharT> (refs)
{
string_type* it = n_d_prefix_units_;
it = fill_units(it, ratio<1> ());
@@ -438,160 +368,134 @@
return n_d_prefix_units_ + (pfs_ + 1);
}
- virtual const string_type* do_get_prefix_units_start() const
+ const string_type* do_get_prefix_units_start() const
{
return prefix_units_;
}
- virtual const string_type* do_get_prefix_units_end() const
+ const string_type* do_get_prefix_units_end() const
{
return prefix_units_ + 19 * (pfs_ + 1);
}
- virtual std::size_t do_get_plural_forms() const
- {
- return pfs_;
- }
-
- virtual std::size_t do_get_plural_form(int_least64_t value) const
+ bool do_is_named_unit(rt_ratio rt) const
{
- return (value == -1 || value == 1) ? 0 : 1;
- }
-
- string_type do_get_pattern() const
- {
- static const CharT t[] =
- { '%', 'v', ' ', '%', 'u' };
- static const string_type pattern(t, t + sizeof (t) / sizeof (t[0]));
+ if (rt.num==1) {
+ switch (rt.den)
+ {
+ case BOOST_RATIO_INTMAX_C(1):
+ case BOOST_RATIO_INTMAX_C(10):
+ case BOOST_RATIO_INTMAX_C(100):
+ case BOOST_RATIO_INTMAX_C(1000):
+ case BOOST_RATIO_INTMAX_C(1000000):
+ case BOOST_RATIO_INTMAX_C(1000000000):
+ case BOOST_RATIO_INTMAX_C(1000000000000):
+ case BOOST_RATIO_INTMAX_C(1000000000000000):
+ case BOOST_RATIO_INTMAX_C(1000000000000000000):
+ return true;
+ default:
+ return false;
+ }
+ } else if (rt.den==1) {
+ switch (rt.num)
+ {
+ case BOOST_RATIO_INTMAX_C(10):
+ case BOOST_RATIO_INTMAX_C(60):
+ case BOOST_RATIO_INTMAX_C(100):
+ case BOOST_RATIO_INTMAX_C(1000):
+ case BOOST_RATIO_INTMAX_C(3600):
+ case BOOST_RATIO_INTMAX_C(1000000):
+ case BOOST_RATIO_INTMAX_C(1000000000):
+ case BOOST_RATIO_INTMAX_C(1000000000000):
+ case BOOST_RATIO_INTMAX_C(1000000000000000):
+ case BOOST_RATIO_INTMAX_C(1000000000000000000):
+ return true;
+ default:
+ return false;
+ }
+ }
+ return false;
- return pattern;
}
- iter_type do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, atto u, int_least64_t value) const
+ std::string do_get_n_d_unit(duration_style::type style, rt_ratio, intmax_t ) const
{
- string_type str = do_get_ratio_prefix(style, u);
- std::copy(str.begin(), str.end(), s);
- return do_put_unit(s, ios, style, ratio<1> (), value);
- }
- iter_type do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, femto u, int_least64_t value) const
- {
- string_type str = do_get_ratio_prefix(style, u);
- std::copy(str.begin(), str.end(), s);
- return do_put_unit(s, ios, style, ratio<1> (), value);
- }
- iter_type do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, pico u, int_least64_t value) const
- {
- string_type str = do_get_ratio_prefix(style, u);
- std::copy(str.begin(), str.end(), s);
- return do_put_unit(s, ios, style, ratio<1> (), value);
+ return do_get_plural_form(style, ratio<1>(), 1);
}
+ std::string do_get_unit(duration_style::type style, rt_ratio rt, intmax_t v) const
+ {
+ if (rt.num==1) {
+ switch (rt.den)
+ {
+ case BOOST_RATIO_INTMAX_C(1):
+ return do_get_plural_form(style, ratio<1>(), do_get_plural_form(v));
+ case BOOST_RATIO_INTMAX_C(10):
+ return do_get_plural_form(style, deci(), do_get_plural_form(v));
+ case BOOST_RATIO_INTMAX_C(100):
+ return do_get_plural_form(style, centi(), do_get_plural_form(v));
+ case BOOST_RATIO_INTMAX_C(1000):
+ return do_get_plural_form(style, milli(), do_get_plural_form(v));
+ case BOOST_RATIO_INTMAX_C(1000000):
+ return do_get_plural_form(style, micro(), do_get_plural_form(v));
+ case BOOST_RATIO_INTMAX_C(1000000000):
+ return do_get_plural_form(style, nano(), do_get_plural_form(v));
+ case BOOST_RATIO_INTMAX_C(1000000000000):
+ return do_get_plural_form(style, pico(), do_get_plural_form(v));
+ case BOOST_RATIO_INTMAX_C(1000000000000000):
+ return do_get_plural_form(style, femto(), do_get_plural_form(v));
+ case BOOST_RATIO_INTMAX_C(1000000000000000000):
+ return do_get_plural_form(style, atto(), do_get_plural_form(v));
+ default:
+ ;
+ }
+ } else if (rt.den==1) {
+ switch (rt.num)
+ {
+ case BOOST_RATIO_INTMAX_C(10):
+ return do_get_plural_form(style, deca(), do_get_plural_form(v));
+ case BOOST_RATIO_INTMAX_C(60):
+ return do_get_plural_form(style, ratio<60>(), do_get_plural_form(v));
+ case BOOST_RATIO_INTMAX_C(100):
+ return do_get_plural_form(style, hecto(), do_get_plural_form(v));
+ case BOOST_RATIO_INTMAX_C(1000):
+ return do_get_plural_form(style, kilo(), do_get_plural_form(v));
+ case BOOST_RATIO_INTMAX_C(3600):
+ return do_get_plural_form(style, ratio<3600>(), do_get_plural_form(v));
+ case BOOST_RATIO_INTMAX_C(1000000):
+ return do_get_plural_form(style, mega(), do_get_plural_form(v));
+ case BOOST_RATIO_INTMAX_C(1000000000):
+ return do_get_plural_form(style, giga(), do_get_plural_form(v));
+ case BOOST_RATIO_INTMAX_C(1000000000000):
+ return do_get_plural_form(style, tera(), do_get_plural_form(v));
+ case BOOST_RATIO_INTMAX_C(1000000000000000):
+ return do_get_plural_form(style, peta(), do_get_plural_form(v));
+ case BOOST_RATIO_INTMAX_C(1000000000000000000):
+ return do_get_plural_form(style, exa(), do_get_plural_form(v));
+ default:
+ ;
+ }
+ }
- iter_type do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, nano u, int_least64_t value) const
- {
- string_type str = do_get_ratio_prefix(style, u);
- std::copy(str.begin(), str.end(), s);
- return do_put_unit(s, ios, style, ratio<1> (), value);
- }
- iter_type do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, micro u, int_least64_t value) const
- {
- string_type str = do_get_ratio_prefix(style, u);
- std::copy(str.begin(), str.end(), s);
- return do_put_unit(s, ios, style, ratio<1> (), value);
- }
- iter_type do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, milli u, int_least64_t value) const
- {
- string_type str = do_get_ratio_prefix(style, u);
- std::copy(str.begin(), str.end(), s);
- return do_put_unit(s, ios, style, ratio<1> (), value);
- }
- iter_type do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, centi u, int_least64_t value) const
- {
- string_type str = do_get_ratio_prefix(style, u);
- std::copy(str.begin(), str.end(), s);
- return do_put_unit(s, ios, style, ratio<1> (), value);
- }
- iter_type do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, deci u, int_least64_t value) const
- {
- string_type str = do_get_ratio_prefix(style, u);
- std::copy(str.begin(), str.end(), s);
- return do_put_unit(s, ios, style, ratio<1> (), value);
- }
- iter_type do_put_unit(iter_type s, std::ios_base&, duration_style_type style, ratio<1> u, int_least64_t value) const
- {
- string_type str = do_get_plural_form(style, u, do_get_plural_form(value));
- return std::copy(str.begin(), str.end(), s);
- }
- iter_type do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, deca u, int_least64_t value) const
- {
- string_type str = do_get_ratio_prefix(style, u);
- std::copy(str.begin(), str.end(), s);
- return do_put_unit(s, ios, style, ratio<1> (), value);
- }
- iter_type do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, hecto u, int_least64_t value) const
- {
- string_type str = do_get_ratio_prefix(style, u);
- std::copy(str.begin(), str.end(), s);
- return do_put_unit(s, ios, style, ratio<1> (), value);
- }
+ return "";
- iter_type do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, kilo u, int_least64_t value) const
- {
- string_type str = do_get_ratio_prefix(style, u);
- std::copy(str.begin(), str.end(), s);
- return do_put_unit(s, ios, style, ratio<1> (), value);
- }
- iter_type do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, mega u, int_least64_t value) const
- {
- string_type str = do_get_ratio_prefix(style, u);
- std::copy(str.begin(), str.end(), s);
- return do_put_unit(s, ios, style, ratio<1> (), value);
- }
- iter_type do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, giga u, int_least64_t value) const
- {
- string_type str = do_get_ratio_prefix(style, u);
- std::copy(str.begin(), str.end(), s);
- return do_put_unit(s, ios, style, ratio<1> (), value);
- }
- iter_type do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, tera u, int_least64_t value) const
- {
- string_type str = do_get_ratio_prefix(style, u);
- std::copy(str.begin(), str.end(), s);
- return do_put_unit(s, ios, style, ratio<1> (), value);
- }
- iter_type do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, peta u, int_least64_t value) const
- {
- string_type str = do_get_ratio_prefix(style, u);
- std::copy(str.begin(), str.end(), s);
- return do_put_unit(s, ios, style, ratio<1> (), value);
- }
- iter_type do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, exa u, int_least64_t value) const
- {
- string_type str = do_get_ratio_prefix(style, u);
- std::copy(str.begin(), str.end(), s);
- return do_put_unit(s, ios, style, ratio<1> (), value);
}
- iter_type do_put_unit(iter_type s, std::ios_base&, duration_style_type style, ratio<60> u, int_least64_t value) const
+ virtual std::size_t do_get_plural_forms() const
{
- string_type str = do_get_plural_form(style, u, do_get_plural_form(value));
- return std::copy(str.begin(), str.end(), s);
+ return pfs_;
}
- iter_type do_put_unit(iter_type s, std::ios_base&, duration_style_type style, ratio<3600> u, int_least64_t value) const
+ virtual std::size_t do_get_plural_form(int_least64_t value) const
{
- string_type str = do_get_plural_form(style, u, do_get_plural_form(value));
- return std::copy(str.begin(), str.end(), s);
+ return (value == -1 || value == 1) ? 0 : 1;
}
- iter_type do_put_unit(iter_type s, std::ios_base& ios, duration_style_type style, rt_ratio rtr,
- int_least64_t value) const
+ string_type do_get_pattern() const
{
- *s++ = CharT('[');
- std::use_facet<std::num_put<CharT, iter_type> >(ios.getloc()).put(s, ios, ' ', rtr.num);
- *s++ = CharT('/');
- std::use_facet<std::num_put<CharT, iter_type> >(ios.getloc()).put(s, ios, ' ', rtr.den);
- *s++ = CharT(']');
+ static const CharT t[] =
+ { '%', 'v', ' ', '%', 'u' };
+ static const string_type pattern(t, t + sizeof (t) / sizeof (t[0]));
- return do_put_unit(s, ios, style, ratio<1> (), value);
+ return pattern;
}
string_type do_get_plural_form(duration_style_type style, ratio<1> , std::size_t pf) const
Modified: trunk/boost/chrono/io/time_point_put.hpp
==============================================================================
--- trunk/boost/chrono/io/time_point_put.hpp (original)
+++ trunk/boost/chrono/io/time_point_put.hpp 2011-11-20 13:32:48 EST (Sun, 20 Nov 2011)
@@ -43,6 +43,10 @@
*/
typedef CharT char_type;
/**
+ * Type of character string passed to member functions.
+ */
+ typedef std::basic_string<CharT> string_type;
+ /**
* Type of iterator used to write in the character buffer.
*/
typedef OutputIterator iter_type;
@@ -93,21 +97,21 @@
iter_type put(iter_type i, std::ios_base& ios, char_type fill, time_point<Clock, Duration> const& tp, const CharT* pattern,
const CharT* pat_end) const
{
- if (std::has_facet<time_point_units<CharT, OutputIterator> >(ios.getloc()))
+ if (std::has_facet<time_point_units<CharT> >(ios.getloc()))
{
- time_point_units<CharT, OutputIterator> const &facet =
- std::use_facet<time_point_units<CharT, OutputIterator> >(ios.getloc());
+ time_point_units<CharT> const &facet =
+ std::use_facet<time_point_units<CharT> >(ios.getloc());
return put(facet, i, ios, fill, tp, pattern, pat_end);
}
else
{
- time_point_units_default<CharT, OutputIterator> facet;
+ time_point_units_default<CharT> facet;
return put(facet, i, ios, fill, tp, pattern, pat_end);
}
}
template <class Clock, class Duration>
- iter_type put(time_point_units<CharT, OutputIterator> const& units_facet, iter_type s, std::ios_base& ios, char_type fill,
+ iter_type put(time_point_units<CharT> const& units_facet, iter_type s, std::ios_base& ios, char_type fill,
time_point<Clock, Duration> const& tp, const CharT* pattern, const CharT* pat_end) const
{
@@ -134,13 +138,6 @@
s = put_epoch<Clock> (units_facet, s, ios);
break;
}
- // case 'x':
- // {
- // std::basic_string<CharT> pat = units_facet.get_pattern();
- // pattern = pat.data();
- // pat_end = pattern + pat.size();
- // break;
- // }
default:
BOOST_ASSERT(false && "Boost::Chrono internal error.");
break;
@@ -167,53 +164,21 @@
template <class Clock, class Duration>
iter_type put(iter_type i, std::ios_base& ios, char_type fill, time_point<Clock, Duration> const& tp) const
{
- if (std::has_facet<time_point_units<CharT, OutputIterator> >(ios.getloc()))
+ if (std::has_facet<time_point_units<CharT> >(ios.getloc()))
{
- time_point_units<CharT, OutputIterator> const &facet =
- std::use_facet<time_point_units<CharT, OutputIterator> >(ios.getloc());
+ time_point_units<CharT> const &facet =
+ std::use_facet<time_point_units<CharT> >(ios.getloc());
std::basic_string<CharT> str = facet.get_pattern();
return put(facet, i, ios, fill, tp, str.data(), str.data() + str.size());
}
else
{
- time_point_units_default<CharT, OutputIterator> facet;
+ time_point_units_default<CharT> facet;
std::basic_string<CharT> str = facet.get_pattern();
return put(facet, i, ios, fill, tp, str.data(), str.data() + str.size());
}
}
- // /*
- // *
- // */
- //
- // template <class Clock, class Duration>
- // iter_type put(iter_type s, std::ios_base& ios, time_point<Clock, Duration> const& tp, const CharT* pattern,
- // const CharT* pat_end) const
- // {
- // time_point_units<CharT,OutputIterator> const& units_facet = time_point_units<CharT,OutputIterator>::imbue_if_has_not(ios);
- //
- // return s;
- // }
-
- // /**
- // *
- // * @param s an output stream iterator
- // * @param ios a reference to a ios_base
- // * @param d the duration
- // * @Effects imbue in @c ios the @c time_point_units_default facet if not already present.
- // * Retrieves Stores the duration pattern from the @c duration_unit facet in let say @c str. Last as if
- // * @code
- // * return put(s, ios, d, str.data(), str.data() + str.size());
- // * @codeend
- // * @Returns An iterator pointing immediately after the last character produced.
- // */
- // template <class Duration>
- // iter_type put(iter_type s, std::ios_base& ios, time_point<system_clock, Duration> const& tp) const
- // {
- // std::basic_string<CharT> str = time_point_units<CharT,OutputIterator>::imbue_if_has_not(ios).get_date_time_pattern();
- // return put(s, ios, tp, str.data(), str.data() + str.size());
- // }
-
/**
*
* @param s an output stream iterator
@@ -244,7 +209,7 @@
* @param d the duration
* @param pattern
* @Effects imbue in @c ios the @c time_point_units_default facet if not already present.
- * @Effects Calls std::use_facet<time_point_units<CharT,OutputIterator> >(ios.getloc()).put(s, ios, d).
+ * @Effects Calls std::use_facet<time_point_units<CharT> >(ios.getloc()).put(s, ios, d).
* @Returns An iterator pointing immediately after the last character produced.
*/
@@ -264,9 +229,11 @@
}
template <typename Clock>
- iter_type put_epoch(time_point_units<CharT, OutputIterator> const& facet, iter_type s, std::ios_base& ios) const
+ iter_type put_epoch(time_point_units<CharT> const& facet, iter_type s, std::ios_base&) const
{
- return facet.template put_epoch<Clock> (s, ios);
+ string_type str = facet.template get_epoch<Clock>();
+ std::copy(str.begin(), str.end(), s);
+ return s;
}
/**
Modified: trunk/boost/chrono/io/time_point_units.hpp
==============================================================================
--- trunk/boost/chrono/io/time_point_units.hpp (original)
+++ trunk/boost/chrono/io/time_point_units.hpp 2011-11-20 13:32:48 EST (Sun, 20 Nov 2011)
@@ -29,7 +29,7 @@
* @c time_point_units facet gives useful information about the time_point pattern,
* the text associated to a time_point's epoch,
*/
- template <typename CharT=char, class OutputIterator = std::ostreambuf_iterator<CharT> >
+ template <typename CharT=char>
class time_point_units: public std::locale::facet
{
public:
@@ -37,10 +37,6 @@
* Type of character the facet is instantiated on.
*/
typedef CharT char_type;
- /**
- * Type of iterator used to scan the character buffer.
- */
- typedef OutputIterator iter_type;
/**
* Unique identifier for this type of facet.
@@ -64,22 +60,6 @@
}
/**
- *
- * @param s
- * @param ios
- * @Effects As if
- * @code
- * return do_put_epoch(s, ios, Clock());
- * @endcode
- * @return @ s
- */
- template <typename Clock>
- iter_type put_epoch(iter_type s, std::ios_base& ios) const
- {
- return do_put_epoch(s, ios, Clock());
- }
-
- /**
* @return the pattern to be used by default calling @c do_get_pattern().
*/
std::basic_string<CharT> get_pattern() const
@@ -107,56 +87,35 @@
*/
virtual std::basic_string<CharT> do_get_pattern() const=0;
- /**
- * Customization point for inserting the system_clock timepoint's epoch.
- *
- * @param s start of the output stream
- * @param ios the associated ios_base
- * @param c tag used to make it possible to override system_clock pattern.
- * @return
- */
- virtual iter_type
- do_put_epoch(iter_type s, std::ios_base& ios, system_clock) const = 0;
- /**
- * customization point for getting the system_clock timepoint's epoch.
- */
virtual std::basic_string<CharT> do_get_epoch(system_clock) const=0;
- virtual iter_type
- do_put_epoch(iter_type s, std::ios_base& ios, steady_clock) const = 0;
virtual std::basic_string<CharT> do_get_epoch(steady_clock) const=0;
#if defined(BOOST_CHRONO_HAS_PROCESS_CLOCKS)
- virtual iter_type do_put_epoch(iter_type s, std::ios_base& ios, process_real_cpu_clock c) const =0;
virtual std::basic_string<CharT> do_get_epoch(process_real_cpu_clock) const=0;
- virtual iter_type do_put_epoch(iter_type s, std::ios_base& ios, process_user_cpu_clock c) const =0;
virtual std::basic_string<CharT> do_get_epoch(process_user_cpu_clock) const=0;
- virtual iter_type do_put_epoch(iter_type s, std::ios_base& ios, process_system_cpu_clock c) const =0;
virtual std::basic_string<CharT> do_get_epoch(process_system_cpu_clock) const=0;
- virtual iter_type do_put_epoch(iter_type s, std::ios_base& ios, process_cpu_clock c) const =0;
virtual std::basic_string<CharT> do_get_epoch(process_cpu_clock) const=0;
#endif
#if defined(BOOST_CHRONO_HAS_THREAD_CLOCK)
- virtual iter_type do_put_epoch(iter_type s, std::ios_base& ios, thread_clock c) const =0;
virtual std::basic_string<CharT> do_get_epoch(thread_clock) const=0;
#endif
};
- template <typename CharT, class OutputIterator>
- std::locale::id time_point_units<CharT, OutputIterator>::id;
+ template <typename CharT>
+ std::locale::id time_point_units<CharT>::id;
// This class is used to define the strings for the default English
- template <typename CharT=char, class OutputIterator = std::ostreambuf_iterator<CharT> >
- class time_point_units_default: public time_point_units<CharT, OutputIterator>
+ template <typename CharT=char>
+ class time_point_units_default: public time_point_units<CharT>
{
public:
typedef CharT char_type;
- typedef OutputIterator iter_type;
explicit time_point_units_default(size_t refs = 0) :
- time_point_units<CharT, OutputIterator> (refs)
+ time_point_units<CharT> (refs)
{
}
~time_point_units_default() {}
@@ -181,58 +140,28 @@
// }
- iter_type do_put_epoch(iter_type s, std::ios_base& , system_clock c) const
- {
- std::basic_string<CharT> str = do_get_epoch(c);
- return std::copy(str.begin(), str.end(), s);
- }
std::basic_string<CharT> do_get_epoch(system_clock ) const
{
return clock_string<system_clock,CharT>::since();
}
- iter_type do_put_epoch(iter_type s, std::ios_base& , steady_clock c) const
- {
- std::basic_string<CharT> str = do_get_epoch(c);
- return std::copy(str.begin(), str.end(), s);
- }
std::basic_string<CharT> do_get_epoch(steady_clock ) const
{
return clock_string<steady_clock,CharT>::since();
}
#if defined(BOOST_CHRONO_HAS_PROCESS_CLOCKS)
- iter_type do_put_epoch(iter_type s, std::ios_base& , process_real_cpu_clock c) const
- {
- std::basic_string<CharT> str = do_get_epoch(c);
- return std::copy(str.begin(), str.end(), s);
- }
std::basic_string<CharT> do_get_epoch(process_real_cpu_clock ) const
{
return clock_string<process_real_cpu_clock,CharT>::since();
}
- iter_type do_put_epoch(iter_type s, std::ios_base& , process_user_cpu_clock c) const
- {
- std::basic_string<CharT> str = do_get_epoch(c);
- return std::copy(str.begin(), str.end(), s);
- }
std::basic_string<CharT> do_get_epoch(process_user_cpu_clock ) const
{
return clock_string<process_user_cpu_clock,CharT>::since();
}
- iter_type do_put_epoch(iter_type s, std::ios_base& , process_system_cpu_clock c) const
- {
- std::basic_string<CharT> str = do_get_epoch(c);
- return std::copy(str.begin(), str.end(), s);
- }
std::basic_string<CharT> do_get_epoch(process_system_cpu_clock ) const
{
return clock_string<process_system_cpu_clock,CharT>::since();
}
- iter_type do_put_epoch(iter_type s, std::ios_base& , process_cpu_clock c) const
- {
- std::basic_string<CharT> str = do_get_epoch(c);
- return std::copy(str.begin(), str.end(), s);
- }
std::basic_string<CharT> do_get_epoch(process_cpu_clock ) const
{
return clock_string<process_cpu_clock,CharT>::since();
@@ -240,11 +169,6 @@
#endif
#if defined(BOOST_CHRONO_HAS_THREAD_CLOCK)
- iter_type do_put_epoch(iter_type s, std::ios_base& , thread_clock c) const
- {
- std::basic_string<CharT> str = do_get_epoch(c);
- return std::copy(str.begin(), str.end(), s);
- }
std::basic_string<CharT> do_get_epoch(thread_clock ) const
{
return clock_string<thread_clock,CharT>::since();
Modified: trunk/libs/chrono/example/french.cpp
==============================================================================
--- trunk/libs/chrono/example/french.cpp (original)
+++ trunk/libs/chrono/example/french.cpp 2011-11-20 13:32:48 EST (Sun, 20 Nov 2011)
@@ -22,19 +22,19 @@
using namespace boost;
using namespace boost::chrono;
- template <typename CharT=char, class OutputIterator = std::ostreambuf_iterator<CharT> >
- class duration_units_fr: public duration_units_default<CharT, OutputIterator>
+ template <typename CharT=char>
+ class duration_units_fr: public duration_units_default<CharT>
{
public:
typedef CharT char_type;
- typedef OutputIterator iter_type;
explicit duration_units_fr(size_t refs = 0) :
- duration_units_default<CharT, OutputIterator>(refs)
+ duration_units_default<CharT>(refs)
{
}
protected:
+ using duration_units_default<CharT>::do_get_plural_form;
std::size_t do_get_plural_form(boost::int_least64_t value) const
{
return (value == -1 || value == 0 || value == 1) ? 0 : 1;
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk