]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Minor optimization for std::locale::encoding()
authorJonathan Wakely <jwakely@redhat.com>
Wed, 10 Jul 2024 16:47:56 +0000 (17:47 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 10 Jul 2024 21:05:22 +0000 (22:05 +0100)
For the C locale we know the encoding is ASCII, so we can avoid using
newlocale and nl_langinfo_l. Similarly, for an unnamed locale, we aren't
going to get a useful answer, so we can just use a default-constrcuted
std::text_encoding representing an unknown encoding.

libstdc++-v3/ChangeLog:

* src/c++26/text_encoding.cc (__locale_encoding): Add to unnamed
namespace.
(std::locale::encoding): Optimize for "C" and "*" names.

libstdc++-v3/src/c++26/text_encoding.cc

index b9a50ef1a001f6b4f56468c05244226309e077d7..efe2997562a4afbf849279f54fc1390fc6abcb39 100644 (file)
@@ -36,7 +36,9 @@
 namespace std
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
-
+namespace
+{
+// Attempt to determine the text_encoding used by the named locale.
 text_encoding
 __locale_encoding(const char* name)
 {
@@ -54,6 +56,7 @@ __locale_encoding(const char* name)
   return enc;
 }
 
+} // namespace
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace std
 
@@ -87,8 +90,15 @@ std::text_encoding::_M_is_environment() const
 std::text_encoding
 std::locale::encoding() const
 {
-  return std::__locale_encoding(name().c_str());
+  string name = this->name();
+  if (name.length() == 1)
+    {
+      if (name[0] == 'C')
+       return text_encoding(text_encoding::ASCII);
+      if (name[0] == '*')
+       return {};
+    }
+  return __locale_encoding(name.c_str());
 }
 #endif // CHAR_BIT == 8
-
 #endif // _GLIBCXX_USE_NL_LANGINFO_L