std::time_g...t_monthname,(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’… std::time_g...t_monthname,(3) πŸ’…

Okay bestie, welcome to the C++ Standard Libary manual (yes, Libary, that's literally how the manual name is spelled on the page and I am not fixing the header πŸ’€), section (3), and today's main character is std::time_get::get_monthname. It's giving niche locale-parsing queen energy and honestly? Obsessed. πŸ’–

πŸ’– NAME πŸ’–

std::time_get::get_monthname, - std::time_get::get_monthname,

Yes, it's listed twice with that trailing comma situation. We don't make the rules, bestie, we just keep every detail. πŸ’…

✨ Synopsis ✨

Here's the whole signature setup, copied exactly because we do not mess with code on this page:

          Defined in header <locale>
          public:

          iter_type get_monthname( iter_type beg, iter_type end, std::ios_base&
       str,      (1)

                                   std::ios_base::iostate& err, std::tm* t )
       const;
          protected:

          virtual iter_type do_get_monthname( iter_type beg, iter_type end,
          std::ios_base& str,
       (2)

                                              std::ios_base::iostate& err,
       std::tm* t )
          const;
  1. Public member function, calls the protected virtual member function do_get_monthname of the most derived class.
  2. Reads successive characters from the sequence [beg, end) and parses out the month name (possibly abbreviated), using the default format for month names expected by this locale, which is the same format as "%b" as used by the functions std::get_time, time_get::get, and the POSIX function strptime().

Heads up, bestie: if it finds an abbreviated name, followed by the characters that are valid for the full name, it continues reading until it consumes all the characters for the full name or finds a character that isn't expected, in which case parsing fails even if the first few characters were a valid abbreviation. That's the plot twist. 😭

The parsed month is stored in the std::tm field t->tm_mon. If the end iterator is reached before a valid month name is read, the function sets std::ios_base::eofbit in err. If a parsing error is encountered, the function sets std::ios_base::failbit in err.

πŸ¦‹ Parameters πŸ¦‹

  • beg β€” iterator designating the start of the sequence to parse.
  • end β€” one past the end iterator for the sequence to parse.
  • str β€” a stream object that this function uses to obtain locale facets when needed, e.g. std::ctype to skip whitespace or std::collate to compare strings.
  • err β€” stream error flags object that is modified by this function to indicate errors.
  • t β€” pointer to the std::tm object that will hold the result of this function call.

🌈 Return value 🌈

Iterator pointing one past the last character in [beg, end) that was recognized as a part of a valid month name. Slay. ✨

πŸŽ€ Notes πŸŽ€

This function is usually case-insensitive.

If a parsing error is encountered, most implementations of this function leave *t unmodified. Vibe check: your std::tm might just be sitting there unchanged, bestie.

πŸ’… Example πŸ’…

The page literally says // Run this code, so here's the whole example, fr fr:

        #include <ctime>
        #include <iostream>
        #include <iterator>
        #include <locale>
        #include <sstream>
        #include <string_view>

        void try_get_mon(std::string_view locale_name, std::string_view source)
        {
            try
            {
                std::locale::global(std::locale(locale_name.data()));
            }
            catch (std::runtime_error const& ex)
            {
                std::cout << "Cannot setup locale: " << locale_name << "\n"
                             "Exception: " << ex.what() << '\n';
                return;
            }

            std::cout << "Parsing the month out of '" << source
                      << "' in the locale " << std::locale().name() << '\n';
            std::istringstream str{source.data()};
            std::ios_base::iostate err = std::ios_base::goodbit;

            std::tm t;
            std::time_get<char> const& facet =
       std::use_facet<std::time_get<char>>(str.getloc());
            std::istreambuf_iterator<char> ret = facet.get_monthname({str}, {},
       str, err, &t);
            str.setstate(err);
            std::istreambuf_iterator<char> last{};

            if (str)
            {
                std::cout << "Successfully parsed, month number is " <<
       t.tm_mon;

                if (ret != last)
                {
                    std::cout << ". Remaining content: ";
                    std::copy(ret, last,
       std::ostreambuf_iterator<char>(std::cout));
                }
                else
                    std::cout << ". The input was fully consumed";
            }
            else
            {
                std::cout << "Parse failed. Unparsed string: ";
                std::copy(ret, last,
       std::ostreambuf_iterator<char>(std::cout));
            }

            std::cout << '\n';
        }

        int main()
        {
            try_get_mon("ja_JP.utf8", "2月");
            try_get_mon("th_TH.utf8", "ΰΈΰΈ‘ΰΈ ΰΈ²ΰΈžΰΈ™ΰΈ˜");
            try_get_mon("el_GR.utf8", "ΦΡβ");
            try_get_mon("el_GR.utf8", "ΦΡβρουάριος");
            try_get_mon("en_US.utf8", "Febrile");
        }

🌸 Possible output 🌸

        Parsing the month out of '2月' in the locale ja_JP.utf8
        Successfully parsed, month number is 1. The input was fully consumed
        Parsing the month out of 'ΰΈΰΈ‘ΰΈ ΰΈ²ΰΈžΰΈ™ΰΈ˜' in the locale th_TH.utf8
        Successfully parsed, month number is 1. The input was fully consumed
        Parsing the month out of 'ΦΡβ' in the locale el_GR.utf8
        Successfully parsed, month number is 1. The input was fully consumed
        Parsing the month out of 'ΦΡβρουάριος' in the locale el_GR.utf8
        Successfully parsed, month number is 1. The input was fully consumed
        Parsing the month out of 'Febrile' in the locale en_US.utf8
        Parse failed. Unparsed string: ile

🫢 Defect reports 🫢

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

  • DR LWG 248 β€” Applied to: C++98. Behavior as published: eofbit was not set upon reaching the end iterator. Correct behavior: sets eofbit if a valid month name has not been read.

⭐ See also ⭐

  • get_time β€” parses a date/time value of specified format (C++11) (function template).

And that's the whole page, bestie 🫢✨ Source: http://cppreference.com, version/date: 2024.06.10, footer title: std::time_g...t_monthname,(3). Byeee πŸ’…πŸŽ€

πŸ“¦ where this page comes from