LCOV - code coverage report
Current view: top level - opt/homebrew/include/boost/date_time - strings_from_facet.hpp (source / functions) Hit Total Coverage
Test: test_dash_coverage.info Lines: 42 42 100.0 %
Date: 2026-06-25 07:23:51 Functions: 2 2 100.0 %

          Line data    Source code
       1             : #ifndef DATE_TIME_STRINGS_FROM_FACET__HPP___
       2             : #define DATE_TIME_STRINGS_FROM_FACET__HPP___
       3             : 
       4             : /* Copyright (c) 2004 CrystalClear Software, Inc.
       5             :  * Use, modification and distribution is subject to the
       6             :  * Boost Software License, Version 1.0. (See accompanying
       7             :  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
       8             :  * Author: Jeff Garland
       9             :  * $Date$
      10             :  */
      11             : 
      12             : #include <cstring>
      13             : #include <sstream>
      14             : #include <string>
      15             : #include <vector>
      16             : #include <locale>
      17             : #include <iterator>
      18             : 
      19             : namespace boost { namespace date_time {
      20             : 
      21             : //! This function gathers up all the month strings from a std::locale
      22             : /*! Using the time_put facet, this function creates a collection of
      23             :  *  all the month strings from a locale.  This is handy when building
      24             :  *  custom date parsers or formatters that need to be localized.
      25             :  *
      26             :  *@param charT The type of char to use when gathering typically char
      27             :  *             or wchar_t.
      28             :  *@param locale The locale to use when gathering the strings
      29             :  *@param short_strings True(default) to gather short strings,
      30             :  *                     false for long strings.
      31             :  *@return A vector of strings containing the strings in order. eg:
      32             :  *        Jan, Feb, Mar, etc.
      33             :  */
      34             : template<typename charT>
      35             : std::vector<std::basic_string<charT> >
      36           4 : gather_month_strings(const std::locale& locale, bool short_strings=true)
      37             : {
      38             :   typedef std::basic_string<charT> string_type;
      39             :   typedef std::vector<string_type> collection_type;
      40             :   typedef std::ostreambuf_iterator<charT> ostream_iter_type;
      41             :   typedef std::basic_ostringstream<charT> stringstream_type;
      42             :   typedef std::time_put<charT>           time_put_facet_type;
      43           4 :   charT short_fmt[3] = { '%', 'b' };
      44           4 :   charT long_fmt[3]  = { '%', 'B' };
      45           4 :   collection_type months;
      46           4 :   string_type outfmt(short_fmt);
      47           4 :   if (!short_strings) {
      48           2 :     outfmt = long_fmt;
      49           2 :   }
      50             :   {
      51             :     //grab the needed strings by using the locale to
      52             :     //output each month
      53           4 :     const charT* p_outfmt = outfmt.c_str(), *p_outfmt_end = p_outfmt + outfmt.size();
      54             :     tm tm_value;
      55           4 :     std::memset(&tm_value, 0, sizeof(tm_value));
      56          52 :     for (int m=0; m < 12; m++) {
      57          48 :       tm_value.tm_mon = m;
      58          48 :       stringstream_type ss;
      59          48 :       ostream_iter_type oitr(ss);
      60          48 :       std::use_facet<time_put_facet_type>(locale).put(oitr, ss, ss.fill(),
      61             :                                                       &tm_value,
      62          48 :                                                       p_outfmt,
      63          48 :                                                       p_outfmt_end);
      64          48 :       months.push_back(ss.str());
      65          48 :     }
      66             :   }
      67           4 :   return months;
      68           4 : }
      69             : 
      70             : //! This function gathers up all the weekday strings from a std::locale
      71             : /*! Using the time_put facet, this function creates a collection of
      72             :  *  all the weekday strings from a locale starting with the string for
      73             :  *  'Sunday'.  This is handy when building custom date parsers or
      74             :  *  formatters that need to be localized.
      75             :  *
      76             :  *@param charT The type of char to use when gathering typically char
      77             :  *             or wchar_t.
      78             :  *@param locale The locale to use when gathering the strings
      79             :  *@param short_strings True(default) to gather short strings,
      80             :  *                     false for long strings.
      81             :  *@return A vector of strings containing the weekdays in order. eg:
      82             :  *        Sun, Mon, Tue, Wed, Thu, Fri, Sat
      83             :  */
      84             : template<typename charT>
      85             : std::vector<std::basic_string<charT> >
      86           4 : gather_weekday_strings(const std::locale& locale, bool short_strings=true)
      87             : {
      88             :   typedef std::basic_string<charT> string_type;
      89             :   typedef std::vector<string_type> collection_type;
      90             :   typedef std::ostreambuf_iterator<charT> ostream_iter_type;
      91             :   typedef std::basic_ostringstream<charT> stringstream_type;
      92             :   typedef std::time_put<charT>           time_put_facet_type;
      93           4 :   charT short_fmt[3] = { '%', 'a' };
      94           4 :   charT long_fmt[3]  = { '%', 'A' };
      95             : 
      96           4 :   collection_type weekdays;
      97             : 
      98             : 
      99           4 :   string_type outfmt(short_fmt);
     100           4 :   if (!short_strings) {
     101           2 :     outfmt = long_fmt;
     102           2 :   }
     103             :   {
     104             :     //grab the needed strings by using the locale to
     105             :     //output each month / weekday
     106           4 :     const charT* p_outfmt = outfmt.c_str(), *p_outfmt_end = p_outfmt + outfmt.size();
     107             :     tm tm_value;
     108           4 :     std::memset(&tm_value, 0, sizeof(tm_value));
     109          32 :     for (int i=0; i < 7; i++) {
     110          28 :       tm_value.tm_wday = i;
     111          28 :       stringstream_type ss;
     112          28 :       ostream_iter_type oitr(ss);
     113          28 :       std::use_facet<time_put_facet_type>(locale).put(oitr, ss, ss.fill(),
     114             :                                                       &tm_value,
     115          28 :                                                       p_outfmt,
     116          28 :                                                       p_outfmt_end);
     117             : 
     118          28 :       weekdays.push_back(ss.str());
     119          28 :     }
     120             :   }
     121           4 :   return weekdays;
     122           4 : }
     123             : 
     124             : } } //namespace
     125             : 
     126             : 
     127             : #endif

Generated by: LCOV version 1.16