From cb1328d1d049d5ac7376d4bd07c3b08f2c5f7c7a Mon Sep 17 00:00:00 2001 From: Chris Loer Date: Wed, 27 Jun 2018 15:01:54 -0700 Subject: [PATCH] [ios, macos] Darwin "collator" implementation - Uses NSString for comparison - Uses NSLocale for loading locales --- platform/darwin/src/collator.mm | 64 +++++++++++++++++++++++++++++++++ platform/ios/config.cmake | 1 + platform/macos/config.cmake | 1 + 3 files changed, 66 insertions(+) create mode 100644 platform/darwin/src/collator.mm diff --git a/platform/darwin/src/collator.mm b/platform/darwin/src/collator.mm new file mode 100644 index 000000000..5a87ab3c9 --- /dev/null +++ b/platform/darwin/src/collator.mm @@ -0,0 +1,64 @@ +#include + +#include + +#import + +namespace mbgl { +namespace style { +namespace expression { + +class Collator::Impl { +public: + Impl(bool caseSensitive, bool diacriticSensitive, optional locale_) + : options((caseSensitive ? 0 : NSCaseInsensitiveSearch) | + (diacriticSensitive ? 0 : NSDiacriticInsensitiveSearch)) + , locale(locale_ ? + [[NSLocale alloc] initWithLocaleIdentifier:@((*locale_).c_str())] : + [NSLocale currentLocale]) + {} + + bool operator==(const Impl& other) const { + return options == other.options && + [[locale localeIdentifier] isEqualToString:[other.locale localeIdentifier]]; + } + + int compare(const std::string& lhs, const std::string& rhs) const { + NSString* nsLhs = @(lhs.c_str()); + NSString* nsRhs = @(rhs.c_str()); + // Limiting the compare range to the length of the LHS seems weird, but + // experimentally we've checked that if LHS is a prefix of RHS compare returns -1 + // https://developer.apple.com/documentation/foundation/nsstring/1414561-compare + NSRange compareRange = NSMakeRange(0, nsLhs.length); + + return [nsLhs compare:nsRhs options:options range:compareRange locale:locale]; + } + + std::string resolvedLocale() const { + return [locale localeIdentifier].UTF8String; + } +private: + NSStringCompareOptions options; + NSLocale* locale; +}; + + +Collator::Collator(bool caseSensitive, bool diacriticSensitive, optional locale_) + : impl(std::make_shared(caseSensitive, diacriticSensitive, std::move(locale_))) +{} + +bool Collator::operator==(const Collator& other) const { + return *impl == *(other.impl); +} + +int Collator::compare(const std::string& lhs, const std::string& rhs) const { + return impl->compare(lhs, rhs); +} + +std::string Collator::resolvedLocale() const { + return impl->resolvedLocale(); +} + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/platform/ios/config.cmake b/platform/ios/config.cmake index 8c1d12e6f..a607fbdf3 100644 --- a/platform/ios/config.cmake +++ b/platform/ios/config.cmake @@ -29,6 +29,7 @@ macro(mbgl_platform_core) PRIVATE platform/darwin/mbgl/storage/reachability.h PRIVATE platform/darwin/mbgl/storage/reachability.m PRIVATE platform/darwin/src/CFHandle.hpp + PRIVATE platform/darwin/src/collator.mm PRIVATE platform/darwin/src/local_glyph_rasterizer.mm PRIVATE platform/darwin/src/logging_nslog.mm PRIVATE platform/darwin/src/nsthread.mm diff --git a/platform/macos/config.cmake b/platform/macos/config.cmake index 23012c6dc..20ac7bc24 100644 --- a/platform/macos/config.cmake +++ b/platform/macos/config.cmake @@ -14,6 +14,7 @@ macro(mbgl_platform_core) PRIVATE platform/darwin/mbgl/storage/reachability.h PRIVATE platform/darwin/mbgl/storage/reachability.m PRIVATE platform/darwin/src/CFHandle.hpp + PRIVATE platform/darwin/src/collator.mm PRIVATE platform/darwin/src/local_glyph_rasterizer.mm PRIVATE platform/darwin/src/logging_nslog.mm PRIVATE platform/darwin/src/nsthread.mm