[committed] libstdc++: Minor optimization for std::locale::encoding()

Message ID 20240710211154.918535-1-jwakely@redhat.com
State New
Headers
Series [committed] libstdc++: Minor optimization for std::locale::encoding() |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 warning Patch is already merged
linaro-tcwg-bot/tcwg_gcc_check--master-arm warning Patch is already merged

Commit Message

Jonathan Wakely July 10, 2024, 9:11 p.m. UTC
  Tested x86_64-linux. Pushed to trunk.

-- >8 --

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 | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)
  

Patch

diff --git a/libstdc++-v3/src/c++26/text_encoding.cc b/libstdc++-v3/src/c++26/text_encoding.cc
index b9a50ef1a00..efe2997562a 100644
--- a/libstdc++-v3/src/c++26/text_encoding.cc
+++ b/libstdc++-v3/src/c++26/text_encoding.cc
@@ -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