From 4f241823a281ef7c00a64a0c1d23eeccd6b39879 Mon Sep 17 00:00:00 2001 From: Eric Fiselier Date: Fri, 28 Aug 2015 03:02:37 +0000 Subject: [PATCH] [libcxx] Optimize away unneeded length calculation in basic_string::compare(const char*) Summary: This patch optimizes basic_string::compare to use strcmp when the default char_traits has been given. See PR19900 for more information. https://llvm.org/bugs/show_bug.cgi?id=19900 Reviewers: mclow.lists Subscribers: bkramer, cfe-commits Differential Revision: http://reviews.llvm.org/D12355 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@246266 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/string | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/include/string b/include/string index 372522ce..504f9e1a 100644 --- a/include/string +++ b/include/string @@ -3795,7 +3795,11 @@ bool operator==(const _CharT* __lhs, const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT { - return __rhs.compare(__lhs) == 0; + typedef basic_string<_CharT, _Traits, _Allocator> _String; + _LIBCPP_ASSERT(__lhs != nullptr, "operator==(char*, basic_string): received nullptr"); + size_t __lhs_len = _Traits::length(__lhs); + if (__lhs_len != __rhs.size()) return false; + return __rhs.compare(0, _String::npos, __lhs, __lhs_len) == 0; } template @@ -3804,7 +3808,11 @@ bool operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs, const _CharT* __rhs) _NOEXCEPT { - return __lhs.compare(__rhs) == 0; + typedef basic_string<_CharT, _Traits, _Allocator> _String; + _LIBCPP_ASSERT(__rhs != nullptr, "operator==(basic_string, char*): received nullptr"); + size_t __rhs_len = _Traits::length(__rhs); + if (__rhs_len != __lhs.size()) return false; + return __lhs.compare(0, _String::npos, __rhs, __rhs_len) == 0; } // operator!=