From 96ab1f0824a54532e76e782c78d9a01aafa6a83b Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 25 Aug 2021 00:48:01 +0200 Subject: [PATCH] Implement wxCmpNatural() using the native function under macOS Use [NSStting localizedStandardCompare:] which is supposed to use the same order as Finder does. --- src/common/arrstr.cpp | 4 ++-- src/osx/cocoa/utils_base.mm | 7 +++++++ tests/arrays/arrays.cpp | 6 ++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/common/arrstr.cpp b/src/common/arrstr.cpp index c2fdb7fda9..3e9b9aef31 100644 --- a/src/common/arrstr.cpp +++ b/src/common/arrstr.cpp @@ -897,11 +897,11 @@ int wxCMPFUNC_CONV wxCmpNaturalGeneric(const wxString& s1, const wxString& s2) // ---------------------------------------------------------------------------- // If native natural sort function isn't available, use the generic version. -#if !defined(__WINDOWS__) +#if !(defined(__WINDOWS__) || defined(__DARWIN__) || defined(__WXOSX_IPHONE__)) int wxCMPFUNC_CONV wxCmpNatural(const wxString& s1, const wxString& s2) { return wxCmpNaturalGeneric(s1, s2); } -#endif // #if !defined( __WINDOWS__ ) +#endif // not a platform with native implementation diff --git a/src/osx/cocoa/utils_base.mm b/src/osx/cocoa/utils_base.mm index a99f3c30d4..bc3c1dfbbe 100644 --- a/src/osx/cocoa/utils_base.mm +++ b/src/osx/cocoa/utils_base.mm @@ -266,3 +266,10 @@ bool wxCocoaLaunch(const char* const* argv, pid_t &pid) } #endif + +int wxCMPFUNC_CONV wxCmpNatural(const wxString& s1, const wxString& s2) +{ + // The values of NSOrdered{Ascending,Same,Descending} are the same as + // expected return values of wxCmpNatural(), so we don't need to convert. + return [wxCFStringRef(s1).AsNSString() localizedStandardCompare: wxCFStringRef(s2).AsNSString()]; +} diff --git a/tests/arrays/arrays.cpp b/tests/arrays/arrays.cpp index 0ef734fd7a..5db623f89b 100644 --- a/tests/arrays/arrays.cpp +++ b/tests/arrays/arrays.cpp @@ -844,3 +844,9 @@ TEST_CASE("wxCmpNaturalGeneric", "[wxString][compare]") CHECK(wxCmpNaturalGeneric("a5th 5", "a 10th 10") > 0); } +TEST_CASE("wxCmpNatural", "[wxString][compare]") +{ + // We can't expect much from the native natural comparison function as it's + // locale-dependent, so just run a simple sanity test + CHECK(wxCmpNatural("same", "same") == 0); +}