public inbox for gcc-prs@sourceware.org help / color / mirror / Atom feed
From: John Carter <john.carter@tait.co.nz> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, Subject: Re: libstdc++/7961: compare( char *) implemented incorrectly. Date: Wed, 18 Sep 2002 14:36:00 -0000 [thread overview] Message-ID: <20020918213601.6649.qmail@sources.redhat.com> (raw) The following reply was made to PR libstdc++/7961; it has been noted by GNATS. From: John Carter <john.carter@tait.co.nz> To: Andreas Schwab <schwab@suse.de> Cc: john.carter@tait.co.nz, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/7961: compare( char *) implemented incorrectly. Date: Thu, 19 Sep 2002 09:27:14 +1200 (NZST) If we going to do two comparisons and a subtract why not template<typename _CharT, typename _Traits, typename _Alloc> int basic_string<_CharT, _Traits, _Alloc>:: compare(const _CharT* __s) const { size_type __size = this->size(); size_type __s_size = traits_types::length(__s); if (__size == __s_size) return traits_type::compare(_M_data(), __s, __min); size_type __min = __size; int __result = -1; if ( __size > __s_size) { __result = 1; __min = __s_size; } int __r = traits_type::compare(_M_data(), __s, __min); if (__r) return __r; return __result; } Hmm, I'm not sure that is better, probably need to look at the assembler generated or benchmark it. Even faster would be to fold in an implementation of strcmp. (We already scan the c-string once with the trait_types::length, cosmically speaking we shouldn't need to do that.). Unfortunately, just using strcmp directly is probably a bad idea as you have to take care. A string can have null's in any place but a c string can only have it at the end. ie. string abcNull( "abc\0"); abcNull > "abc" strcmp( abcNull.c_str(), "abs") == 0 I would go for correctness and simplicity over speed. On Wed, 18 Sep 2002, Andreas Schwab wrote: > john.carter@tait.co.nz writes: > > |> A correct implementation would be... > |> template<typename _CharT, typename _Traits, typename _Alloc> > |> int > |> basic_string<_CharT, _Traits, _Alloc>:: > |> compare(const _CharT* __s) const > |> { > |> size_type __size = this->size(); > |> size_type __s_size = traits_types::length(__s); > |> size_type __min = __size; > |> if ( __size > __s_size) > |> __min = __s_size; > |> > |> int __r = traits_type::compare(_M_data(), __s, __min); > |> if (!__r) > |> __r = __size - _s_size; > |> > |> return __r; > |> } > > This is not correct either, because __size - __s_size may overflow the > range of int. Try this instead: > > if (!__r) > __r = (__size > __s_size) - (__size < __s_size); > > Andreas. > > -- John Carter Phone : (64)(3) 358 6639 Tait Electronics Fax : (64)(3) 359 4632 PO Box 1645 Christchurch Email : john.carter@tait.co.nz New Zealand Good Ideas: Ruby - http://www.ruby-lang-org - The best of perl,python,scheme without the pain. Valgrind - http://developer.kde.org/~sewardj/ - memory debugger for x86-GNU/Linux Free your books - http://www.bookcrossing.com
next reply other threads:[~2002-09-18 21:36 UTC|newest] Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top 2002-09-18 14:36 John Carter [this message] -- strict thread matches above, loose matches on Subject: below -- 2002-11-01 7:27 paolo 2002-11-01 2:55 paolo 2002-11-01 2:36 paolo 2002-11-01 2:23 paolo 2002-09-18 14:46 John Carter 2002-09-18 1:46 Andreas Schwab 2002-09-17 20:36 john.carter
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20020918213601.6649.qmail@sources.redhat.com \ --to=john.carter@tait.co.nz \ --cc=gcc-prs@gcc.gnu.org \ --cc=nobody@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).