Update minimum ICU version to 60.2
authorross.kirsling@sony.com <ross.kirsling@sony.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 6 Apr 2020 23:15:45 +0000 (23:15 +0000)
committerross.kirsling@sony.com <ross.kirsling@sony.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 6 Apr 2020 23:15:45 +0000 (23:15 +0000)
https://bugs.webkit.org/show_bug.cgi?id=209694

Reviewed by Darin Adler.

.:

* Source/cmake/OptionsAppleWin.cmake:
* Source/cmake/OptionsCommon.cmake:
* Source/cmake/OptionsFTW.cmake:
* Source/cmake/OptionsGTK.cmake:
* Source/cmake/OptionsJSCOnly.cmake:
* Source/cmake/OptionsMac.cmake:
* Source/cmake/OptionsPlayStation.cmake:
* Source/cmake/OptionsWPE.cmake:
* Source/cmake/OptionsWinCairo.cmake:
Indicate 60.2 as minimum version (as required by GTK for supporting Ubuntu 18.04 LTS).
Also ensure that the C++ API is hidden for all platforms.

Source/JavaScriptCore:

* icu/LICENSE: Deleted.
* icu/README: Deleted.
Remove leftover files following r219155.

* runtime/IntlDateTimeFormat.cpp:
(JSC::IntlDateTimeFormat::UFieldPositionIteratorDeleter::operator() const):
(JSC::IntlDateTimeFormat::partTypeString):
(JSC::IntlDateTimeFormat::formatToParts):
* runtime/IntlDateTimeFormat.h:
* runtime/IntlDateTimeFormatPrototype.cpp:
(JSC::IntlDateTimeFormatPrototype::finishCreation):
(JSC::IntlDateTimeFormatPrototypeFuncFormatToParts):
* runtime/IntlNumberFormat.cpp:
(JSC::IntlNumberFormat::partTypeString):
(JSC::IntlNumberFormat::formatToParts):
* runtime/IntlNumberFormat.h:
* runtime/IntlNumberFormatPrototype.cpp:
(JSC::IntlNumberFormatPrototype::finishCreation):
(JSC::IntlNumberFormatPrototypeFuncFormatToParts):
* runtime/IntlPluralRules.cpp:
(JSC::IntlPluralRules::resolvedOptions):
(JSC::IntlPluralRules::select):
* runtime/IntlPluralRules.h:
* runtime/JSGlobalObjectFunctions.cpp:
(JSC::decode):
Remove obsoleted compile-time version checks.

Source/WebCore:

* PlatformMac.cmake:
* WebCore.xcodeproj/project.pbxproj:
* icu/LICENSE: Deleted.
* icu/README: Deleted.
Remove leftover files following r219155 as well as a corresponding Xcode step.

* editing/cocoa/DataDetection.mm:
(WebCore::buildQuery):
* page/ios/FrameIOS.mm:
(WebCore::Frame::interpretationsForCurrentRoot const):
* platform/cocoa/KeyEventCocoa.mm:
(WebCore::keyForCharCode):
* platform/cocoa/TelephoneNumberDetectorCocoa.cpp:
(WebCore::TelephoneNumberDetector::find):
* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
(WebCore::MediaPlayerPrivateAVFoundationObjC::shouldWaitForLoadingOfResource):
* platform/graphics/cocoa/FontCacheCoreText.cpp:
(WebCore::createFontForCharacters):
(WebCore::FontCache::prewarm):
* platform/graphics/mac/ComplexTextControllerCoreText.mm:
(WebCore::provideStringAndAttributes):
* platform/graphics/mac/GlyphPageMac.cpp:
(WebCore::GlyphPage::fill):
Manually convert between UChar and UniChar/unichar where needed.

* platform/text/CharacterProperties.h:
(WebCore::isEmojiGroupCandidate):
(WebCore::isEmojiWithPresentationByDefault):
(WebCore::isEmojiModifierBase):
(WebCore::icuLibraryUnderstandsSupplementalSymbolsAndPictographs): Deleted.
Remove obsoleted compile-time and runtime version checks.

Source/WebKit:

* WebProcess/InjectedBundle/API/mac/WKDOMTextIterator.mm:
(-[WKDOMTextIterator currentTextPointer]):
Manually convert between UChar and UniChar/unichar where needed.

Source/WebKitLegacy/mac:

* Misc/WebKitNSStringExtras.mm:
(-[NSString _web_drawAtPoint:font:textColor:]):
(-[NSString _web_widthWithFont:]):
* WebCoreSupport/WebVisitedLinkStore.mm:
(WebVisitedLinkStore::addVisitedLink):
* WebView/WebTextIterator.mm:
(-[WebTextIterator currentTextPointer]):
Manually convert between UChar and UniChar/unichar where needed.

Source/WTF:

This patch has two immediate motivations:
  1. To properly introduce a minimum ICU version for WebKit as a whole
     (responding to a pain point identified in bug 209579)
  2. To support the development of ECMA-402 Intl API features, which JSC is quite behind on
     (and which often boil down to exposing ICU functionality to JavaScript)

* icu/LICENSE:
* icu/README:
* icu/unicode/:
Update ICU headers to major version 62, the version included in macOS Mojave.

* wtf/text/AtomString.h:
* wtf/text/WTFString.h:
Remove obsoleted compile-time version checks.

* wtf/text/cocoa/StringCocoa.mm:
(WTF::String::String):
* wtf/text/cocoa/StringViewCocoa.mm:
(WTF::StringView::createNSString const):
(WTF::StringView::createNSStringWithoutCopying const):
Manually convert between UChar and UniChar/unichar where needed.

Tools:

* TestWebKitAPI/Tests/WTF/StringConcatenate.cpp:
Remove obsoleted compile-time version checks.

* DumpRenderTree/TestRunner.cpp:
(TestRunner::runUIScript):
* TestWebKitAPI/Tests/WebCore/LineBreaking.mm:
(breakingLocationsFromICU):
Manually convert between UChar and UniChar/unichar where needed.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@259606 268f45cc-cd09-0410-ab3c-d52691b4dbfc

233 files changed:
ChangeLog
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/icu/LICENSE [deleted file]
Source/JavaScriptCore/icu/README [deleted file]
Source/JavaScriptCore/runtime/IntlDateTimeFormat.cpp
Source/JavaScriptCore/runtime/IntlDateTimeFormat.h
Source/JavaScriptCore/runtime/IntlDateTimeFormatPrototype.cpp
Source/JavaScriptCore/runtime/IntlNumberFormat.cpp
Source/JavaScriptCore/runtime/IntlNumberFormat.h
Source/JavaScriptCore/runtime/IntlNumberFormatPrototype.cpp
Source/JavaScriptCore/runtime/IntlPluralRules.cpp
Source/JavaScriptCore/runtime/IntlPluralRules.h
Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp
Source/WTF/ChangeLog
Source/WTF/icu/LICENSE
Source/WTF/icu/README
Source/WTF/icu/unicode/.gitattributes
Source/WTF/icu/unicode/alphaindex.h
Source/WTF/icu/unicode/appendable.h
Source/WTF/icu/unicode/basictz.h
Source/WTF/icu/unicode/brkiter.h
Source/WTF/icu/unicode/bytestream.h
Source/WTF/icu/unicode/bytestrie.h
Source/WTF/icu/unicode/bytestriebuilder.h
Source/WTF/icu/unicode/calendar.h
Source/WTF/icu/unicode/caniter.h
Source/WTF/icu/unicode/casemap.h [new file with mode: 0644]
Source/WTF/icu/unicode/char16ptr.h [new file with mode: 0644]
Source/WTF/icu/unicode/chariter.h
Source/WTF/icu/unicode/choicfmt.h
Source/WTF/icu/unicode/coleitr.h
Source/WTF/icu/unicode/coll.h
Source/WTF/icu/unicode/compactdecimalformat.h
Source/WTF/icu/unicode/curramt.h
Source/WTF/icu/unicode/currpinf.h
Source/WTF/icu/unicode/currunit.h
Source/WTF/icu/unicode/datefmt.h
Source/WTF/icu/unicode/dbbi.h
Source/WTF/icu/unicode/dcfmtsym.h
Source/WTF/icu/unicode/decimfmt.h
Source/WTF/icu/unicode/docmain.h
Source/WTF/icu/unicode/dtfmtsym.h
Source/WTF/icu/unicode/dtintrv.h
Source/WTF/icu/unicode/dtitvfmt.h
Source/WTF/icu/unicode/dtitvinf.h
Source/WTF/icu/unicode/dtptngen.h
Source/WTF/icu/unicode/dtrule.h
Source/WTF/icu/unicode/edits.h [new file with mode: 0644]
Source/WTF/icu/unicode/enumset.h
Source/WTF/icu/unicode/errorcode.h
Source/WTF/icu/unicode/fieldpos.h
Source/WTF/icu/unicode/filteredbrk.h
Source/WTF/icu/unicode/fmtable.h
Source/WTF/icu/unicode/format.h
Source/WTF/icu/unicode/fpositer.h
Source/WTF/icu/unicode/gender.h
Source/WTF/icu/unicode/gregocal.h
Source/WTF/icu/unicode/icudataver.h
Source/WTF/icu/unicode/icuplug.h
Source/WTF/icu/unicode/idna.h
Source/WTF/icu/unicode/listformatter.h
Source/WTF/icu/unicode/localpointer.h
Source/WTF/icu/unicode/locdspnm.h
Source/WTF/icu/unicode/locid.h
Source/WTF/icu/unicode/measfmt.h
Source/WTF/icu/unicode/measunit.h
Source/WTF/icu/unicode/measure.h
Source/WTF/icu/unicode/messagepattern.h
Source/WTF/icu/unicode/msgfmt.h
Source/WTF/icu/unicode/normalizer2.h
Source/WTF/icu/unicode/normlzr.h
Source/WTF/icu/unicode/nounit.h [new file with mode: 0644]
Source/WTF/icu/unicode/numberformatter.h [new file with mode: 0644]
Source/WTF/icu/unicode/numfmt.h
Source/WTF/icu/unicode/numsys.h
Source/WTF/icu/unicode/parseerr.h
Source/WTF/icu/unicode/parsepos.h
Source/WTF/icu/unicode/platform.h
Source/WTF/icu/unicode/plurfmt.h
Source/WTF/icu/unicode/plurrule.h
Source/WTF/icu/unicode/ptypes.h
Source/WTF/icu/unicode/putil.h
Source/WTF/icu/unicode/rbbi.h
Source/WTF/icu/unicode/rbnf.h
Source/WTF/icu/unicode/rbtz.h
Source/WTF/icu/unicode/regex.h
Source/WTF/icu/unicode/region.h
Source/WTF/icu/unicode/reldatefmt.h
Source/WTF/icu/unicode/rep.h
Source/WTF/icu/unicode/resbund.h
Source/WTF/icu/unicode/schriter.h
Source/WTF/icu/unicode/scientificnumberformatter.h
Source/WTF/icu/unicode/search.h
Source/WTF/icu/unicode/selfmt.h [changed mode: 0644->0755]
Source/WTF/icu/unicode/simpleformatter.h [new file with mode: 0644]
Source/WTF/icu/unicode/simpletz.h
Source/WTF/icu/unicode/smpdtfmt.h
Source/WTF/icu/unicode/sortkey.h
Source/WTF/icu/unicode/std_string.h
Source/WTF/icu/unicode/strenum.h
Source/WTF/icu/unicode/stringoptions.h [new file with mode: 0644]
Source/WTF/icu/unicode/stringpiece.h
Source/WTF/icu/unicode/stringtriebuilder.h
Source/WTF/icu/unicode/stsearch.h
Source/WTF/icu/unicode/symtable.h
Source/WTF/icu/unicode/tblcoll.h
Source/WTF/icu/unicode/timezone.h
Source/WTF/icu/unicode/tmunit.h
Source/WTF/icu/unicode/tmutamt.h
Source/WTF/icu/unicode/tmutfmt.h
Source/WTF/icu/unicode/translit.h
Source/WTF/icu/unicode/tzfmt.h
Source/WTF/icu/unicode/tznames.h
Source/WTF/icu/unicode/tzrule.h
Source/WTF/icu/unicode/tztrans.h
Source/WTF/icu/unicode/ubidi.h
Source/WTF/icu/unicode/ubiditransform.h [new file with mode: 0644]
Source/WTF/icu/unicode/ubrk.h
Source/WTF/icu/unicode/ucal.h
Source/WTF/icu/unicode/ucasemap.h
Source/WTF/icu/unicode/ucat.h
Source/WTF/icu/unicode/uchar.h
Source/WTF/icu/unicode/ucharstrie.h
Source/WTF/icu/unicode/ucharstriebuilder.h
Source/WTF/icu/unicode/uchriter.h
Source/WTF/icu/unicode/uclean.h
Source/WTF/icu/unicode/ucnv.h
Source/WTF/icu/unicode/ucnv_cb.h
Source/WTF/icu/unicode/ucnv_err.h
Source/WTF/icu/unicode/ucnvsel.h
Source/WTF/icu/unicode/ucol.h
Source/WTF/icu/unicode/ucoleitr.h
Source/WTF/icu/unicode/uconfig.h
Source/WTF/icu/unicode/ucsdet.h
Source/WTF/icu/unicode/ucurr.h
Source/WTF/icu/unicode/udat.h
Source/WTF/icu/unicode/udata.h
Source/WTF/icu/unicode/udateintervalformat.h
Source/WTF/icu/unicode/udatpg.h
Source/WTF/icu/unicode/udisplaycontext.h
Source/WTF/icu/unicode/uenum.h
Source/WTF/icu/unicode/ufieldpositer.h
Source/WTF/icu/unicode/uformattable.h
Source/WTF/icu/unicode/ugender.h
Source/WTF/icu/unicode/uidna.h
Source/WTF/icu/unicode/uiter.h
Source/WTF/icu/unicode/uldnames.h
Source/WTF/icu/unicode/ulistformatter.h
Source/WTF/icu/unicode/uloc.h
Source/WTF/icu/unicode/ulocdata.h
Source/WTF/icu/unicode/umachine.h
Source/WTF/icu/unicode/umisc.h
Source/WTF/icu/unicode/umsg.h
Source/WTF/icu/unicode/unifilt.h
Source/WTF/icu/unicode/unifunct.h
Source/WTF/icu/unicode/unimatch.h
Source/WTF/icu/unicode/unirepl.h
Source/WTF/icu/unicode/uniset.h
Source/WTF/icu/unicode/unistr.h
Source/WTF/icu/unicode/unorm.h
Source/WTF/icu/unicode/unorm2.h
Source/WTF/icu/unicode/unum.h
Source/WTF/icu/unicode/unumberformatter.h [new file with mode: 0644]
Source/WTF/icu/unicode/unumsys.h
Source/WTF/icu/unicode/uobject.h
Source/WTF/icu/unicode/upluralrules.h
Source/WTF/icu/unicode/uregex.h
Source/WTF/icu/unicode/uregion.h
Source/WTF/icu/unicode/ureldatefmt.h [new file with mode: 0644]
Source/WTF/icu/unicode/urename.h
Source/WTF/icu/unicode/urep.h
Source/WTF/icu/unicode/ures.h
Source/WTF/icu/unicode/uscript.h
Source/WTF/icu/unicode/usearch.h
Source/WTF/icu/unicode/uset.h
Source/WTF/icu/unicode/usetiter.h
Source/WTF/icu/unicode/ushape.h
Source/WTF/icu/unicode/uspoof.h
Source/WTF/icu/unicode/usprep.h
Source/WTF/icu/unicode/ustdio.h
Source/WTF/icu/unicode/ustream.h
Source/WTF/icu/unicode/ustring.h
Source/WTF/icu/unicode/ustringtrie.h
Source/WTF/icu/unicode/utext.h
Source/WTF/icu/unicode/utf.h
Source/WTF/icu/unicode/utf16.h
Source/WTF/icu/unicode/utf32.h
Source/WTF/icu/unicode/utf8.h
Source/WTF/icu/unicode/utf_old.h
Source/WTF/icu/unicode/utmscale.h
Source/WTF/icu/unicode/utrace.h
Source/WTF/icu/unicode/utrans.h
Source/WTF/icu/unicode/utypes.h
Source/WTF/icu/unicode/uvernum.h
Source/WTF/icu/unicode/uversion.h
Source/WTF/icu/unicode/vtzone.h
Source/WTF/wtf/text/AtomString.h
Source/WTF/wtf/text/WTFString.h
Source/WTF/wtf/text/cocoa/StringCocoa.mm
Source/WTF/wtf/text/cocoa/StringViewCocoa.mm
Source/WebCore/ChangeLog
Source/WebCore/PlatformMac.cmake
Source/WebCore/WebCore.xcodeproj/project.pbxproj
Source/WebCore/editing/cocoa/DataDetection.mm
Source/WebCore/icu/LICENSE [deleted file]
Source/WebCore/icu/README [deleted file]
Source/WebCore/page/ios/FrameIOS.mm
Source/WebCore/platform/cocoa/KeyEventCocoa.mm
Source/WebCore/platform/cocoa/TelephoneNumberDetectorCocoa.cpp
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm
Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp
Source/WebCore/platform/graphics/mac/ComplexTextControllerCoreText.mm
Source/WebCore/platform/graphics/mac/GlyphPageMac.cpp
Source/WebCore/platform/text/CharacterProperties.h
Source/WebKit/ChangeLog
Source/WebKit/WebProcess/InjectedBundle/API/mac/WKDOMTextIterator.mm
Source/WebKitLegacy/mac/ChangeLog
Source/WebKitLegacy/mac/Misc/WebKitNSStringExtras.mm
Source/WebKitLegacy/mac/WebCoreSupport/WebVisitedLinkStore.mm
Source/WebKitLegacy/mac/WebView/WebTextIterator.mm
Source/cmake/OptionsAppleWin.cmake
Source/cmake/OptionsCommon.cmake
Source/cmake/OptionsFTW.cmake
Source/cmake/OptionsGTK.cmake
Source/cmake/OptionsJSCOnly.cmake
Source/cmake/OptionsMac.cmake
Source/cmake/OptionsPlayStation.cmake
Source/cmake/OptionsWPE.cmake
Source/cmake/OptionsWinCairo.cmake
Tools/ChangeLog
Tools/DumpRenderTree/TestRunner.cpp
Tools/TestWebKitAPI/Tests/WTF/StringConcatenate.cpp
Tools/TestWebKitAPI/Tests/WebCore/LineBreaking.mm

index 18869b3c058b0f38a22031bdf39b0535d773eba8..2f70612de671e9a9ea4ff35d9a825bb059c80453 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2020-04-06  Ross Kirsling  <ross.kirsling@sony.com>
+
+        Update minimum ICU version to 60.2
+        https://bugs.webkit.org/show_bug.cgi?id=209694
+
+        Reviewed by Darin Adler.
+
+        * Source/cmake/OptionsAppleWin.cmake:
+        * Source/cmake/OptionsCommon.cmake:
+        * Source/cmake/OptionsFTW.cmake:
+        * Source/cmake/OptionsGTK.cmake:
+        * Source/cmake/OptionsJSCOnly.cmake:
+        * Source/cmake/OptionsMac.cmake:
+        * Source/cmake/OptionsPlayStation.cmake:
+        * Source/cmake/OptionsWPE.cmake:
+        * Source/cmake/OptionsWinCairo.cmake:
+        Indicate 60.2 as minimum version (as required by GTK for supporting Ubuntu 18.04 LTS).
+        Also ensure that the C++ API is hidden for all platforms.
+
 2020-04-05  Don Olmstead  <don.olmstead@sony.com>
 
         [CMake] Use WEBKIT_EXECUTABLE in MiniBrowser
index 7941a2b0205bc3427f21c10aee740441e7d9e8ce..f65dc941852944fc0a44b39330d0739a1c19aa9f 100644 (file)
@@ -1,3 +1,37 @@
+2020-04-06  Ross Kirsling  <ross.kirsling@sony.com>
+
+        Update minimum ICU version to 60.2
+        https://bugs.webkit.org/show_bug.cgi?id=209694
+
+        Reviewed by Darin Adler.
+
+        * icu/LICENSE: Deleted.
+        * icu/README: Deleted.
+        Remove leftover files following r219155.
+
+        * runtime/IntlDateTimeFormat.cpp:
+        (JSC::IntlDateTimeFormat::UFieldPositionIteratorDeleter::operator() const):
+        (JSC::IntlDateTimeFormat::partTypeString):
+        (JSC::IntlDateTimeFormat::formatToParts):
+        * runtime/IntlDateTimeFormat.h:
+        * runtime/IntlDateTimeFormatPrototype.cpp:
+        (JSC::IntlDateTimeFormatPrototype::finishCreation):
+        (JSC::IntlDateTimeFormatPrototypeFuncFormatToParts):
+        * runtime/IntlNumberFormat.cpp:
+        (JSC::IntlNumberFormat::partTypeString):
+        (JSC::IntlNumberFormat::formatToParts):
+        * runtime/IntlNumberFormat.h:
+        * runtime/IntlNumberFormatPrototype.cpp:
+        (JSC::IntlNumberFormatPrototype::finishCreation):
+        (JSC::IntlNumberFormatPrototypeFuncFormatToParts):
+        * runtime/IntlPluralRules.cpp:
+        (JSC::IntlPluralRules::resolvedOptions):
+        (JSC::IntlPluralRules::select):
+        * runtime/IntlPluralRules.h:
+        * runtime/JSGlobalObjectFunctions.cpp:
+        (JSC::decode):
+        Remove obsoleted compile-time version checks.
+
 2020-04-06  Fujii Hironori  <Hironori.Fujii@sony.com>
 
         [Clang 10] Fix -Wimplicit-int-float-conversion compilation warnings in JavaScriptCore
diff --git a/Source/JavaScriptCore/icu/LICENSE b/Source/JavaScriptCore/icu/LICENSE
deleted file mode 100644 (file)
index d6f0eeb..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-COPYRIGHT AND PERMISSION NOTICE
-
-Copyright (c) 1995-2015 International Business Machines Corporation and others
-
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this
-software and associated documentation files (the "Software"), to deal in the Software
-without restriction, including without limitation the rights to use, copy, modify,
-merge, publish, distribute, and/or sell copies of the Software, and to permit persons
-to whom the Software is furnished to do so, provided that the above copyright notice(s)
-and this permission notice appear in all copies of the Software and that both the above
-copyright notice(s) and this permission notice appear in supporting documentation.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER
-OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR
-CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
-PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
-OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-Except as contained in this notice, the name of a copyright holder shall not be used in
-advertising or otherwise to promote the sale, use or other dealings in this Software
-without prior written authorization of the copyright holder.
diff --git a/Source/JavaScriptCore/icu/README b/Source/JavaScriptCore/icu/README
deleted file mode 100644 (file)
index 326efe1..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-The headers in this directory are for compiling on Mac OS X 10.4 and newer.
-The Mac OS X 10.4 and subsequent releases include the ICU binary, but not ICU headers.
-
-For other platforms, installed ICU headers should be used rather than these.
-They are specific to the Mac OS X platform.
-
-The headers here are from ICU version 55.1 downloaded from the ICU project.
-http://site.icu-project.org/download/55#TOC-ICU4C-Download
-
-The following changes are needed again if you update the files:
-utypes.h:62 U_SHOW_CPLUSPLUS_API 0
-uconfig.h:90 U_DISABLE_RENAMING 1
index 9817a45ea2f3a22844ed3e56816cff94eb051423..77a28d3bf5d94df1a73f4dfcb5d4a43d3e29383c 100644 (file)
 #include <unicode/ucal.h>
 #include <unicode/udatpg.h>
 #include <unicode/uenum.h>
-#include <wtf/text/StringBuilder.h>
-
-#if JSC_ICU_HAS_UFIELDPOSITER
 #include <unicode/ufieldpositer.h>
-#endif
+#include <wtf/text/StringBuilder.h>
 
 namespace JSC {
 
@@ -65,13 +62,11 @@ void IntlDateTimeFormat::UDateFormatDeleter::operator()(UDateFormat* dateFormat)
         udat_close(dateFormat);
 }
 
-#if JSC_ICU_HAS_UFIELDPOSITER
 void IntlDateTimeFormat::UFieldPositionIteratorDeleter::operator()(UFieldPositionIterator* iterator) const
 {
     if (iterator)
         ufieldpositer_close(iterator);
 }
-#endif
 
 IntlDateTimeFormat* IntlDateTimeFormat::create(VM& vm, Structure* structure)
 {
@@ -913,7 +908,6 @@ JSValue IntlDateTimeFormat::format(JSGlobalObject* globalObject, double value)
     return jsString(vm, String(result.data(), resultLength));
 }
 
-#if JSC_ICU_HAS_UFIELDPOSITER
 ASCIILiteral IntlDateTimeFormat::partTypeString(UDateFormatField field)
 {
     switch (field) {
@@ -943,10 +937,8 @@ ASCIILiteral IntlDateTimeFormat::partTypeString(UDateFormatField field)
     case UDAT_STANDALONE_DAY_FIELD:
         return "weekday"_s;
     case UDAT_AM_PM_FIELD:
-#if U_ICU_VERSION_MAJOR_NUM >= 57
     case UDAT_AM_PM_MIDNIGHT_NOON_FIELD:
     case UDAT_FLEXIBLE_DAY_PERIOD_FIELD:
-#endif
         return "dayPeriod"_s;
     case UDAT_TIMEZONE_FIELD:
     case UDAT_TIMEZONE_RFC_FIELD:
@@ -969,9 +961,6 @@ ASCIILiteral IntlDateTimeFormat::partTypeString(UDateFormatField field)
     case UDAT_STANDALONE_QUARTER_FIELD:
     case UDAT_RELATED_YEAR_FIELD:
     case UDAT_TIME_SEPARATOR_FIELD:
-#if U_ICU_VERSION_MAJOR_NUM < 58 || !defined(U_HIDE_DEPRECATED_API)
-    case UDAT_FIELD_COUNT:
-#endif
     // Any newer additions to the UDateFormatField enum should just be considered an "unknown" part.
     default:
         return "unknown"_s;
@@ -1047,7 +1036,6 @@ JSValue IntlDateTimeFormat::formatToParts(JSGlobalObject* globalObject, double v
 
     return parts;
 }
-#endif
 
 } // namespace JSC
 
index c9668a1d873be2237251ffde7bb777681c65df8a..eeb3ee747c56dcfc81abe2494db623b5cd08218f 100644 (file)
@@ -31,8 +31,6 @@
 #include <unicode/udat.h>
 #include <unicode/uvernum.h>
 
-#define JSC_ICU_HAS_UFIELDPOSITER (U_ICU_VERSION_MAJOR_NUM >= 55)
-
 namespace JSC {
 
 class IntlDateTimeFormatConstructor;
@@ -62,9 +60,7 @@ public:
 
     void initializeDateTimeFormat(JSGlobalObject*, JSValue locales, JSValue options);
     JSValue format(JSGlobalObject*, double value);
-#if JSC_ICU_HAS_UFIELDPOSITER
     JSValue formatToParts(JSGlobalObject*, double value);
-#endif
     JSObject* resolvedOptions(JSGlobalObject*);
 
     JSBoundFunction* boundFormat() const { return m_boundFormat.get(); }
@@ -120,13 +116,11 @@ private:
     TimeZoneName m_timeZoneName { TimeZoneName::None };
     bool m_initializedDateTimeFormat { false };
 
-#if JSC_ICU_HAS_UFIELDPOSITER
     struct UFieldPositionIteratorDeleter {
         void operator()(UFieldPositionIterator*) const;
     };
 
     static ASCIILiteral partTypeString(UDateFormatField);
-#endif
 };
 
 } // namespace JSC
index 178b1193e402b97a6f9a9821480d6b71db2c09bf..e724358de04e52fefd5e380752ddb1f39c316cd7 100644 (file)
@@ -42,9 +42,7 @@
 namespace JSC {
 
 static EncodedJSValue JSC_HOST_CALL IntlDateTimeFormatPrototypeGetterFormat(JSGlobalObject*, CallFrame*);
-#if JSC_ICU_HAS_UFIELDPOSITER
 static EncodedJSValue JSC_HOST_CALL IntlDateTimeFormatPrototypeFuncFormatToParts(JSGlobalObject*, CallFrame*);
-#endif
 static EncodedJSValue JSC_HOST_CALL IntlDateTimeFormatPrototypeFuncResolvedOptions(JSGlobalObject*, CallFrame*);
 
 }
@@ -82,13 +80,8 @@ IntlDateTimeFormatPrototype::IntlDateTimeFormatPrototype(VM& vm, Structure* stru
 void IntlDateTimeFormatPrototype::finishCreation(VM& vm, JSGlobalObject* globalObject, Structure*)
 {
     Base::finishCreation(vm);
-#if JSC_ICU_HAS_UFIELDPOSITER
     JSFunction* formatToPartsFunction = JSFunction::create(vm, globalObject, 1, vm.propertyNames->formatToParts.string(), IntlDateTimeFormatPrototypeFuncFormatToParts);
     putDirectWithoutTransition(vm, vm.propertyNames->formatToParts, formatToPartsFunction, static_cast<unsigned>(PropertyAttribute::DontEnum));
-#else
-    UNUSED_PARAM(globalObject);
-#endif
-
     putDirectWithoutTransition(vm, vm.propertyNames->toStringTagSymbol, jsNontrivialString(vm, "Object"_s), PropertyAttribute::DontEnum | PropertyAttribute::ReadOnly);
 }
 
@@ -152,7 +145,6 @@ EncodedJSValue JSC_HOST_CALL IntlDateTimeFormatPrototypeGetterFormat(JSGlobalObj
     return JSValue::encode(boundFormat);
 }
 
-#if JSC_ICU_HAS_UFIELDPOSITER
 EncodedJSValue JSC_HOST_CALL IntlDateTimeFormatPrototypeFuncFormatToParts(JSGlobalObject* globalObject, CallFrame* callFrame)
 {
     VM& vm = globalObject->vm();
@@ -177,7 +169,6 @@ EncodedJSValue JSC_HOST_CALL IntlDateTimeFormatPrototypeFuncFormatToParts(JSGlob
 
     RELEASE_AND_RETURN(scope, JSValue::encode(dateTimeFormat->formatToParts(globalObject, value)));
 }
-#endif
 
 EncodedJSValue JSC_HOST_CALL IntlDateTimeFormatPrototypeFuncResolvedOptions(JSGlobalObject* globalObject, CallFrame* callFrame)
 {
index 7903db1eab8fe024130c0cc82684e95a286588a9..bf6d2c1c99ada5e81ea0eab14691cb22481d79c8 100644 (file)
 #include "JSBoundFunction.h"
 #include "JSCInlines.h"
 #include "ObjectConstructor.h"
-
-#if HAVE(ICU_FORMAT_DOUBLE_FOR_FIELDS)
 #include <unicode/ufieldpositer.h>
-#endif
 
 namespace JSC {
 
@@ -430,7 +427,6 @@ void IntlNumberFormat::setBoundFormat(VM& vm, JSBoundFunction* format)
     m_boundFormat.set(vm, this, format);
 }
 
-#if HAVE(ICU_FORMAT_DOUBLE_FOR_FIELDS)
 void IntlNumberFormat::UFieldPositionIteratorDeleter::operator()(UFieldPositionIterator* iterator) const
 {
     if (iterator)
@@ -464,9 +460,6 @@ ASCIILiteral IntlNumberFormat::partTypeString(UNumberFormatFields field, double
     case UNUM_EXPONENT_SYMBOL_FIELD:
     case UNUM_EXPONENT_SIGN_FIELD:
     case UNUM_EXPONENT_FIELD:
-#if !defined(U_HIDE_DEPRECATED_API)
-    case UNUM_FIELD_COUNT:
-#endif
     // Any newer additions to the UNumberFormatFields enum should just be considered an "unknown" part.
     default:
         return "unknown"_s;
@@ -544,7 +537,6 @@ JSValue IntlNumberFormat::formatToParts(JSGlobalObject* globalObject, double val
 
     return parts;
 }
-#endif
 
 } // namespace JSC
 
index d89b1c52ea7b1d48bc2de68e94c90754ea44a031..f328b0b2d671be40056520590f483221630fbbc4 100644 (file)
@@ -31,8 +31,6 @@
 #include <unicode/unum.h>
 #include <unicode/uvernum.h>
 
-#define HAVE_ICU_FORMAT_DOUBLE_FOR_FIELDS (U_ICU_VERSION_MAJOR_NUM >= 59)
-
 namespace JSC {
 
 class IntlNumberFormatConstructor;
@@ -62,9 +60,7 @@ public:
 
     void initializeNumberFormat(JSGlobalObject*, JSValue locales, JSValue optionsValue);
     JSValue formatNumber(JSGlobalObject*, double number);
-#if HAVE(ICU_FORMAT_DOUBLE_FOR_FIELDS)
     JSValue formatToParts(JSGlobalObject*, double value);
-#endif
     JSObject* resolvedOptions(JSGlobalObject*);
 
     JSBoundFunction* boundFormat() const { return m_boundFormat.get(); }
@@ -101,7 +97,6 @@ private:
     bool m_useGrouping { true };
     bool m_initializedNumberFormat { false };
 
-#if HAVE(ICU_FORMAT_DOUBLE_FOR_FIELDS)
     struct UFieldPositionIteratorDeleter {
         void operator()(UFieldPositionIterator*) const;
     };
@@ -116,7 +111,6 @@ private:
     };
 
     static ASCIILiteral partTypeString(UNumberFormatFields, double);
-#endif
 };
 
 } // namespace JSC
index 7b5c777769b025a51eee6b6423ea540e6142ecd7..519019aff392570c2bfbc4a5b18d07b846037477 100644 (file)
@@ -40,9 +40,7 @@
 namespace JSC {
 
 static EncodedJSValue JSC_HOST_CALL IntlNumberFormatPrototypeGetterFormat(JSGlobalObject*, CallFrame*);
-#if HAVE(ICU_FORMAT_DOUBLE_FOR_FIELDS)
 static EncodedJSValue JSC_HOST_CALL IntlNumberFormatPrototypeFuncFormatToParts(JSGlobalObject*, CallFrame*);
-#endif
 static EncodedJSValue JSC_HOST_CALL IntlNumberFormatPrototypeFuncResolvedOptions(JSGlobalObject*, CallFrame*);
 
 }
@@ -80,12 +78,7 @@ IntlNumberFormatPrototype::IntlNumberFormatPrototype(VM& vm, Structure* structur
 void IntlNumberFormatPrototype::finishCreation(VM& vm, JSGlobalObject* globalObject, Structure*)
 {
     Base::finishCreation(vm);
-#if HAVE(ICU_FORMAT_DOUBLE_FOR_FIELDS)
     JSC_NATIVE_FUNCTION_WITHOUT_TRANSITION(vm.propertyNames->formatToParts, IntlNumberFormatPrototypeFuncFormatToParts, static_cast<unsigned>(PropertyAttribute::DontEnum), 1);
-#else
-    UNUSED_PARAM(globalObject);
-#endif
-
     putDirectWithoutTransition(vm, vm.propertyNames->toStringTagSymbol, jsNontrivialString(vm, "Object"_s), PropertyAttribute::DontEnum | PropertyAttribute::ReadOnly);
 }
 
@@ -145,7 +138,6 @@ EncodedJSValue JSC_HOST_CALL IntlNumberFormatPrototypeGetterFormat(JSGlobalObjec
     return JSValue::encode(boundFormat);
 }
 
-#if HAVE(ICU_FORMAT_DOUBLE_FOR_FIELDS)
 EncodedJSValue JSC_HOST_CALL IntlNumberFormatPrototypeFuncFormatToParts(JSGlobalObject* globalObject, CallFrame* callFrame)
 {
     VM& vm = globalObject->vm();
@@ -163,7 +155,6 @@ EncodedJSValue JSC_HOST_CALL IntlNumberFormatPrototypeFuncFormatToParts(JSGlobal
 
     RELEASE_AND_RETURN(scope, JSValue::encode(numberFormat->formatToParts(globalObject, value)));
 }
-#endif
 
 EncodedJSValue JSC_HOST_CALL IntlNumberFormatPrototypeFuncResolvedOptions(JSGlobalObject* globalObject, CallFrame* callFrame)
 {
index de27ea4180f78231ae260fb99e495bb63c20cca7..d8b3b5d81a974215c856ffc349f38c62d996bffc 100644 (file)
@@ -212,7 +212,6 @@ JSObject* IntlPluralRules::resolvedOptions(JSGlobalObject* globalObject)
         options->putDirect(vm, Identifier::fromString(vm, "maximumSignificantDigits"), jsNumber(m_maximumSignificantDigits.value()));
     }
 
-#if HAVE(ICU_PLURALRULES_KEYWORDS)
     JSArray* categories = JSArray::tryCreate(vm, globalObject->arrayStructureForIndexingTypeDuringAllocation(ArrayWithContiguous), 0);
     if (UNLIKELY(!categories)) {
         throwOutOfMemoryError(globalObject, scope);
@@ -232,7 +231,6 @@ JSObject* IntlPluralRules::resolvedOptions(JSGlobalObject* globalObject)
         RETURN_IF_EXCEPTION(scope, { });
     }
     options->putDirect(vm, Identifier::fromString(vm, "pluralCategories"), categories);
-#endif
 
     RELEASE_AND_RETURN(scope, options);
 }
@@ -250,35 +248,11 @@ JSValue IntlPluralRules::select(JSGlobalObject* globalObject, double value)
     if (!std::isfinite(value))
         return jsNontrivialString(vm, "other"_s);
 
-#if HAVE(ICU_PLURALRULES_WITH_FORMAT)
     UErrorCode status = U_ZERO_ERROR;
     Vector<UChar, 8> result(8);
     auto length = uplrules_selectWithFormat(m_pluralRules.get(), value, m_numberFormat.get(), result.data(), result.size(), &status);
     if (U_FAILURE(status))
         return throwTypeError(globalObject, scope, "failed to select plural value"_s);
-#else
-    UErrorCode status = U_ZERO_ERROR;
-    Vector<UChar, 32> buffer(32);
-    auto length = unum_formatDouble(m_numberFormat.get(), value, buffer.data(), buffer.size(), nullptr, &status);
-    if (status == U_BUFFER_OVERFLOW_ERROR) {
-        buffer.grow(length);
-        status = U_ZERO_ERROR;
-        unum_formatDouble(m_numberFormat.get(), value, buffer.data(), length, nullptr, &status);
-    }
-    if (U_FAILURE(status))
-        return throwTypeError(globalObject, scope, "failed to select plural value"_s);
-
-    double formatted = unum_parseDouble(m_numberFormat.get(), buffer.data(), length, nullptr, &status);
-    if (U_FAILURE(status))
-        return throwTypeError(globalObject, scope, "failed to select plural value"_s);
-
-    // Can only be 'zero', 'one', 'two', 'few', 'many' or 'other'
-    status = U_ZERO_ERROR;
-    Vector<UChar, 8> result(8);
-    length = uplrules_select(m_pluralRules.get(), formatted, result.data(), result.size(), &status);
-    if (U_FAILURE(status))
-        return throwTypeError(globalObject, scope, "failed to select plural value"_s);
-#endif
 
     return jsString(vm, String(result.data(), length));
 }
index 706b98624a2ce082fd3ffa61f0ee6b23ee445399..b41cc24c0ca3e547f90bf2e1efbcdee562517bf5 100644 (file)
@@ -32,9 +32,6 @@
 #include <unicode/upluralrules.h>
 #include <unicode/uvernum.h>
 
-#define HAVE_ICU_PLURALRULES_KEYWORDS (U_ICU_VERSION_MAJOR_NUM >= 59)
-#define HAVE_ICU_PLURALRULES_WITH_FORMAT (U_ICU_VERSION_MAJOR_NUM >= 59)
-
 namespace JSC {
 
 class IntlPluralRulesConstructor;
index 9ba8c70d76a742eeb571678cc93dbacb4793944e..75cfe5afdbb75fa901095ea74b285f6a3cc3da95 100644 (file)
@@ -183,12 +183,7 @@ static JSValue decode(JSGlobalObject* globalObject, const CharType* characters,
                 const int sequenceLen = 1 + U8_COUNT_TRAIL_BYTES(b0);
                 if (k <= length - sequenceLen * 3) {
                     charLen = sequenceLen * 3;
-#if U_ICU_VERSION_MAJOR_NUM >= 60
                     uint8_t sequence[U8_MAX_LENGTH];
-#else
-                    // In pre-60 ICU, U8_COUNT_TRAIL_BYTES returns 0..5
-                    uint8_t sequence[6];
-#endif
                     sequence[0] = b0;
                     for (int i = 1; i < sequenceLen; ++i) {
                         const CharType* q = p + i * 3;
index 53a100f5613833602eb5b0654710daab12fb600b..cea450eac21d589b6a996b4e2841ce16ea55c4a9 100644 (file)
@@ -1,3 +1,32 @@
+2020-04-06  Ross Kirsling  <ross.kirsling@sony.com>
+
+        Update minimum ICU version to 60.2
+        https://bugs.webkit.org/show_bug.cgi?id=209694
+
+        Reviewed by Darin Adler.
+
+        This patch has two immediate motivations:
+          1. To properly introduce a minimum ICU version for WebKit as a whole
+             (responding to a pain point identified in bug 209579)
+          2. To support the development of ECMA-402 Intl API features, which JSC is quite behind on
+             (and which often boil down to exposing ICU functionality to JavaScript)
+
+        * icu/LICENSE:
+        * icu/README:
+        * icu/unicode/:
+        Update ICU headers to major version 62, the version included in macOS Mojave.
+
+        * wtf/text/AtomString.h:
+        * wtf/text/WTFString.h:
+        Remove obsoleted compile-time version checks.
+
+        * wtf/text/cocoa/StringCocoa.mm:
+        (WTF::String::String):
+        * wtf/text/cocoa/StringViewCocoa.mm:
+        (WTF::StringView::createNSString const):
+        (WTF::StringView::createNSStringWithoutCopying const):
+        Manually convert between UChar and UniChar/unichar where needed.
+
 2020-04-06  Saam Barati  <sbarati@apple.com>
 
         Implement 1GB of executable memory on arm64
index d6f0eebbc659018dd0c94e4a285ce7cf768d8cce..c26de5c5842bdd94ed653d3ae2b3c2a117a342f4 100644 (file)
@@ -1,25 +1,33 @@
-COPYRIGHT AND PERMISSION NOTICE
+COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later)
 
-Copyright (c) 1995-2015 International Business Machines Corporation and others
+Copyright © 1991-2018 Unicode, Inc. All rights reserved.
+Distributed under the Terms of Use in http://www.unicode.org/copyright.html.
 
-All rights reserved.
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Unicode data files and any associated documentation
+(the "Data Files") or Unicode software and any associated documentation
+(the "Software") to deal in the Data Files or Software
+without restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, and/or sell copies of
+the Data Files or Software, and to permit persons to whom the Data Files
+or Software are furnished to do so, provided that either
+(a) this copyright and permission notice appear with all copies
+of the Data Files or Software, or
+(b) this copyright and permission notice appear in associated
+Documentation.
 
-Permission is hereby granted, free of charge, to any person obtaining a copy of this
-software and associated documentation files (the "Software"), to deal in the Software
-without restriction, including without limitation the rights to use, copy, modify,
-merge, publish, distribute, and/or sell copies of the Software, and to permit persons
-to whom the Software is furnished to do so, provided that the above copyright notice(s)
-and this permission notice appear in all copies of the Software and that both the above
-copyright notice(s) and this permission notice appear in supporting documentation.
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THE DATA FILES OR SOFTWARE.
 
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER
-OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR
-CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
-PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
-OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-Except as contained in this notice, the name of a copyright holder shall not be used in
-advertising or otherwise to promote the sale, use or other dealings in this Software
-without prior written authorization of the copyright holder.
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale,
+use or other dealings in these Data Files or Software without prior
+written authorization of the copyright holder.
index 326efe1798645095e9a6c4ec3a29cd2d4914b12f..8fe171a5687e70f81e285fdeeda8b810d356ced0 100644 (file)
@@ -1,12 +1,8 @@
-The headers in this directory are for compiling on Mac OS X 10.4 and newer.
-The Mac OS X 10.4 and subsequent releases include the ICU binary, but not ICU headers.
+The headers in this directory are for compiling on macOS 10.14 (Mojave) and newer.
+macOS releases include the ICU binary, but not ICU headers.
 
 For other platforms, installed ICU headers should be used rather than these.
-They are specific to the Mac OS X platform.
+They are specific to the macOS platform.
 
-The headers here are from ICU version 55.1 downloaded from the ICU project.
-http://site.icu-project.org/download/55#TOC-ICU4C-Download
-
-The following changes are needed again if you update the files:
-utypes.h:62 U_SHOW_CPLUSPLUS_API 0
-uconfig.h:90 U_DISABLE_RENAMING 1
+The headers here are from ICU version 62 downloaded from the ICU project.
+http://site.icu-project.org/download/62#TOC-ICU4C-Download
index 1c73aca7ad16956ed2189f7135564e5a3c9d04bc..fcd42072ca0158c0e12c081420873125cf8695eb 100644 (file)
@@ -1,7 +1,4 @@
 datefmt.h svn-properties=allow-tabs=on
-decimfmt.h svn-properties=allow-tabs=on
 dtitvfmt.h svn-properties=allow-tabs=on
-dtptngen.h svn-properties=allow-tabs=on
-numfmt.h svn-properties=allow-tabs=on
 plurfmt.h svn-properties=allow-tabs=on
 usprep.h svn-properties=allow-tabs=on
index 7969962e55de11a79806f1c0a307263b5958fccd..1442f754e46d759f1f10856f3b9e95d3d9d1cabf 100644 (file)
@@ -1,3 +1,5 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 *******************************************************************************
 *
@@ -13,6 +15,7 @@
 #include "unicode/utypes.h"
 #include "unicode/uobject.h"
 #include "unicode/locid.h"
+#include "unicode/unistr.h"
 
 #if !UCONFIG_NO_COLLATION
 
index a6a83b15cf97193b2dc691f90cbcaa91928ddb7f..8512c2f30311b8d1bc1b8a8e467ddadc3828d42f 100644 (file)
@@ -1,10 +1,12 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 *******************************************************************************
 *   Copyright (C) 2011-2012, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *******************************************************************************
 *   file name:  appendable.h
-*   encoding:   US-ASCII
+*   encoding:   UTF-8
 *   tab size:   8 (not used)
 *   indentation:4
 *
@@ -17,7 +19,7 @@
 
 /**
  * \file
- * \brief C++ API: Appendable class: Sink for Unicode code points and 16-bit code units (UChars).
+ * \brief C++ API: Appendable class: Sink for Unicode code points and 16-bit code units (char16_ts).
  */
 
 #include "unicode/utypes.h"
@@ -32,10 +34,10 @@ class UnicodeString;
  * Combines elements of Java Appendable and ICU4C ByteSink.
  *
  * This class can be used in APIs where it does not matter whether the actual destination is
- * a UnicodeString, a UChar[] array, a UnicodeSet, or any other object
+ * a UnicodeString, a char16_t[] array, a UnicodeSet, or any other object
  * that receives and processes characters and/or strings.
  *
- * Implementation classes must implement at least appendCodeUnit(UChar).
+ * Implementation classes must implement at least appendCodeUnit(char16_t).
  * The base class provides default implementations for the other methods.
  *
  * The methods do not take UErrorCode parameters.
@@ -60,11 +62,11 @@ public:
      * @return TRUE if the operation succeeded
      * @stable ICU 4.8
      */
-    virtual UBool appendCodeUnit(UChar c) = 0;
+    virtual UBool appendCodeUnit(char16_t c) = 0;
 
     /**
      * Appends a code point.
-     * The default implementation calls appendCodeUnit(UChar) once or twice.
+     * The default implementation calls appendCodeUnit(char16_t) once or twice.
      * @param c code point 0..0x10ffff
      * @return TRUE if the operation succeeded
      * @stable ICU 4.8
@@ -73,20 +75,20 @@ public:
 
     /**
      * Appends a string.
-     * The default implementation calls appendCodeUnit(UChar) for each code unit.
+     * The default implementation calls appendCodeUnit(char16_t) for each code unit.
      * @param s string, must not be NULL if length!=0
      * @param length string length, or -1 if NUL-terminated
      * @return TRUE if the operation succeeded
      * @stable ICU 4.8
      */
-    virtual UBool appendString(const UChar *s, int32_t length);
+    virtual UBool appendString(const char16_t *s, int32_t length);
 
     /**
      * Tells the object that the caller is going to append roughly
-     * appendCapacity UChars. A subclass might use this to pre-allocate
+     * appendCapacity char16_ts. A subclass might use this to pre-allocate
      * a larger buffer if necessary.
      * The default implementation does nothing. (It always returns TRUE.)
-     * @param appendCapacity estimated number of UChars that will be appended
+     * @param appendCapacity estimated number of char16_ts that will be appended
      * @return TRUE if the operation succeeded
      * @stable ICU 4.8
      */
@@ -100,19 +102,19 @@ public:
      * The returned buffer is only valid until the next operation
      * on this Appendable.
      *
-     * After writing at most *resultCapacity UChars, call appendString() with the
-     * pointer returned from this function and the number of UChars written.
-     * Many appendString() implementations will avoid copying UChars if this function
+     * After writing at most *resultCapacity char16_ts, call appendString() with the
+     * pointer returned from this function and the number of char16_ts written.
+     * Many appendString() implementations will avoid copying char16_ts if this function
      * returned an internal buffer.
      *
      * Partial usage example:
      * \code
      *  int32_t capacity;
-     *  UChar* buffer = app.getAppendBuffer(..., &capacity);
-     *  ... Write n UChars into buffer, with n <= capacity.
+     *  char16_t* buffer = app.getAppendBuffer(..., &capacity);
+     *  ... Write n char16_ts into buffer, with n <= capacity.
      *  app.appendString(buffer, n);
      * \endcode
-     * In many implementations, that call to append will avoid copying UChars.
+     * In many implementations, that call to append will avoid copying char16_ts.
      *
      * If the Appendable allocates or reallocates an internal buffer, it should use
      * the desiredCapacityHint if appropriate.
@@ -136,9 +138,9 @@ public:
      * @return a buffer with *resultCapacity>=minCapacity
      * @stable ICU 4.8
      */
-    virtual UChar *getAppendBuffer(int32_t minCapacity,
+    virtual char16_t *getAppendBuffer(int32_t minCapacity,
                                    int32_t desiredCapacityHint,
-                                   UChar *scratch, int32_t scratchCapacity,
+                                   char16_t *scratch, int32_t scratchCapacity,
                                    int32_t *resultCapacity);
 };
 
@@ -169,7 +171,7 @@ public:
      * @return TRUE if the operation succeeded
      * @stable ICU 4.8
      */
-    virtual UBool appendCodeUnit(UChar c);
+    virtual UBool appendCodeUnit(char16_t c);
 
     /**
      * Appends a code point to the string.
@@ -186,12 +188,12 @@ public:
      * @return TRUE if the operation succeeded
      * @stable ICU 4.8
      */
-    virtual UBool appendString(const UChar *s, int32_t length);
+    virtual UBool appendString(const char16_t *s, int32_t length);
 
     /**
      * Tells the UnicodeString that the caller is going to append roughly
-     * appendCapacity UChars.
-     * @param appendCapacity estimated number of UChars that will be appended
+     * appendCapacity char16_ts.
+     * @param appendCapacity estimated number of char16_ts that will be appended
      * @return TRUE if the operation succeeded
      * @stable ICU 4.8
      */
@@ -218,9 +220,9 @@ public:
      * @return a buffer with *resultCapacity>=minCapacity
      * @stable ICU 4.8
      */
-    virtual UChar *getAppendBuffer(int32_t minCapacity,
+    virtual char16_t *getAppendBuffer(int32_t minCapacity,
                                    int32_t desiredCapacityHint,
-                                   UChar *scratch, int32_t scratchCapacity,
+                                   char16_t *scratch, int32_t scratchCapacity,
                                    int32_t *resultCapacity);
 
 private:
index f1e477f4743894386f4dbb85525b73828fb022ff..3541207268ddfb0d8a6aadbb4b6c550f087ef0fd 100644 (file)
@@ -1,3 +1,5 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 *******************************************************************************
 * Copyright (C) 2007-2013, International Business Machines Corporation and
index 4aa5e552796090eaebcd7ce7b7d275aa8b3775b4..5faeedfa93ecb8e55efa52ee86c933d9c9f333fb 100644 (file)
@@ -1,6 +1,8 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 ********************************************************************************
-*   Copyright (C) 1997-2014, International Business Machines
+*   Copyright (C) 1997-2016, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 ********************************************************************************
 *
@@ -168,6 +170,11 @@ public:
     /**
      * Change the text over which this operates. The text boundary is
      * reset to the start.
+     *
+     * The BreakIterator will retain a reference to the supplied string.
+     * The caller must not modify or delete the text while the BreakIterator
+     * retains the reference.
+     *
      * @param text The UnicodeString used to change the text.
      * @stable ICU 2.0
      */
@@ -243,7 +250,7 @@ public:
     virtual int32_t next(void) = 0;
 
     /**
-     * Return character index of the current interator position within the text.
+     * Return character index of the current iterator position within the text.
      * @return The boundary most recently returned.
      * @stable ICU 2.0
      */
@@ -270,7 +277,7 @@ public:
     virtual int32_t preceding(int32_t offset) = 0;
 
     /**
-     * Return true if the specfied position is a boundary position.
+     * Return true if the specified position is a boundary position.
      * As a side effect, the current position of the iterator is set
      * to the first boundary position at or following the specified offset.
      * @param offset the offset to check.
@@ -285,21 +292,20 @@ public:
      * does nothing.  Negative values move to previous boundaries
      * and positive values move to later boundaries.
      * @return The new iterator position, or
-     * DONE if there are fewer than |n| boundaries in the specfied direction.
+     * DONE if there are fewer than |n| boundaries in the specified direction.
      * @stable ICU 2.0
      */
     virtual int32_t next(int32_t n) = 0;
 
    /**
-     * For RuleBasedBreakIterators, return the status tag from the 
-     * break rule that determined the most recently
-     * returned break position.
+     * For RuleBasedBreakIterators, return the status tag from the break rule
+     * that determined the boundary at the current iteration position.
      * <p>
      * For break iterator types that do not support a rule status,
      * a default value of 0 is returned.
      * <p>
-     * @return the status from the break rule that determined the most recently
-     *         returned break position.
+     * @return the status from the break rule that determined the boundary at
+     *         the current iteration position.
      * @see RuleBaseBreakIterator::getRuleStatus()
      * @see UWordBreak
      * @stable ICU 52
@@ -307,8 +313,8 @@ public:
     virtual int32_t getRuleStatus() const;
 
    /**
-    * For RuleBasedBreakIterators, get the status (tag) values from the break rule(s) 
-    * that determined the most recently returned break position.
+    * For RuleBasedBreakIterators, get the status (tag) values from the break rule(s)
+    * that determined the boundary at the current iteration position.
     * <p>
     * For break iterator types that do not support rule status,
     * no values are returned.
@@ -324,10 +330,10 @@ public:
     * @param fillInVec an array to be filled in with the status values.
     * @param capacity  the length of the supplied vector.  A length of zero causes
     *                  the function to return the number of status values, in the
-    *                  normal way, without attemtping to store any values.
+    *                  normal way, without attempting to store any values.
     * @param status    receives error codes.
     * @return          The number of rule status values from rules that determined
-    *                  the most recent boundary returned by the break iterator.
+    *                  the boundary at the current iteration position.
     *                  In the event of a U_BUFFER_OVERFLOW_ERROR, the return value
     *                  is the total number of status values that were available,
     *                  not the reduced number that were actually returned.
@@ -462,7 +468,7 @@ public:
     static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
 
     /**
-     * Get name of the object for the desired Locale, in the desired langauge.
+     * Get name of the object for the desired Locale, in the desired language.
      * @param objectLocale must be from getAvailableLocales.
      * @param displayLocale specifies the desired locale for output.
      * @param name the fill-in parameter of the return value
@@ -475,7 +481,7 @@ public:
                                          UnicodeString& name);
 
     /**
-     * Get name of the object for the desired Locale, in the langauge of the
+     * Get name of the object for the desired Locale, in the language of the
      * default locale.
      * @param objectLocale must be from getMatchingLocales
      * @param name the fill-in parameter of the return value
@@ -609,7 +615,7 @@ public:
     virtual BreakIterator &refreshInputText(UText *input, UErrorCode &status) = 0;
 
  private:
-    static BreakIterator* buildInstance(const Locale& loc, const char *type, int32_t kind, UErrorCode& status);
+    static BreakIterator* buildInstance(const Locale& loc, const char *type, UErrorCode& status);
     static BreakIterator* createInstance(const Locale& loc, int32_t kind, UErrorCode& status);
     static BreakIterator* makeInstance(const Locale& loc, int32_t kind, UErrorCode& status);
 
@@ -622,20 +628,19 @@ protected:
     /** @internal */
     BreakIterator();
     /** @internal */
-    BreakIterator (const BreakIterator &other) : UObject(other) {}
+    BreakIterator (const BreakIterator &other);
+#ifndef U_HIDE_INTERNAL_API
     /** @internal */
-    BreakIterator (const Locale& valid, const Locale& actual);
+    BreakIterator (const Locale& valid, const Locale &actual);
+    /** @internal. Assignment Operator, used by RuleBasedBreakIterator. */
+    BreakIterator &operator = (const BreakIterator &other);
+#endif  /* U_HIDE_INTERNAL_API */
+
 private:
 
-    /** @internal */
+    /** @internal (private) */
     char actualLocale[ULOC_FULLNAME_CAPACITY];
     char validLocale[ULOC_FULLNAME_CAPACITY];
-
-    /**
-     * The assignment operator has no real implementation.
-     * It's provided to make the compiler happy. Do not call.
-     */
-    BreakIterator& operator=(const BreakIterator&);
 };
 
 #ifndef U_HIDE_DEPRECATED_API
@@ -651,5 +656,5 @@ U_NAMESPACE_END
 
 #endif /* #if !UCONFIG_NO_BREAK_ITERATION */
 
-#endif // _BRKITER
+#endif // BRKITER_H
 //eof
index 174aa38afce0702014aba88e52937efe4abec125..6f61c384f795866b165ce95e9b5a26381f043a21 100644 (file)
@@ -1,3 +1,5 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 // Copyright (C) 2009-2012, International Business Machines
 // Corporation and others. All Rights Reserved.
 //
@@ -124,8 +126,8 @@ public:
   virtual void Flush();
 
 private:
-  ByteSink(const ByteSink &); // copy constructor not implemented
-  ByteSink &operator=(const ByteSink &); // assignment operator not implemented
+  ByteSink(const ByteSink &) = delete;
+  ByteSink &operator=(const ByteSink &) = delete;
 };
 
 // -------------------------------------------------------------
@@ -215,12 +217,11 @@ private:
   int32_t size_;
   int32_t appended_;
   UBool overflowed_;
-  CheckedArrayByteSink(); ///< default constructor not implemented 
-  CheckedArrayByteSink(const CheckedArrayByteSink &); ///< copy constructor not implemented
-  CheckedArrayByteSink &operator=(const CheckedArrayByteSink &); ///< assignment operator not implemented
-};
 
-#if U_HAVE_STD_STRING
+  CheckedArrayByteSink() = delete;
+  CheckedArrayByteSink(const CheckedArrayByteSink &) = delete;
+  CheckedArrayByteSink &operator=(const CheckedArrayByteSink &) = delete;
+};
 
 /** 
  * Implementation of ByteSink that writes to a "string".
@@ -236,6 +237,21 @@ class StringByteSink : public ByteSink {
    * @stable ICU 4.2
    */
   StringByteSink(StringClass* dest) : dest_(dest) { }
+#ifndef U_HIDE_DRAFT_API
+  /**
+   * Constructs a ByteSink that reserves append capacity and will append bytes to the dest string.
+   * 
+   * @param dest pointer to string object to append to
+   * @param initialAppendCapacity capacity beyond dest->length() to be reserve()d
+   * @draft ICU 60
+   */
+  StringByteSink(StringClass* dest, int32_t initialAppendCapacity) : dest_(dest) {
+    if (initialAppendCapacity > 0 &&
+        (uint32_t)initialAppendCapacity > (dest->capacity() - dest->length())) {
+      dest->reserve(dest->length() + initialAppendCapacity);
+    }
+  }
+#endif  // U_HIDE_DRAFT_API
   /**
    * Append "bytes[0,n-1]" to this.
    * @param data the pointer to the bytes
@@ -245,12 +261,11 @@ class StringByteSink : public ByteSink {
   virtual void Append(const char* data, int32_t n) { dest_->append(data, n); }
  private:
   StringClass* dest_;
-  StringByteSink(); ///< default constructor not implemented 
-  StringByteSink(const StringByteSink &); ///< copy constructor not implemented
-  StringByteSink &operator=(const StringByteSink &); ///< assignment operator not implemented
-};
 
-#endif
+  StringByteSink() = delete;
+  StringByteSink(const StringByteSink &) = delete;
+  StringByteSink &operator=(const StringByteSink &) = delete;
+};
 
 U_NAMESPACE_END
 
index 9c7782740dba2752b1f01264d3977ee615402007..c57b8ccfeb59600d9e8fe8ae690bddff9cafb7a8 100644 (file)
@@ -1,10 +1,12 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 *******************************************************************************
 *   Copyright (C) 2010-2012, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *******************************************************************************
 *   file name:  bytestrie.h
-*   encoding:   US-ASCII
+*   encoding:   UTF-8
 *   tab size:   8 (not used)
 *   indentation:4
 *
@@ -306,7 +308,7 @@ public:
          * @return The NUL-terminated byte sequence for the last successful next().
          * @stable ICU 4.8
          */
-        const StringPiece &getString() const { return sp_; }
+        StringPiece getString() const;
         /**
          * @return The value for the last successful next().
          * @stable ICU 4.8
@@ -325,7 +327,6 @@ public:
         int32_t initialRemainingMatchLength_;
 
         CharString *str_;
-        StringPiece sp_;
         int32_t maxLength_;
         int32_t value_;
 
index d00ab9b3b0947d0d05c8935f98efe15073da6218..2a1f28e6255d77fffc5083470d417b0bf3a90454 100644 (file)
@@ -1,10 +1,12 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 *******************************************************************************
-*   Copyright (C) 2010-2014, International Business Machines
+*   Copyright (C) 2010-2016, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *******************************************************************************
 *   file name:  bytestriebuilder.h
-*   encoding:   US-ASCII
+*   encoding:   UTF-8
 *   tab size:   8 (not used)
 *   indentation:4
 *
@@ -29,7 +31,6 @@ U_NAMESPACE_BEGIN
 
 class BytesTrieElement;
 class CharString;
-
 /**
  * Builder class for BytesTrie.
  *
@@ -65,7 +66,7 @@ public:
      * @return *this
      * @stable ICU 4.8
      */
-    BytesTrieBuilder &add(const StringPiece &s, int32_t value, UErrorCode &errorCode);
+    BytesTrieBuilder &add(StringPiece s, int32_t value, UErrorCode &errorCode);
 
     /**
      * Builds a BytesTrie for the add()ed data.
@@ -126,14 +127,14 @@ private:
     void buildBytes(UStringTrieBuildOption buildOption, UErrorCode &errorCode);
 
     virtual int32_t getElementStringLength(int32_t i) const;
-    virtual UChar getElementUnit(int32_t i, int32_t byteIndex) const;
+    virtual char16_t getElementUnit(int32_t i, int32_t byteIndex) const;
     virtual int32_t getElementValue(int32_t i) const;
 
     virtual int32_t getLimitOfLinearMatch(int32_t first, int32_t last, int32_t byteIndex) const;
 
     virtual int32_t countElementUnits(int32_t start, int32_t limit, int32_t byteIndex) const;
     virtual int32_t skipElementsBySomeUnits(int32_t i, int32_t byteIndex, int32_t count) const;
-    virtual int32_t indexOfElementWithNextUnit(int32_t i, int32_t byteIndex, UChar byte) const;
+    virtual int32_t indexOfElementWithNextUnit(int32_t i, int32_t byteIndex, char16_t byte) const;
 
     virtual UBool matchNodesCanHaveValues() const { return FALSE; }
 
@@ -142,7 +143,7 @@ private:
     virtual int32_t getMaxLinearMatchLength() const { return BytesTrie::kMaxLinearMatchLength; }
 
     /**
-     * @internal
+     * @internal (private)
      */
     class BTLinearMatchNode : public LinearMatchNode {
     public:
@@ -152,7 +153,7 @@ private:
     private:
         const char *s;
     };
-
+    
     virtual Node *createLinearMatchNode(int32_t i, int32_t byteIndex, int32_t length,
                                         Node *nextNode) const;
 
index bc7f05492defddabd4a47117962265267ae664d8..f478e5ca7dfa2375a570a0be3a0edac45420f5f3 100644 (file)
@@ -1,3 +1,5 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 ********************************************************************************
 *   Copyright (C) 1997-2014, International Business Machines
@@ -28,7 +30,7 @@
 #include "unicode/utypes.h"
 
 /**
- * \file 
+ * \file
  * \brief C++ API: Calendar object
  */
 #if !UCONFIG_NO_FORMATTING
@@ -135,7 +137,7 @@ class BasicTimeZone;
  * Calendar resolves the time using the UTC offset before the transition by default.
  * In this example, 1:30 AM is interpreted as 1:30 AM standard time (non-exist),
  * so the final result will be 2:30 AM daylight time.
- * 
+ *
  * <p>On the date switching back to standard time, wall clock time is moved back one
  * hour at 2:00 AM. So wall clock time from 1:00 AM to 1:59 AM occur twice. In this
  * case, the ICU Calendar resolves the time using the UTC offset after the transition
@@ -148,7 +150,7 @@ class BasicTimeZone;
  * <p>
  * <strong>Note:</strong> for some non-Gregorian calendars, different
  * fields may be necessary for complete disambiguation. For example, a full
- * specification of the historial Arabic astronomical calendar requires year,
+ * specification of the historical Arabic astronomical calendar requires year,
  * month, day-of-month <em>and</em> day-of-week in some cases.
  *
  * <p>
@@ -195,6 +197,19 @@ class BasicTimeZone;
  * should use the protected constants in <code>Calendar</code> to
  * specify an extremely early or extremely late date.</p>
  *
+ * <p>
+ * The Japanese calendar uses a combination of era name and year number.
+ * When an emperor of Japan abdicates and a new emperor ascends the throne,
+ * a new era is declared and year number is reset to 1. Even if the date of
+ * abdication is scheduled ahead of time, the new era name might not be
+ * announced until just before the date. In such case, ICU4C may include
+ * a start date of future era without actual era name, but not enabled
+ * by default. ICU4C users who want to test the behavior of the future era
+ * can enable the tentative era by:
+ * <ul>
+ * <li>Environment variable <code>ICU_ENABLE_TENTATIVE_ERA=true</code>.</li>
+ * </ul>
+ *
  * @stable ICU 2.0
  */
 class U_I18N_API Calendar : public UObject {
@@ -233,7 +248,7 @@ public:
         DST_OFFSET,           // Example: 0 or U_MILLIS_PER_HOUR
         YEAR_WOY,             // 'Y' Example: 1..big number - Year of Week of Year
         DOW_LOCAL,            // 'e' Example: 1..7 - Day of Week / Localized
-        
+
         EXTENDED_YEAR,
         JULIAN_DAY,
         MILLISECONDS_IN_DAY,
@@ -901,7 +916,7 @@ public:
     /**
      * Sets the behavior for handling wall time repeating multiple times
      * at negative time zone offset transitions. For example, 1:30 AM on
-     * November 6, 2011 in US Eastern time (Ameirca/New_York) occurs twice;
+     * November 6, 2011 in US Eastern time (America/New_York) occurs twice;
      * 1:30 AM EDT, then 1:30 AM EST one hour later. When <code>UCAL_WALLTIME_FIRST</code>
      * is used, the wall time 1:30AM in this example will be interpreted as 1:30 AM EDT
      * (first occurrence). When <code>UCAL_WALLTIME_LAST</code> is used, it will be
@@ -912,7 +927,7 @@ public:
      * option for this. When the argument is neither <code>UCAL_WALLTIME_FIRST</code>
      * nor <code>UCAL_WALLTIME_LAST</code>, this method has no effect and will keep
      * the current setting.
-     * 
+     *
      * @param option the behavior for handling repeating wall time, either
      * <code>UCAL_WALLTIME_FIRST</code> or <code>UCAL_WALLTIME_LAST</code>.
      * @see #getRepeatedWallTimeOption
@@ -923,7 +938,7 @@ public:
     /**
      * Gets the behavior for handling wall time repeating multiple times
      * at negative time zone offset transitions.
-     * 
+     *
      * @return the behavior for handling repeating wall time, either
      * <code>UCAL_WALLTIME_FIRST</code> or <code>UCAL_WALLTIME_LAST</code>.
      * @see #setRepeatedWallTimeOption
@@ -944,12 +959,12 @@ public:
      * <p>
      * <b>Note:</b>This option is effective only when this calendar is lenient.
      * When the calendar is strict, such non-existing wall time will cause an error.
-     * 
+     *
      * @param option the behavior for handling skipped wall time at positive time zone
      * offset transitions, one of <code>UCAL_WALLTIME_FIRST</code>, <code>UCAL_WALLTIME_LAST</code> and
      * <code>UCAL_WALLTIME_NEXT_VALID</code>.
      * @see #getSkippedWallTimeOption
-     * 
+     *
      * @stable ICU 49
      */
     void setSkippedWallTimeOption(UCalendarWallTimeOption option);
@@ -957,7 +972,7 @@ public:
     /**
      * Gets the behavior for handling skipped wall time at positive time zone offset
      * transitions.
-     * 
+     *
      * @return the behavior for handling skipped wall time, one of
      * <code>UCAL_WALLTIME_FIRST</code>, <code>UCAL_WALLTIME_LAST</code>
      * and <code>UCAL_WALLTIME_NEXT_VALID</code>.
@@ -1739,7 +1754,7 @@ protected:
      * reflects local zone wall time.
      * @internal
      */
-    int32_t computeMillisInDay();
+    double computeMillisInDay();
 
     /**
      * This method can assume EXTENDED_YEAR has been set.
@@ -1750,7 +1765,7 @@ protected:
      *          when this function fails.
      * @internal
      */
-    int32_t computeZoneOffset(double millis, int32_t millisInDay, UErrorCode &ec);
+    int32_t computeZoneOffset(double millis, double millisInDay, UErrorCode &ec);
 
 
     /**
@@ -2169,7 +2184,7 @@ private:
     TimeZone*   fZone;
 
     /**
-     * Option for rpeated wall time
+     * Option for repeated wall time
      * @see #setRepeatedWallTimeOption
      */
     UCalendarWallTimeOption fRepeatedWallTime;
@@ -2454,7 +2469,7 @@ private:
     BasicTimeZone* getBasicTimeZone() const;
 
     /**
-     * Find the previous zone transtion near the given time.
+     * Find the previous zone transition near the given time.
      * @param base The base time, inclusive
      * @param transitionTime Receives the result time
      * @param status The error status
index 3bd79f768e0b0577b0f23bd9d40bb3a4a3150222..9b21ba52d89855feaf029263a9f3a7c6a4a7e8e4 100644 (file)
@@ -1,3 +1,5 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
  *******************************************************************************
  * Copyright (C) 1996-2014, International Business Machines Corporation and
@@ -151,13 +153,13 @@ private:
 
     /**
      * Copy constructor. Private for now.
-     * @internal
+     * @internal (private)
      */
     CanonicalIterator(const CanonicalIterator& other);
 
     /**
      * Assignment operator. Private for now.
-     * @internal
+     * @internal (private)
      */
     CanonicalIterator& operator=(const CanonicalIterator& other);
 
@@ -185,7 +187,7 @@ private:
     UnicodeString *getEquivalents(const UnicodeString &segment, int32_t &result_len, UErrorCode &status); //private String[] getEquivalents(String segment)
 
     //Set getEquivalents2(String segment);
-    Hashtable *getEquivalents2(Hashtable *fillinResult, const UChar *segment, int32_t segLen, UErrorCode &status);
+    Hashtable *getEquivalents2(Hashtable *fillinResult, const char16_t *segment, int32_t segLen, UErrorCode &status);
     //Hashtable *getEquivalents2(const UnicodeString &segment, int32_t segLen, UErrorCode &status);
 
     /**
@@ -194,7 +196,7 @@ private:
      * If so, take the remainder, and return the equivalents
      */
     //Set extract(int comp, String segment, int segmentPos, StringBuffer buffer);
-    Hashtable *extract(Hashtable *fillinResult, UChar32 comp, const UChar *segment, int32_t segLen, int32_t segmentPos, UErrorCode &status);
+    Hashtable *extract(Hashtable *fillinResult, UChar32 comp, const char16_t *segment, int32_t segLen, int32_t segmentPos, UErrorCode &status);
     //Hashtable *extract(UChar32 comp, const UnicodeString &segment, int32_t segLen, int32_t segmentPos, UErrorCode &status);
 
     void cleanPieces();
diff --git a/Source/WTF/icu/unicode/casemap.h b/Source/WTF/icu/unicode/casemap.h
new file mode 100644 (file)
index 0000000..9d03a1a
--- /dev/null
@@ -0,0 +1,494 @@
+// © 2017 and later: Unicode, Inc. and others.\r
+// License & terms of use: http://www.unicode.org/copyright.html\r
+\r
+// casemap.h\r
+// created: 2017jan12 Markus W. Scherer\r
+\r
+#ifndef __CASEMAP_H__\r
+#define __CASEMAP_H__\r
+\r
+#include "unicode/utypes.h"\r
+#include "unicode/stringpiece.h"\r
+#include "unicode/uobject.h"\r
+\r
+/**\r
+ * \file\r
+ * \brief C++ API: Low-level C++ case mapping functions.\r
+ */\r
+\r
+U_NAMESPACE_BEGIN\r
+\r
+class BreakIterator;\r
+class ByteSink;\r
+class Edits;\r
+\r
+/**\r
+ * Low-level C++ case mapping functions.\r
+ *\r
+ * @stable ICU 59\r
+ */\r
+class U_COMMON_API CaseMap U_FINAL : public UMemory {\r
+public:\r
+    /**\r
+     * Lowercases a UTF-16 string and optionally records edits.\r
+     * Casing is locale-dependent and context-sensitive.\r
+     * The result may be longer or shorter than the original.\r
+     * The source string and the destination buffer must not overlap.\r
+     *\r
+     * @param locale    The locale ID. ("" = root locale, NULL = default locale.)\r
+     * @param options   Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET.\r
+     * @param src       The original string.\r
+     * @param srcLength The length of the original string. If -1, then src must be NUL-terminated.\r
+     * @param dest      A buffer for the result string. The result will be NUL-terminated if\r
+     *                  the buffer is large enough.\r
+     *                  The contents is undefined in case of failure.\r
+     * @param destCapacity The size of the buffer (number of char16_ts). If it is 0, then\r
+     *                  dest may be NULL and the function will only return the length of the result\r
+     *                  without writing any of the result string.\r
+     * @param edits     Records edits for index mapping, working with styled text,\r
+     *                  and getting only changes (if any).\r
+     *                  The Edits contents is undefined if any error occurs.\r
+     *                  This function calls edits->reset() first unless\r
+     *                  options includes U_EDITS_NO_RESET. edits can be NULL.\r
+     * @param errorCode Reference to an in/out error code value\r
+     *                  which must not indicate a failure before the function call.\r
+     * @return The length of the result string, if successful.\r
+     *         When the result would be longer than destCapacity,\r
+     *         the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set.\r
+     *\r
+     * @see u_strToLower\r
+     * @stable ICU 59\r
+     */\r
+     static int32_t toLower(\r
+            const char *locale, uint32_t options,\r
+            const char16_t *src, int32_t srcLength,\r
+            char16_t *dest, int32_t destCapacity, Edits *edits,\r
+            UErrorCode &errorCode);\r
+\r
+    /**\r
+     * Uppercases a UTF-16 string and optionally records edits.\r
+     * Casing is locale-dependent and context-sensitive.\r
+     * The result may be longer or shorter than the original.\r
+     * The source string and the destination buffer must not overlap.\r
+     *\r
+     * @param locale    The locale ID. ("" = root locale, NULL = default locale.)\r
+     * @param options   Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET.\r
+     * @param src       The original string.\r
+     * @param srcLength The length of the original string. If -1, then src must be NUL-terminated.\r
+     * @param dest      A buffer for the result string. The result will be NUL-terminated if\r
+     *                  the buffer is large enough.\r
+     *                  The contents is undefined in case of failure.\r
+     * @param destCapacity The size of the buffer (number of char16_ts). If it is 0, then\r
+     *                  dest may be NULL and the function will only return the length of the result\r
+     *                  without writing any of the result string.\r
+     * @param edits     Records edits for index mapping, working with styled text,\r
+     *                  and getting only changes (if any).\r
+     *                  The Edits contents is undefined if any error occurs.\r
+     *                  This function calls edits->reset() first unless\r
+     *                  options includes U_EDITS_NO_RESET. edits can be NULL.\r
+     * @param errorCode Reference to an in/out error code value\r
+     *                  which must not indicate a failure before the function call.\r
+     * @return The length of the result string, if successful.\r
+     *         When the result would be longer than destCapacity,\r
+     *         the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set.\r
+     *\r
+     * @see u_strToUpper\r
+     * @stable ICU 59\r
+     */\r
+    static int32_t toUpper(\r
+            const char *locale, uint32_t options,\r
+            const char16_t *src, int32_t srcLength,\r
+            char16_t *dest, int32_t destCapacity, Edits *edits,\r
+            UErrorCode &errorCode);\r
+\r
+#if !UCONFIG_NO_BREAK_ITERATION\r
+\r
+    /**\r
+     * Titlecases a UTF-16 string and optionally records edits.\r
+     * Casing is locale-dependent and context-sensitive.\r
+     * The result may be longer or shorter than the original.\r
+     * The source string and the destination buffer must not overlap.\r
+     *\r
+     * Titlecasing uses a break iterator to find the first characters of words\r
+     * that are to be titlecased. It titlecases those characters and lowercases\r
+     * all others. (This can be modified with options bits.)\r
+     *\r
+     * @param locale    The locale ID. ("" = root locale, NULL = default locale.)\r
+     * @param options   Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET,\r
+     *                  U_TITLECASE_NO_LOWERCASE,\r
+     *                  U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED,\r
+     *                  U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES.\r
+     * @param iter      A break iterator to find the first characters of words that are to be titlecased.\r
+     *                  It is set to the source string (setText())\r
+     *                  and used one or more times for iteration (first() and next()).\r
+     *                  If NULL, then a word break iterator for the locale is used\r
+     *                  (or something equivalent).\r
+     * @param src       The original string.\r
+     * @param srcLength The length of the original string. If -1, then src must be NUL-terminated.\r
+     * @param dest      A buffer for the result string. The result will be NUL-terminated if\r
+     *                  the buffer is large enough.\r
+     *                  The contents is undefined in case of failure.\r
+     * @param destCapacity The size of the buffer (number of char16_ts). If it is 0, then\r
+     *                  dest may be NULL and the function will only return the length of the result\r
+     *                  without writing any of the result string.\r
+     * @param edits     Records edits for index mapping, working with styled text,\r
+     *                  and getting only changes (if any).\r
+     *                  The Edits contents is undefined if any error occurs.\r
+     *                  This function calls edits->reset() first unless\r
+     *                  options includes U_EDITS_NO_RESET. edits can be NULL.\r
+     * @param errorCode Reference to an in/out error code value\r
+     *                  which must not indicate a failure before the function call.\r
+     * @return The length of the result string, if successful.\r
+     *         When the result would be longer than destCapacity,\r
+     *         the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set.\r
+     *\r
+     * @see u_strToTitle\r
+     * @see ucasemap_toTitle\r
+     * @stable ICU 59\r
+     */\r
+    static int32_t toTitle(\r
+            const char *locale, uint32_t options, BreakIterator *iter,\r
+            const char16_t *src, int32_t srcLength,\r
+            char16_t *dest, int32_t destCapacity, Edits *edits,\r
+            UErrorCode &errorCode);\r
+\r
+#endif  // UCONFIG_NO_BREAK_ITERATION\r
+\r
+    /**\r
+     * Case-folds a UTF-16 string and optionally records edits.\r
+     *\r
+     * Case folding is locale-independent and not context-sensitive,\r
+     * but there is an option for whether to include or exclude mappings for dotted I\r
+     * and dotless i that are marked with 'T' in CaseFolding.txt.\r
+     *\r
+     * The result may be longer or shorter than the original.\r
+     * The source string and the destination buffer must not overlap.\r
+     *\r
+     * @param options   Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET,\r
+     *                  U_FOLD_CASE_DEFAULT, U_FOLD_CASE_EXCLUDE_SPECIAL_I.\r
+     * @param src       The original string.\r
+     * @param srcLength The length of the original string. If -1, then src must be NUL-terminated.\r
+     * @param dest      A buffer for the result string. The result will be NUL-terminated if\r
+     *                  the buffer is large enough.\r
+     *                  The contents is undefined in case of failure.\r
+     * @param destCapacity The size of the buffer (number of char16_ts). If it is 0, then\r
+     *                  dest may be NULL and the function will only return the length of the result\r
+     *                  without writing any of the result string.\r
+     * @param edits     Records edits for index mapping, working with styled text,\r
+     *                  and getting only changes (if any).\r
+     *                  The Edits contents is undefined if any error occurs.\r
+     *                  This function calls edits->reset() first unless\r
+     *                  options includes U_EDITS_NO_RESET. edits can be NULL.\r
+     * @param errorCode Reference to an in/out error code value\r
+     *                  which must not indicate a failure before the function call.\r
+     * @return The length of the result string, if successful.\r
+     *         When the result would be longer than destCapacity,\r
+     *         the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set.\r
+     *\r
+     * @see u_strFoldCase\r
+     * @stable ICU 59\r
+     */\r
+    static int32_t fold(\r
+            uint32_t options,\r
+            const char16_t *src, int32_t srcLength,\r
+            char16_t *dest, int32_t destCapacity, Edits *edits,\r
+            UErrorCode &errorCode);\r
+\r
+#ifndef U_HIDE_DRAFT_API\r
+    /**\r
+     * Lowercases a UTF-8 string and optionally records edits.\r
+     * Casing is locale-dependent and context-sensitive.\r
+     * The result may be longer or shorter than the original.\r
+     *\r
+     * @param locale    The locale ID. ("" = root locale, NULL = default locale.)\r
+     * @param options   Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET.\r
+     * @param src       The original string.\r
+     * @param sink      A ByteSink to which the result string is written.\r
+     *                  sink.Flush() is called at the end.\r
+     * @param edits     Records edits for index mapping, working with styled text,\r
+     *                  and getting only changes (if any).\r
+     *                  The Edits contents is undefined if any error occurs.\r
+     *                  This function calls edits->reset() first unless\r
+     *                  options includes U_EDITS_NO_RESET. edits can be NULL.\r
+     * @param errorCode Reference to an in/out error code value\r
+     *                  which must not indicate a failure before the function call.\r
+     *\r
+     * @see ucasemap_utf8ToLower\r
+     * @draft ICU 60\r
+     */\r
+    static void utf8ToLower(\r
+            const char *locale, uint32_t options,\r
+            StringPiece src, ByteSink &sink, Edits *edits,\r
+            UErrorCode &errorCode);\r
+\r
+    /**\r
+     * Uppercases a UTF-8 string and optionally records edits.\r
+     * Casing is locale-dependent and context-sensitive.\r
+     * The result may be longer or shorter than the original.\r
+     *\r
+     * @param locale    The locale ID. ("" = root locale, NULL = default locale.)\r
+     * @param options   Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET.\r
+     * @param src       The original string.\r
+     * @param sink      A ByteSink to which the result string is written.\r
+     *                  sink.Flush() is called at the end.\r
+     * @param edits     Records edits for index mapping, working with styled text,\r
+     *                  and getting only changes (if any).\r
+     *                  The Edits contents is undefined if any error occurs.\r
+     *                  This function calls edits->reset() first unless\r
+     *                  options includes U_EDITS_NO_RESET. edits can be NULL.\r
+     * @param errorCode Reference to an in/out error code value\r
+     *                  which must not indicate a failure before the function call.\r
+     *\r
+     * @see ucasemap_utf8ToUpper\r
+     * @draft ICU 60\r
+     */\r
+    static void utf8ToUpper(\r
+            const char *locale, uint32_t options,\r
+            StringPiece src, ByteSink &sink, Edits *edits,\r
+            UErrorCode &errorCode);\r
+\r
+#if !UCONFIG_NO_BREAK_ITERATION\r
+\r
+    /**\r
+     * Titlecases a UTF-8 string and optionally records edits.\r
+     * Casing is locale-dependent and context-sensitive.\r
+     * The result may be longer or shorter than the original.\r
+     *\r
+     * Titlecasing uses a break iterator to find the first characters of words\r
+     * that are to be titlecased. It titlecases those characters and lowercases\r
+     * all others. (This can be modified with options bits.)\r
+     *\r
+     * @param locale    The locale ID. ("" = root locale, NULL = default locale.)\r
+     * @param options   Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET,\r
+     *                  U_TITLECASE_NO_LOWERCASE,\r
+     *                  U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED,\r
+     *                  U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES.\r
+     * @param iter      A break iterator to find the first characters of words that are to be titlecased.\r
+     *                  It is set to the source string (setUText())\r
+     *                  and used one or more times for iteration (first() and next()).\r
+     *                  If NULL, then a word break iterator for the locale is used\r
+     *                  (or something equivalent).\r
+     * @param src       The original string.\r
+     * @param sink      A ByteSink to which the result string is written.\r
+     *                  sink.Flush() is called at the end.\r
+     * @param edits     Records edits for index mapping, working with styled text,\r
+     *                  and getting only changes (if any).\r
+     *                  The Edits contents is undefined if any error occurs.\r
+     *                  This function calls edits->reset() first unless\r
+     *                  options includes U_EDITS_NO_RESET. edits can be NULL.\r
+     * @param errorCode Reference to an in/out error code value\r
+     *                  which must not indicate a failure before the function call.\r
+     *\r
+     * @see ucasemap_utf8ToTitle\r
+     * @draft ICU 60\r
+     */\r
+    static void utf8ToTitle(\r
+            const char *locale, uint32_t options, BreakIterator *iter,\r
+            StringPiece src, ByteSink &sink, Edits *edits,\r
+            UErrorCode &errorCode);\r
+\r
+#endif  // UCONFIG_NO_BREAK_ITERATION\r
+\r
+    /**\r
+     * Case-folds a UTF-8 string and optionally records edits.\r
+     *\r
+     * Case folding is locale-independent and not context-sensitive,\r
+     * but there is an option for whether to include or exclude mappings for dotted I\r
+     * and dotless i that are marked with 'T' in CaseFolding.txt.\r
+     *\r
+     * The result may be longer or shorter than the original.\r
+     *\r
+     * @param options   Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET.\r
+     * @param src       The original string.\r
+     * @param sink      A ByteSink to which the result string is written.\r
+     *                  sink.Flush() is called at the end.\r
+     * @param edits     Records edits for index mapping, working with styled text,\r
+     *                  and getting only changes (if any).\r
+     *                  The Edits contents is undefined if any error occurs.\r
+     *                  This function calls edits->reset() first unless\r
+     *                  options includes U_EDITS_NO_RESET. edits can be NULL.\r
+     * @param errorCode Reference to an in/out error code value\r
+     *                  which must not indicate a failure before the function call.\r
+     *\r
+     * @see ucasemap_utf8FoldCase\r
+     * @draft ICU 60\r
+     */\r
+    static void utf8Fold(\r
+            uint32_t options,\r
+            StringPiece src, ByteSink &sink, Edits *edits,\r
+            UErrorCode &errorCode);\r
+#endif  // U_HIDE_DRAFT_API\r
+\r
+    /**\r
+     * Lowercases a UTF-8 string and optionally records edits.\r
+     * Casing is locale-dependent and context-sensitive.\r
+     * The result may be longer or shorter than the original.\r
+     * The source string and the destination buffer must not overlap.\r
+     *\r
+     * @param locale    The locale ID. ("" = root locale, NULL = default locale.)\r
+     * @param options   Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET.\r
+     * @param src       The original string.\r
+     * @param srcLength The length of the original string. If -1, then src must be NUL-terminated.\r
+     * @param dest      A buffer for the result string. The result will be NUL-terminated if\r
+     *                  the buffer is large enough.\r
+     *                  The contents is undefined in case of failure.\r
+     * @param destCapacity The size of the buffer (number of bytes). If it is 0, then\r
+     *                  dest may be NULL and the function will only return the length of the result\r
+     *                  without writing any of the result string.\r
+     * @param edits     Records edits for index mapping, working with styled text,\r
+     *                  and getting only changes (if any).\r
+     *                  The Edits contents is undefined if any error occurs.\r
+     *                  This function calls edits->reset() first unless\r
+     *                  options includes U_EDITS_NO_RESET. edits can be NULL.\r
+     * @param errorCode Reference to an in/out error code value\r
+     *                  which must not indicate a failure before the function call.\r
+     * @return The length of the result string, if successful.\r
+     *         When the result would be longer than destCapacity,\r
+     *         the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set.\r
+     *\r
+     * @see ucasemap_utf8ToLower\r
+     * @stable ICU 59\r
+     */\r
+    static int32_t utf8ToLower(\r
+            const char *locale, uint32_t options,\r
+            const char *src, int32_t srcLength,\r
+            char *dest, int32_t destCapacity, Edits *edits,\r
+            UErrorCode &errorCode);\r
+\r
+    /**\r
+     * Uppercases a UTF-8 string and optionally records edits.\r
+     * Casing is locale-dependent and context-sensitive.\r
+     * The result may be longer or shorter than the original.\r
+     * The source string and the destination buffer must not overlap.\r
+     *\r
+     * @param locale    The locale ID. ("" = root locale, NULL = default locale.)\r
+     * @param options   Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET.\r
+     * @param src       The original string.\r
+     * @param srcLength The length of the original string. If -1, then src must be NUL-terminated.\r
+     * @param dest      A buffer for the result string. The result will be NUL-terminated if\r
+     *                  the buffer is large enough.\r
+     *                  The contents is undefined in case of failure.\r
+     * @param destCapacity The size of the buffer (number of bytes). If it is 0, then\r
+     *                  dest may be NULL and the function will only return the length of the result\r
+     *                  without writing any of the result string.\r
+     * @param edits     Records edits for index mapping, working with styled text,\r
+     *                  and getting only changes (if any).\r
+     *                  The Edits contents is undefined if any error occurs.\r
+     *                  This function calls edits->reset() first unless\r
+     *                  options includes U_EDITS_NO_RESET. edits can be NULL.\r
+     * @param errorCode Reference to an in/out error code value\r
+     *                  which must not indicate a failure before the function call.\r
+     * @return The length of the result string, if successful.\r
+     *         When the result would be longer than destCapacity,\r
+     *         the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set.\r
+     *\r
+     * @see ucasemap_utf8ToUpper\r
+     * @stable ICU 59\r
+     */\r
+    static int32_t utf8ToUpper(\r
+            const char *locale, uint32_t options,\r
+            const char *src, int32_t srcLength,\r
+            char *dest, int32_t destCapacity, Edits *edits,\r
+            UErrorCode &errorCode);\r
+\r
+#if !UCONFIG_NO_BREAK_ITERATION\r
+\r
+    /**\r
+     * Titlecases a UTF-8 string and optionally records edits.\r
+     * Casing is locale-dependent and context-sensitive.\r
+     * The result may be longer or shorter than the original.\r
+     * The source string and the destination buffer must not overlap.\r
+     *\r
+     * Titlecasing uses a break iterator to find the first characters of words\r
+     * that are to be titlecased. It titlecases those characters and lowercases\r
+     * all others. (This can be modified with options bits.)\r
+     *\r
+     * @param locale    The locale ID. ("" = root locale, NULL = default locale.)\r
+     * @param options   Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET,\r
+     *                  U_TITLECASE_NO_LOWERCASE,\r
+     *                  U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED,\r
+     *                  U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES.\r
+     * @param iter      A break iterator to find the first characters of words that are to be titlecased.\r
+     *                  It is set to the source string (setUText())\r
+     *                  and used one or more times for iteration (first() and next()).\r
+     *                  If NULL, then a word break iterator for the locale is used\r
+     *                  (or something equivalent).\r
+     * @param src       The original string.\r
+     * @param srcLength The length of the original string. If -1, then src must be NUL-terminated.\r
+     * @param dest      A buffer for the result string. The result will be NUL-terminated if\r
+     *                  the buffer is large enough.\r
+     *                  The contents is undefined in case of failure.\r
+     * @param destCapacity The size of the buffer (number of bytes). If it is 0, then\r
+     *                  dest may be NULL and the function will only return the length of the result\r
+     *                  without writing any of the result string.\r
+     * @param edits     Records edits for index mapping, working with styled text,\r
+     *                  and getting only changes (if any).\r
+     *                  The Edits contents is undefined if any error occurs.\r
+     *                  This function calls edits->reset() first unless\r
+     *                  options includes U_EDITS_NO_RESET. edits can be NULL.\r
+     * @param errorCode Reference to an in/out error code value\r
+     *                  which must not indicate a failure before the function call.\r
+     * @return The length of the result string, if successful.\r
+     *         When the result would be longer than destCapacity,\r
+     *         the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set.\r
+     *\r
+     * @see ucasemap_utf8ToTitle\r
+     * @stable ICU 59\r
+     */\r
+    static int32_t utf8ToTitle(\r
+            const char *locale, uint32_t options, BreakIterator *iter,\r
+            const char *src, int32_t srcLength,\r
+            char *dest, int32_t destCapacity, Edits *edits,\r
+            UErrorCode &errorCode);\r
+\r
+#endif  // UCONFIG_NO_BREAK_ITERATION\r
+\r
+    /**\r
+     * Case-folds a UTF-8 string and optionally records edits.\r
+     *\r
+     * Case folding is locale-independent and not context-sensitive,\r
+     * but there is an option for whether to include or exclude mappings for dotted I\r
+     * and dotless i that are marked with 'T' in CaseFolding.txt.\r
+     *\r
+     * The result may be longer or shorter than the original.\r
+     * The source string and the destination buffer must not overlap.\r
+     *\r
+     * @param options   Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET,\r
+     *                  U_FOLD_CASE_DEFAULT, U_FOLD_CASE_EXCLUDE_SPECIAL_I.\r
+     * @param src       The original string.\r
+     * @param srcLength The length of the original string. If -1, then src must be NUL-terminated.\r
+     * @param dest      A buffer for the result string. The result will be NUL-terminated if\r
+     *                  the buffer is large enough.\r
+     *                  The contents is undefined in case of failure.\r
+     * @param destCapacity The size of the buffer (number of bytes). If it is 0, then\r
+     *                  dest may be NULL and the function will only return the length of the result\r
+     *                  without writing any of the result string.\r
+     * @param edits     Records edits for index mapping, working with styled text,\r
+     *                  and getting only changes (if any).\r
+     *                  The Edits contents is undefined if any error occurs.\r
+     *                  This function calls edits->reset() first unless\r
+     *                  options includes U_EDITS_NO_RESET. edits can be NULL.\r
+     * @param errorCode Reference to an in/out error code value\r
+     *                  which must not indicate a failure before the function call.\r
+     * @return The length of the result string, if successful.\r
+     *         When the result would be longer than destCapacity,\r
+     *         the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set.\r
+     *\r
+     * @see ucasemap_utf8FoldCase\r
+     * @stable ICU 59\r
+     */\r
+    static int32_t utf8Fold(\r
+            uint32_t options,\r
+            const char *src, int32_t srcLength,\r
+            char *dest, int32_t destCapacity, Edits *edits,\r
+            UErrorCode &errorCode);\r
+\r
+private:\r
+    CaseMap() = delete;\r
+    CaseMap(const CaseMap &other) = delete;\r
+    CaseMap &operator=(const CaseMap &other) = delete;\r
+};\r
+\r
+U_NAMESPACE_END\r
+\r
+#endif  // __CASEMAP_H__\r
diff --git a/Source/WTF/icu/unicode/char16ptr.h b/Source/WTF/icu/unicode/char16ptr.h
new file mode 100644 (file)
index 0000000..48ac607
--- /dev/null
@@ -0,0 +1,302 @@
+// © 2017 and later: Unicode, Inc. and others.\r
+// License & terms of use: http://www.unicode.org/copyright.html\r
+\r
+// char16ptr.h\r
+// created: 2017feb28 Markus W. Scherer\r
+\r
+#ifndef __CHAR16PTR_H__\r
+#define __CHAR16PTR_H__\r
+\r
+#include <cstddef>\r
+#include "unicode/utypes.h"\r
+\r
+/**\r
+ * \file\r
+ * \brief C++ API: char16_t pointer wrappers with\r
+ *        implicit conversion from bit-compatible raw pointer types.\r
+ *        Also conversion functions from char16_t * to UChar * and OldUChar *.\r
+ */\r
+\r
+U_NAMESPACE_BEGIN\r
+\r
+/**\r
+ * \def U_ALIASING_BARRIER\r
+ * Barrier for pointer anti-aliasing optimizations even across function boundaries.\r
+ * @internal\r
+ */\r
+#ifdef U_ALIASING_BARRIER\r
+    // Use the predefined value.\r
+#elif (defined(__clang__) || defined(__GNUC__)) && U_PLATFORM != U_PF_BROWSER_NATIVE_CLIENT\r
+#   define U_ALIASING_BARRIER(ptr) asm volatile("" : : "rm"(ptr) : "memory")\r
+#endif\r
+\r
+/**\r
+ * char16_t * wrapper with implicit conversion from distinct but bit-compatible pointer types.\r
+ * @stable ICU 59\r
+ */\r
+class U_COMMON_API Char16Ptr U_FINAL {\r
+public:\r
+    /**\r
+     * Copies the pointer.\r
+     * @param p pointer\r
+     * @stable ICU 59\r
+     */\r
+    inline Char16Ptr(char16_t *p);\r
+#if !U_CHAR16_IS_TYPEDEF\r
+    /**\r
+     * Converts the pointer to char16_t *.\r
+     * @param p pointer to be converted\r
+     * @stable ICU 59\r
+     */\r
+    inline Char16Ptr(uint16_t *p);\r
+#endif\r
+#if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN)\r
+    /**\r
+     * Converts the pointer to char16_t *.\r
+     * (Only defined if U_SIZEOF_WCHAR_T==2.)\r
+     * @param p pointer to be converted\r
+     * @stable ICU 59\r
+     */\r
+    inline Char16Ptr(wchar_t *p);\r
+#endif\r
+    /**\r
+     * nullptr constructor.\r
+     * @param p nullptr\r
+     * @stable ICU 59\r
+     */\r
+    inline Char16Ptr(std::nullptr_t p);\r
+    /**\r
+     * Destructor.\r
+     * @stable ICU 59\r
+     */\r
+    inline ~Char16Ptr();\r
+\r
+    /**\r
+     * Pointer access.\r
+     * @return the wrapped pointer\r
+     * @stable ICU 59\r
+     */\r
+    inline char16_t *get() const;\r
+    /**\r
+     * char16_t pointer access via type conversion (e.g., static_cast).\r
+     * @return the wrapped pointer\r
+     * @stable ICU 59\r
+     */\r
+    inline operator char16_t *() const { return get(); }\r
+\r
+private:\r
+    Char16Ptr() = delete;\r
+\r
+#ifdef U_ALIASING_BARRIER\r
+    template<typename T> static char16_t *cast(T *t) {\r
+        U_ALIASING_BARRIER(t);\r
+        return reinterpret_cast<char16_t *>(t);\r
+    }\r
+\r
+    char16_t *p_;\r
+#else\r
+    union {\r
+        char16_t *cp;\r
+        uint16_t *up;\r
+        wchar_t *wp;\r
+    } u_;\r
+#endif\r
+};\r
+\r
+#ifdef U_ALIASING_BARRIER\r
+\r
+Char16Ptr::Char16Ptr(char16_t *p) : p_(p) {}\r
+#if !U_CHAR16_IS_TYPEDEF\r
+Char16Ptr::Char16Ptr(uint16_t *p) : p_(cast(p)) {}\r
+#endif\r
+#if U_SIZEOF_WCHAR_T==2\r
+Char16Ptr::Char16Ptr(wchar_t *p) : p_(cast(p)) {}\r
+#endif\r
+Char16Ptr::Char16Ptr(std::nullptr_t p) : p_(p) {}\r
+Char16Ptr::~Char16Ptr() {\r
+    U_ALIASING_BARRIER(p_);\r
+}\r
+\r
+char16_t *Char16Ptr::get() const { return p_; }\r
+\r
+#else\r
+\r
+Char16Ptr::Char16Ptr(char16_t *p) { u_.cp = p; }\r
+#if !U_CHAR16_IS_TYPEDEF\r
+Char16Ptr::Char16Ptr(uint16_t *p) { u_.up = p; }\r
+#endif\r
+#if U_SIZEOF_WCHAR_T==2\r
+Char16Ptr::Char16Ptr(wchar_t *p) { u_.wp = p; }\r
+#endif\r
+Char16Ptr::Char16Ptr(std::nullptr_t p) { u_.cp = p; }\r
+Char16Ptr::~Char16Ptr() {}\r
+\r
+char16_t *Char16Ptr::get() const { return u_.cp; }\r
+\r
+#endif\r
+\r
+/**\r
+ * const char16_t * wrapper with implicit conversion from distinct but bit-compatible pointer types.\r
+ * @stable ICU 59\r
+ */\r
+class U_COMMON_API ConstChar16Ptr U_FINAL {\r
+public:\r
+    /**\r
+     * Copies the pointer.\r
+     * @param p pointer\r
+     * @stable ICU 59\r
+     */\r
+    inline ConstChar16Ptr(const char16_t *p);\r
+#if !U_CHAR16_IS_TYPEDEF\r
+    /**\r
+     * Converts the pointer to char16_t *.\r
+     * @param p pointer to be converted\r
+     * @stable ICU 59\r
+     */\r
+    inline ConstChar16Ptr(const uint16_t *p);\r
+#endif\r
+#if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN)\r
+    /**\r
+     * Converts the pointer to char16_t *.\r
+     * (Only defined if U_SIZEOF_WCHAR_T==2.)\r
+     * @param p pointer to be converted\r
+     * @stable ICU 59\r
+     */\r
+    inline ConstChar16Ptr(const wchar_t *p);\r
+#endif\r
+    /**\r
+     * nullptr constructor.\r
+     * @param p nullptr\r
+     * @stable ICU 59\r
+     */\r
+    inline ConstChar16Ptr(const std::nullptr_t p);\r
+\r
+    /**\r
+     * Destructor.\r
+     * @stable ICU 59\r
+     */\r
+    inline ~ConstChar16Ptr();\r
+\r
+    /**\r
+     * Pointer access.\r
+     * @return the wrapped pointer\r
+     * @stable ICU 59\r
+     */\r
+    inline const char16_t *get() const;\r
+    /**\r
+     * char16_t pointer access via type conversion (e.g., static_cast).\r
+     * @return the wrapped pointer\r
+     * @stable ICU 59\r
+     */\r
+    inline operator const char16_t *() const { return get(); }\r
+\r
+private:\r
+    ConstChar16Ptr() = delete;\r
+\r
+#ifdef U_ALIASING_BARRIER\r
+    template<typename T> static const char16_t *cast(const T *t) {\r
+        U_ALIASING_BARRIER(t);\r
+        return reinterpret_cast<const char16_t *>(t);\r
+    }\r
+\r
+    const char16_t *p_;\r
+#else\r
+    union {\r
+        const char16_t *cp;\r
+        const uint16_t *up;\r
+        const wchar_t *wp;\r
+    } u_;\r
+#endif\r
+};\r
+\r
+#ifdef U_ALIASING_BARRIER\r
+\r
+ConstChar16Ptr::ConstChar16Ptr(const char16_t *p) : p_(p) {}\r
+#if !U_CHAR16_IS_TYPEDEF\r
+ConstChar16Ptr::ConstChar16Ptr(const uint16_t *p) : p_(cast(p)) {}\r
+#endif\r
+#if U_SIZEOF_WCHAR_T==2\r
+ConstChar16Ptr::ConstChar16Ptr(const wchar_t *p) : p_(cast(p)) {}\r
+#endif\r
+ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t p) : p_(p) {}\r
+ConstChar16Ptr::~ConstChar16Ptr() {\r
+    U_ALIASING_BARRIER(p_);\r
+}\r
+\r
+const char16_t *ConstChar16Ptr::get() const { return p_; }\r
+\r
+#else\r
+\r
+ConstChar16Ptr::ConstChar16Ptr(const char16_t *p) { u_.cp = p; }\r
+#if !U_CHAR16_IS_TYPEDEF\r
+ConstChar16Ptr::ConstChar16Ptr(const uint16_t *p) { u_.up = p; }\r
+#endif\r
+#if U_SIZEOF_WCHAR_T==2\r
+ConstChar16Ptr::ConstChar16Ptr(const wchar_t *p) { u_.wp = p; }\r
+#endif\r
+ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t p) { u_.cp = p; }\r
+ConstChar16Ptr::~ConstChar16Ptr() {}\r
+\r
+const char16_t *ConstChar16Ptr::get() const { return u_.cp; }\r
+\r
+#endif\r
+\r
+/**\r
+ * Converts from const char16_t * to const UChar *.\r
+ * Includes an aliasing barrier if available.\r
+ * @param p pointer\r
+ * @return p as const UChar *\r
+ * @stable ICU 59\r
+ */\r
+inline const UChar *toUCharPtr(const char16_t *p) {\r
+#ifdef U_ALIASING_BARRIER\r
+    U_ALIASING_BARRIER(p);\r
+#endif\r
+    return reinterpret_cast<const UChar *>(p);\r
+}\r
+\r
+/**\r
+ * Converts from char16_t * to UChar *.\r
+ * Includes an aliasing barrier if available.\r
+ * @param p pointer\r
+ * @return p as UChar *\r
+ * @stable ICU 59\r
+ */\r
+inline UChar *toUCharPtr(char16_t *p) {\r
+#ifdef U_ALIASING_BARRIER\r
+    U_ALIASING_BARRIER(p);\r
+#endif\r
+    return reinterpret_cast<UChar *>(p);\r
+}\r
+\r
+/**\r
+ * Converts from const char16_t * to const OldUChar *.\r
+ * Includes an aliasing barrier if available.\r
+ * @param p pointer\r
+ * @return p as const OldUChar *\r
+ * @stable ICU 59\r
+ */\r
+inline const OldUChar *toOldUCharPtr(const char16_t *p) {\r
+#ifdef U_ALIASING_BARRIER\r
+    U_ALIASING_BARRIER(p);\r
+#endif\r
+    return reinterpret_cast<const OldUChar *>(p);\r
+}\r
+\r
+/**\r
+ * Converts from char16_t * to OldUChar *.\r
+ * Includes an aliasing barrier if available.\r
+ * @param p pointer\r
+ * @return p as OldUChar *\r
+ * @stable ICU 59\r
+ */\r
+inline OldUChar *toOldUCharPtr(char16_t *p) {\r
+#ifdef U_ALIASING_BARRIER\r
+    U_ALIASING_BARRIER(p);\r
+#endif\r
+    return reinterpret_cast<OldUChar *>(p);\r
+}\r
+\r
+U_NAMESPACE_END\r
+\r
+#endif  // __CHAR16PTR_H__\r
index e8d65090a40a6085951c73307f74acf83ba1bbc8..70d7a24883334dc801c88936649c07b7b1fb879f 100644 (file)
@@ -1,3 +1,5 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 ********************************************************************
 *
@@ -76,7 +78,7 @@ U_NAMESPACE_BEGIN
  * }
  *
  * void function1(ForwardCharacterIterator &it) {
- *     UChar c;
+ *     char16_t c;
  *     while((c=it.nextPostInc())!=ForwardCharacterIterator::DONE) {
  *         // use c
  *      }
@@ -147,7 +149,7 @@ public:
      * @return the current code unit.
      * @stable ICU 2.0
      */
-    virtual UChar         nextPostInc(void) = 0;
+    virtual char16_t         nextPostInc(void) = 0;
     
     /**
      * Gets the current code point for returning and advances to the next code point
@@ -228,7 +230,7 @@ protected:
  * showing a way to convert simple for() loops:
  * \code
  * void forward2(CharacterIterator &it) {
- *     UChar c;
+ *     char16_t c;
  *     for(c=it.firstPostInc(); c!=CharacterIterator::DONE; c=it.nextPostInc()) {
  *          // use c
  *      }
@@ -247,7 +249,7 @@ protected:
  * Backward iteration with a more traditional for() loop:
  * \code
  * void backward2(CharacterIterator &it) {
- *     UChar c;
+ *     char16_t c;
  *     for(c=it.last(); c!=CharacterIterator::DONE; c=it.previous()) {
  *         // use c
  *      }
@@ -264,7 +266,7 @@ protected:
  *      // get the position
  *      int32_t pos=it.getIndex();
  *      // get the previous code unit
- *      UChar u=it.previous();
+ *      char16_t u=it.previous();
  *      // move back one more code unit
  *      it.move(-1, CharacterIterator::kCurrent);
  *      // set the position back to where it was
@@ -281,7 +283,7 @@ protected:
  * Function processing characters, in this example simple output
  * <pre>
  * \code
- *  void processChar( UChar c )
+ *  void processChar( char16_t c )
  *  {
  *      cout << " " << c;
  *  }
@@ -292,7 +294,7 @@ protected:
  * \code
  *  void traverseForward(CharacterIterator& iter)
  *  {
- *      for(UChar c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
+ *      for(char16_t c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
  *          processChar(c);
  *      }
  *  }
@@ -303,7 +305,7 @@ protected:
  * \code
  *  void traverseBackward(CharacterIterator& iter)
  *  {
- *      for(UChar c = iter.last(); c != CharacterIterator.DONE; c = iter.previous()) {
+ *      for(char16_t c = iter.last(); c != CharacterIterator.DONE; c = iter.previous()) {
  *          processChar(c);
  *      }
  *  }
@@ -315,7 +317,7 @@ protected:
  * \code
  * void traverseOut(CharacterIterator& iter, int32_t pos)
  * {
- *      UChar c;
+ *      char16_t c;
  *      for (c = iter.setIndex(pos);
  *      c != CharacterIterator.DONE && (Unicode::isLetter(c) || Unicode::isDigit(c));
  *          c = iter.next()) {}
@@ -384,7 +386,7 @@ public:
      * @return the first code unit in its iteration range.
      * @stable ICU 2.0
      */
-    virtual UChar         first(void) = 0;
+    virtual char16_t         first(void) = 0;
 
     /**
      * Sets the iterator to refer to the first code unit in its
@@ -394,7 +396,7 @@ public:
      * @return the first code unit in its iteration range.
      * @stable ICU 2.0
      */
-    virtual UChar         firstPostInc(void);
+    virtual char16_t         firstPostInc(void);
 
     /**
      * Sets the iterator to refer to the first code point in its
@@ -433,7 +435,7 @@ public:
      * @return the last code unit.
      * @stable ICU 2.0
      */
-    virtual UChar         last(void) = 0;
+    virtual char16_t         last(void) = 0;
         
     /**
      * Sets the iterator to refer to the last code point in its
@@ -461,7 +463,7 @@ public:
      * @return the "position"-th code unit.
      * @stable ICU 2.0
      */
-    virtual UChar         setIndex(int32_t position) = 0;
+    virtual char16_t         setIndex(int32_t position) = 0;
 
     /**
      * Sets the iterator to refer to the beginning of the code point
@@ -481,7 +483,7 @@ public:
      * @return the current code unit. 
      * @stable ICU 2.0
      */
-    virtual UChar         current(void) const = 0;
+    virtual char16_t         current(void) const = 0;
         
     /**
      * Returns the code point the iterator currently refers to.  
@@ -497,7 +499,7 @@ public:
      * @return the next code unit.
      * @stable ICU 2.0
      */
-    virtual UChar         next(void) = 0;
+    virtual char16_t         next(void) = 0;
         
     /**
      * Advances to the next code point in the iteration range
@@ -518,7 +520,7 @@ public:
      * @return the previous code unit.
      * @stable ICU 2.0
      */
-    virtual UChar         previous(void) = 0;
+    virtual char16_t         previous(void) = 0;
 
     /**
      * Advances to the previous code point in the iteration range
@@ -567,7 +569,7 @@ public:
      * Returns the numeric index in the underlying text-storage
      * object of the character the iterator currently refers to
      * (i.e., the character returned by current()).  
-     * @return the numberic index in the text-storage object of 
+     * @return the numeric index in the text-storage object of 
      * the character the iterator currently refers to
      * @stable ICU 2.0
      */
@@ -605,6 +607,10 @@ public:
      * @return the new position
      * @stable ICU 2.0
      */
+#ifdef move32
+     // One of the system headers right now is sometimes defining a conflicting macro we don't use
+#undef move32
+#endif
     virtual int32_t      move32(int32_t delta, EOrigin origin) = 0;
 
     /**
index cfd520624dc53aec3ab8c1ad2fe147d003f07fc4..c9f0f1114f89edc41415d68caeef834027d4a245 100644 (file)
@@ -1,3 +1,5 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 ********************************************************************************
 *   Copyright (C) 1997-2013, International Business Machines
index 8c5d0e94f58d4328f21dd331015a69c30dcf9406..f2bd2ecc621ac85dbd6813cc614306c1f6d55371 100644 (file)
@@ -1,3 +1,5 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
  ******************************************************************************
  *   Copyright (C) 1997-2014, International Business Machines
@@ -45,6 +47,7 @@ U_NAMESPACE_BEGIN
 
 struct CollationData;
 
+class CharacterIterator;
 class CollationIterator;
 class RuleBasedCollator;
 class UCollationPCE;
index add6b5ba368f7b9d99ddd4a03f3619760c215831..d03570509ecebbdfbeb1ca215bd33703785e7f8e 100644 (file)
@@ -1,15 +1,17 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 ******************************************************************************
-*   Copyright (C) 1996-2015, International Business Machines
+*   Copyright (C) 1996-2016, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 ******************************************************************************
 */
 
 /**
- * \file 
+ * \file
  * \brief C++ API: Collation Service.
  */
+
 /**
 * File coll.h
 *
@@ -56,7 +58,7 @@
 
 #include "unicode/uobject.h"
 #include "unicode/ucol.h"
-#include "unicode/normlzr.h"
+#include "unicode/unorm.h"
 #include "unicode/locid.h"
 #include "unicode/uniset.h"
 #include "unicode/umisc.h"
@@ -156,7 +158,7 @@ class CollationKey;
 * @see         CollationKey
 * @see         CollationElementIterator
 * @see         Locale
-* @see         Normalizer
+* @see         Normalizer2
 * @version     2.0 11/15/01
 */
 
@@ -199,6 +201,9 @@ public:
         IDENTICAL  = UCOL_IDENTICAL  // 15
     };
 
+
+    // Cannot use #ifndef U_HIDE_DEPRECATED_API for the following, it is
+    // used by virtual methods that cannot have that conditional.
     /**
      * LESS is returned if source string is compared to be less than target
      * string in the compare() method.
@@ -388,8 +393,8 @@ public:
      * is less than, greater than or equal to another string array.
      * <p>Example of use:
      * <pre>
-     * .       UChar ABC[] = {0x41, 0x42, 0x43, 0};  // = "ABC"
-     * .       UChar abc[] = {0x61, 0x62, 0x63, 0};  // = "abc"
+     * .       char16_t ABC[] = {0x41, 0x42, 0x43, 0};  // = "ABC"
+     * .       char16_t abc[] = {0x61, 0x62, 0x63, 0};  // = "abc"
      * .       UErrorCode status = U_ZERO_ERROR;
      * .       Collator *myCollation =
      * .                         Collator::createInstance(Locale::getUS(), status);
@@ -415,8 +420,8 @@ public:
      *         target
      * @deprecated ICU 2.6 use the overload with UErrorCode &
      */
-    virtual EComparisonResult compare(const UChar* source, int32_t sourceLength,
-                                      const UChar* target, int32_t targetLength)
+    virtual EComparisonResult compare(const char16_t* source, int32_t sourceLength,
+                                      const char16_t* target, int32_t targetLength)
                                       const;
 
     /**
@@ -435,8 +440,8 @@ public:
      * than target
      * @stable ICU 2.6
      */
-    virtual UCollationResult compare(const UChar* source, int32_t sourceLength,
-                                      const UChar* target, int32_t targetLength,
+    virtual UCollationResult compare(const char16_t* source, int32_t sourceLength,
+                                      const char16_t* target, int32_t targetLength,
                                       UErrorCode &status) const = 0;
 
     /**
@@ -479,7 +484,7 @@ public:
      * generated sort keys.
      * If the source string is null, a null collation key will be returned.
      *
-     * Note that sort keys are often less efficient than simply doing comparison.  
+     * Note that sort keys are often less efficient than simply doing comparison.
      * For more details, see the ICU User Guide.
      *
      * @param source the source string to be transformed into a sort key.
@@ -501,7 +506,7 @@ public:
      * generated sort keys.
      * <p>If the source string is null, a null collation key will be returned.
      *
-     * Note that sort keys are often less efficient than simply doing comparison.  
+     * Note that sort keys are often less efficient than simply doing comparison.
      * For more details, see the ICU User Guide.
      *
      * @param source the source string to be transformed into a sort key.
@@ -512,7 +517,7 @@ public:
      * @see CollationKey#compare
      * @stable ICU 2.0
      */
-    virtual CollationKey& getCollationKey(const UChar*source,
+    virtual CollationKey& getCollationKey(const char16_t*source,
                                           int32_t sourceLength,
                                           CollationKey& key,
                                           UErrorCode& status) const = 0;
@@ -616,7 +621,7 @@ public:
      * @see Collator#setReorderCodes
      * @see UScriptCode
      * @see UColReorderCode
-     * @stable ICU 4.8 
+     * @stable ICU 4.8
      */
      virtual int32_t getReorderCodes(int32_t *dest,
                                      int32_t destCapacity,
@@ -626,7 +631,7 @@ public:
      * Sets the ordering of scripts for this collator.
      *
      * <p>The reordering codes are a combination of script codes and reorder codes.
-     * @param reorderCodes An array of script codes in the new order. This can be NULL if the 
+     * @param reorderCodes An array of script codes in the new order. This can be NULL if the
      * length is also set to 0. An empty array will clear any reordering codes on the collator.
      * @param reorderCodesLength The length of reorderCodes.
      * @param status error code
@@ -635,7 +640,7 @@ public:
      * @see Collator#getEquivalentReorderCodes
      * @see UScriptCode
      * @see UColReorderCode
-     * @stable ICU 4.8 
+     * @stable ICU 4.8
      */
      virtual void setReorderCodes(const int32_t* reorderCodes,
                                   int32_t reorderCodesLength,
@@ -647,11 +652,11 @@ public:
      * Beginning with ICU 55, scripts only reorder together if they are primary-equal,
      * for example Hiragana and Katakana.
      *
-     * @param reorderCode The reorder code to determine equivalence for. 
+     * @param reorderCode The reorder code to determine equivalence for.
      * @param dest The array to fill with the script equivalence reordering codes.
-     * @param destCapacity The length of dest. If it is 0, then dest may be NULL and the 
+     * @param destCapacity The length of dest. If it is 0, then dest may be NULL and the
      * function will only return the length of the result without writing any codes (pre-flighting).
-     * @param status A reference to an error code value, which must not indicate 
+     * @param status A reference to an error code value, which must not indicate
      * a failure before the function call.
      * @return The length of the of the reordering code equivalence array.
      * @see ucol_setReorderCodes
@@ -659,7 +664,7 @@ public:
      * @see Collator#setReorderCodes
      * @see UScriptCode
      * @see UColReorderCode
-     * @stable ICU 4.8 
+     * @stable ICU 4.8
      */
     static int32_t U_EXPORT2 getEquivalentReorderCodes(int32_t reorderCode,
                                 int32_t* dest,
@@ -667,7 +672,7 @@ public:
                                 UErrorCode& status);
 
     /**
-     * Get name of the object for the desired Locale, in the desired langauge
+     * Get name of the object for the desired Locale, in the desired language
      * @param objectLocale must be from getAvailableLocales
      * @param displayLocale specifies the desired locale for output
      * @param name the fill-in parameter of the return value
@@ -680,7 +685,7 @@ public:
                                          UnicodeString& name);
 
     /**
-    * Get name of the object for the desired Locale, in the langauge of the
+    * Get name of the object for the desired Locale, in the language of the
     * default locale.
     * @param objectLocale must be from getAvailableLocales
     * @param name the fill-in parameter of the return value
@@ -906,7 +911,7 @@ public:
      * the top of one of the supported reordering groups,
      * and it must not be beyond the last of those groups.
      * See setMaxVariable().
-     * @param varTop one or more (if contraction) UChars to which the variable top should be set
+     * @param varTop one or more (if contraction) char16_ts to which the variable top should be set
      * @param len length of variable top string. If -1 it is considered to be zero terminated.
      * @param status error code. If error code is set, the return value is undefined. Errors set by this function are: <br>
      *    U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such contraction<br>
@@ -915,7 +920,7 @@ public:
      * @return variable top primary weight
      * @deprecated ICU 53 Call setMaxVariable() instead.
      */
-    virtual uint32_t setVariableTop(const UChar *varTop, int32_t len, UErrorCode &status) = 0;
+    virtual uint32_t setVariableTop(const char16_t *varTop, int32_t len, UErrorCode &status) = 0;
 
     /**
      * Sets the variable top to the primary weight of the specified string.
@@ -924,7 +929,7 @@ public:
      * the top of one of the supported reordering groups,
      * and it must not be beyond the last of those groups.
      * See setMaxVariable().
-     * @param varTop a UnicodeString size 1 or more (if contraction) of UChars to which the variable top should be set
+     * @param varTop a UnicodeString size 1 or more (if contraction) of char16_ts to which the variable top should be set
      * @param status error code. If error code is set, the return value is undefined. Errors set by this function are: <br>
      *    U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such contraction<br>
      *    U_ILLEGAL_ARGUMENT_ERROR if the variable top is beyond
@@ -981,7 +986,7 @@ public:
      * Sort key byte arrays are zero-terminated and can be compared using
      * strcmp().
      *
-     * Note that sort keys are often less efficient than simply doing comparison.  
+     * Note that sort keys are often less efficient than simply doing comparison.
      * For more details, see the ICU User Guide.
      *
      * @param source string to be processed.
@@ -997,11 +1002,11 @@ public:
                               int32_t resultLength) const = 0;
 
     /**
-     * Get the sort key as an array of bytes from a UChar buffer.
+     * Get the sort key as an array of bytes from a char16_t buffer.
      * Sort key byte arrays are zero-terminated and can be compared using
      * strcmp().
      *
-     * Note that sort keys are often less efficient than simply doing comparison.  
+     * Note that sort keys are often less efficient than simply doing comparison.
      * For more details, see the ICU User Guide.
      *
      * @param source string to be processed.
@@ -1015,7 +1020,7 @@ public:
      * @return Number of bytes needed for storing the sort key
      * @stable ICU 2.2
      */
-    virtual int32_t getSortKey(const UChar*source, int32_t sourceLength,
+    virtual int32_t getSortKey(const char16_t*source, int32_t sourceLength,
                                uint8_t*result, int32_t resultLength) const = 0;
 
     /**
@@ -1111,18 +1116,18 @@ public:
     virtual void setLocales(const Locale& requestedLocale, const Locale& validLocale, const Locale& actualLocale);
 
     /** Get the short definition string for a collator. This internal API harvests the collator's
-     *  locale and the attribute set and produces a string that can be used for opening 
+     *  locale and the attribute set and produces a string that can be used for opening
      *  a collator with the same attributes using the ucol_openFromShortString API.
      *  This string will be normalized.
      *  The structure and the syntax of the string is defined in the "Naming collators"
-     *  section of the users guide: 
+     *  section of the users guide:
      *  http://userguide.icu-project.org/collation/concepts#TOC-Collator-naming-scheme
      *  This function supports preflighting.
-     * 
+     *
      *  This is internal, and intended to be used with delegate converters.
      *
      *  @param locale a locale that will appear as a collators locale in the resulting
-     *                short string definition. If NULL, the locale will be harvested 
+     *                short string definition. If NULL, the locale will be harvested
      *                from the collator.
      *  @param buffer space to hold the resulting string
      *  @param capacity capacity of the buffer
index bd8fdba8e8f23cbc9e7aa91ab2f75b9cebcfeb40..7dc92f610062f4e6e3004999ad075de941e73278 100644 (file)
@@ -1,6 +1,8 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 ********************************************************************************
-*   Copyright (C) 2012-2014, International Business Machines
+*   Copyright (C) 2012-2016, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 ********************************************************************************
 *
@@ -14,7 +16,7 @@
 #include "unicode/utypes.h"
 /**
  * \file
- * \brief C++ API: Formats decimal numbers in compact form.
+ * \brief C++ API: Compatibility APIs for compact decimal number formatting.
  */
 
 #if !UCONFIG_NO_FORMATTING
@@ -28,6 +30,11 @@ U_NAMESPACE_BEGIN
 class PluralRules;
 
 /**
+ * <p><strong>IMPORTANT:</strong> New users are strongly encouraged to see if
+ * numberformatter.h fits their use case.  Although not deprecated, this header
+ * is provided for backwards compatibility only.
+ * <hr/>
+ *
  * The CompactDecimalFormat produces abbreviated numbers, suitable for display in
  * environments will limited real estate. For example, 'Hits: 1.2B' instead of
  * 'Hits: 1,200,000,000'. The format will be appropriate for the given language,
@@ -54,6 +61,9 @@ public:
 
      /**
       * Returns a compact decimal instance for specified locale.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
       * @param inLocale the given locale.
       * @param style whether to use short or long style.
       * @param status error code returned  here.
@@ -74,7 +84,7 @@ public:
      * Destructor.
      * @stable ICU 51
      */
-    virtual ~CompactDecimalFormat();
+    ~CompactDecimalFormat() U_OVERRIDE;
 
     /**
      * Assignment operator.
@@ -91,176 +101,34 @@ public:
      * @return    a polymorphic copy of this CompactDecimalFormat.
      * @stable ICU 51
      */
-    virtual Format* clone() const;
-
-    /**
-     * Return TRUE if the given Format objects are semantically equal.
-     * Objects of different subclasses are considered unequal.
-     *
-     * @param other    the object to be compared with.
-     * @return         TRUE if the given Format objects are semantically equal.
-     * @stable ICU 51
-     */
-    virtual UBool operator==(const Format& other) const;
-
+    Format* clone() const U_OVERRIDE;
 
     using DecimalFormat::format;
 
     /**
-     * Format a double or long number using base-10 representation.
-     *
-     * @param number    The value to be formatted.
-     * @param appendTo  Output parameter to receive result.
-     *                  Result is appended to existing contents.
-     * @param pos       On input: an alignment field, if desired.
-     *                  On output: the offsets of the alignment field.
-     * @return          Reference to 'appendTo' parameter.
-     * @stable ICU 51
-     */
-    virtual UnicodeString& format(double number,
-                                  UnicodeString& appendTo,
-                                  FieldPosition& pos) const;
-
-    /**
-     * Format a double or long number using base-10 representation.
-     * Currently sets status to U_UNSUPPORTED_ERROR.
-     *
-     * @param number    The value to be formatted.
-     * @param appendTo  Output parameter to receive result.
-     *                  Result is appended to existing contents.
-     * @param posIter   On return, can be used to iterate over positions
-     *                  of fields generated by this format call.
-     *                  Can be NULL.
-     * @param status    Output param filled with success/failure status.
-     * @return          Reference to 'appendTo' parameter.
-     * @internal
-     */
-    virtual UnicodeString& format(double number,
-                                  UnicodeString& appendTo,
-                                  FieldPositionIterator* posIter,
-                                  UErrorCode& status) const;
-
-    /**
-     * Format an int64 number using base-10 representation.
-     *
-     * @param number    The value to be formatted.
-     * @param appendTo  Output parameter to receive result.
-     *                  Result is appended to existing contents.
-     * @param pos       On input: an alignment field, if desired.
-     *                  On output: the offsets of the alignment field.
-     * @return          Reference to 'appendTo' parameter.
+     * CompactDecimalFormat does not support parsing. This implementation
+     * does nothing.
+     * @param text           Unused.
+     * @param result         Does not change.
+     * @param parsePosition  Does not change.
+     * @see Formattable
      * @stable ICU 51
      */
-    virtual UnicodeString& format(int64_t number,
-                                  UnicodeString& appendTo,
-                                  FieldPosition& pos) const;
-
-    /**
-     * Format an int64 number using base-10 representation.
-     * Currently sets status to U_UNSUPPORTED_ERROR
-     *
-     * @param number    The value to be formatted.
-     * @param appendTo  Output parameter to receive result.
-     *                  Result is appended to existing contents.
-     * @param posIter   On return, can be used to iterate over positions
-     *                  of fields generated by this format call.
-     *                  Can be NULL.
-     * @param status    Output param filled with success/failure status.
-     * @return          Reference to 'appendTo' parameter.
-     * @internal
-     */
-    virtual UnicodeString& format(int64_t number,
-                                  UnicodeString& appendTo,
-                                  FieldPositionIterator* posIter,
-                                  UErrorCode& status) const;
-
-    /**
-     * Format a decimal number. Currently sets status to U_UNSUPPORTED_ERROR
-     * The syntax of the unformatted number is a "numeric string"
-     * as defined in the Decimal Arithmetic Specification, available at
-     * http://speleotrove.com/decimal
-     *
-     * @param number    The unformatted number, as a string.
-     * @param appendTo  Output parameter to receive result.
-     *                  Result is appended to existing contents.
-     * @param posIter   On return, can be used to iterate over positions
-     *                  of fields generated by this format call.
-     *                  Can be NULL.
-     * @param status    Output param filled with success/failure status.
-     * @return          Reference to 'appendTo' parameter.
-     * @internal
-     */
-    virtual UnicodeString& format(const StringPiece &number,
-                                  UnicodeString& appendTo,
-                                  FieldPositionIterator* posIter,
-                                  UErrorCode& status) const;
-
-    /**
-     * Format a decimal number. Currently sets status to U_UNSUPPORTED_ERROR
-     * The number is a DigitList wrapper onto a floating point decimal number.
-     * The default implementation in NumberFormat converts the decimal number
-     * to a double and formats that.
-     *
-     * @param number    The number, a DigitList format Decimal Floating Point.
-     * @param appendTo  Output parameter to receive result.
-     *                  Result is appended to existing contents.
-     * @param posIter   On return, can be used to iterate over positions
-     *                  of fields generated by this format call.
-     * @param status    Output param filled with success/failure status.
-     * @return          Reference to 'appendTo' parameter.
-     * @internal
-     */
-    virtual UnicodeString& format(const DigitList &number,
-                                  UnicodeString& appendTo,
-                                  FieldPositionIterator* posIter,
-                                  UErrorCode& status) const;
-
-    /**
-     * Format a decimal number. Currently sets status to U_UNSUPPORTED_ERROR.
-     * The number is a DigitList wrapper onto a floating point decimal number.
-     * The default implementation in NumberFormat converts the decimal number
-     * to a double and formats that.  
-     *
-     * @param number    The number, a DigitList format Decimal Floating Point.
-     * @param appendTo  Output parameter to receive result.
-     *                  Result is appended to existing contents.
-     * @param pos       On input: an alignment field, if desired.
-     *                  On output: the offsets of the alignment field.
-     * @param status    Output param filled with success/failure status.
-     * @return          Reference to 'appendTo' parameter.
-     * @internal
-     */
-    virtual UnicodeString& format(const DigitList &number,
-                                  UnicodeString& appendTo,
-                                  FieldPosition& pos,
-                                  UErrorCode& status) const;
-
-   /**
-    * CompactDecimalFormat does not support parsing. This implementation
-    * does nothing.
-    * @param text           Unused.
-    * @param result         Does not change.
-    * @param parsePosition  Does not change.
-    * @see Formattable
-    * @stable ICU 51
-    */
-    virtual void parse(const UnicodeString& text,
-                       Formattable& result,
-                       ParsePosition& parsePosition) const;
+    void parse(const UnicodeString& text, Formattable& result,
+               ParsePosition& parsePosition) const U_OVERRIDE;
 
     /**
      * CompactDecimalFormat does not support parsing. This implementation
      * sets status to U_UNSUPPORTED_ERROR
      *
-     * @param text      Unused. 
+     * @param text      Unused.
      * @param result    Does not change.
      * @param status    Always set to U_UNSUPPORTED_ERROR.
      * @stable ICU 51
      */
-    virtual void parse(const UnicodeString& text,
-                       Formattable& result,
-                       UErrorCode& status) const;
+    void parse(const UnicodeString& text, Formattable& result, UErrorCode& status) const U_OVERRIDE;
 
+#ifndef U_HIDE_INTERNAL_API
     /**
      * Parses text from the given string as a currency amount.  Unlike
      * the parse() method, this method will attempt to parse a generic
@@ -281,8 +149,8 @@ public:
      *             the parsed currency; if parse fails, this is NULL.
      * @internal
      */
-    virtual CurrencyAmount* parseCurrency(const UnicodeString& text,
-                                          ParsePosition& pos) const;
+    CurrencyAmount* parseCurrency(const UnicodeString& text, ParsePosition& pos) const U_OVERRIDE;
+#endif  /* U_HIDE_INTERNAL_API */
 
     /**
      * Return the class ID for this class.  This is useful only for
@@ -308,18 +176,10 @@ public:
      *                  other classes have different class IDs.
      * @stable ICU 51
      */
-    virtual UClassID getDynamicClassID() const;
-
-private:
-
-    const UHashtable* _unitsByVariant;
-    const double* _divisors;
-    PluralRules* _pluralRules;
-
-    // Default constructor not implemented.
-    CompactDecimalFormat(const DecimalFormat &, const UHashtable* unitsByVariant, const double* divisors, PluralRules* pluralRules);
+    UClassID getDynamicClassID() const U_OVERRIDE;
 
-    UBool eqHelper(const CompactDecimalFormat& that) const;
+  private:
+    CompactDecimalFormat(const Locale& inLocale, UNumberCompactStyle style, UErrorCode& status);
 };
 
 U_NAMESPACE_END
index c33e6f1f8338bddb747d464ef7f58e5349ca15af..e321df861d251fd52176229faa449ae8bfb52e5c 100644 (file)
@@ -1,3 +1,5 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 **********************************************************************
 * Copyright (c) 2004-2006, International Business Machines
@@ -44,7 +46,7 @@ class U_I18N_API CurrencyAmount: public Measure {
      * is invalid, then this will be set to a failing value.
      * @stable ICU 3.0
      */
-    CurrencyAmount(const Formattable& amount, const UChar* isoCode,
+    CurrencyAmount(const Formattable& amount, ConstChar16Ptr isoCode,
                    UErrorCode &ec);
 
     /**
@@ -57,7 +59,7 @@ class U_I18N_API CurrencyAmount: public Measure {
      * then this will be set to a failing value.
      * @stable ICU 3.0
      */
-    CurrencyAmount(double amount, const UChar* isoCode,
+    CurrencyAmount(double amount, ConstChar16Ptr isoCode,
                    UErrorCode &ec);
 
     /**
@@ -113,14 +115,14 @@ class U_I18N_API CurrencyAmount: public Measure {
      * Return the ISO currency code of this object.
      * @stable ICU 3.0
      */
-    inline const UChar* getISOCurrency() const;
+    inline const char16_t* getISOCurrency() const;
 };
 
 inline const CurrencyUnit& CurrencyAmount::getCurrency() const {
     return (const CurrencyUnit&) getUnit();
 }
 
-inline const UChar* CurrencyAmount::getISOCurrency() const {
+inline const char16_t* CurrencyAmount::getISOCurrency() const {
     return getCurrency().getISOCurrency();
 }
 
index 9ade99a09e59ada3ccb6aca811a4cbc3d955973f..33c18b08f24c6639c237ed6c073029e8e42722f3 100644 (file)
@@ -1,6 +1,8 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
  *******************************************************************************
- * Copyright (C) 2009-2011, International Business Machines Corporation and         *
+ * Copyright (C) 2009-2015, International Business Machines Corporation and         *
  * others. All Rights Reserved.                                                *
  *******************************************************************************
  */
@@ -191,6 +193,7 @@ public:
 
 private:
     friend class DecimalFormat;
+    friend class DecimalFormatImpl;
 
     void initialize(const Locale& loc, UErrorCode& status);
    
index d79836bb7495264ebab19219c656cbc524adbcb7..ca90acb79183325f1e0eb8964b8dc63b1d66a988 100644 (file)
@@ -1,3 +1,5 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 **********************************************************************
 * Copyright (c) 2004-2014, International Business Machines
@@ -26,7 +28,7 @@ U_NAMESPACE_BEGIN
 
 /**
  * A unit of currency, such as USD (U.S. dollars) or JPY (Japanese
- * yen).  This class is a thin wrapper over a UChar string that
+ * yen).  This class is a thin wrapper over a char16_t string that
  * subclasses MeasureUnit, for use with Measure and MeasureFormat.
  *
  * @author Alan Liu
@@ -34,15 +36,22 @@ U_NAMESPACE_BEGIN
  */
 class U_I18N_API CurrencyUnit: public MeasureUnit {
  public:
+    /**
+     * Default constructor.  Initializes currency code to "XXX" (no currency).
+     * @draft ICU 60
+     */
+    CurrencyUnit();
+
     /**
      * Construct an object with the given ISO currency code.
-     * @param isoCode the 3-letter ISO 4217 currency code; must not be
-     * NULL and must have length 3
+     * @param isoCode the 3-letter ISO 4217 currency code; must have
+     * length 3 and need not be NUL-terminated. If NULL, the currency
+     * is initialized to the unknown currency XXX.
      * @param ec input-output error code. If the isoCode is invalid,
      * then this will be set to a failing value.
      * @stable ICU 3.0
      */
-    CurrencyUnit(const UChar* isoCode, UErrorCode &ec);
+    CurrencyUnit(ConstChar16Ptr isoCode, UErrorCode &ec);
 
     /**
      * Copy constructor
@@ -50,6 +59,18 @@ class U_I18N_API CurrencyUnit: public MeasureUnit {
      */
     CurrencyUnit(const CurrencyUnit& other);
 
+#ifndef U_HIDE_DRAFT_API
+    /**
+     * Copy constructor from MeasureUnit. This constructor allows you to
+     * restore a CurrencyUnit that was sliced to MeasureUnit.
+     *
+     * @param measureUnit The MeasureUnit to copy from.
+     * @param ec Set to a failing value if the MeasureUnit is not a currency.
+     * @draft ICU 60
+     */
+    CurrencyUnit(const MeasureUnit& measureUnit, UErrorCode &ec);
+#endif  /* U_HIDE_DRAFT_API */
+
     /**
      * Assignment operator
      * @stable ICU 3.0
@@ -91,16 +112,16 @@ class U_I18N_API CurrencyUnit: public MeasureUnit {
      * Return the ISO currency code of this object.
      * @stable ICU 3.0
      */
-    inline const UChar* getISOCurrency() const;
+    inline const char16_t* getISOCurrency() const;
 
  private:
     /**
      * The ISO 4217 code of this object.
      */
-    UChar isoCode[4];
+    char16_t isoCode[4];
 };
 
-inline const UChar* CurrencyUnit::getISOCurrency() const {
+inline const char16_t* CurrencyUnit::getISOCurrency() const {
     return isoCode;
 }
 
index 983f13635c5ac47b7f26d8fa77c6562d9695e07f..f8bcf54bfb351f864555d513a12833c9dcb9d2a4 100644 (file)
@@ -1,6 +1,8 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
  ********************************************************************************
- *   Copyright (C) 1997-2015, International Business Machines
+ *   Copyright (C) 1997-2016, International Business Machines
  *   Corporation and others.  All Rights Reserved.
  ********************************************************************************
  *
@@ -42,7 +44,8 @@ class TimeZone;
 class DateTimePatternGenerator;
 
 // explicit template instantiation. see digitlst.h
-#if defined (_MSC_VER)
+// (When building DLLs for Windows this is required.)
+#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN
 template class U_I18N_API EnumSet<UDateFormatBooleanAttribute,
             0, 
             UDAT_BOOLEAN_ATTRIBUTE_COUNT>;
@@ -571,7 +574,20 @@ public:
                                               EStyle timeStyle = kDefault,
                                               const Locale& aLocale = Locale::getDefault());
 
-#ifndef U_HIDE_DRAFT_API
+#ifndef U_HIDE_INTERNAL_API
+    /**
+     * Returns the best pattern given a skeleton and locale.
+     * @param locale the locale
+     * @param skeleton the skeleton
+     * @param status ICU error returned here
+     * @return the best pattern.
+     * @internal For ICU use only.
+     */
+    static UnicodeString getBestPattern(
+            const Locale &locale,
+            const UnicodeString &skeleton,
+            UErrorCode &status);
+#endif  /* U_HIDE_INTERNAL_API */
 
     /**
      * Creates a date/time formatter for the given skeleton and 
@@ -584,7 +600,7 @@ public:
      *                 order for that locale.
      * @param status   Any error returned here.
      * @return         A date/time formatter which the caller owns.
-     * @draft ICU 55
+     * @stable ICU 55
      */
     static DateFormat* U_EXPORT2 createInstanceForSkeleton(
             const UnicodeString& skeleton,
@@ -601,7 +617,7 @@ public:
      * @param locale  The given locale.
      * @param status   Any error returned here.
      * @return         A date/time formatter which the caller owns.
-     * @draft ICU 55
+     * @stable ICU 55
      */
     static DateFormat* U_EXPORT2 createInstanceForSkeleton(
             const UnicodeString& skeleton,
@@ -620,7 +636,7 @@ public:
      * @param locale  The given locale.
      * @param status   Any error returned here.
      * @return         A date/time formatter which the caller owns.
-     * @draft ICU 55
+     * @stable ICU 55
      */
     static DateFormat* U_EXPORT2 createInstanceForSkeleton(
             Calendar *calendarToAdopt,
@@ -628,42 +644,6 @@ public:
             const Locale &locale,
             UErrorCode &status);
 
-#endif /* U_HIDE_DRAFT_API */
-
-#ifndef U_HIDE_INTERNAL_API 
-
-    /**
-     * Creates a date/time formatter for the given skeleton and locale and
-     * uses the given DateTimePatternGenerator to convert the skeleton to
-     * a format pattern. As creating a DateTimePatternGenerator is
-     * expensive, callers can supply it here (if they already have it) to save
-     * this method from creating its own.
-     *
-     * @param skeleton The skeleton e.g "yMMMMd." Fields in the skeleton can
-     *                 be in any order, and this method uses the provided
-     *                 DateTimePatternGenerator to map the skeleton to a
-     *                 pattern that includes appropriate separators with
-     *                 the fields in the appropriate order.
-     * @param locale  The given locale.
-     * @param dpng     The user supplied DateTimePatternGenerator. dpng
-     *                 must be created for the same locale as locale.
-     *                 Moreover, the caller must not modify dpng between
-     *                 creating it by locale and calling this method.
-     *                 Although dpng is a non-const reference, the caller
-     *                 must not regard it as an out or in-out parameter.
-     *                 The only reason dpng is a non-const reference is
-     *                 because its method, getBestPattern, which converts
-     *                 a skeleton to a date format pattern is non-const.
-     * @return         A date/time formatter which the caller owns.
-     * @internal For ICU use only
-     */
-    static DateFormat* U_EXPORT2 internalCreateInstanceForSkeleton(
-            const UnicodeString& skeleton,
-            const Locale &locale,
-            DateTimePatternGenerator &dpng,
-            UErrorCode &status);
-
-#endif /* U_HIDE_INTERNAL_API */
 
     /**
      * Gets the set of locales for which DateFormats are installed.
@@ -887,6 +867,7 @@ protected:
 
 
 private:
+
     /**
      * Gets the date/time formatter with the given formatting styles for the
      * given locale.
index 7187c3c20f9823648e5f33f289e4157025cf4114..a2c3d7d75232e48d63b8e82031779d82208e53e8 100644 (file)
@@ -1,3 +1,5 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 **********************************************************************
 *   Copyright (C) 1999-2006,2013 IBM Corp. All rights reserved.
index 46ef22241b31c58789465ee941b44036f51bcd9a..2f824cec3087f599c0528d118b3e83a7c0d63773 100644 (file)
@@ -1,6 +1,8 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 ********************************************************************************
-*   Copyright (C) 1997-2015, International Business Machines
+*   Copyright (C) 1997-2016, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 ********************************************************************************
 *
@@ -32,7 +34,9 @@
 
 #include "unicode/uobject.h"
 #include "unicode/locid.h"
+#include "unicode/numsys.h"
 #include "unicode/unum.h"
+#include "unicode/unistr.h"
 
 /**
  * \file
@@ -76,10 +80,6 @@ U_NAMESPACE_BEGIN
  * If you supply a pattern with multiple grouping characters, the interval
  * between the last one and the end of the integer is the one that is
  * used. So "#,##,###,####" == "######,####" == "##,####,####".
- * <P>
- * This class only handles localized digits where the 10 digits are
- * contiguous in Unicode, from 0 to 9. Other digits sets (such as
- * superscripts) would need a different subclass.
  */
 class U_I18N_API DecimalFormatSymbols : public UObject {
 public:
@@ -163,12 +163,10 @@ public:
          * @stable ICU 4.6
          */
         kNineDigitSymbol,
-#ifndef U_HIDE_DRAFT_API
         /** Multiplication sign.
-         * @draft ICU 54
+         * @stable ICU 54
          */
         kExponentMultiplicationSymbol,
-#endif  /* U_HIDE_DRAFT_API */
         /** count symbol constants */
         kFormatSymbolCount = kNineDigitSymbol + 2
     };
@@ -183,6 +181,26 @@ public:
      */
     DecimalFormatSymbols(const Locale& locale, UErrorCode& status);
 
+#ifndef U_HIDE_DRAFT_API
+    /**
+     * Creates a DecimalFormatSymbols instance for the given locale with digits and symbols
+     * corresponding to the given NumberingSystem.
+     *
+     * This constructor behaves equivalently to the normal constructor called with a locale having a
+     * "numbers=xxxx" keyword specifying the numbering system by name.
+     *
+     * In this constructor, the NumberingSystem argument will be used even if the locale has its own
+     * "numbers=xxxx" keyword.
+     *
+     * @param locale    The locale to get symbols for.
+     * @param ns        The numbering system.
+     * @param status    Input/output parameter, set to success or
+     *                  failure code upon return.
+     * @draft ICU 60
+     */
+    DecimalFormatSymbols(const Locale& locale, const NumberingSystem& ns, UErrorCode& status);
+#endif  /* U_HIDE_DRAFT_API */
+
     /**
      * Create a DecimalFormatSymbols object for the default locale.
      * This constructor will not fail.  If the resource file data is
@@ -345,8 +363,11 @@ private:
      * @param success              Input/output parameter, set to success or
      *                             failure code upon return.
      * @param useLastResortData    determine if use last resort data
+     * @param ns                   The NumberingSystem to use; otherwise, fall
+     *                             back to the locale.
      */
-    void initialize(const Locale& locale, UErrorCode& success, UBool useLastResortData = FALSE);
+    void initialize(const Locale& locale, UErrorCode& success,
+        UBool useLastResortData = FALSE, const NumberingSystem* ns = nullptr);
 
     /**
      * Initialize the symbols with default values.
@@ -356,26 +377,70 @@ private:
     void setCurrencyForSymbols();
 
 public:
+
+#ifndef U_HIDE_INTERNAL_API
+    /**
+     * @internal For ICU use only
+     */
+    inline UBool isCustomCurrencySymbol() const {
+        return fIsCustomCurrencySymbol;
+    }
+
+    /**
+     * @internal For ICU use only
+     */
+    inline UBool isCustomIntlCurrencySymbol() const {
+        return fIsCustomIntlCurrencySymbol;
+    }
+
+    /**
+     * @internal For ICU use only
+     */
+    inline UChar32 getCodePointZero() const {
+        return fCodePointZero;
+    }
+#endif  /* U_HIDE_INTERNAL_API */
+
     /**
      * _Internal_ function - more efficient version of getSymbol,
      * returning a const reference to one of the symbol strings.
      * The returned reference becomes invalid when the symbol is changed
      * or when the DecimalFormatSymbols are destroyed.
-     * ### TODO markus 2002oct11: Consider proposing getConstSymbol() to be really public.
      * Note: moved #ifndef U_HIDE_INTERNAL_API after this, since this is needed for inline in DecimalFormat
      *
+     * This is not currently stable API, but if you think it should be stable,
+     * post a comment on the following ticket and the ICU team will take a look:
+     * http://bugs.icu-project.org/trac/ticket/13580
+     *
      * @param symbol Constant to indicate a number format symbol.
      * @return the format symbol by the param 'symbol'
      * @internal
      */
-    inline const UnicodeString &getConstSymbol(ENumberFormatSymbol symbol) const;
+    inline const UnicodeStringgetConstSymbol(ENumberFormatSymbol symbol) const;
 
 #ifndef U_HIDE_INTERNAL_API
+    /**
+     * Returns the const UnicodeString reference, like getConstSymbol,
+     * corresponding to the digit with the given value.  This is equivalent
+     * to accessing the symbol from getConstSymbol with the corresponding
+     * key, such as kZeroDigitSymbol or kOneDigitSymbol.
+     *
+     * This is not currently stable API, but if you think it should be stable,
+     * post a comment on the following ticket and the ICU team will take a look:
+     * http://bugs.icu-project.org/trac/ticket/13580
+     *
+     * @param digit The digit, an integer between 0 and 9 inclusive.
+     *              If outside the range 0 to 9, the zero digit is returned.
+     * @return the format symbol for the given digit.
+     * @internal This API is currently for ICU use only.
+     */
+    inline const UnicodeString& getConstDigitSymbol(int32_t digit) const;
+
     /**
      * Returns that pattern stored in currecy info. Internal API for use by NumberFormat API.
      * @internal
      */
-    inline const UChar* getCurrencyPattern(void) const;
+    inline const char16_t* getCurrencyPattern(void) const;
 #endif  /* U_HIDE_INTERNAL_API */
 
 private:
@@ -402,14 +467,32 @@ private:
      */
     UnicodeString fNoSymbol;
 
+    /**
+     * Dealing with code points is faster than dealing with strings when formatting. Because of
+     * this, we maintain a value containing the zero code point that is used whenever digitStrings
+     * represents a sequence of ten code points in order.
+     *
+     * <p>If the value stored here is positive, it means that the code point stored in this value
+     * corresponds to the digitStrings array, and codePointZero can be used instead of the
+     * digitStrings array for the purposes of efficient formatting; if -1, then digitStrings does
+     * *not* contain a sequence of code points, and it must be used directly.
+     *
+     * <p>It is assumed that codePointZero always shadows the value in digitStrings. codePointZero
+     * should never be set directly; rather, it should be updated only when digitStrings mutates.
+     * That is, the flow of information is digitStrings -> codePointZero, not the other way.
+     */
+    UChar32 fCodePointZero;
+
     Locale locale;
 
     char actualLocale[ULOC_FULLNAME_CAPACITY];
     char validLocale[ULOC_FULLNAME_CAPACITY];
-    const UChar* currPattern;
+    const char16_t* currPattern;
 
     UnicodeString currencySpcBeforeSym[UNUM_CURRENCY_SPACING_COUNT];
     UnicodeString currencySpcAfterSym[UNUM_CURRENCY_SPACING_COUNT];
+    UBool fIsCustomCurrencySymbol;
+    UBool fIsCustomIntlCurrencySymbol;
 };
 
 // -------------------------------------
@@ -425,8 +508,7 @@ DecimalFormatSymbols::getSymbol(ENumberFormatSymbol symbol) const {
     return *strPtr;
 }
 
-//#ifndef U_HIDE_INTERNAL_API
-// See comments above for this function. Not hidden.
+// See comments above for this function. Not hidden with #ifdef U_HIDE_INTERNAL_API
 inline const UnicodeString &
 DecimalFormatSymbols::getConstSymbol(ENumberFormatSymbol symbol) const {
     const UnicodeString *strPtr;
@@ -438,27 +520,49 @@ DecimalFormatSymbols::getConstSymbol(ENumberFormatSymbol symbol) const {
     return *strPtr;
 }
 
-//#endif  /* U_HIDE_INTERNAL_API */
-
+#ifndef U_HIDE_INTERNAL_API
+inline const UnicodeString& DecimalFormatSymbols::getConstDigitSymbol(int32_t digit) const {
+    if (digit < 0 || digit > 9) {
+        digit = 0;
+    }
+    if (digit == 0) {
+        return fSymbols[kZeroDigitSymbol];
+    }
+    ENumberFormatSymbol key = static_cast<ENumberFormatSymbol>(kOneDigitSymbol + digit - 1);
+    return fSymbols[key];
+}
+#endif
 
 // -------------------------------------
 
 inline void
 DecimalFormatSymbols::setSymbol(ENumberFormatSymbol symbol, const UnicodeString &value, const UBool propogateDigits = TRUE) {
+    if (symbol == kCurrencySymbol) {
+        fIsCustomCurrencySymbol = TRUE;
+    }
+    else if (symbol == kIntlCurrencySymbol) {
+        fIsCustomIntlCurrencySymbol = TRUE;
+    }
     if(symbol<kFormatSymbolCount) {
         fSymbols[symbol]=value;
     }
 
     // If the zero digit is being set to a known zero digit according to Unicode,
     // then we automatically set the corresponding 1-9 digits
-    if ( propogateDigits && symbol == kZeroDigitSymbol && value.countChar32() == 1 ) {
+    // Also record updates to fCodePointZero. Be conservative if in doubt.
+    if (symbol == kZeroDigitSymbol) {
         UChar32 sym = value.char32At(0);
-        if ( u_charDigitValue(sym) == 0 ) {
+        if ( propogateDigits && u_charDigitValue(sym) == 0 && value.countChar32() == 1 ) {
+            fCodePointZero = sym;
             for ( int8_t i = 1 ; i<= 9 ; i++ ) {
                 sym++;
                 fSymbols[(int)kOneDigitSymbol+i-1] = UnicodeString(sym);
             }
+        } else {
+            fCodePointZero = -1;
         }
+    } else if (symbol >= kOneDigitSymbol && symbol <= kNineDigitSymbol) {
+        fCodePointZero = -1;
     }
 }
 
@@ -470,7 +574,7 @@ DecimalFormatSymbols::getLocale() const {
 }
 
 #ifndef U_HIDE_INTERNAL_API
-inline const UChar*
+inline const char16_t*
 DecimalFormatSymbols::getCurrencyPattern() const {
     return currPattern;
 }
index 138855bf0853eeeff5684776bacf19030a4f6604..3747f510f79c794f9a43b447702d0403892bce70 100644 (file)
@@ -1,6 +1,8 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 ********************************************************************************
-*   Copyright (C) 1997-2015, International Business Machines
+*   Copyright (C) 1997-2016, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 ********************************************************************************
 *
@@ -28,7 +30,7 @@
 #include "unicode/utypes.h"
 /**
  * \file
- * \brief C++ API: Formats decimal numbers.
+ * \brief C++ API: Compatibility APIs for decimal formatting.
  */
 
 #if !UCONFIG_NO_FORMATTING
 #include "unicode/curramt.h"
 #include "unicode/enumset.h"
 
-/**
- * \def UNUM_DECIMALFORMAT_INTERNAL_SIZE
- * @internal
- */
-#if UCONFIG_FORMAT_FASTPATHS_49
-#define UNUM_DECIMALFORMAT_INTERNAL_SIZE 16
-#endif
-
 U_NAMESPACE_BEGIN
 
-class DigitList;
-class ChoiceFormat;
 class CurrencyPluralInfo;
-class Hashtable;
-class UnicodeSet;
-class FieldPositionHandler;
-class DecimalFormatStaticSets;
-class FixedDecimal;
+class CompactDecimalFormat;
+
+namespace number {
+class LocalizedNumberFormatter;
+class FormattedNumber;
+namespace impl {
+class DecimalQuantity;
+struct DecimalFormatFields;
+}
+}
+
+namespace numparse {
+namespace impl {
+class NumberParserImpl;
+}
+}
 
 // explicit template instantiation. see digitlst.h
-#if defined (_MSC_VER)
+// (When building DLLs for Windows this is required.)
+#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN
 template class U_I18N_API    EnumSet<UNumberFormatAttribute,
             UNUM_MAX_NONBOOLEAN_ATTRIBUTE+1,
             UNUM_LIMIT_BOOLEAN_ATTRIBUTE>;
 #endif
 
 /**
+ * <p><strong>IMPORTANT:</strong> New users are strongly encouraged to see if
+ * numberformatter.h fits their use case.  Although not deprecated, this header
+ * is provided for backwards compatibility only.
+ * <hr/>
+ *
  * DecimalFormat is a concrete subclass of NumberFormat that formats decimal
  * numbers. It has a variety of features designed to make it possible to parse
  * and format numbers in any locale, including support for Western, Arabic, or
@@ -598,7 +607,7 @@ template class U_I18N_API    EnumSet<UNumberFormatAttribute,
  * including prefix and suffix, determines the format width.  For example, in
  * the pattern <code>"* #0 o''clock"</code>, the format width is 10.
  *
- * <li>The width is counted in 16-bit code units (UChars).
+ * <li>The width is counted in 16-bit code units (char16_ts).
  *
  * <li>Some parameters which usually do not matter have meaning when padding is
  * used, because the pattern width is significant with padding.  In the pattern
@@ -660,39 +669,14 @@ template class U_I18N_API    EnumSet<UNumberFormatAttribute,
  * subclasses, such code will not necessarily work and will not be
  * guaranteed to work stably from release to release.
  */
-class U_I18N_API DecimalFormat: public NumberFormat {
-public:
-    /**
-     * Rounding mode.
-     * @stable ICU 2.4
-     */
-    enum ERoundingMode {
-        kRoundCeiling,  /**< Round towards positive infinity */
-        kRoundFloor,    /**< Round towards negative infinity */
-        kRoundDown,     /**< Round towards zero */
-        kRoundUp,       /**< Round away from zero */
-        kRoundHalfEven, /**< Round towards the nearest integer, or
-                             towards the nearest even integer if equidistant */
-        kRoundHalfDown, /**< Round towards the nearest integer, or
-                             towards zero if equidistant */
-        kRoundHalfUp,   /**< Round towards the nearest integer, or
-                             away from zero if equidistant */
-        /**
-          *  Return U_FORMAT_INEXACT_ERROR if number does not format exactly.
-          *  @stable ICU 4.8
-          */
-        kRoundUnnecessary
-    };
-
+class U_I18N_API DecimalFormat : public NumberFormat {
+  public:
     /**
      * Pad position.
      * @stable ICU 2.4
      */
     enum EPadPosition {
-        kPadBeforePrefix,
-        kPadAfterPrefix,
-        kPadBeforeSuffix,
-        kPadAfterSuffix
+        kPadBeforePrefix, kPadAfterPrefix, kPadBeforeSuffix, kPadAfterSuffix
     };
 
     /**
@@ -704,6 +688,9 @@ public:
      * on NumberFormat such as createInstance. These factories will
      * return the most appropriate sub-class of NumberFormat for a given
      * locale.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of DecimalFormat.
      * @param status    Output param set to success/failure code. If the
      *                  pattern is invalid this will be set to a failure code.
      * @stable ICU 2.0
@@ -719,13 +706,15 @@ public:
      * on NumberFormat such as createInstance. These factories will
      * return the most appropriate sub-class of NumberFormat for a given
      * locale.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of DecimalFormat.
      * @param pattern   A non-localized pattern string.
      * @param status    Output param set to success/failure code. If the
      *                  pattern is invalid this will be set to a failure code.
      * @stable ICU 2.0
      */
-    DecimalFormat(const UnicodeString& pattern,
-                  UErrorCode& status);
+    DecimalFormat(const UnicodeString& pattern, UErrorCode& status);
 
     /**
      * Create a DecimalFormat from the given pattern and symbols.
@@ -737,6 +726,9 @@ public:
      * createInstance or createCurrencyInstance. If you need only minor adjustments
      * to a standard format, you can modify the format returned by
      * a NumberFormat factory method.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of DecimalFormat.
      *
      * @param pattern           a non-localized pattern string
      * @param symbolsToAdopt    the set of symbols to be used.  The caller should not
@@ -745,11 +737,10 @@ public:
      *                          pattern is invalid this will be set to a failure code.
      * @stable ICU 2.0
      */
-    DecimalFormat(  const UnicodeString& pattern,
-                    DecimalFormatSymbols* symbolsToAdopt,
-                    UErrorCode& status);
+    DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt, UErrorCode& status);
 
 #ifndef U_HIDE_INTERNAL_API
+
     /**
      * This API is for ICU use only.
      * Create a DecimalFormat from the given pattern, symbols, and style.
@@ -762,20 +753,29 @@ public:
      *                          pattern is invalid this will be set to a failure code.
      * @internal
      */
-    DecimalFormat(  const UnicodeString& pattern,
-                    DecimalFormatSymbols* symbolsToAdopt,
-                    UNumberFormatStyle style,
-                    UErrorCode& status);
+    DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt,
+                  UNumberFormatStyle style, UErrorCode& status);
 
 #if UCONFIG_HAVE_PARSEALLINPUT
+
     /**
      * @internal
      */
     void setParseAllInput(UNumberFormatAttributeValue value);
+
 #endif
 
 #endif  /* U_HIDE_INTERNAL_API */
 
+  private:
+
+    /**
+     * Internal constructor for DecimalFormat; sets up internal fields. All public constructors should
+     * call this constructor.
+     */
+    DecimalFormat(const DecimalFormatSymbols* symbolsToAdopt, UErrorCode& status);
+
+  public:
 
     /**
      * Set an integer attribute on this DecimalFormat.
@@ -787,9 +787,7 @@ public:
      * @return *this - for chaining (example: format.setAttribute(...).setAttribute(...) )
      * @stable ICU 51
      */
-    virtual DecimalFormat& setAttribute( UNumberFormatAttribute attr,
-                                       int32_t newvalue,
-                                       UErrorCode &status);
+    virtual DecimalFormat& setAttribute(UNumberFormatAttribute attr, int32_t newValue, UErrorCode& status);
 
     /**
      * Get an integer
@@ -800,17 +798,16 @@ public:
      * @return the attribute value. Undefined if there is an error.
      * @stable ICU 51
      */
-    virtual int32_t getAttribute( UNumberFormatAttribute attr,
-                                  UErrorCode &status) const;
+    virtual int32_t getAttribute(UNumberFormatAttribute attr, UErrorCode& status) const;
+
 
-    
     /**
      * Set whether or not grouping will be used in this format.
      * @param newValue    True, grouping will be used in this format.
      * @see getGroupingUsed
      * @stable ICU 53
      */
-    virtual void setGroupingUsed(UBool newValue);
+    void setGroupingUsed(UBool newValue) U_OVERRIDE;
 
     /**
      * Sets whether or not numbers should be parsed as integers only.
@@ -819,18 +816,16 @@ public:
      * @see isParseIntegerOnly
      * @stable ICU 53
      */
-    virtual void setParseIntegerOnly(UBool value);
+    void setParseIntegerOnly(UBool value) U_OVERRIDE;
 
     /**
-     * Set a particular UDisplayContext value in the formatter, such as
-     * UDISPCTX_CAPITALIZATION_FOR_STANDALONE.
-     * @param value The UDisplayContext value to set.
-     * @param status Input/output status. If at entry this indicates a failure
-     *               status, the function will do nothing; otherwise this will be
-     *               updated with any new status from the function. 
-     * @stable ICU 53
+     * Sets whether lenient parsing should be enabled (it is off by default).
+     *
+     * @param enable \c TRUE if lenient parsing should be used,
+     *               \c FALSE otherwise.
+     * @stable ICU 4.8
      */
-    virtual void setContext(UDisplayContext value, UErrorCode& status);
+    void setLenient(UBool enable) U_OVERRIDE;
 
     /**
      * Create a DecimalFormat from the given pattern and symbols.
@@ -842,6 +837,9 @@ public:
      * createInstance or createCurrencyInstance. If you need only minor adjustments
      * to a standard format, you can modify the format returned by
      * a NumberFormat factory method.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of DecimalFormat.
      *
      * @param pattern           a non-localized pattern string
      * @param symbolsToAdopt    the set of symbols to be used.  The caller should not
@@ -851,10 +849,9 @@ public:
      *                          pattern is invalid this will be set to a failure code.
      * @stable ICU 2.0
      */
-    DecimalFormat(  const UnicodeString& pattern,
-                    DecimalFormatSymbols* symbolsToAdopt,
-                    UParseError& parseError,
-                    UErrorCode& status);
+    DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt,
+                  UParseError& parseError, UErrorCode& status);
+
     /**
      * Create a DecimalFormat from the given pattern and symbols.
      * Use this constructor when you need to completely customize the
@@ -865,6 +862,9 @@ public:
      * createInstance or createCurrencyInstance. If you need only minor adjustments
      * to a standard format, you can modify the format returned by
      * a NumberFormat factory method.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of DecimalFormat.
      *
      * @param pattern           a non-localized pattern string
      * @param symbols   the set of symbols to be used
@@ -872,9 +872,7 @@ public:
      *                          pattern is invalid this will be set to a failure code.
      * @stable ICU 2.0
      */
-    DecimalFormat(  const UnicodeString& pattern,
-                    const DecimalFormatSymbols& symbols,
-                    UErrorCode& status);
+    DecimalFormat(const UnicodeString& pattern, const DecimalFormatSymbols& symbols, UErrorCode& status);
 
     /**
      * Copy constructor.
@@ -896,7 +894,7 @@ public:
      * Destructor.
      * @stable ICU 2.0
      */
-    virtual ~DecimalFormat();
+    ~DecimalFormat() U_OVERRIDE;
 
     /**
      * Clone this Format object polymorphically. The caller owns the
@@ -905,7 +903,7 @@ public:
      * @return    a polymorphic copy of this DecimalFormat.
      * @stable ICU 2.0
      */
-    virtual Format* clone(void) const;
+    Format* clone(void) const U_OVERRIDE;
 
     /**
      * Return true if the given Format objects are semantically equal.
@@ -915,7 +913,7 @@ public:
      * @return         true if the given Format objects are semantically equal.
      * @stable ICU 2.0
      */
-    virtual UBool operator==(const Format& other) const;
+    UBool operator==(const Format& other) const U_OVERRIDE;
 
 
     using NumberFormat::format;
@@ -931,11 +929,9 @@ public:
      * @return          Reference to 'appendTo' parameter.
      * @stable ICU 2.0
      */
-    virtual UnicodeString& format(double number,
-                                  UnicodeString& appendTo,
-                                  FieldPosition& pos) const;
-
+    UnicodeString& format(double number, UnicodeString& appendTo, FieldPosition& pos) const U_OVERRIDE;
 
+#ifndef U_HIDE_INTERNAL_API
     /**
      * Format a double or long number using base-10 representation.
      *
@@ -948,10 +944,9 @@ public:
      * @return          Reference to 'appendTo' parameter.
      * @internal
      */
-    virtual UnicodeString& format(double number,
-                                  UnicodeString& appendTo,
-                                  FieldPosition& pos,
-                                  UErrorCode &status) const;
+    UnicodeString& format(double number, UnicodeString& appendTo, FieldPosition& pos,
+                          UErrorCode& status) const U_OVERRIDE;
+#endif  /* U_HIDE_INTERNAL_API */
 
     /**
      * Format a double or long number using base-10 representation.
@@ -964,12 +959,10 @@ public:
      *                  Can be NULL.
      * @param status    Output param filled with success/failure status.
      * @return          Reference to 'appendTo' parameter.
-     * @stable 4.4
+     * @stable ICU 4.4
      */
-    virtual UnicodeString& format(double number,
-                                  UnicodeString& appendTo,
-                                  FieldPositionIterator* posIter,
-                                  UErrorCode& status) const;
+    UnicodeString& format(double number, UnicodeString& appendTo, FieldPositionIterator* posIter,
+                          UErrorCode& status) const U_OVERRIDE;
 
     /**
      * Format a long number using base-10 representation.
@@ -982,10 +975,9 @@ public:
      * @return          Reference to 'appendTo' parameter.
      * @stable ICU 2.0
      */
-    virtual UnicodeString& format(int32_t number,
-                                  UnicodeString& appendTo,
-                                  FieldPosition& pos) const;
+    UnicodeString& format(int32_t number, UnicodeString& appendTo, FieldPosition& pos) const U_OVERRIDE;
 
+#ifndef U_HIDE_INTERNAL_API
     /**
      * Format a long number using base-10 representation.
      *
@@ -997,10 +989,9 @@ public:
      * @return          Reference to 'appendTo' parameter.
      * @internal
      */
-    virtual UnicodeString& format(int32_t number,
-                                  UnicodeString& appendTo,
-                                  FieldPosition& pos,
-                                  UErrorCode &status) const;
+    UnicodeString& format(int32_t number, UnicodeString& appendTo, FieldPosition& pos,
+                          UErrorCode& status) const U_OVERRIDE;
+#endif  /* U_HIDE_INTERNAL_API */
 
     /**
      * Format a long number using base-10 representation.
@@ -1013,12 +1004,10 @@ public:
      *                  Can be NULL.
      * @param status    Output param filled with success/failure status.
      * @return          Reference to 'appendTo' parameter.
-     * @stable 4.4
+     * @stable ICU 4.4
      */
-    virtual UnicodeString& format(int32_t number,
-                                  UnicodeString& appendTo,
-                                  FieldPositionIterator* posIter,
-                                  UErrorCode& status) const;
+    UnicodeString& format(int32_t number, UnicodeString& appendTo, FieldPositionIterator* posIter,
+                          UErrorCode& status) const U_OVERRIDE;
 
     /**
      * Format an int64 number using base-10 representation.
@@ -1031,10 +1020,9 @@ public:
      * @return          Reference to 'appendTo' parameter.
      * @stable ICU 2.8
      */
-    virtual UnicodeString& format(int64_t number,
-                                  UnicodeString& appendTo,
-                                  FieldPosition& pos) const;
+    UnicodeString& format(int64_t number, UnicodeString& appendTo, FieldPosition& pos) const U_OVERRIDE;
 
+#ifndef U_HIDE_INTERNAL_API
     /**
      * Format an int64 number using base-10 representation.
      *
@@ -1046,10 +1034,9 @@ public:
      * @return          Reference to 'appendTo' parameter.
      * @internal
      */
-    virtual UnicodeString& format(int64_t number,
-                                  UnicodeString& appendTo,
-                                  FieldPosition& pos,
-                                  UErrorCode &status) const;
+    UnicodeString& format(int64_t number, UnicodeString& appendTo, FieldPosition& pos,
+                          UErrorCode& status) const U_OVERRIDE;
+#endif  /* U_HIDE_INTERNAL_API */
 
     /**
      * Format an int64 number using base-10 representation.
@@ -1062,12 +1049,10 @@ public:
      *                  Can be NULL.
      * @param status    Output param filled with success/failure status.
      * @return          Reference to 'appendTo' parameter.
-     * @stable 4.4
+     * @stable ICU 4.4
      */
-    virtual UnicodeString& format(int64_t number,
-                                  UnicodeString& appendTo,
-                                  FieldPositionIterator* posIter,
-                                  UErrorCode& status) const;
+    UnicodeString& format(int64_t number, UnicodeString& appendTo, FieldPositionIterator* posIter,
+                          UErrorCode& status) const U_OVERRIDE;
 
     /**
      * Format a decimal number.
@@ -1083,21 +1068,20 @@ public:
      *                  Can be NULL.
      * @param status    Output param filled with success/failure status.
      * @return          Reference to 'appendTo' parameter.
-     * @stable 4.4
+     * @stable ICU 4.4
      */
-    virtual UnicodeString& format(const StringPiece &number,
-                                  UnicodeString& appendTo,
-                                  FieldPositionIterator* posIter,
-                                  UErrorCode& status) const;
+    UnicodeString& format(StringPiece number, UnicodeString& appendTo, FieldPositionIterator* posIter,
+                          UErrorCode& status) const U_OVERRIDE;
 
+#ifndef U_HIDE_INTERNAL_API
 
     /**
      * Format a decimal number.
-     * The number is a DigitList wrapper onto a floating point decimal number.
+     * The number is a DecimalQuantity wrapper onto a floating point decimal number.
      * The default implementation in NumberFormat converts the decimal number
      * to a double and formats that.
      *
-     * @param number    The number, a DigitList format Decimal Floating Point.
+     * @param number    The number, a DecimalQuantity format Decimal Floating Point.
      * @param appendTo  Output parameter to receive result.
      *                  Result is appended to existing contents.
      * @param posIter   On return, can be used to iterate over positions
@@ -1106,18 +1090,16 @@ public:
      * @return          Reference to 'appendTo' parameter.
      * @internal
      */
-    virtual UnicodeString& format(const DigitList &number,
-                                  UnicodeString& appendTo,
-                                  FieldPositionIterator* posIter,
-                                  UErrorCode& status) const;
+    UnicodeString& format(const number::impl::DecimalQuantity& number, UnicodeString& appendTo,
+                          FieldPositionIterator* posIter, UErrorCode& status) const U_OVERRIDE;
 
     /**
      * Format a decimal number.
-     * The number is a DigitList wrapper onto a floating point decimal number.
+     * The number is a DecimalQuantity wrapper onto a floating point decimal number.
      * The default implementation in NumberFormat converts the decimal number
      * to a double and formats that.
      *
-     * @param number    The number, a DigitList format Decimal Floating Point.
+     * @param number    The number, a DecimalQuantity format Decimal Floating Point.
      * @param appendTo  Output parameter to receive result.
      *                  Result is appended to existing contents.
      * @param pos       On input: an alignment field, if desired.
@@ -1126,35 +1108,34 @@ public:
      * @return          Reference to 'appendTo' parameter.
      * @internal
      */
-    virtual UnicodeString& format(const DigitList &number,
-                                  UnicodeString& appendTo,
-                                  FieldPosition& pos,
-                                  UErrorCode& status) const;
-
-   using NumberFormat::parse;
-
-   /**
-    * Parse the given string using this object's choices. The method
-    * does string comparisons to try to find an optimal match.
-    * If no object can be parsed, index is unchanged, and NULL is
-    * returned.  The result is returned as the most parsimonious
-    * type of Formattable that will accomodate all of the
-    * necessary precision.  For example, if the result is exactly 12,
-    * it will be returned as a long.  However, if it is 1.5, it will
-    * be returned as a double.
-    *
-    * @param text           The text to be parsed.
-    * @param result         Formattable to be set to the parse result.
-    *                       If parse fails, return contents are undefined.
-    * @param parsePosition  The position to start parsing at on input.
-    *                       On output, moved to after the last successfully
-    *                       parse character. On parse failure, does not change.
-    * @see Formattable
-    * @stable ICU 2.0
-    */
-    virtual void parse(const UnicodeString& text,
-                       Formattable& result,
-                       ParsePosition& parsePosition) const;
+    UnicodeString& format(const number::impl::DecimalQuantity& number, UnicodeString& appendTo,
+                          FieldPosition& pos, UErrorCode& status) const U_OVERRIDE;
+
+#endif // U_HIDE_INTERNAL_API
+
+    using NumberFormat::parse;
+
+    /**
+     * Parse the given string using this object's choices. The method
+     * does string comparisons to try to find an optimal match.
+     * If no object can be parsed, index is unchanged, and NULL is
+     * returned.  The result is returned as the most parsimonious
+     * type of Formattable that will accomodate all of the
+     * necessary precision.  For example, if the result is exactly 12,
+     * it will be returned as a long.  However, if it is 1.5, it will
+     * be returned as a double.
+     *
+     * @param text           The text to be parsed.
+     * @param result         Formattable to be set to the parse result.
+     *                       If parse fails, return contents are undefined.
+     * @param parsePosition  The position to start parsing at on input.
+     *                       On output, moved to after the last successfully
+     *                       parse character. On parse failure, does not change.
+     * @see Formattable
+     * @stable ICU 2.0
+     */
+    void parse(const UnicodeString& text, Formattable& result,
+               ParsePosition& parsePosition) const U_OVERRIDE;
 
     /**
      * Parses text from the given string as a currency amount.  Unlike
@@ -1175,8 +1156,7 @@ public:
      *             the parsed currency; if parse fails, this is NULL.
      * @stable ICU 49
      */
-    virtual CurrencyAmount* parseCurrency(const UnicodeString& text,
-                                          ParsePosition& pos) const;
+    CurrencyAmount* parseCurrency(const UnicodeString& text, ParsePosition& pos) const U_OVERRIDE;
 
     /**
      * Returns the decimal format symbols, which is generally not changed
@@ -1305,12 +1285,29 @@ public:
      */
     virtual void setNegativeSuffix(const UnicodeString& newValue);
 
+#ifndef U_HIDE_INTERNAL_API
+    /**
+     * Whether to show the plus sign on positive (non-negative) numbers; for example, "+12"
+     * @internal Technical Preview
+     */
+    UBool isSignAlwaysShown() const;
+#endif  /* U_HIDE_INTERNAL_API */
+
+    /**
+     * Set whether to show the plus sign on positive (non-negative) numbers; for example, "+12"
+     * @param value The new setting for whether to show plus sign on positive numbers
+     * @internal Technical Preview
+     */
+    virtual void setSignAlwaysShown(UBool value);
+
     /**
      * Get the multiplier for use in percent, permill, etc.
      * For a percentage, set the suffixes to have "%" and the multiplier to be 100.
      * (For Arabic, use arabic percent symbol).
      * For a permill, set the suffixes to have "\\u2031" and the multiplier to be 1000.
      *
+     * The number may also be multiplied by a power of ten; see getMultiplierScale().
+     *
      * @return    the multiplier for use in percent, permill, etc.
      * Examples: with 100, 1.23 -> "123", and "123" -> 1.23
      * @stable ICU 2.0
@@ -1323,12 +1320,52 @@ public:
      * (For Arabic, use arabic percent symbol).
      * For a permill, set the suffixes to have "\\u2031" and the multiplier to be 1000.
      *
+     * This method only supports integer multipliers. To multiply by a non-integer, pair this
+     * method with setMultiplierScale().
+     *
      * @param newValue    the new value of the multiplier for use in percent, permill, etc.
      * Examples: with 100, 1.23 -> "123", and "123" -> 1.23
      * @stable ICU 2.0
      */
     virtual void setMultiplier(int32_t newValue);
 
+#ifndef U_HIDE_DRAFT_API
+    /**
+     * Gets the power of ten by which number should be multiplied before formatting, which
+     * can be combined with setMultiplier() to multiply by any arbitrary decimal value.
+     *
+     * A multiplier scale of 2 corresponds to multiplication by 100, and a multiplier scale
+     * of -2 corresponds to multiplication by 0.01.
+     *
+     * This method is analogous to UNUM_SCALE in getAttribute.
+     *
+     * @return    the current value of the power-of-ten multiplier.
+     * @draft ICU 62
+     */
+    int32_t getMultiplierScale(void) const;
+#endif  /* U_HIDE_DRAFT_API */
+
+    /**
+     * Sets a power of ten by which number should be multiplied before formatting, which
+     * can be combined with setMultiplier() to multiply by any arbitrary decimal value.
+     *
+     * A multiplier scale of 2 corresponds to multiplication by 100, and a multiplier scale
+     * of -2 corresponds to multiplication by 0.01.
+     *
+     * For example, to multiply numbers by 0.5 before formatting, you can do:
+     *
+     * <pre>
+     * df.setMultiplier(5);
+     * df.setMultiplierScale(-1);
+     * </pre>
+     *
+     * This method is analogous to UNUM_SCALE in setAttribute.
+     *
+     * @param newValue    the new value of the power-of-ten multiplier.
+     * @draft ICU 62
+     */
+    virtual void setMultiplierScale(int32_t newValue);
+
     /**
      * Get the rounding increment.
      * @return A positive rounding increment, or 0.0 if a custom rounding
@@ -1361,7 +1398,7 @@ public:
      * @see #setRoundingMode
      * @stable ICU 2.0
      */
-    virtual ERoundingMode getRoundingMode(void) const;
+    virtual ERoundingMode getRoundingMode(void) const U_OVERRIDE;
 
     /**
      * Set the rounding mode.
@@ -1371,7 +1408,7 @@ public:
      * @see #getRoundingMode
      * @stable ICU 2.0
      */
-    virtual void setRoundingMode(ERoundingMode roundingMode);
+    virtual void setRoundingMode(ERoundingMode roundingMode) U_OVERRIDE;
 
     /**
      * Get the width to which the output of format() is padded.
@@ -1430,7 +1467,7 @@ public:
      * @see #setPadPosition
      * @stable ICU 2.0
      */
-    virtual void setPadCharacter(const UnicodeString &padChar);
+    virtual void setPadCharacter(const UnicodeStringpadChar);
 
     /**
      * Get the position at which padding will take place.  This is the location
@@ -1610,6 +1647,45 @@ public:
      */
     virtual void setSecondaryGroupingSize(int32_t newValue);
 
+#ifndef U_HIDE_INTERNAL_API
+
+    /**
+     * Returns the minimum number of grouping digits.
+     * Grouping separators are output if there are at least this many
+     * digits to the left of the first (rightmost) grouping separator,
+     * that is, there are at least (minimum grouping + grouping size) integer digits.
+     * (Subject to isGroupingUsed().)
+     *
+     * For example, if this value is 2, and the grouping size is 3, then
+     * 9999 -> "9999" and 10000 -> "10,000"
+     *
+     * This is a technology preview. This API may change behavior or may be removed.
+     *
+     * The default value for this attribute is 0.
+     * A value of 1, 0, or lower, means that the use of grouping separators
+     * only depends on the grouping size (and on isGroupingUsed()).
+     * Currently, the corresponding CLDR data is not used; this is likely to change.
+     *
+     * @see setMinimumGroupingDigits
+     * @see getGroupingSize
+     * @internal technology preview
+     */
+    int32_t getMinimumGroupingDigits() const;
+
+#endif  /* U_HIDE_INTERNAL_API */
+
+    /* Cannot use #ifndef U_HIDE_INTERNAL_API for the following draft method since it is virtual. */
+    /**
+     * Sets the minimum grouping digits. Setting to a value less than or
+     * equal to 1 turns off minimum grouping digits.
+     *
+     * @param newValue the new value of minimum grouping digits.
+     * @see getMinimumGroupingDigits
+     * @internal technology preview
+     */
+    virtual void setMinimumGroupingDigits(int32_t newValue);
+
+
     /**
      * Allows you to get the behavior of the decimal separator with integers.
      * (The decimal separator will always appear with decimals.)
@@ -1630,27 +1706,79 @@ public:
      */
     virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
 
-#ifndef U_HIDE_DRAFT_API
     /**
      * Allows you to get the parse behavior of the pattern decimal mark.
      *
      * @return    TRUE if input must contain a match to decimal mark in pattern
-     * @draft ICU 54
+     * @stable ICU 54
      */
     UBool isDecimalPatternMatchRequired(void) const;
-#endif  /* U_HIDE_DRAFT_API */
 
     /**
-     * Allows you to set the behavior of the pattern decimal mark.
-     * 
+     * Allows you to set the parse behavior of the pattern decimal mark.
+     *
      * if TRUE, the input must have a decimal mark if one was specified in the pattern. When
      * FALSE the decimal mark may be omitted from the input.
      *
      * @param newValue    set TRUE if input must contain a match to decimal mark in pattern
-     * @draft ICU 54
+     * @stable ICU 54
      */
     virtual void setDecimalPatternMatchRequired(UBool newValue);
 
+    /**
+     * {@icu} Returns whether to ignore exponents when parsing.
+     *
+     * @see #setParseNoExponent
+     * @internal This API is a technical preview. It may change in an upcoming release.
+     */
+    virtual UBool isParseNoExponent() const;
+
+    /**
+     * {@icu} Specifies whether to stop parsing when an exponent separator is encountered. For
+     * example, parses "123E4" to 123 (with parse position 3) instead of 1230000 (with parse position
+     * 5).
+     *
+     * @param value true to prevent exponents from being parsed; false to allow them to be parsed.
+     * @internal This API is a technical preview. It may change in an upcoming release.
+     */
+    virtual void setParseNoExponent(UBool value);
+
+    /**
+     * {@icu} Returns whether parsing is sensitive to case (lowercase/uppercase).
+     *
+     * @see #setParseCaseSensitive
+     * @internal This API is a technical preview. It may change in an upcoming release.
+     */
+    virtual UBool isParseCaseSensitive() const;
+
+    /**
+     * {@icu} Whether to pay attention to case when parsing; default is to ignore case (perform
+     * case-folding). For example, "A" == "a" in case-insensitive but not case-sensitive mode.
+     *
+     * Currency symbols are never case-folded. For example, "us$1.00" will not parse in case-insensitive
+     * mode, even though "US$1.00" parses.
+     *
+     * @internal This API is a technical preview. It may change in an upcoming release.
+     */
+    virtual void setParseCaseSensitive(UBool value);
+
+    /**
+     * {@icu} Returns whether truncation of high-order integer digits should result in an error.
+     * By default, setMaximumIntegerDigits truncates high-order digits silently.
+     *
+     * @see setFormatFailIfMoreThanMaxDigits
+     * @internal This API is a technical preview. It may change in an upcoming release.
+     */
+    virtual UBool isFormatFailIfMoreThanMaxDigits() const;
+
+    /**
+     * {@icu} Sets whether truncation of high-order integer digits should result in an error.
+     * By default, setMaximumIntegerDigits truncates high-order digits silently.
+     *
+     * @internal This API is a technical preview. It may change in an upcoming release.
+     */
+    virtual void setFormatFailIfMoreThanMaxDigits(UBool value);
+
 
     /**
      * Synthesizes a pattern string that represents the current state
@@ -1705,9 +1833,8 @@ public:
      *                   set to a failure result.
      * @stable ICU 2.0
      */
-    virtual void applyPattern(const UnicodeString& pattern,
-                             UParseError& parseError,
-                             UErrorCode& status);
+    virtual void applyPattern(const UnicodeString& pattern, UParseError& parseError, UErrorCode& status);
+
     /**
      * Sets the pattern.
      * @param pattern   The pattern to be applied.
@@ -1716,8 +1843,7 @@ public:
      *                  set to a failure result.
      * @stable ICU 2.0
      */
-    virtual void applyPattern(const UnicodeString& pattern,
-                             UErrorCode& status);
+    virtual void applyPattern(const UnicodeString& pattern, UErrorCode& status);
 
     /**
      * Apply the given pattern to this Format object.  The pattern
@@ -1749,8 +1875,7 @@ public:
      *                  set to a failure result.
      * @stable ICU 2.0
      */
-    virtual void applyLocalizedPattern(const UnicodeString& pattern,
-                                       UParseError& parseError,
+    virtual void applyLocalizedPattern(const UnicodeString& pattern, UParseError& parseError,
                                        UErrorCode& status);
 
     /**
@@ -1762,8 +1887,7 @@ public:
      *                  set to a failure result.
      * @stable ICU 2.0
      */
-    virtual void applyLocalizedPattern(const UnicodeString& pattern,
-                                       UErrorCode& status);
+    virtual void applyLocalizedPattern(const UnicodeString& pattern, UErrorCode& status);
 
 
     /**
@@ -1775,7 +1899,7 @@ public:
      * @see NumberFormat#setMaximumIntegerDigits
      * @stable ICU 2.0
      */
-    virtual void setMaximumIntegerDigits(int32_t newValue);
+    void setMaximumIntegerDigits(int32_t newValue) U_OVERRIDE;
 
     /**
      * Sets the minimum number of digits allowed in the integer portion of a
@@ -1786,7 +1910,7 @@ public:
      * @see NumberFormat#setMinimumIntegerDigits
      * @stable ICU 2.0
      */
-    virtual void setMinimumIntegerDigits(int32_t newValue);
+    void setMinimumIntegerDigits(int32_t newValue) U_OVERRIDE;
 
     /**
      * Sets the maximum number of digits allowed in the fraction portion of a
@@ -1797,7 +1921,7 @@ public:
      * @see NumberFormat#setMaximumFractionDigits
      * @stable ICU 2.0
      */
-    virtual void setMaximumFractionDigits(int32_t newValue);
+    void setMaximumFractionDigits(int32_t newValue) U_OVERRIDE;
 
     /**
      * Sets the minimum number of digits allowed in the fraction portion of a
@@ -1808,7 +1932,7 @@ public:
      * @see NumberFormat#setMinimumFractionDigits
      * @stable ICU 2.0
      */
-    virtual void setMinimumFractionDigits(int32_t newValue);
+    void setMinimumFractionDigits(int32_t newValue) U_OVERRIDE;
 
     /**
      * Returns the minimum number of significant digits that will be
@@ -1871,7 +1995,6 @@ public:
      */
     void setSignificantDigitsUsed(UBool useSignificantDigits);
 
- public:
     /**
      * Sets the currency used to display currency
      * amounts.  This takes effect immediately, if this format is a
@@ -1884,69 +2007,77 @@ public:
      * @param ec input-output error code
      * @stable ICU 3.0
      */
-    virtual void setCurrency(const UChar* theCurrency, UErrorCode& ec);
+    void setCurrency(const char16_t* theCurrency, UErrorCode& ec) U_OVERRIDE;
 
     /**
      * Sets the currency used to display currency amounts.  See
-     * setCurrency(const UChar*, UErrorCode&).
-     * @deprecated ICU 3.0. Use setCurrency(const UChar*, UErrorCode&).
+     * setCurrency(const char16_t*, UErrorCode&).
+     * @deprecated ICU 3.0. Use setCurrency(const char16_t*, UErrorCode&).
      */
-    virtual void setCurrency(const UChar* theCurrency);
+    virtual void setCurrency(const char16_t* theCurrency);
 
-#ifndef U_HIDE_DRAFT_API
     /**
      * Sets the <tt>Currency Context</tt> object used to display currency.
      * This takes effect immediately, if this format is a
-     * currency format.  
-     * @param currencyContext new currency context object to use.  
-     * @draft ICU 54
+     * currency format.
+     * @param currencyContext new currency context object to use.
+     * @stable ICU 54
      */
     void setCurrencyUsage(UCurrencyUsage newUsage, UErrorCode* ec);
 
     /**
      * Returns the <tt>Currency Context</tt> object used to display currency
-     * @draft ICU 54
+     * @stable ICU 54
      */
     UCurrencyUsage getCurrencyUsage() const;
-#endif  /* U_HIDE_DRAFT_API */
-
-
-#ifndef U_HIDE_DEPRECATED_API
-    /**
-     * The resource tags we use to retrieve decimal format data from
-     * locale resource bundles.
-     * @deprecated ICU 3.4. This string has no public purpose. Please don't use it.
-     */
-    static const char fgNumberPatterns[];
-#endif  /* U_HIDE_DEPRECATED_API */
 
 #ifndef U_HIDE_INTERNAL_API
+
     /**
-     *  Get a FixedDecimal corresponding to a double as it would be
-     *  formatted by this DecimalFormat.
+     *  Format a number and save it into the given DecimalQuantity.
      *  Internal, not intended for public use.
      *  @internal
      */
-     FixedDecimal getFixedDecimal(double number, UErrorCode &status) const;
+    void formatToDecimalQuantity(double number, number::impl::DecimalQuantity& output,
+                                 UErrorCode& status) const;
 
     /**
-     *  Get a FixedDecimal corresponding to a formattable as it would be
+     *  Get a DecimalQuantity corresponding to a formattable as it would be
      *  formatted by this DecimalFormat.
      *  Internal, not intended for public use.
      *  @internal
      */
-     FixedDecimal getFixedDecimal(const Formattable &number, UErrorCode &status) const;
+    void formatToDecimalQuantity(const Formattable& number, number::impl::DecimalQuantity& output,
+                                 UErrorCode& status) const;
 
+#endif
+
+#ifndef U_HIDE_DRAFT_API
     /**
-     *  Get a FixedDecimal corresponding to a DigitList as it would be
-     *  formatted by this DecimalFormat. Note: the DigitList may be modified.
-     *  Internal, not intended for public use.
-     *  @internal
+     * Converts this DecimalFormat to a NumberFormatter.  Starting in ICU 60,
+     * NumberFormatter is the recommended way to format numbers.
+     *
+     * NOTE: The returned LocalizedNumberFormatter is owned by this DecimalFormat.
+     * If a non-const method is called on the DecimalFormat, or if the DecimalFormat
+     * is deleted, the object becomes invalid. If you plan to keep the return value
+     * beyond the lifetime of the DecimalFormat, copy it to a local variable:
+     *
+     * <pre>
+     * LocalizedNumberFormatter f = df->toNumberFormatter();
+     * </pre>
+     *
+     * It is, however, safe to use the return value for chaining:
+     *
+     * <pre>
+     * FormattedNumber result = df->toNumberFormatter().formatDouble(123, status);
+     * </pre>
+     *
+     * @param output The variable into which to store the LocalizedNumberFormatter.
+     * @return The output variable, for chaining.
+     * @draft ICU 62
      */
-     FixedDecimal getFixedDecimal(DigitList &number, UErrorCode &status) const;
-#endif  /* U_HIDE_INTERNAL_API */
-
-public:
+    const number::LocalizedNumberFormatter& toNumberFormatter() const;
+#endif  /* U_HIDE_DRAFT_API */
 
     /**
      * Return the class ID for this class.  This is useful only for
@@ -1972,504 +2103,60 @@ public:
      *                  other classes have different class IDs.
      * @stable ICU 2.0
      */
-    virtual UClassID getDynamicClassID(void) const;
-
-private:
-
-    DecimalFormat(); // default constructor not implemented
+    UClassID getDynamicClassID(void) const U_OVERRIDE;
 
-    int32_t precision() const;
+  private:
 
-    /**
-     *   Initialize all fields of a new DecimalFormatter to a safe default value.
-     *      Common code for use by constructors.
-     */
-    void init();
+    /** Rebuilds the formatter object from the property bag. */
+    void touch(UErrorCode& status);
 
-    /**
-     * Do real work of constructing a new DecimalFormat.
-     */
-    void construct(UErrorCode&              status,
-                   UParseError&             parseErr,
-                   const UnicodeString*     pattern = 0,
-                   DecimalFormatSymbols*    symbolsToAdopt = 0
-                   );
+    /** Rebuilds the formatter object, hiding the error code. */
+    void touchNoError();
 
     /**
-     * Does the real work of generating a pattern.
+     * Updates the property bag with settings from the given pattern.
      *
-     * @param result     Output param which will receive the pattern.
-     *                   Previous contents are deleted.
-     * @param localized  TRUE return localized pattern.
-     * @return           A reference to 'result'.
+     * @param pattern The pattern string to parse.
+     * @param ignoreRounding Whether to leave out rounding information (minFrac, maxFrac, and rounding
+     *     increment) when parsing the pattern. This may be desirable if a custom rounding mode, such
+     *     as CurrencyUsage, is to be used instead. One of {@link
+     *     PatternStringParser#IGNORE_ROUNDING_ALWAYS}, {@link PatternStringParser#IGNORE_ROUNDING_IF_CURRENCY},
+     *     or {@link PatternStringParser#IGNORE_ROUNDING_NEVER}.
+     * @see PatternAndPropertyUtils#parseToExistingProperties
      */
-    UnicodeString& toPattern(UnicodeString& result, UBool localized) const;
+    void setPropertiesFromPattern(const UnicodeString& pattern, int32_t ignoreRounding,
+                                  UErrorCode& status);
 
-    /**
-     * Does the real work of applying a pattern.
-     * @param pattern    The pattern to be applied.
-     * @param localized  If true, the pattern is localized; else false.
-     * @param parseError Struct to recieve information on position
-     *                   of error if an error is encountered
-     * @param status     Output param set to success/failure code on
-     *                   exit. If the pattern is invalid, this will be
-     *                   set to a failure result.
-     */
-    void applyPattern(const UnicodeString& pattern,
-                            UBool localized,
-                            UParseError& parseError,
-                            UErrorCode& status);
+    const numparse::impl::NumberParserImpl* getParser(UErrorCode& status) const;
 
-    /*
-     * similar to applyPattern, but without re-gen affix for currency
-     */
-    void applyPatternInternally(const UnicodeString& pluralCount,
-                                const UnicodeString& pattern,
-                                UBool localized,
-                                UParseError& parseError,
-                                UErrorCode& status);
+    const numparse::impl::NumberParserImpl* getCurrencyParser(UErrorCode& status) const;
 
-    /*
-     * only apply pattern without expand affixes
-     */
-    void applyPatternWithoutExpandAffix(const UnicodeString& pattern,
-                                        UBool localized,
-                                        UParseError& parseError,
-                                        UErrorCode& status);
+    static void fieldPositionHelper(const number::FormattedNumber& formatted, FieldPosition& fieldPosition,
+                                    int32_t offset, UErrorCode& status);
 
+    static void fieldPositionIteratorHelper(const number::FormattedNumber& formatted,
+                                            FieldPositionIterator* fpi, int32_t offset, UErrorCode& status);
 
-    /*
-     * expand affixes (after apply patter) and re-compute fFormatWidth
-     */
-    void expandAffixAdjustWidth(const UnicodeString* pluralCount);
+    void setupFastFormat();
 
+    bool fastFormatDouble(double input, UnicodeString& output) const;
 
-    /**
-     * Do the work of formatting a number, either a double or a long.
-     *
-     * @param appendTo       Output parameter to receive result.
-     *                       Result is appended to existing contents.
-     * @param handler        Records information about field positions.
-     * @param digits         the digits to be formatted.
-     * @param isInteger      if TRUE format the digits as Integer.
-     * @return               Reference to 'appendTo' parameter.
-     */
-    UnicodeString& subformat(UnicodeString& appendTo,
-                             FieldPositionHandler& handler,
-                             DigitList&     digits,
-                             UBool          isInteger,
-                             UErrorCode &status) const;
-
-
-    void parse(const UnicodeString& text,
-               Formattable& result,
-               ParsePosition& pos,
-               UChar* currency) const;
-
-    enum {
-        fgStatusInfinite,
-        fgStatusLength      // Leave last in list.
-    } StatusFlags;
-
-    UBool subparse(const UnicodeString& text,
-                   const UnicodeString* negPrefix,
-                   const UnicodeString* negSuffix,
-                   const UnicodeString* posPrefix,
-                   const UnicodeString* posSuffix,
-                   UBool complexCurrencyParsing,
-                   int8_t type,
-                   ParsePosition& parsePosition,
-                   DigitList& digits, UBool* status,
-                   UChar* currency) const;
-
-    // Mixed style parsing for currency.
-    // It parses against the current currency pattern
-    // using complex affix comparison
-    // parses against the currency plural patterns using complex affix comparison,
-    // and parses against the current pattern using simple affix comparison.
-    UBool parseForCurrency(const UnicodeString& text,
-                           ParsePosition& parsePosition,
-                           DigitList& digits,
-                           UBool* status,
-                           UChar* currency) const;
-
-    int32_t skipPadding(const UnicodeString& text, int32_t position) const;
-
-    int32_t compareAffix(const UnicodeString& input,
-                         int32_t pos,
-                         UBool isNegative,
-                         UBool isPrefix,
-                         const UnicodeString* affixPat,
-                         UBool complexCurrencyParsing,
-                         int8_t type,
-                         UChar* currency) const;
-
-    static UnicodeString& trimMarksFromAffix(const UnicodeString& affix, UnicodeString& trimmedAffix);
-
-    UBool equalWithSignCompatibility(UChar32 lhs, UChar32 rhs) const;
-
-    int32_t compareSimpleAffix(const UnicodeString& affix,
-                                      const UnicodeString& input,
-                                      int32_t pos,
-                                      UBool lenient) const;
-
-    static int32_t skipPatternWhiteSpace(const UnicodeString& text, int32_t pos);
-
-    static int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos);
-
-    static int32_t skipUWhiteSpaceAndMarks(const UnicodeString& text, int32_t pos);
-
-    static int32_t skipBidiMarks(const UnicodeString& text, int32_t pos);
-
-    int32_t compareComplexAffix(const UnicodeString& affixPat,
-                                const UnicodeString& input,
-                                int32_t pos,
-                                int8_t type,
-                                UChar* currency) const;
-
-    static int32_t match(const UnicodeString& text, int32_t pos, UChar32 ch);
-
-    static int32_t match(const UnicodeString& text, int32_t pos, const UnicodeString& str);
-
-    static UBool matchSymbol(const UnicodeString &text, int32_t position, int32_t length, const UnicodeString &symbol,
-                             UnicodeSet *sset, UChar32 schar);
-
-    static UBool matchDecimal(UChar32 symbolChar,
-                            UBool sawDecimal,  UChar32 sawDecimalChar,
-                             const UnicodeSet *sset, UChar32 schar);
-
-    static UBool matchGrouping(UChar32 groupingChar,
-                            UBool sawGrouping, UChar32 sawGroupingChar,
-                             const UnicodeSet *sset,
-                             UChar32 decimalChar, const UnicodeSet *decimalSet,
-                             UChar32 schar);
-
-    /**
-     * Get a decimal format symbol.
-     * Returns a const reference to the symbol string.
-     * @internal
-     */
-    inline const UnicodeString &getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const;
-
-    int32_t appendAffix(UnicodeString& buf,
-                        double number,
-                        FieldPositionHandler& handler,
-                        UBool isNegative,
-                        UBool isPrefix) const;
-
-    /**
-     * Append an affix to the given UnicodeString, using quotes if
-     * there are special characters.  Single quotes themselves must be
-     * escaped in either case.
-     */
-    void appendAffixPattern(UnicodeString& appendTo, const UnicodeString& affix,
-                            UBool localized) const;
-
-    void appendAffixPattern(UnicodeString& appendTo,
-                            const UnicodeString* affixPattern,
-                            const UnicodeString& expAffix, UBool localized) const;
-
-    void expandAffix(const UnicodeString& pattern,
-                     UnicodeString& affix,
-                     double number,
-                     FieldPositionHandler& handler,
-                     UBool doFormat,
-                     const UnicodeString* pluralCount) const;
-
-    void expandAffixes(const UnicodeString* pluralCount);
-
-    void addPadding(UnicodeString& appendTo,
-                    FieldPositionHandler& handler,
-                    int32_t prefixLen, int32_t suffixLen) const;
-
-    UBool isGroupingPosition(int32_t pos) const;
-
-    void setCurrencyForSymbols();
-
-    // similar to setCurrency without re-compute the affixes for currency.
-    // If currency changes, the affix pattern for currency is not changed,
-    // but the affix will be changed. So, affixes need to be
-    // re-computed in setCurrency(), but not in setCurrencyInternally().
-    virtual void setCurrencyInternally(const UChar* theCurrency, UErrorCode& ec);
-
-    // set up currency affix patterns for mix parsing.
-    // The patterns saved here are the affix patterns of default currency
-    // pattern and the unique affix patterns of the plural currency patterns.
-    // Those patterns are used by parseForCurrency().
-    void setupCurrencyAffixPatterns(UErrorCode& status);
-
-    // set up the currency affixes used in currency plural formatting.
-    // It sets up both fAffixesForCurrency for currency pattern if the current
-    // pattern contains 3 currency signs,
-    // and it sets up fPluralAffixesForCurrency for currency plural patterns.
-    void setupCurrencyAffixes(const UnicodeString& pattern,
-                              UBool setupForCurrentPattern,
-                              UBool setupForPluralPattern,
-                              UErrorCode& status);
-       
-    // get the currency rounding with respect to currency usage
-    double getCurrencyRounding(const UChar* currency,
-                               UErrorCode* ec) const;
-       
-    // get the currency fraction with respect to currency usage
-    int getCurrencyFractionDigits(const UChar* currency,
-                                  UErrorCode* ec) const;
-
-    // hashtable operations
-    Hashtable* initHashForAffixPattern(UErrorCode& status);
-    Hashtable* initHashForAffix(UErrorCode& status);
-
-    void deleteHashForAffixPattern();
-    void deleteHashForAffix(Hashtable*& table);
-
-    void copyHashForAffixPattern(const Hashtable* source,
-                                 Hashtable* target, UErrorCode& status);
-    void copyHashForAffix(const Hashtable* source,
-                          Hashtable* target, UErrorCode& status);
-
-    UnicodeString& _format(int64_t number,
-                           UnicodeString& appendTo,
-                           FieldPositionHandler& handler,
-                           UErrorCode &status) const;
-    UnicodeString& _format(double number,
-                           UnicodeString& appendTo,
-                           FieldPositionHandler& handler,
-                           UErrorCode &status) const;
-    UnicodeString& _format(const DigitList &number,
-                           UnicodeString& appendTo,
-                           FieldPositionHandler& handler,
-                           UErrorCode &status) const;
-
-    /**
-     * Constants.
-     */
-
-    UnicodeString           fPositivePrefix;
-    UnicodeString           fPositiveSuffix;
-    UnicodeString           fNegativePrefix;
-    UnicodeString           fNegativeSuffix;
-    UnicodeString*          fPosPrefixPattern;
-    UnicodeString*          fPosSuffixPattern;
-    UnicodeString*          fNegPrefixPattern;
-    UnicodeString*          fNegSuffixPattern;
-
-    /**
-     * Formatter for ChoiceFormat-based currency names.  If this field
-     * is not null, then delegate to it to format currency symbols.
-     * @since ICU 2.6
-     */
-    ChoiceFormat*           fCurrencyChoice;
-
-    DigitList *             fMultiplier;   // NULL for multiplier of one
-    int32_t                 fScale;
-    int32_t                 fGroupingSize;
-    int32_t                 fGroupingSize2;
-    UBool                   fDecimalSeparatorAlwaysShown;
-    DecimalFormatSymbols*   fSymbols;
-
-    UBool                   fUseSignificantDigits;
-    int32_t                 fMinSignificantDigits;
-    int32_t                 fMaxSignificantDigits;
-
-    UBool                   fUseExponentialNotation;
-    int8_t                  fMinExponentDigits;
-    UBool                   fExponentSignAlwaysShown;
-
-    EnumSet<UNumberFormatAttribute,
-            UNUM_MAX_NONBOOLEAN_ATTRIBUTE+1,
-            UNUM_LIMIT_BOOLEAN_ATTRIBUTE>
-                            fBoolFlags;
-
-    DigitList*              fRoundingIncrement;  // NULL if no rounding increment specified.
-    ERoundingMode           fRoundingMode;
-
-    UChar32                 fPad;
-    int32_t                 fFormatWidth;
-    EPadPosition            fPadPosition;
-
-    /*
-     * Following are used for currency format
-     */
-    // pattern used in this formatter
-    UnicodeString fFormatPattern;
-    // style is only valid when decimal formatter is constructed by
-    // DecimalFormat(pattern, decimalFormatSymbol, style)
-    int fStyle;
-    /*
-     * Represents whether this is a currency format, and which
-     * currency format style.
-     * 0: not currency format type;
-     * 1: currency style -- symbol name, such as "$" for US dollar.
-     * 2: currency style -- ISO name, such as USD for US dollar.
-     * 3: currency style -- plural long name, such as "US Dollar" for
-     *                      "1.00 US Dollar", or "US Dollars" for
-     *                      "3.00 US Dollars".
-     */
-    int fCurrencySignCount;
-
-
-    /* For currency parsing purose,
-     * Need to remember all prefix patterns and suffix patterns of
-     * every currency format pattern,
-     * including the pattern of default currecny style
-     * and plural currency style. And the patterns are set through applyPattern.
-     */
-    // TODO: innerclass?
-    /* This is not needed in the class declaration, so it is moved into decimfmp.cpp
-    struct AffixPatternsForCurrency : public UMemory {
-        // negative prefix pattern
-        UnicodeString negPrefixPatternForCurrency;
-        // negative suffix pattern
-        UnicodeString negSuffixPatternForCurrency;
-        // positive prefix pattern
-        UnicodeString posPrefixPatternForCurrency;
-        // positive suffix pattern
-        UnicodeString posSuffixPatternForCurrency;
-        int8_t patternType;
-
-        AffixPatternsForCurrency(const UnicodeString& negPrefix,
-                                 const UnicodeString& negSuffix,
-                                 const UnicodeString& posPrefix,
-                                 const UnicodeString& posSuffix,
-                                 int8_t type) {
-            negPrefixPatternForCurrency = negPrefix;
-            negSuffixPatternForCurrency = negSuffix;
-            posPrefixPatternForCurrency = posPrefix;
-            posSuffixPatternForCurrency = posSuffix;
-            patternType = type;
-        }
-    };
-    */
-
-    /* affix for currency formatting when the currency sign in the pattern
-     * equals to 3, such as the pattern contains 3 currency sign or
-     * the formatter style is currency plural format style.
-     */
-    /* This is not needed in the class declaration, so it is moved into decimfmp.cpp
-    struct AffixesForCurrency : public UMemory {
-        // negative prefix
-        UnicodeString negPrefixForCurrency;
-        // negative suffix
-        UnicodeString negSuffixForCurrency;
-        // positive prefix
-        UnicodeString posPrefixForCurrency;
-        // positive suffix
-        UnicodeString posSuffixForCurrency;
-
-        int32_t formatWidth;
-
-        AffixesForCurrency(const UnicodeString& negPrefix,
-                           const UnicodeString& negSuffix,
-                           const UnicodeString& posPrefix,
-                           const UnicodeString& posSuffix) {
-            negPrefixForCurrency = negPrefix;
-            negSuffixForCurrency = negSuffix;
-            posPrefixForCurrency = posPrefix;
-            posSuffixForCurrency = posSuffix;
-        }
-    };
-    */
-
-    // Affix pattern set for currency.
-    // It is a set of AffixPatternsForCurrency,
-    // each element of the set saves the negative prefix pattern,
-    // negative suffix pattern, positive prefix pattern,
-    // and positive suffix  pattern of a pattern.
-    // It is used for currency mixed style parsing.
-    // It is actually is a set.
-    // The set contains the default currency pattern from the locale,
-    // and the currency plural patterns.
-    // Since it is a set, it does not contain duplicated items.
-    // For example, if 2 currency plural patterns are the same, only one pattern
-    // is included in the set. When parsing, we do not check whether the plural
-    // count match or not.
-    Hashtable* fAffixPatternsForCurrency;
-
-    // Following 2 are affixes for currency.
-    // It is a hash map from plural count to AffixesForCurrency.
-    // AffixesForCurrency saves the negative prefix,
-    // negative suffix, positive prefix, and positive suffix of a pattern.
-    // It is used during currency formatting only when the currency sign count
-    // is 3. In which case, the affixes are getting from here, not
-    // from the fNegativePrefix etc.
-    Hashtable* fAffixesForCurrency;  // for current pattern
-    Hashtable* fPluralAffixesForCurrency;  // for plural pattern
-
-    // Information needed for DecimalFormat to format/parse currency plural.
-    CurrencyPluralInfo* fCurrencyPluralInfo;
-
-#if UCONFIG_HAVE_PARSEALLINPUT
-    UNumberFormatAttributeValue fParseAllInput;
-#endif
-
-    // Decimal Format Static Sets singleton.
-    const DecimalFormatStaticSets *fStaticSets;
-       
-    // Currency Usage(STANDARD vs CASH)
-    UCurrencyUsage fCurrencyUsage;
+    bool fastFormatInt64(int64_t input, UnicodeString& output) const;
 
-protected:
-
-#ifndef U_HIDE_INTERNAL_API
-    /**
-     * Rounds a value according to the rules of this object.
-     * @internal
-     */
-    DigitList& _round(const DigitList& number, DigitList& adjustedNum, UBool& isNegative, UErrorCode& status) const;
-#endif  /* U_HIDE_INTERNAL_API */
+    void doFastFormatInt32(int32_t input, bool isNegative, UnicodeString& output) const;
 
-    /**
-     * Returns the currency in effect for this formatter.  Subclasses
-     * should override this method as needed.  Unlike getCurrency(),
-     * this method should never return "".
-     * @result output parameter for null-terminated result, which must
-     * have a capacity of at least 4
-     * @internal
-     */
-    virtual void getEffectiveCurrency(UChar* result, UErrorCode& ec) const;
-
-  /** number of integer digits
-   * @stable ICU 2.4
-   */
-    static const int32_t  kDoubleIntegerDigits;
-  /** number of fraction digits
-   * @stable ICU 2.4
-   */
-    static const int32_t  kDoubleFractionDigits;
-
-    /**
-     * When someone turns on scientific mode, we assume that more than this
-     * number of digits is due to flipping from some other mode that didn't
-     * restrict the maximum, and so we force 1 integer digit.  We don't bother
-     * to track and see if someone is using exponential notation with more than
-     * this number, it wouldn't make sense anyway, and this is just to make sure
-     * that someone turning on scientific mode with default settings doesn't
-     * end up with lots of zeroes.
-     * @stable ICU 2.8
-     */
-    static const int32_t  kMaxScientificIntegerDigits;
+    //=====================================================================================//
+    //                                   INSTANCE FIELDS                                   //
+    //=====================================================================================//
 
-#if UCONFIG_FORMAT_FASTPATHS_49
- private:
-    /**
-     * Internal state.
-     * @internal
-     */
-    uint8_t fReserved[UNUM_DECIMALFORMAT_INTERNAL_SIZE];
+    // Only one instance field: keep all fields inside of an implementation class defined in number_mapper.h
+    number::impl::DecimalFormatFields* fields;
 
+    // Allow child class CompactDecimalFormat to access fProperties:
+    friend class CompactDecimalFormat;
 
-    /**
-     * Called whenever any state changes. Recomputes whether fastpath is OK to use.
-     */
-    void handleChanged();
-#endif
 };
 
-inline const UnicodeString &
-DecimalFormat::getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const {
-    return fSymbols->getConstSymbol(symbol);
-}
-
 U_NAMESPACE_END
 
 #endif /* #if !UCONFIG_NO_FORMATTING */
index df3fe842aacf1ddeeb1ec77e1b2d40e3ae5f7576..b98da28c192f6826532813ed9d6ab0c408eb248d 100644 (file)
@@ -1,3 +1,5 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /********************************************************************
  * COPYRIGHT: 
  * Copyright (c) 1997-2012, International Business Machines Corporation and
  *     <td>C API</td>
  *   </tr>
  *   <tr>
+ *     <td>Codepage Detection</td>
+ *     <td>ucsdet.h</td>
+ *     <td>C API</td>
+ *   </tr>
+ *   <tr>
  *     <td>Unicode Text Compression</td>
  *     <td>ucnv.h<br/>(encoding name "SCSU" or "BOCU-1")</td>
  *     <td>C API</td>
  *   </tr>
  *   <tr>
  *     <td>Number Formatting</td>
- *     <td>unum.h</td>
- *     <td>icu::NumberFormat</td>
+ *     <td>unumberformatter.h, unum.h</td>
+ *     <td>icu::number::NumberFormatter (ICU 60+) or icu::NumberFormat (older versions)</td>
  *   </tr>
  *   <tr>
  *     <td>Number Spellout<br/>(Rule Based Number Formatting)</td>
  *   </tr>
  *   <tr>
  *     <td>Bidirectional Algorithm</td>
- *     <td>ubidi.h</td>
+ *     <td>ubidi.h, ubiditransform.h</td>
  *     <td>C API</td>
  *   </tr>
  *   <tr>
index 78d0ceb5a909863cf7b19dc55bd8abe2c2caac02..fe914b461e6249f602e7ee511388836a804a2cdf 100644 (file)
@@ -1,6 +1,8 @@
-/*  
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+/*
 ********************************************************************************
-*   Copyright (C) 1997-2015, International Business Machines
+*   Copyright (C) 1997-2016, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 ********************************************************************************
 *
 *                            Changed to match C++ conventions
 ********************************************************************************
 */
-     
+
 #ifndef DTFMTSYM_H
 #define DTFMTSYM_H
+
 #include "unicode/utypes.h"
 
 #if !UCONFIG_NO_FORMATTING
 
 #include "unicode/calendar.h"
+#include "unicode/strenum.h"
 #include "unicode/uobject.h"
 #include "unicode/locid.h"
 #include "unicode/udat.h"
 #include "unicode/ures.h"
 
 /**
- * \file 
+ * \file
  * \brief C++ API: Symbols for formatting dates.
  */
 
@@ -115,7 +118,7 @@ public:
      * data for the default locale, it will return a last-resort object
      * based on hard-coded strings.
      *
-     * @param type      Type of calendar (as returned by Calendar::getType). 
+     * @param type      Type of calendar (as returned by Calendar::getType).
      *                  Will be used to access the correct set of strings.
      *                  (NULL or empty string defaults to "gregorian".)
      * @param status    Status code.  Failure
@@ -130,7 +133,7 @@ public:
      * resources for the given locale, in the default calendar (Gregorian).
      *
      * @param locale    Locale to load format data from.
-     * @param type      Type of calendar (as returned by Calendar::getType). 
+     * @param type      Type of calendar (as returned by Calendar::getType).
      *                  Will be used to access the correct set of strings.
      *                  (NULL or empty string defaults to "gregorian".)
      * @param status    Status code.  Failure
@@ -270,9 +273,15 @@ public:
      * @stable ICU 3.6
      */
     enum DtContextType {
-         FORMAT,
-         STANDALONE,
-         DT_CONTEXT_COUNT
+        FORMAT,
+        STANDALONE,
+#ifndef U_HIDE_DEPRECATED_API
+        /**
+         * One more than the highest normal DtContextType value.
+         * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
+         */
+        DT_CONTEXT_COUNT
+#endif  // U_HIDE_DEPRECATED_API
     };
 
     /**
@@ -280,17 +289,21 @@ public:
      * @stable ICU 3.6
      */
     enum DtWidthType {
-         ABBREVIATED,
-         WIDE,
-         NARROW,
-         /**
-          * Short width is currently only supported for weekday names.
-          * @stable ICU 51
-          */
-         SHORT,
-         /**
-          */
-         DT_WIDTH_COUNT = 4
+        ABBREVIATED,
+        WIDE,
+        NARROW,
+        /**
+         * Short width is currently only supported for weekday names.
+         * @stable ICU 51
+         */
+        SHORT,
+#ifndef U_HIDE_DEPRECATED_API
+        /**
+         * One more than the highest normal DtWidthType value.
+         * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
+         */
+        DT_WIDTH_COUNT = 4
+#endif  // U_HIDE_DEPRECATED_API
     };
 
     /**
@@ -414,33 +427,30 @@ public:
      * doesn't specify any time separator, and always recognized when parsing.
      * @internal
      */
-    static const UChar DEFAULT_TIME_SEPARATOR = 0x003a;  // ':'
+    static const char16_t DEFAULT_TIME_SEPARATOR = 0x003a;  // ':'
 
     /**
      * This alternate time separator is always recognized when parsing.
      * @internal
      */
-    static const UChar ALTERNATE_TIME_SEPARATOR = 0x002e;  // '.'
-#endif  /* U_HIDE_INTERNAL_API */
+    static const char16_t ALTERNATE_TIME_SEPARATOR = 0x002e;  // '.'
 
-#ifndef U_HIDE_DRAFT_API
     /**
      * Gets the time separator string. For example: ":".
      * @param result Output param which will receive the time separator string.
      * @return       A reference to 'result'.
-     * @draft ICU 55
+     * @internal
      */
     UnicodeString& getTimeSeparatorString(UnicodeString& result) const;
 
     /**
      * Sets the time separator string. For example: ":".
      * @param newTimeSeparator the new time separator string.
-     * @draft ICU 55
+     * @internal
      */
     void setTimeSeparatorString(const UnicodeString& newTimeSeparator);
-#endif  /* U_HIDE_DRAFT_API */
+#endif  /* U_HIDE_INTERNAL_API */
 
-#ifndef U_HIDE_DRAFT_API
     /**
      * Gets cyclic year name strings if the calendar has them, by width and context.
      * For example: "jia-zi", "yi-chou", etc.
@@ -449,7 +459,7 @@ public:
      * @param width     The requested name width: WIDE, ABBREVIATED, NARROW.
      * @return          The year name strings (DateFormatSymbols retains ownership),
      *                  or null if they are not available for this calendar.
-     * @draft ICU 54
+     * @stable ICU 54
      */
     const UnicodeString* getYearNames(int32_t& count,
                             DtContextType context, DtWidthType width) const;
@@ -461,7 +471,7 @@ public:
      * @param count     The length of the array.
      * @param context   The usage context: FORMAT, STANDALONE (currently only FORMAT is supported).
      * @param width     The name width: WIDE, ABBREVIATED, NARROW (currently only ABBREVIATED is supported).
-     * @draft ICU 54
+     * @stable ICU 54
      */
     void setYearNames(const UnicodeString* yearNames, int32_t count,
                             DtContextType context, DtWidthType width);
@@ -474,7 +484,7 @@ public:
      * @param width     The requested name width: WIDE, ABBREVIATED, NARROW.
      * @return          The zodiac name strings (DateFormatSymbols retains ownership),
      *                  or null if they are not available for this calendar.
-     * @draft ICU 54
+     * @stable ICU 54
      */
     const UnicodeString* getZodiacNames(int32_t& count,
                             DtContextType context, DtWidthType width) const;
@@ -486,13 +496,11 @@ public:
      * @param count     The length of the array.
      * @param context   The usage context: FORMAT, STANDALONE (currently only FORMAT is supported).
      * @param width     The name width: WIDE, ABBREVIATED, NARROW (currently only ABBREVIATED is supported).
-     * @draft ICU 54
+     * @stable ICU 54
      */
     void setZodiacNames(const UnicodeString* zodiacNames, int32_t count,
                             DtContextType context, DtWidthType width);
 
-#endif  /* U_HIDE_DRAFT_API */
-
 #ifndef U_HIDE_INTERNAL_API
     /**
      * Somewhat temporary constants for leap month pattern types, adequate for supporting
@@ -559,7 +567,7 @@ public:
      * @return    the non-localized date-time pattern characters
      * @stable ICU 2.0
      */
-    static const UChar * U_EXPORT2 getPatternUChars(void);
+    static const char16_t * U_EXPORT2 getPatternUChars(void);
 
     /**
      * Gets localized date-time pattern characters. For example: 'u', 't', etc.
@@ -855,6 +863,42 @@ private:
      */
      UBool fCapitalization[kCapContextUsageTypeCount][2];
 
+    /**
+     * Abbreviated (== short) day period strings.
+     */
+    UnicodeString  *fAbbreviatedDayPeriods;
+    int32_t         fAbbreviatedDayPeriodsCount;
+
+    /**
+     * Wide day period strings.
+     */
+    UnicodeString  *fWideDayPeriods;
+    int32_t         fWideDayPeriodsCount;
+
+    /**
+     * Narrow day period strings.
+     */
+    UnicodeString  *fNarrowDayPeriods;
+    int32_t         fNarrowDayPeriodsCount;
+
+    /**
+     * Stand-alone abbreviated (== short) day period strings.
+     */
+    UnicodeString  *fStandaloneAbbreviatedDayPeriods;
+    int32_t         fStandaloneAbbreviatedDayPeriodsCount;
+
+    /**
+     * Stand-alone wide day period strings.
+     */
+    UnicodeString  *fStandaloneWideDayPeriods;
+    int32_t         fStandaloneWideDayPeriodsCount;
+
+    /**
+     * Stand-alone narrow day period strings.
+     */
+    UnicodeString  *fStandaloneNarrowDayPeriods;
+    int32_t         fStandaloneNarrowDayPeriodsCount;
+
 private:
     /** valid/actual locale information 
      *  these are always ICU locales, so the length should not be a problem
@@ -934,7 +978,7 @@ private:
      * Returns the date format field index of the pattern character c,
      * or UDAT_FIELD_COUNT if c is not a pattern character.
      */
-    static UDateFormatField U_EXPORT2 getPatternCharIndex(UChar c);
+    static UDateFormatField U_EXPORT2 getPatternCharIndex(char16_t c);
 
     /**
      * Returns TRUE if f (with its pattern character repeated count times) is a numeric field.
@@ -944,7 +988,7 @@ private:
     /**
      * Returns TRUE if c (repeated count times) is the pattern character for a numeric field.
      */
-    static UBool U_EXPORT2 isNumericPatternChar(UChar c, int32_t count);
+    static UBool U_EXPORT2 isNumericPatternChar(char16_t c, int32_t count);
 public:
 #ifndef U_HIDE_INTERNAL_API
     /**
index 5bacce88446748e03e3b949d9bf5281ea85a5943..c3f1058c0668f5fe30d268a9ee1aa174282f186f 100644 (file)
@@ -1,3 +1,5 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 *******************************************************************************
 * Copyright (C) 2008-2009, International Business Machines Corporation and
@@ -67,7 +69,7 @@ public:
      * <pre>
      * .   Base* polymorphic_pointer = createPolymorphicObject();
      * .   if (polymorphic_pointer->getDynamicClassID() ==
-     * .       erived::getStaticClassID()) ...
+     * .       derived::getStaticClassID()) ...
      * </pre>
      * @return          The class ID for all objects of this class.
      * @stable ICU 4.0
index fb27eec48158d2e8bbf1b7584f24c95d82bdd85f..5eaa559d0eaf48a416ecb03406af758f279010af 100644 (file)
@@ -1,5 +1,7 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /********************************************************************************
-* Copyright (C) 2008-2013, International Business Machines Corporation and
+* Copyright (C) 2008-2016, International Business Machines Corporation and
 * others. All Rights Reserved.
 *******************************************************************************
 *
@@ -93,9 +95,11 @@ U_NAMESPACE_BEGIN
  *
  * <P>
  * The calendar fields we support for interval formatting are:
- * year, month, date, day-of-week, am-pm, hour, hour-of-day, and minute.
+ * year, month, date, day-of-week, am-pm, hour, hour-of-day, minute, and second
+ * (though we do not currently have specific intervalFormat date for skeletons
+ * with seconds).
  * Those calendar fields can be defined in the following order:
- * year >  month > date > hour (in day) >  minute
+ * year >  month > date > hour (in day) >  minute > second
  *
  * The largest different calendar fields between 2 calendars is the
  * first different calendar field in above order.
@@ -387,6 +391,9 @@ public:
      *                          Result is appended to existing contents.
      * @param fieldPosition     On input: an alignment field, if desired.
      *                          On output: the offsets of the alignment field.
+     *                          There may be multiple instances of a given field type
+     *                          in an interval format; in this case the fieldPosition
+     *                          offsets refer to the first instance.
      * @param status            Output param filled with success/failure status.
      * @return                  Reference to 'appendTo' parameter.
      * @stable ICU 4.0
@@ -406,6 +413,9 @@ public:
      *                          Result is appended to existing contents.
      * @param fieldPosition     On input: an alignment field, if desired.
      *                          On output: the offsets of the alignment field.
+     *                          There may be multiple instances of a given field type
+     *                          in an interval format; in this case the fieldPosition
+     *                          offsets refer to the first instance.
      * @param status            Output param filled with success/failure status.
      * @return                  Reference to 'appendTo' parameter.
      * @stable ICU 4.0
@@ -430,6 +440,9 @@ public:
      *                          Result is appended to existing contents.
      * @param fieldPosition     On input: an alignment field, if desired.
      *                          On output: the offsets of the alignment field.
+     *                          There may be multiple instances of a given field type
+     *                          in an interval format; in this case the fieldPosition
+     *                          offsets refer to the first instance.
      * @param status            Output param filled with success/failure status.
      *                          Caller needs to make sure it is SUCCESS
      *                          at the function entrance
@@ -493,7 +506,13 @@ public:
 
 
     /**
-     * Gets the date formatter
+     * Gets the date formatter. The DateIntervalFormat instance continues to own
+     * the returned DateFormatter object, and will use and possibly modify it
+     * during format operations. In a multi-threaded environment, the returned
+     * DateFormat can only be used if it is certain that no other threads are
+     * concurrently using this DateIntervalFormatter, even for nominally const
+     * functions.
+     *
      * @return the date formatter associated with this date interval formatter.
      * @stable ICU 4.0
      */
@@ -598,7 +617,7 @@ private:
 
     /**
      * default constructor
-     * @internal ICU 4.0
+     * @internal (private)
      */
     DateIntervalFormat();
 
@@ -642,27 +661,30 @@ private:
                                                 UErrorCode& status);
 
     /**
-     * Create a simple date/time formatter from skeleton, given locale,
-     * and date time pattern generator.
-     *
-     * @param skeleton  the skeleton on which date format based.
-     * @param locale    the given locale.
-     * @param dtpng     the date time pattern generator.
-     * @param status    Output param to be set to success/failure code.
-     *                  If it is failure, the returned date formatter will
-     *                  be NULL.
-     * @return          a simple date formatter which the caller owns.
+     *  Below are for generating interval patterns local to the formatter
      */
-    static SimpleDateFormat* U_EXPORT2 createSDFPatternInstance(
-                                        const UnicodeString& skeleton,
-                                        const Locale& locale,
-                                        DateTimePatternGenerator* dtpng,
-                                        UErrorCode& status);
-
 
     /**
-     *  Below are for generating interval patterns local to the formatter
+     * Provide an updated FieldPosition posResult based on two formats,
+     * the FieldPosition values for each of them, and the pattern used
+     * to combine them. The idea is for posResult to indicate the first
+     * instance (if any) of the specified field in the combined result,
+     * with correct offsets.
+     *
+     * @param combiningPattern  Pattern used to combine pat0 and pat1
+     * @param pat0              Formatted date/time value to replace {0}
+     * @param pos0              FieldPosition within pat0
+     * @param pat1              Formatted date/time value to replace {1}
+     * @param pos1              FieldPosition within pat1
+     * @param posResult         FieldPosition to be set to the correct
+     *                          position of the first field instance when
+     *                          pat0 and pat1 are combined using combiningPattern
      */
+    static void
+    adjustPosition(UnicodeString& combiningPattern, // has {0} and {1} in it
+                   UnicodeString& pat0, FieldPosition& pos0, // pattern and pos corresponding to {0}
+                   UnicodeString& pat1, FieldPosition& pos1, // pattern and pos corresponding to {1}
+                   FieldPosition& posResult);
 
 
     /**
@@ -671,19 +693,25 @@ private:
      * The full pattern used in this fall-back format is the
      * full pattern of the date formatter.
      *
+     * gFormatterMutex must already be locked when calling this function.
+     *
      * @param fromCalendar      calendar set to the from date in date interval
      *                          to be formatted into date interval string
      * @param toCalendar        calendar set to the to date in date interval
      *                          to be formatted into date interval string
+     * @param fromToOnSameDay   TRUE iff from and to dates are on the same day
+     *                          (any difference is in ampm/hours or below)
      * @param appendTo          Output parameter to receive result.
      *                          Result is appended to existing contents.
      * @param pos               On input: an alignment field, if desired.
      *                          On output: the offsets of the alignment field.
      * @param status            output param set to success/failure code on exit
      * @return                  Reference to 'appendTo' parameter.
+     * @internal (private)
      */
     UnicodeString& fallbackFormat(Calendar& fromCalendar,
                                   Calendar& toCalendar,
+                                  UBool fromToOnSameDay,
                                   UnicodeString& appendTo,
                                   FieldPosition& pos,
                                   UErrorCode& status) const;
@@ -874,13 +902,11 @@ private:
      * both time and date. Present the date followed by
      * the range expression for the time.
      * @param format         date and time format
-     * @param formatLen      format string length
      * @param datePattern    date pattern
      * @param field          time calendar field: AM_PM, HOUR, MINUTE
      * @param status         output param set to success/failure code on exit
      */
-    void concatSingleDate2TimeInterval(const UChar* format,
-                                       int32_t formatLen,
+    void concatSingleDate2TimeInterval(UnicodeString& format,
                                        const UnicodeString& datePattern,
                                        UCalendarDateFields field,
                                        UErrorCode& status);
@@ -937,9 +963,40 @@ private:
                         const UnicodeString* secondPart,
                         UBool laterDateFirst);
 
+    /**
+     * Format 2 Calendars to produce a string.
+     * Implementation of the similar public format function.
+     * Must be called with gFormatterMutex already locked.
+     *
+     * Note: "fromCalendar" and "toCalendar" are not const,
+     * since calendar is not const in  SimpleDateFormat::format(Calendar&),
+     *
+     * @param fromCalendar      calendar set to the from date in date interval
+     *                          to be formatted into date interval string
+     * @param toCalendar        calendar set to the to date in date interval
+     *                          to be formatted into date interval string
+     * @param appendTo          Output parameter to receive result.
+     *                          Result is appended to existing contents.
+     * @param fieldPosition     On input: an alignment field, if desired.
+     *                          On output: the offsets of the alignment field.
+     *                          There may be multiple instances of a given field type
+     *                          in an interval format; in this case the fieldPosition
+     *                          offsets refer to the first instance.
+     * @param status            Output param filled with success/failure status.
+     *                          Caller needs to make sure it is SUCCESS
+     *                          at the function entrance
+     * @return                  Reference to 'appendTo' parameter.
+     * @internal (private)
+     */
+    UnicodeString& formatImpl(Calendar& fromCalendar,
+                              Calendar& toCalendar,
+                              UnicodeString& appendTo,
+                              FieldPosition& fieldPosition,
+                              UErrorCode& status) const ;
+
 
     // from calendar field to pattern letter
-    static const UChar fgCalendarFieldToPatternLetter[];
+    static const char16_t fgCalendarFieldToPatternLetter[];
 
 
     /**
@@ -960,16 +1017,20 @@ private:
     Calendar* fFromCalendar;
     Calendar* fToCalendar;
 
-    /**
-     * Date time pattern generator
-     */
-    DateTimePatternGenerator* fDtpng;
+    Locale fLocale;
 
     /**
-     * Following are interval information relavent (locale) to this formatter.
+     * Following are interval information relevant (locale) to this formatter.
      */
     UnicodeString fSkeleton;
     PatternInfo fIntervalPatterns[DateIntervalInfo::kIPI_MAX_INDEX];
+
+    /**
+     * Patterns for fallback formatting.
+     */
+    UnicodeString* fDatePattern;
+    UnicodeString* fTimePattern;
+    UnicodeString* fDateTimeFormat;
 };
 
 inline UBool
index 9f6674e70d192a3acde4a605b9b019b671dfe7eb..726e34a745a2ec30ba567b59efb37139f6f13d31 100644 (file)
@@ -1,6 +1,8 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
  *******************************************************************************
- * Copyright (C) 2008-2014, International Business Machines Corporation and
+ * Copyright (C) 2008-2016, International Business Machines Corporation and
  * others. All Rights Reserved.
  *******************************************************************************
  *
@@ -49,22 +51,22 @@ U_NAMESPACE_BEGIN
  * to (date_interval_pattern).
  *
  * <P>
- * A skeleton 
+ * A skeleton
  * <ol>
  * <li>
- * only keeps the field pattern letter and ignores all other parts 
+ * only keeps the field pattern letter and ignores all other parts
  * in a pattern, such as space, punctuations, and string literals.
  * <li>
- * hides the order of fields. 
+ * hides the order of fields.
  * <li>
  * might hide a field's pattern letter length.
  *
- * For those non-digit calendar fields, the pattern letter length is 
- * important, such as MMM, MMMM, and MMMMM; EEE and EEEE, 
+ * For those non-digit calendar fields, the pattern letter length is
+ * important, such as MMM, MMMM, and MMMMM; EEE and EEEE,
  * and the field's pattern letter length is honored.
- *    
- * For the digit calendar fields,  such as M or MM, d or dd, yy or yyyy, 
- * the field pattern length is ignored and the best match, which is defined 
+ *
+ * For the digit calendar fields,  such as M or MM, d or dd, yy or yyyy,
+ * the field pattern length is ignored and the best match, which is defined
  * in date time patterns, will be returned without honor the field pattern
  * letter length in skeleton.
  * </ol>
@@ -73,21 +75,21 @@ U_NAMESPACE_BEGIN
  * The calendar fields we support for interval formatting are:
  * year, month, date, day-of-week, am-pm, hour, hour-of-day, and minute.
  * Those calendar fields can be defined in the following order:
- * year >  month > date > am-pm > hour >  minute 
- *  
+ * year >  month > date > am-pm > hour >  minute
+ *
  * The largest different calendar fields between 2 calendars is the
  * first different calendar field in above order.
  *
- * For example: the largest different calendar fields between &quot;Jan 10, 2007&quot; 
+ * For example: the largest different calendar fields between &quot;Jan 10, 2007&quot;
  * and &quot;Feb 20, 2008&quot; is year.
- *   
+ *
  * <P>
  * There is a set of pre-defined static skeleton strings.
  * There are pre-defined interval patterns for those pre-defined skeletons
  * in locales' resource files.
  * For example, for a skeleton UDAT_YEAR_ABBR_MONTH_DAY, which is  &quot;yMMMd&quot;,
- * in  en_US, if the largest different calendar field between date1 and date2 
- * is &quot;year&quot;, the date interval pattern  is &quot;MMM d, yyyy - MMM d, yyyy&quot;, 
+ * in  en_US, if the largest different calendar field between date1 and date2
+ * is &quot;year&quot;, the date interval pattern  is &quot;MMM d, yyyy - MMM d, yyyy&quot;,
  * such as &quot;Jan 10, 2007 - Jan 10, 2008&quot;.
  * If the largest different calendar field between date1 and date2 is &quot;month&quot;,
  * the date interval pattern is &quot;MMM d - MMM d, yyyy&quot;,
@@ -95,7 +97,7 @@ U_NAMESPACE_BEGIN
  * If the largest different calendar field between date1 and date2 is &quot;day&quot;,
  * the date interval pattern is &quot;MMM d-d, yyyy&quot;, such as &quot;Jan 10-20, 2007&quot;.
  *
- * For date skeleton, the interval patterns when year, or month, or date is 
+ * For date skeleton, the interval patterns when year, or month, or date is
  * different are defined in resource files.
  * For time skeleton, the interval patterns when am/pm, or hour, or minute is
  * different are defined in resource files.
@@ -108,56 +110,55 @@ U_NAMESPACE_BEGIN
  * We use fallback format for the default order for the locale.
  * For example, if the fallback format is &quot;{0} - {1}&quot;, it means
  * the first date in the interval pattern for this locale is earlier date.
- * If the fallback format is &quot;{1} - {0}&quot;, it means the first date is the 
+ * If the fallback format is &quot;{1} - {0}&quot;, it means the first date is the
  * later date.
  * For a particular interval pattern, the default order can be overriden
  * by prefixing &quot;latestFirst:&quot; or &quot;earliestFirst:&quot; to the interval pattern.
  * For example, if the fallback format is &quot;{0}-{1}&quot;,
- * but for skeleton &quot;yMMMd&quot;, the interval pattern when day is different is 
+ * but for skeleton &quot;yMMMd&quot;, the interval pattern when day is different is
  * &quot;latestFirst:d-d MMM yy&quot;, it means by default, the first date in interval
  * pattern is the earlier date. But for skeleton &quot;yMMMd&quot;, when day is different,
  * the first date in &quot;d-d MMM yy&quot; is the later date.
- * 
+ *
  * <P>
- * The recommended way to create a DateIntervalFormat object is to pass in 
- * the locale. 
- * By using a Locale parameter, the DateIntervalFormat object is 
- * initialized with the pre-defined interval patterns for a given or 
+ * The recommended way to create a DateIntervalFormat object is to pass in
+ * the locale.
+ * By using a Locale parameter, the DateIntervalFormat object is
+ * initialized with the pre-defined interval patterns for a given or
  * default locale.
  * <P>
- * Users can also create DateIntervalFormat object 
+ * Users can also create DateIntervalFormat object
  * by supplying their own interval patterns.
  * It provides flexibility for power users.
  *
  * <P>
  * After a DateIntervalInfo object is created, clients may modify
  * the interval patterns using setIntervalPattern function as so desired.
- * Currently, users can only set interval patterns when the following 
- * calendar fields are different: ERA, YEAR, MONTH, DATE,  DAY_OF_MONTH, 
+ * Currently, users can only set interval patterns when the following
+ * calendar fields are different: ERA, YEAR, MONTH, DATE,  DAY_OF_MONTH,
  * DAY_OF_WEEK, AM_PM,  HOUR, HOUR_OF_DAY, and MINUTE.
  * Interval patterns when other calendar fields are different is not supported.
  * <P>
- * DateIntervalInfo objects are cloneable. 
- * When clients obtain a DateIntervalInfo object, 
+ * DateIntervalInfo objects are cloneable.
+ * When clients obtain a DateIntervalInfo object,
  * they can feel free to modify it as necessary.
  * <P>
- * DateIntervalInfo are not expected to be subclassed. 
- * Data for a calendar is loaded out of resource bundles. 
+ * DateIntervalInfo are not expected to be subclassed.
+ * Data for a calendar is loaded out of resource bundles.
  * Through ICU 4.4, date interval patterns are only supported in the Gregorian
- * calendar; non-Gregorian calendars are supported from ICU 4.4.1. 
+ * calendar; non-Gregorian calendars are supported from ICU 4.4.1.
  * @stable ICU 4.0
 **/
 
 class U_I18N_API DateIntervalInfo U_FINAL : public UObject {
 public:
-#ifndef U_HIDE_INTERNAL_API
     /**
      * Default constructor.
      * It does not initialize any interval patterns except
      * that it initialize default fall-back pattern as "{0} - {1}",
      * which can be reset by setFallbackIntervalPattern().
-     * It should be followed by setFallbackIntervalPattern() and 
-     * setIntervalPattern(), 
+     * It should be followed by setFallbackIntervalPattern() and
+     * setIntervalPattern(),
      * and is recommended to be used only for power users who
      * wants to create their own interval patterns and use them to create
      * date interval formatter.
@@ -165,10 +166,9 @@ public:
      * @internal ICU 4.0
      */
     DateIntervalInfo(UErrorCode& status);
-#endif  /* U_HIDE_INTERNAL_API */
 
 
-    /** 
+    /**
      * Construct DateIntervalInfo for the given locale,
      * @param locale  the interval patterns are loaded from the appropriate calendar
      *                data (specified calendar or default calendar) in this locale.
@@ -226,7 +226,7 @@ public:
 
 
 
-    /** 
+    /**
      * Provides a way for client to build interval patterns.
      * User could construct DateIntervalInfo by providing a list of skeletons
      * and their patterns.
@@ -236,53 +236,53 @@ public:
      * UErrorCode status = U_ZERO_ERROR;
      * DateIntervalInfo dIntervalInfo = new DateIntervalInfo();
      * dIntervalInfo->setFallbackIntervalPattern("{0} ~ {1}");
-     * dIntervalInfo->setIntervalPattern("yMd", UCAL_YEAR, "'from' yyyy-M-d 'to' yyyy-M-d", status); 
+     * dIntervalInfo->setIntervalPattern("yMd", UCAL_YEAR, "'from' yyyy-M-d 'to' yyyy-M-d", status);
      * dIntervalInfo->setIntervalPattern("yMMMd", UCAL_MONTH, "'from' yyyy MMM d 'to' MMM d", status);
      * dIntervalInfo->setIntervalPattern("yMMMd", UCAL_DAY, "yyyy MMM d-d", status, status);
      * </pre>
      *
-     * Restriction: 
-     * Currently, users can only set interval patterns when the following 
-     * calendar fields are different: ERA, YEAR, MONTH, DATE,  DAY_OF_MONTH, 
+     * Restriction:
+     * Currently, users can only set interval patterns when the following
+     * calendar fields are different: ERA, YEAR, MONTH, DATE,  DAY_OF_MONTH,
      * DAY_OF_WEEK, AM_PM,  HOUR, HOUR_OF_DAY, and MINUTE.
-     * Interval patterns when other calendar fields are different are 
+     * Interval patterns when other calendar fields are different are
      * not supported.
      *
      * @param skeleton         the skeleton on which interval pattern based
      * @param lrgDiffCalUnit   the largest different calendar unit.
      * @param intervalPattern  the interval pattern on the largest different
      *                         calendar unit.
-     *                         For example, if lrgDiffCalUnit is 
+     *                         For example, if lrgDiffCalUnit is
      *                         "year", the interval pattern for en_US when year
      *                         is different could be "'from' yyyy 'to' yyyy".
      * @param status           output param set to success/failure code on exit
      * @stable ICU 4.0
      */
-    void setIntervalPattern(const UnicodeString& skeleton, 
-                            UCalendarDateFields lrgDiffCalUnit, 
+    void setIntervalPattern(const UnicodeString& skeleton,
+                            UCalendarDateFields lrgDiffCalUnit,
                             const UnicodeString& intervalPattern,
                             UErrorCode& status);
 
     /**
-     * Get the interval pattern given skeleton and 
+     * Get the interval pattern given skeleton and
      * the largest different calendar field.
      * @param skeleton   the skeleton
      * @param field      the largest different calendar field
      * @param result     output param to receive the pattern
      * @param status     output param set to success/failure code on exit
      * @return a reference to 'result'
-     * @stable ICU 4.0 
+     * @stable ICU 4.0
      */
     UnicodeString& getIntervalPattern(const UnicodeString& skeleton,
                                       UCalendarDateFields field,
                                       UnicodeString& result,
-                                      UErrorCode& status) const; 
+                                      UErrorCode& status) const;
 
     /**
      * Get the fallback interval pattern.
      * @param  result   output param to receive the pattern
      * @return a reference to 'result'
-     * @stable ICU 4.0 
+     * @stable ICU 4.0
      */
     UnicodeString& getFallbackIntervalPattern(UnicodeString& result) const;
 
@@ -298,7 +298,7 @@ public:
      *
      * @param fallbackPattern  fall-back interval pattern.
      * @param status           output param set to success/failure code on exit
-     * @stable ICU 4.0 
+     * @stable ICU 4.0
      */
     void setFallbackIntervalPattern(const UnicodeString& fallbackPattern,
                                     UErrorCode& status);
@@ -308,7 +308,7 @@ public:
                              or not.
      * return default date ordering in interval pattern. TRUE if the first date
      *        in pattern is later date, FALSE otherwise.
-     * @stable ICU 4.0 
+     * @stable ICU 4.0
      */
     UBool getDefaultOrder() const;
 
@@ -339,6 +339,11 @@ private:
      */
     friend class DateIntervalFormat;
 
+    /**
+     * Internal struct used to load resource bundle data.
+     */
+    struct DateIntervalSink;
+
     /**
      * Following is for saving the interval patterns.
      * We only support interval patterns on