From fae4512d33f49615ae501f15374654aca5901f9a Mon Sep 17 00:00:00 2001 From: Mihai Nita Date: Tue, 10 Dec 2024 20:17:47 +0000 Subject: [PATCH 01/24] ICU-22922 ICU BRS 77: front-load update version to 77.0.1 --- docs/processes/release/tasks/versions.md | 10 ++++++---- .../allinone/Build.Windows.IcuVersion.props | 2 +- icu4c/source/common/unicode/uvernum.h | 14 +++++++------- icu4c/source/configure | 18 +++++++++--------- icu4c/source/data/makedata.mak | 4 ++-- icu4c/source/data/misc/icuver.txt | 4 ++-- icu4j/demos/pom.xml | 2 +- icu4j/main/charset/pom.xml | 2 +- icu4j/main/collate/pom.xml | 2 +- icu4j/main/common_tests/pom.xml | 2 +- icu4j/main/core/pom.xml | 2 +- .../java/com/ibm/icu/util/VersionInfo.java | 4 ++-- .../icu/dev/test/util/DebugUtilitiesData.java | 2 +- icu4j/main/currdata/pom.xml | 2 +- icu4j/main/framework/pom.xml | 2 +- icu4j/main/icu4j/pom.xml | 2 +- icu4j/main/langdata/pom.xml | 2 +- icu4j/main/localespi/pom.xml | 2 +- icu4j/main/regiondata/pom.xml | 2 +- icu4j/main/translit/pom.xml | 2 +- icu4j/perf-tests/pom.xml | 2 +- icu4j/pom.xml | 4 ++-- icu4j/releases_tools/shared.sh | 8 ++++---- icu4j/samples/pom.xml | 2 +- icu4j/tools/build/pom.xml | 2 +- icu4j/tools/misc/pom.xml | 2 +- tools/cldr/cldr-to-icu/README.md | 6 +++--- tools/cldr/cldr-to-icu/pom.xml | 2 +- 28 files changed, 56 insertions(+), 54 deletions(-) diff --git a/docs/processes/release/tasks/versions.md b/docs/processes/release/tasks/versions.md index 5425302e4f56..23f0ea940694 100644 --- a/docs/processes/release/tasks/versions.md +++ b/docs/processes/release/tasks/versions.md @@ -53,6 +53,8 @@ need to be correspondingly updated. See below for more files to be updated and s [icu4c/source/data/misc/icuver.txt](https://github.com/unicode-org/icu/blob/main/icu4c/source/data/misc/icuver.txt) needs to be updated with the correct version number for ICU and its data. +### CLDR-to-ICU Conversion + #### Since ICU 77 The tool takes the `icuVersion` and `icuDataVersion` from the official ICU APIs. @@ -171,7 +173,7 @@ Changing the version for Java starting with ICU 74 requires a few steps: 2. [icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/DebugUtilitiesData.java](https://github.com/unicode-org/icu/blob/main/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/DebugUtilitiesData.java) There is a public string named `ICU4C_VERSION` which should be updated accordingly. - 'public static final String ICU4C_VERSION="74.0.1";' + `public static final String ICU4C_VERSION="74.0.1";` 3. When creating the final release of a major ICU version, or a point release (minor version update on a maintenance branch), @@ -208,7 +210,7 @@ The command requires a version number string that follows the typical Java / Mav This should happen at the same time and along with the work in the previous step for the version number when the version number is updated on `main` in the commit after the release/maintanence branch is cut. In other words, the above `versions:set-property` step should be executed at the same time - `mvn versions:set -DnewVersion=74.0.1-SNAPSHOT` is executed. + `mvn versions:set -DnewVersion=74.0.1-SNAPSHOT -DgenerateBackupPoms=false` is executed. 5. Update the following variables in `icu4j/releases_tools/shared.sh` @@ -229,7 +231,7 @@ Since ICU 77 this moved to a property: ``` Which can be easily be set from command line: ```sh -mvn versions:set-property -Dproperty=icu4j.version -DnewVersion=77.1 -f $ICU_DIR/tools/cldr/cldr-to-icu +mvn versions:set-property -Dproperty=icu4j.version -DnewVersion=77.1 -f $ICU_DIR/tools/cldr/cldr-to-icu -DgenerateBackupPoms=false ``` #### Until ICU 73 (inclusive) @@ -291,7 +293,7 @@ For updating ICU version numbers, follow the steps below. 3. [icu4j/main/core/src/main/java/com/ibm/icu/util/VersionInfo.java](https://github.com/unicode-org/icu/blob/main/icu4j/main/core/src/main/java/com/ibm/icu/util/VersionInfo.java) There is a static block starting at line 501 (as of 54.1) in the source file. - + Update the `ICU_VERSION` value, where the first three arguments represent the major, minor, and patch versions of a semantic version. Use the `getInstance(major, 0, 1, 0)` as the version during pre-release development, diff --git a/icu4c/source/allinone/Build.Windows.IcuVersion.props b/icu4c/source/allinone/Build.Windows.IcuVersion.props index a4023ae9f791..7cfed86463c4 100644 --- a/icu4c/source/allinone/Build.Windows.IcuVersion.props +++ b/icu4c/source/allinone/Build.Windows.IcuVersion.props @@ -3,6 +3,6 @@ - 76 + 77 diff --git a/icu4c/source/common/unicode/uvernum.h b/icu4c/source/common/unicode/uvernum.h index a3cb882623be..b947ddf2917c 100644 --- a/icu4c/source/common/unicode/uvernum.h +++ b/icu4c/source/common/unicode/uvernum.h @@ -53,19 +53,19 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION_MAJOR_NUM 76 +#define U_ICU_VERSION_MAJOR_NUM 77 /** The current ICU minor version as an integer. * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_MINOR_NUM 1 +#define U_ICU_VERSION_MINOR_NUM 0 /** The current ICU patchlevel version as an integer. * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION_PATCHLEVEL_NUM 0 +#define U_ICU_VERSION_PATCHLEVEL_NUM 1 /** The current ICU build level version as an integer. * This value is for use by ICU clients. It defaults to 0. @@ -79,7 +79,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_SUFFIX _76 +#define U_ICU_VERSION_SUFFIX _77 /** * \def U_DEF2_ICU_ENTRY_POINT_RENAME @@ -132,7 +132,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION "76.1" +#define U_ICU_VERSION "77.0.1" /** * The current ICU library major version number as a string, for library name suffixes. @@ -145,13 +145,13 @@ * * @stable ICU 2.6 */ -#define U_ICU_VERSION_SHORT "76" +#define U_ICU_VERSION_SHORT "77" #ifndef U_HIDE_INTERNAL_API /** Data version in ICU4C. * @internal ICU 4.4 Internal Use Only **/ -#define U_ICU_DATA_VERSION "76.1" +#define U_ICU_DATA_VERSION "77.0.1" #endif /* U_HIDE_INTERNAL_API */ /*=========================================================================== diff --git a/icu4c/source/configure b/icu4c/source/configure index c824ff799e6f..5b40e1d33209 100755 --- a/icu4c/source/configure +++ b/icu4c/source/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.72 for ICU 76.1. +# Generated by GNU Autoconf 2.72 for ICU 77.0.1. # # Report bugs to . # @@ -606,8 +606,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='ICU' PACKAGE_TARNAME='icu4c' -PACKAGE_VERSION='76.1' -PACKAGE_STRING='ICU 76.1' +PACKAGE_VERSION='77.0.1' +PACKAGE_STRING='ICU 77.0.1' PACKAGE_BUGREPORT='https://icu.unicode.org/bugs' PACKAGE_URL='https://icu.unicode.org/' @@ -1387,7 +1387,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -'configure' configures ICU 76.1 to adapt to many kinds of systems. +'configure' configures ICU 77.0.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1453,7 +1453,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of ICU 76.1:";; + short | recursive ) echo "Configuration of ICU 77.0.1:";; esac cat <<\_ACEOF @@ -1592,7 +1592,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -ICU configure 76.1 +ICU configure 77.0.1 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. @@ -2184,7 +2184,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by ICU $as_me 76.1, which was +It was created by ICU $as_me 77.0.1, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw @@ -9019,7 +9019,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by ICU $as_me 76.1, which was +This file was extended by ICU $as_me 77.0.1, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -9075,7 +9075,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -ICU config.status 76.1 +ICU config.status 77.0.1 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" diff --git a/icu4c/source/data/makedata.mak b/icu4c/source/data/makedata.mak index 5dd12bc0f797..b9ea7a1ba647 100644 --- a/icu4c/source/data/makedata.mak +++ b/icu4c/source/data/makedata.mak @@ -12,11 +12,11 @@ ############################################################################## # Keep the following in sync with the version - see common/unicode/uvernum.h -U_ICUDATA_NAME=icudt76 +U_ICUDATA_NAME=icudt77 ############################################################################## !IF "$(UWP)" == "UWP" # Optionally change the name of the data file for the UWP version. -U_ICUDATA_NAME=icudt76 +U_ICUDATA_NAME=icudt77 !ENDIF U_ICUDATA_ENDIAN_SUFFIX=l UNICODE_VERSION=16.0 diff --git a/icu4c/source/data/misc/icuver.txt b/icu4c/source/data/misc/icuver.txt index 048da6a25ce9..6f59f13d379f 100644 --- a/icu4c/source/data/misc/icuver.txt +++ b/icu4c/source/data/misc/icuver.txt @@ -9,6 +9,6 @@ // *************************************************************************** icuver:table(nofallback){ CLDRVersion{"46"} - DataVersion{"76.1.0.0"} - ICUVersion{"76.1.0.0"} + DataVersion{"77.0.1.0"} + ICUVersion{"77.0.1.0"} } diff --git a/icu4j/demos/pom.xml b/icu4j/demos/pom.xml index 66eba0ef41c0..52ef383562a7 100644 --- a/icu4j/demos/pom.xml +++ b/icu4j/demos/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1 + 77.0.1-SNAPSHOT demos diff --git a/icu4j/main/charset/pom.xml b/icu4j/main/charset/pom.xml index ede3f95bd67b..e754aec46d54 100644 --- a/icu4j/main/charset/pom.xml +++ b/icu4j/main/charset/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1 + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/main/collate/pom.xml b/icu4j/main/collate/pom.xml index 4db9dd263c40..78eadff0bb18 100644 --- a/icu4j/main/collate/pom.xml +++ b/icu4j/main/collate/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1 + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/main/common_tests/pom.xml b/icu4j/main/common_tests/pom.xml index f3007b609462..47e379937898 100644 --- a/icu4j/main/common_tests/pom.xml +++ b/icu4j/main/common_tests/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1 + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/main/core/pom.xml b/icu4j/main/core/pom.xml index 93a695c9f7ce..0760367795b8 100644 --- a/icu4j/main/core/pom.xml +++ b/icu4j/main/core/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1 + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/main/core/src/main/java/com/ibm/icu/util/VersionInfo.java b/icu4j/main/core/src/main/java/com/ibm/icu/util/VersionInfo.java index 9abf94ba1554..6c84f2da5b2b 100644 --- a/icu4j/main/core/src/main/java/com/ibm/icu/util/VersionInfo.java +++ b/icu4j/main/core/src/main/java/com/ibm/icu/util/VersionInfo.java @@ -239,7 +239,7 @@ public final class VersionInfo implements Comparable * @deprecated This API is ICU internal only. */ @Deprecated - public static final String ICU_DATA_VERSION_PATH = "76b"; + public static final String ICU_DATA_VERSION_PATH = "77b"; /** * Data version in ICU4J. @@ -584,7 +584,7 @@ public int compareTo(VersionInfo other) UNICODE_15_1 = getInstance(15, 1, 0, 0); UNICODE_16_0 = getInstance(16, 0, 0, 0); - ICU_VERSION = getInstance(76, 1, 0, 0); + ICU_VERSION = getInstance(77, 0, 1, 0); ICU_DATA_VERSION = ICU_VERSION; UNICODE_VERSION = UNICODE_16_0; diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/DebugUtilitiesData.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/DebugUtilitiesData.java index 94976a5c9185..32b420996a60 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/DebugUtilitiesData.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/DebugUtilitiesData.java @@ -10,7 +10,7 @@ package com.ibm.icu.dev.test.util; public class DebugUtilitiesData extends Object { - public static final String ICU4C_VERSION="76.1"; + public static final String ICU4C_VERSION="77.0.1"; public static final int UDebugEnumType = 0; public static final int UCalendarDateFields = 1; public static final int UCalendarMonths = 2; diff --git a/icu4j/main/currdata/pom.xml b/icu4j/main/currdata/pom.xml index a0ec34783c7c..ed3352fa2b10 100644 --- a/icu4j/main/currdata/pom.xml +++ b/icu4j/main/currdata/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1 + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/main/framework/pom.xml b/icu4j/main/framework/pom.xml index ec9480d4a1d8..32a8df866102 100644 --- a/icu4j/main/framework/pom.xml +++ b/icu4j/main/framework/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1 + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/main/icu4j/pom.xml b/icu4j/main/icu4j/pom.xml index 34ab4c7ccf06..bd87662e62f7 100644 --- a/icu4j/main/icu4j/pom.xml +++ b/icu4j/main/icu4j/pom.xml @@ -9,7 +9,7 @@ com.ibm.icu icu4j-root - 76.1 + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/main/langdata/pom.xml b/icu4j/main/langdata/pom.xml index 0b37e48c15d9..6310217c076f 100644 --- a/icu4j/main/langdata/pom.xml +++ b/icu4j/main/langdata/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1 + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/main/localespi/pom.xml b/icu4j/main/localespi/pom.xml index acc08ada3e26..d819f3c3ab0b 100644 --- a/icu4j/main/localespi/pom.xml +++ b/icu4j/main/localespi/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1 + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/main/regiondata/pom.xml b/icu4j/main/regiondata/pom.xml index 0984b574c552..0a71c8986f82 100644 --- a/icu4j/main/regiondata/pom.xml +++ b/icu4j/main/regiondata/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1 + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/main/translit/pom.xml b/icu4j/main/translit/pom.xml index 53621bffcccf..98f8a639f44d 100644 --- a/icu4j/main/translit/pom.xml +++ b/icu4j/main/translit/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1 + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/perf-tests/pom.xml b/icu4j/perf-tests/pom.xml index 47acece7a220..3ac628e85648 100644 --- a/icu4j/perf-tests/pom.xml +++ b/icu4j/perf-tests/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1 + 77.0.1-SNAPSHOT perf-tests diff --git a/icu4j/pom.xml b/icu4j/pom.xml index 816a147287dc..faeb96a96fcc 100644 --- a/icu4j/pom.xml +++ b/icu4j/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1 + 77.0.1-SNAPSHOT pom ${proj-title} (${project.artifactId}) @@ -72,7 +72,7 @@ https://github.com/unicode-org/icu - 76 + 77 diff --git a/icu4j/releases_tools/shared.sh b/icu4j/releases_tools/shared.sh index 977296929523..3eec622421f6 100755 --- a/icu4j/releases_tools/shared.sh +++ b/icu4j/releases_tools/shared.sh @@ -5,10 +5,10 @@ export MAVEN_ARGS='--no-transfer-progress' # Version update! -export artifact_version='76.1' -export github_rel_version='76_1' -export api_report_version='76' -export api_report_prev_version='75' +export artifact_version='77.0.1-SNAPSHOT' +export github_rel_version='77_0_1' +export api_report_version='77' +export api_report_prev_version='76' export out_dir=target function checkThatJdk8IsDefault() { diff --git a/icu4j/samples/pom.xml b/icu4j/samples/pom.xml index 1072c4790ba2..61b28f651099 100644 --- a/icu4j/samples/pom.xml +++ b/icu4j/samples/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1 + 77.0.1-SNAPSHOT samples diff --git a/icu4j/tools/build/pom.xml b/icu4j/tools/build/pom.xml index 3e1ab5dbe7c3..7f027bd4b51b 100644 --- a/icu4j/tools/build/pom.xml +++ b/icu4j/tools/build/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1 + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/tools/misc/pom.xml b/icu4j/tools/misc/pom.xml index ee05daa5de1c..796b87eb17d1 100644 --- a/icu4j/tools/misc/pom.xml +++ b/icu4j/tools/misc/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1 + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/tools/cldr/cldr-to-icu/README.md b/tools/cldr/cldr-to-icu/README.md index 3b1f20a9fc30..295a23135edd 100644 --- a/tools/cldr/cldr-to-icu/README.md +++ b/tools/cldr/cldr-to-icu/README.md @@ -121,9 +121,9 @@ echo $real_icu_ver real_cldr_ver=`mvn help:evaluate -Dexpression=project.version -q -DforceStdout -f $CLDR_DIR/tools` echo $real_cldr_ver # Set dependency versions -mvn versions:set-property -Dproperty=icu4j.version -DnewVersion=$real_icu_ver -f $ICU_DIR/tools/cldr/cldr-to-icu -mvn versions:set-property -Dproperty=cldr-code.version -DnewVersion=$real_cldr_ver -f $ICU_DIR/tools/cldr/cldr-to-icu -mvn versions:set-property -Dproperty=icu4j.version -DnewVersion=$real_icu_ver -f $CLDR_DIR/tools +mvn versions:set-property -DgenerateBackupPoms=false -Dproperty=icu4j.version -DnewVersion=$real_icu_ver -f $ICU_DIR/tools/cldr/cldr-to-icu +mvn versions:set-property -DgenerateBackupPoms=false -Dproperty=cldr-code.version -DnewVersion=$real_cldr_ver -f $ICU_DIR/tools/cldr/cldr-to-icu +mvn versions:set-property -DgenerateBackupPoms=false -Dproperty=icu4j.version -DnewVersion=$real_icu_ver -f $CLDR_DIR/tools ``` ## Build everything diff --git a/tools/cldr/cldr-to-icu/pom.xml b/tools/cldr/cldr-to-icu/pom.xml index 2fb61ec8b4fa..677e632ed190 100644 --- a/tools/cldr/cldr-to-icu/pom.xml +++ b/tools/cldr/cldr-to-icu/pom.xml @@ -20,7 +20,7 @@ 11 11 - 76.1 + 77.0.1-SNAPSHOT 47.0-SNAPSHOT 32.1.1-jre 1.4.4 From 1b8118049f4e6b8292f6bb4c4358b5c564024a03 Mon Sep 17 00:00:00 2001 From: Tim Chevalier Date: Tue, 8 Oct 2024 14:41:59 -0700 Subject: [PATCH 02/24] ICU-22940 MF2 ICU4C: Update for bidi support Per https://github.com/unicode-org/message-format-wg/pull/884 --- icu4c/source/i18n/messageformat2.cpp | 8 +- .../source/i18n/messageformat2_formatter.cpp | 3 +- icu4c/source/i18n/messageformat2_parser.cpp | 425 ++++++++++++++---- icu4c/source/i18n/messageformat2_parser.h | 84 +++- icu4c/source/i18n/ucln_in.h | 1 + .../test/intltest/messageformat2test.cpp | 10 - .../intltest/messageformat2test_read_json.cpp | 4 + .../test/intltest/messageformat2test_utils.h | 8 +- testdata/message2/bidi.json | 160 +++++++ testdata/message2/matches-whitespace.json | 2 +- testdata/message2/more-syntax-errors.json | 21 + 11 files changed, 608 insertions(+), 118 deletions(-) create mode 100644 testdata/message2/bidi.json create mode 100644 testdata/message2/more-syntax-errors.json diff --git a/icu4c/source/i18n/messageformat2.cpp b/icu4c/source/i18n/messageformat2.cpp index 9de6088a51ce..77ce62b658af 100644 --- a/icu4c/source/i18n/messageformat2.cpp +++ b/icu4c/source/i18n/messageformat2.cpp @@ -469,8 +469,8 @@ void MessageFormatter::resolvePreferences(MessageContext& context, UVector& res, if (!key.isWildcard()) { // 2ii(b)(a) Assert that key is a literal. // (Not needed) - // 2ii(b)(b) Let `ks` be the resolved value of `key`. - ks = key.asLiteral().unquoted(); + // 2ii(b)(b) Let `ks` be the resolved value of `key` in Unicode Normalization Form C. + ks = normalizeNFC(key.asLiteral().unquoted()); // 2ii(b)(c) Append `ks` as the last element of the list `keys`. ksP.adoptInstead(create(std::move(ks), status)); CHECK_ERROR(status); @@ -531,7 +531,7 @@ void MessageFormatter::filterVariants(const UVector& pref, UVector& vars, UError // 2i(c). Assert that `key` is a literal. // (Not needed) // 2i(d). Let `ks` be the resolved value of `key`. - UnicodeString ks = key.asLiteral().unquoted(); + UnicodeString ks = normalizeNFC(key.asLiteral().unquoted()); // 2i(e). Let `matches` be the list of strings at index `i` of `pref`. const UVector& matches = *(static_cast(pref[i])); // `matches` is a vector of strings // 2i(f). If `matches` includes `ks` @@ -593,7 +593,7 @@ void MessageFormatter::sortVariants(const UVector& pref, UVector& vars, UErrorCo // 5iii(c)(a). Assert that `key` is a literal. // (Not needed) // 5iii(c)(b). Let `ks` be the resolved value of `key`. - UnicodeString ks = key.asLiteral().unquoted(); + UnicodeString ks = normalizeNFC(key.asLiteral().unquoted()); // 5iii(c)(c) Let matchpref be the integer position of ks in `matches`. matchpref = vectorFind(matches, ks); U_ASSERT(matchpref >= 0); diff --git a/icu4c/source/i18n/messageformat2_formatter.cpp b/icu4c/source/i18n/messageformat2_formatter.cpp index 82f2191ba1a6..625d87de6dea 100644 --- a/icu4c/source/i18n/messageformat2_formatter.cpp +++ b/icu4c/source/i18n/messageformat2_formatter.cpp @@ -45,7 +45,8 @@ namespace message2 { // Parse the pattern MFDataModel::Builder tree(errorCode); - Parser(pat, tree, *errors, normalizedInput).parse(parseError, errorCode); + Parser(pat, tree, *errors, normalizedInput, errorCode) + .parse(parseError, errorCode); // Fail on syntax errors if (errors->hasSyntaxError()) { diff --git a/icu4c/source/i18n/messageformat2_parser.cpp b/icu4c/source/i18n/messageformat2_parser.cpp index fcffe76e8433..f61596e4f4ac 100644 --- a/icu4c/source/i18n/messageformat2_parser.cpp +++ b/icu4c/source/i18n/messageformat2_parser.cpp @@ -9,9 +9,12 @@ #if !UCONFIG_NO_MF2 +#include "unicode/uniset.h" #include "messageformat2_errors.h" #include "messageformat2_macros.h" #include "messageformat2_parser.h" +#include "ucln_in.h" +#include "umutex.h" #include "uvector.h" // U_ASSERT U_NAMESPACE_BEGIN @@ -93,14 +96,235 @@ static void copyContext(const UChar in[U_PARSE_CONTEXT_LEN], UChar out[U_PARSE_C } // ------------------------------------- -// Predicates +// Initialization of UnicodeSets + +namespace unisets { + +UnicodeSet* gUnicodeSets[unisets::UNISETS_KEY_COUNT] = {}; + +inline UnicodeSet* getImpl(Key key) { + return gUnicodeSets[key]; +} + +icu::UInitOnce gMF2ParseUniSetsInitOnce {}; +} + +UnicodeSet* initContentChars(UErrorCode& status) { + if (U_FAILURE(status)) { + return {}; + } + + UnicodeSet* result = new UnicodeSet(0x0001, 0x0008); // Omit NULL, HTAB and LF + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + result->add(0x000B, 0x000C); // Omit CR + result->add(0x000E, 0x001F); // Omit SP + result->add(0x0021, 0x002D); // Omit '.' + result->add(0x002F, 0x003F); // Omit '@' + result->add(0x0041, 0x005B); // Omit '\' + result->add(0x005D, 0x007A); // Omit { | } + result->add(0x007E, 0x2FFF); // Omit IDEOGRAPHIC_SPACE + result->add(0x3001, 0x10FFFF); // Allowing surrogates is intentional + result->freeze(); + return result; +} + +UnicodeSet* initWhitespace(UErrorCode& status) { + if (U_FAILURE(status)) { + return {}; + } + + UnicodeSet* result = new UnicodeSet(); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + result->add(SPACE); + result->add(HTAB); + result->add(CR); + result->add(LF); + result->add(IDEOGRAPHIC_SPACE); + result->freeze(); + return result; +} + +UnicodeSet* initBidiControls(UErrorCode& status) { + UnicodeSet* result = new UnicodeSet(UnicodeString("[\\u061C]"), status); + if (U_FAILURE(status)) { + return {}; + } + result->add(0x200E, 0x200F); + result->add(0x2066, 0x2069); + result->freeze(); + return result; +} + +UnicodeSet* initAlpha(UErrorCode& status) { + UnicodeSet* result = new UnicodeSet(UnicodeString("[:letter:]"), status); + if (U_FAILURE(status)) { + return {}; + } + result->freeze(); + return result; +} + +UnicodeSet* initDigits(UErrorCode& status) { + UnicodeSet* result = new UnicodeSet(UnicodeString("[:number:]"), status); + if (U_FAILURE(status)) { + return {}; + } + result->freeze(); + return result; +} + +UnicodeSet* initNameStartChars(UErrorCode& status) { + if (U_FAILURE(status)) { + return {}; + } + + UnicodeSet* result = new UnicodeSet(*unisets::getImpl(unisets::ALPHA)); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + }; + result->add(UNDERSCORE); + result->add(0x00C0, 0x00D6); + result->add(0x00D8, 0x00F6); + result->add(0x00F8, 0x02FF); + result->add(0x0370, 0x037D); + result->add(0x037F, 0x061B); + result->add(0x061D, 0x1FFF); + result->add(0x200C, 0x200D); + result->add(0x2070, 0x218F); + result->add(0x2C00, 0x2FEF); + result->add(0x3001, 0xD7FF); + result->add(0xF900, 0xFDCF); + result->add(0xFDF0, 0xFFFD); + result->add(0x100000, 0xEFFFF); + result->freeze(); + return result; +} + +UnicodeSet* initNameChars(UErrorCode& status) { + if (U_FAILURE(status)) { + return {}; + } + + UnicodeSet* result = new UnicodeSet(); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + }; + result->addAll(*unisets::getImpl(unisets::NAME_START)); + result->addAll(*unisets::getImpl(unisets::DIGIT)); + result->add(HYPHEN); + result->add(PERIOD); + result->add(0x00B7); + result->add(0x0300, 0x036F); + result->add(0x203F, 0x2040); + result->freeze(); + return result; +} + +UnicodeSet* initTextChars(UErrorCode& status) { + if (U_FAILURE(status)) { + return {}; + } + + UnicodeSet* result = new UnicodeSet(); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + }; + result->addAll(*unisets::getImpl(unisets::CONTENT)); + result->addAll(*unisets::getImpl(unisets::WHITESPACE)); + result->add(PERIOD); + result->add(AT); + result->add(PIPE); + result->freeze(); + return result; +} + +UnicodeSet* initQuotedChars(UErrorCode& status) { + if (U_FAILURE(status)) { + return {}; + } + + UnicodeSet* result = new UnicodeSet(); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + }; + result->addAll(*unisets::getImpl(unisets::CONTENT)); + result->addAll(*unisets::getImpl(unisets::WHITESPACE)); + result->add(PERIOD); + result->add(AT); + result->add(LEFT_CURLY_BRACE); + result->add(RIGHT_CURLY_BRACE); + result->freeze(); + return result; +} + +UnicodeSet* initEscapableChars(UErrorCode& status) { + if (U_FAILURE(status)) { + return {}; + } + + UnicodeSet* result = new UnicodeSet(); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + result->add(PIPE); + result->add(BACKSLASH); + result->add(LEFT_CURLY_BRACE); + result->add(RIGHT_CURLY_BRACE); + result->freeze(); + return result; +} + +namespace unisets { + +UBool U_CALLCONV cleanupMF2ParseUniSets() { + for (int32_t i = 0; i < UNISETS_KEY_COUNT; i++) { + delete gUnicodeSets[i]; + gUnicodeSets[i] = nullptr; + } + gMF2ParseUniSetsInitOnce.reset(); + return true; +} + +void U_CALLCONV initMF2ParseUniSets(UErrorCode& status) { + ucln_i18n_registerCleanup(UCLN_I18N_MF2_UNISETS, cleanupMF2ParseUniSets); + + gUnicodeSets[unisets::CONTENT] = initContentChars(status); + gUnicodeSets[unisets::WHITESPACE] = initWhitespace(status); + gUnicodeSets[unisets::BIDI] = initBidiControls(status); + gUnicodeSets[unisets::ALPHA] = initAlpha(status); + gUnicodeSets[unisets::DIGIT] = initDigits(status); + gUnicodeSets[unisets::NAME_START] = initNameStartChars(status); + gUnicodeSets[unisets::NAME_CHAR] = initNameChars(status); + gUnicodeSets[unisets::TEXT] = initTextChars(status); + gUnicodeSets[unisets::QUOTED] = initQuotedChars(status); + gUnicodeSets[unisets::ESCAPABLE] = initEscapableChars(status); +} + +const UnicodeSet* get(Key key) { + UErrorCode localStatus = U_ZERO_ERROR; + umtx_initOnce(gMF2ParseUniSetsInitOnce, &initMF2ParseUniSets, localStatus); + if (U_FAILURE(localStatus)) { + return nullptr; + } + return getImpl(key); +} -// Returns true if `c` is in the interval [`first`, `last`] -static bool inRange(UChar32 c, UChar32 first, UChar32 last) { - U_ASSERT(first < last); - return c >= first && c <= last; } +// ------------------------------------- +// Predicates + /* The following helper predicates should exactly match nonterminals in the MessageFormat 2 grammar: @@ -115,76 +339,50 @@ static bool inRange(UChar32 c, UChar32 first, UChar32 last) { `isWhitespace()` : `s` */ -static bool isContentChar(UChar32 c) { - return inRange(c, 0x0001, 0x0008) // Omit NULL, HTAB and LF - || inRange(c, 0x000B, 0x000C) // Omit CR - || inRange(c, 0x000E, 0x001F) // Omit SP - || inRange(c, 0x0021, 0x002D) // Omit '.' - || inRange(c, 0x002F, 0x003F) // Omit '@' - || inRange(c, 0x0041, 0x005B) // Omit '\' - || inRange(c, 0x005D, 0x007A) // Omit { | } - || inRange(c, 0x007E, 0x2FFF) // Omit IDEOGRAPHIC_SPACE - || inRange(c, 0x3001, 0x10FFFF); // Allowing surrogates is intentional +bool Parser::isContentChar(UChar32 c) const { + return contentChars->contains(c); } -// See `s` in the MessageFormat 2 grammar -inline bool isWhitespace(UChar32 c) { - switch (c) { - case SPACE: - case HTAB: - case CR: - case LF: - case IDEOGRAPHIC_SPACE: - return true; - default: - return false; - } +// See `bidi` in the MF2 grammar +bool Parser::isBidiControl(UChar32 c) const { + return bidiControlChars->contains(c); } -static bool isTextChar(UChar32 c) { - return isContentChar(c) - || isWhitespace(c) - || c == PERIOD - || c == AT - || c == PIPE; +// See `ws` in the MessageFormat 2 grammar +bool Parser::isWhitespace(UChar32 c) const { + return whitespaceChars->contains(c); } -static bool isAlpha(UChar32 c) { return inRange(c, 0x0041, 0x005A) || inRange(c, 0x0061, 0x007A); } +bool Parser::isTextChar(UChar32 c) const { + return textChars->contains(c); +} -static bool isDigit(UChar32 c) { return inRange(c, 0x0030, 0x0039); } +bool Parser::isAlpha(UChar32 c) const { + return alphaChars->contains(c); +} -static bool isNameStart(UChar32 c) { - return isAlpha(c) || c == UNDERSCORE || inRange(c, 0x00C0, 0x00D6) || inRange(c, 0x00D8, 0x00F6) || - inRange(c, 0x00F8, 0x02FF) || inRange(c, 0x0370, 0x037D) || inRange(c, 0x037F, 0x1FFF) || - inRange(c, 0x200C, 0x200D) || inRange(c, 0x2070, 0x218F) || inRange(c, 0x2C00, 0x2FEF) || - inRange(c, 0x3001, 0xD7FF) || inRange(c, 0xF900, 0xFDCF) || inRange(c, 0xFDF0, 0xFFFD) || - inRange(c, 0x10000, 0xEFFFF); +bool Parser::isDigit(UChar32 c) const { + return digitChars->contains(c); } -static bool isNameChar(UChar32 c) { - return isNameStart(c) || isDigit(c) || c == HYPHEN || c == PERIOD || c == 0x00B7 || - inRange(c, 0x0300, 0x036F) || inRange(c, 0x203F, 0x2040); +bool Parser::isNameStart(UChar32 c) const { + return nameStartChars->contains(c); } -static bool isUnquotedStart(UChar32 c) { - return isNameStart(c) || isDigit(c) || c == HYPHEN || c == PERIOD || c == 0x00B7 || - inRange(c, 0x0300, 0x036F) || inRange(c, 0x203F, 0x2040); +bool Parser::isNameChar(UChar32 c) const { + return nameChars->contains(c); } -static bool isQuotedChar(UChar32 c) { - return isContentChar(c) - || isWhitespace(c) - || c == PERIOD - || c == AT - || c == LEFT_CURLY_BRACE - || c == RIGHT_CURLY_BRACE; +bool Parser::isUnquotedStart(UChar32 c) const { + return isNameChar(c); } -static bool isEscapableChar(UChar32 c) { - return c == PIPE - || c == BACKSLASH - || c == LEFT_CURLY_BRACE - || c == RIGHT_CURLY_BRACE; +bool Parser::isQuotedChar(UChar32 c) const { + return quotedChars->contains(c); +} + +bool Parser::isEscapableChar(UChar32 c) const { + return escapableChars->contains(c); } // Returns true iff `c` can begin a `function` nonterminal @@ -205,12 +403,12 @@ static bool isAnnotationStart(UChar32 c) { } // Returns true iff `c` can begin a `literal` nonterminal -static bool isLiteralStart(UChar32 c) { +bool Parser::isLiteralStart(UChar32 c) const { return (c == PIPE || isNameStart(c) || c == HYPHEN || isDigit(c)); } // Returns true iff `c` can begin a `key` nonterminal -static bool isKeyStart(UChar32 c) { +bool Parser::isKeyStart(UChar32 c) const { return (c == ASTERISK || isLiteralStart(c)); } @@ -349,7 +547,7 @@ option, or the optional space before an attribute. No pre, no post. A message may end with whitespace, so `index` may equal `len()` on exit. */ -void Parser::parseWhitespaceMaybeRequired(bool required, UErrorCode& errorCode) { +void Parser::parseRequiredWS(UErrorCode& errorCode) { bool sawWhitespace = false; // The loop exits either when we consume all the input, @@ -360,7 +558,7 @@ void Parser::parseWhitespaceMaybeRequired(bool required, UErrorCode& errorCode) // If whitespace isn't required -- or if we saw it already -- // then the caller is responsible for checking this case and // setting an error if necessary. - if (!required || sawWhitespace) { + if (sawWhitespace) { // Not an error. return; } @@ -382,24 +580,51 @@ void Parser::parseWhitespaceMaybeRequired(bool required, UErrorCode& errorCode) } } - if (!sawWhitespace && required) { + if (!sawWhitespace) { ERROR(errorCode); } } +void Parser::parseOptionalBidi() { + while (true) { + if (!inBounds()) { + return; + } + if (isBidiControl(peek())) { + next(); + } else { + break; + } + } +} + /* - No pre, no post, for the same reason as `parseWhitespaceMaybeRequired()`. + No pre, no post, because a message may end with whitespace + Matches `s` in the MF2 grammar */ void Parser::parseRequiredWhitespace(UErrorCode& errorCode) { - parseWhitespaceMaybeRequired(true, errorCode); + parseOptionalBidi(); + parseRequiredWS(errorCode); + parseOptionalWhitespace(); normalizedInput += SPACE; } /* No pre, no post, for the same reason as `parseWhitespaceMaybeRequired()`. */ -void Parser::parseOptionalWhitespace(UErrorCode& errorCode) { - parseWhitespaceMaybeRequired(false, errorCode); +void Parser::parseOptionalWhitespace() { + while (true) { + if (!inBounds()) { + return; + } + auto cp = peek(); + if (isWhitespace(cp) || isBidiControl(cp)) { + maybeAdvanceLine(); + next(); + } else { + break; + } + } } // Consumes a single character, signaling an error if `peek()` != `c` @@ -444,11 +669,11 @@ void Parser::parseToken(const std::u16string_view& token, UErrorCode& errorCode) */ void Parser::parseTokenWithWhitespace(const std::u16string_view& token, UErrorCode& errorCode) { // No need for error check or bounds check before parseOptionalWhitespace - parseOptionalWhitespace(errorCode); + parseOptionalWhitespace(); // Establish precondition CHECK_BOUNDS(errorCode); parseToken(token, errorCode); - parseOptionalWhitespace(errorCode); + parseOptionalWhitespace(); // Guarantee postcondition CHECK_BOUNDS(errorCode); } @@ -460,12 +685,12 @@ void Parser::parseTokenWithWhitespace(const std::u16string_view& token, UErrorCo then consumes optional whitespace again */ void Parser::parseTokenWithWhitespace(UChar32 c, UErrorCode& errorCode) { - // No need for error check or bounds check before parseOptionalWhitespace(errorCode) - parseOptionalWhitespace(errorCode); + // No need for error check or bounds check before parseOptionalWhitespace() + parseOptionalWhitespace(); // Establish precondition CHECK_BOUNDS(errorCode); parseToken(c, errorCode); - parseOptionalWhitespace(errorCode); + parseOptionalWhitespace(); // Guarantee postcondition CHECK_BOUNDS(errorCode); } @@ -484,11 +709,17 @@ UnicodeString Parser::parseName(UErrorCode& errorCode) { U_ASSERT(inBounds()); - if (!isNameStart(peek())) { + if (!(isNameStart(peek()) || isBidiControl(peek()))) { ERROR(errorCode); return name; } + // name = [bidi] name-start *name-char [bidi] + + // [bidi] + parseOptionalBidi(); + + // name-start *name-char while (isNameChar(peek())) { UChar32 c = peek(); name += c; @@ -499,6 +730,10 @@ UnicodeString Parser::parseName(UErrorCode& errorCode) { break; } } + + // [bidi] + parseOptionalBidi(); + return name; } @@ -847,7 +1082,7 @@ void Parser::parseAttribute(AttributeAdder& attrAdder, UErrorCode& errorCode) // about whether whitespace precedes another // attribute, or the '=' sign int32_t savedIndex = index; - parseOptionalWhitespace(errorCode); + parseOptionalWhitespace(); Operand rand; if (peek() == EQUALS) { @@ -1133,7 +1368,7 @@ the comment in `parseOptions()` for details. // (the character is either the required space before an annotation, or optional // trailing space after the literal or variable). It's still ambiguous which // one does apply. - parseOptionalWhitespace(status); + parseOptionalWhitespace(); // Restore precondition CHECK_BOUNDS(status); @@ -1204,7 +1439,7 @@ Expression Parser::parseExpression(UErrorCode& status) { // Parse opening brace parseToken(LEFT_CURLY_BRACE, status); // Optional whitespace after opening brace - parseOptionalWhitespace(status); + parseOptionalWhitespace(); Expression::Builder exprBuilder(status); // Restore precondition @@ -1247,7 +1482,7 @@ Expression Parser::parseExpression(UErrorCode& status) { // Parse optional space // (the last [s] in e.g. "{" [s] literal [s annotation] *(s attribute) [s] "}") - parseOptionalWhitespace(status); + parseOptionalWhitespace(); // Either an operand or operator (or both) must have been set already, // so there can't be an error @@ -1323,7 +1558,7 @@ void Parser::parseInputDeclaration(UErrorCode& status) { CHECK_BOUNDS(status); parseToken(ID_INPUT, status); - parseOptionalWhitespace(status); + parseOptionalWhitespace(); // Restore precondition before calling parseExpression() CHECK_BOUNDS(status); @@ -1384,7 +1619,7 @@ void Parser::parseDeclarations(UErrorCode& status) { // Avoid looping infinitely CHECK_ERROR(status); - parseOptionalWhitespace(status); + parseOptionalWhitespace(); // Restore precondition CHECK_BOUNDS(status); } @@ -1494,8 +1729,8 @@ This is addressed using "backtracking" (similarly to `parseOptions()`). // We've seen at least one whitespace-key pair, so now we can parse // *(s key) [s] - while (peek() != LEFT_CURLY_BRACE || isWhitespace(peek())) { // Try to recover from errors - bool wasWhitespace = isWhitespace(peek()); + while (peek() != LEFT_CURLY_BRACE || isWhitespace(peek()) || isBidiControl(peek())) { + bool wasWhitespace = isWhitespace(peek()) || isBidiControl(peek()); parseRequiredWhitespace(status); if (!wasWhitespace) { // Avoid infinite loop when parsing something like: @@ -1553,7 +1788,7 @@ Markup Parser::parseMarkup(UErrorCode& status) { // Consume the '{' next(); normalizedInput += LEFT_CURLY_BRACE; - parseOptionalWhitespace(status); + parseOptionalWhitespace(); bool closing = false; switch (peek()) { case NUMBER_SIGN: { @@ -1580,19 +1815,19 @@ Markup Parser::parseMarkup(UErrorCode& status) { // Parse the options, which must begin with a ' ' // if present - if (inBounds() && isWhitespace(peek())) { + if (inBounds() && (isWhitespace(peek()) || isBidiControl(peek()))) { OptionAdder optionAdder(builder); parseOptions(optionAdder, status); } // Parse the attributes, which also must begin // with a ' ' - if (inBounds() && isWhitespace(peek())) { + if (inBounds() && (isWhitespace(peek()) || isBidiControl(peek()))) { AttributeAdder attrAdder(builder); parseAttributes(attrAdder, status); } - parseOptionalWhitespace(status); + parseOptionalWhitespace(); bool standalone = false; // Check if this is a standalone or not @@ -1640,7 +1875,7 @@ std::variant Parser::parsePlaceholder(UErrorCode& status) { isMarkup = true; break; } - if (!isWhitespace(c)){ + if (!(isWhitespace(c) || isBidiControl(c))) { break; } tempIndex++; @@ -1696,7 +1931,7 @@ Pattern Parser::parseSimpleMessage(UErrorCode& status) { break; } // Don't loop infinitely - if (errors.hasSyntaxError()) { + if (errors.hasSyntaxError() || U_FAILURE(status)) { break; } } @@ -1787,8 +2022,8 @@ void Parser::parseSelectors(UErrorCode& status) { return; } - while (isWhitespace(peek()) || isKeyStart(peek())) { - parseOptionalWhitespace(status); + while (isWhitespace(peek()) || isBidiControl(peek()) || isKeyStart(peek())) { + parseOptionalWhitespace(); // Restore the precondition. // Trailing whitespace is allowed. if (!inBounds()) { @@ -1804,6 +2039,10 @@ void Parser::parseSelectors(UErrorCode& status) { // Because if we don't check it here, the `isWhitespace()` call in // the loop head will read off the end of the input string. CHECK_END_OF_INPUT + + if (errors.hasSyntaxError() || U_FAILURE(status)) { + break; + } } } @@ -1876,7 +2115,7 @@ void Parser::parse(UParseError &parseErrorResult, UErrorCode& status) { bool complex = false; // First, "look ahead" to determine if this is a simple or complex // message. To do that, check the first non-whitespace character. - while (inBounds(index) && isWhitespace(peek())) { + while (inBounds(index) && (isWhitespace(peek()) || isBidiControl(peek()))) { next(); } @@ -1896,10 +2135,10 @@ void Parser::parse(UParseError &parseErrorResult, UErrorCode& status) { // Message can be empty, so we need to only look ahead // if we know it's non-empty if (complex) { - parseOptionalWhitespace(status); + parseOptionalWhitespace(); parseDeclarations(status); parseBody(status); - parseOptionalWhitespace(status); + parseOptionalWhitespace(); } else { // Simple message // For normalization, quote the pattern diff --git a/icu4c/source/i18n/messageformat2_parser.h b/icu4c/source/i18n/messageformat2_parser.h index fa4eaa42b977..7b6dfa3b3824 100644 --- a/icu4c/source/i18n/messageformat2_parser.h +++ b/icu4c/source/i18n/messageformat2_parser.h @@ -10,6 +10,7 @@ #include "unicode/messageformat2_data_model.h" #include "unicode/parseerr.h" +#include "unicode/uniset.h" #include "messageformat2_allocation.h" #include "messageformat2_errors.h" @@ -56,6 +57,26 @@ namespace message2 { } }; + + // Initialization of UnicodeSets + namespace unisets { + enum Key { + CONTENT, + WHITESPACE, + BIDI, + ALPHA, + DIGIT, + NAME_START, + NAME_CHAR, + TEXT, + QUOTED, + ESCAPABLE, + UNISETS_KEY_COUNT + }; + + U_I18N_API const UnicodeSet* get(Key key); + } + // Parser class (private) class Parser : public UMemory { public: @@ -84,8 +105,23 @@ namespace message2 { UChar postContext[U_PARSE_CONTEXT_LEN]; } MessageParseError; - Parser(const UnicodeString &input, MFDataModel::Builder& dataModelBuilder, StaticErrors& e, UnicodeString& normalizedInputRef) - : source(input), index(0), errors(e), normalizedInput(normalizedInputRef), dataModel(dataModelBuilder) { + Parser(const UnicodeString &input, + MFDataModel::Builder& dataModelBuilder, + StaticErrors& e, + UnicodeString& normalizedInputRef, + UErrorCode& status) + : contentChars(unisets::get(unisets::CONTENT)), + whitespaceChars(unisets::get(unisets::WHITESPACE)), + bidiControlChars(unisets::get(unisets::BIDI)), + alphaChars(unisets::get(unisets::ALPHA)), + digitChars(unisets::get(unisets::DIGIT)), + nameStartChars(unisets::get(unisets::NAME_START)), + nameChars(unisets::get(unisets::NAME_CHAR)), + textChars(unisets::get(unisets::TEXT)), + quotedChars(unisets::get(unisets::QUOTED)), + escapableChars(unisets::get(unisets::ESCAPABLE)), + source(input), index(0), errors(e), normalizedInput(normalizedInputRef), dataModel(dataModelBuilder) { + (void) status; parseError.line = 0; parseError.offset = 0; parseError.lengthBeforeCurrentLine = 0; @@ -93,6 +129,31 @@ namespace message2 { parseError.postContext[0] = '\0'; } + UnicodeSet initContentChars(UErrorCode& status); + UnicodeSet initWhitespace(UErrorCode& status); + UnicodeSet initBidiControls(UErrorCode& status); + UnicodeSet initAlpha(UErrorCode& status); + UnicodeSet initDigits(UErrorCode& status); + UnicodeSet initNameStartChars(UErrorCode& status); + UnicodeSet initNameChars(UErrorCode& status); + UnicodeSet initTextChars(UErrorCode& status); + UnicodeSet initQuotedChars(UErrorCode& status); + UnicodeSet initEscapableChars(UErrorCode& status); + + bool isContentChar(UChar32) const; + bool isBidiControl(UChar32) const; + bool isWhitespace(UChar32) const; + bool isTextChar(UChar32) const; + bool isQuotedChar(UChar32) const; + bool isEscapableChar(UChar32) const; + bool isAlpha(UChar32) const; + bool isDigit(UChar32) const; + bool isNameStart(UChar32) const; + bool isNameChar(UChar32) const; + bool isUnquotedStart(UChar32) const; + bool isLiteralStart(UChar32) const; + bool isKeyStart(UChar32) const; + static void translateParseError(const MessageParseError&, UParseError&); static void setParseError(MessageParseError&, uint32_t); void maybeAdvanceLine(); @@ -105,9 +166,10 @@ namespace message2 { void parseSelectors(UErrorCode&); void parseVariant(UErrorCode&); - void parseWhitespaceMaybeRequired(bool, UErrorCode&); + void parseRequiredWS(UErrorCode&); void parseRequiredWhitespace(UErrorCode&); - void parseOptionalWhitespace(UErrorCode&); + void parseOptionalBidi(); + void parseOptionalWhitespace(); void parseToken(UChar32, UErrorCode&); void parseTokenWithWhitespace(UChar32, UErrorCode&); void parseToken(const std::u16string_view&, UErrorCode&); @@ -152,6 +214,18 @@ namespace message2 { bool inBounds(uint32_t i) const { return source.moveIndex32(index, i) < source.length(); } bool allConsumed() const { return (int32_t) index == source.length(); } + // UnicodeSets for checking character ranges + const UnicodeSet* contentChars; + const UnicodeSet* whitespaceChars; + const UnicodeSet* bidiControlChars; + const UnicodeSet* alphaChars; + const UnicodeSet* digitChars; + const UnicodeSet* nameStartChars; + const UnicodeSet* nameChars; + const UnicodeSet* textChars; + const UnicodeSet* quotedChars; + const UnicodeSet* escapableChars; + // The input string const UnicodeString &source; // The current position within the input string -- counting in UChar32 @@ -168,8 +242,8 @@ namespace message2 { // The parent builder MFDataModel::Builder &dataModel; - }; // class Parser + }; // class Parser } // namespace message2 U_NAMESPACE_END diff --git a/icu4c/source/i18n/ucln_in.h b/icu4c/source/i18n/ucln_in.h index b3b19628f4c6..74868891c837 100644 --- a/icu4c/source/i18n/ucln_in.h +++ b/icu4c/source/i18n/ucln_in.h @@ -63,6 +63,7 @@ typedef enum ECleanupI18NType { UCLN_I18N_REGION, UCLN_I18N_LIST_FORMATTER, UCLN_I18N_NUMSYS, + UCLN_I18N_MF2_UNISETS, UCLN_I18N_COUNT /* This must be last */ } ECleanupI18NType; diff --git a/icu4c/source/test/intltest/messageformat2test.cpp b/icu4c/source/test/intltest/messageformat2test.cpp index f6e212dc89be..5317d2c3585b 100644 --- a/icu4c/source/test/intltest/messageformat2test.cpp +++ b/icu4c/source/test/intltest/messageformat2test.cpp @@ -13,16 +13,6 @@ using namespace icu::message2; -/* - TODO: Tests need to be unified in a single format that - both ICU4C and ICU4J can use, rather than being embedded in code. - - Tests are included in their current state to give a sense of - how much test coverage has been achieved. Most of the testing is - of the parser/serializer; the formatter needs to be tested more - thoroughly. -*/ - void TestMessageFormat2::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par*/) { diff --git a/icu4c/source/test/intltest/messageformat2test_read_json.cpp b/icu4c/source/test/intltest/messageformat2test_read_json.cpp index fd3f29629427..3e378d6b905f 100644 --- a/icu4c/source/test/intltest/messageformat2test_read_json.cpp +++ b/icu4c/source/test/intltest/messageformat2test_read_json.cpp @@ -318,12 +318,16 @@ void TestMessageFormat2::jsonTestsFromFiles(IcuTestErrorCode& errorCode) { // TODO: Delete this file after https://github.com/unicode-org/message-format-wg/pull/904 // lands and the tests here are updated from the spec repo runTestsFromJsonFile(*this, "normalization.json", errorCode); + // TODO: https://github.com/unicode-org/message-format-wg/pull/902 will + // move the bidi tests into the spec + runTestsFromJsonFile(*this, "bidi.json", errorCode); runTestsFromJsonFile(*this, "more-functions.json", errorCode); runTestsFromJsonFile(*this, "valid-tests.json", errorCode); runTestsFromJsonFile(*this, "resolution-errors.json", errorCode); runTestsFromJsonFile(*this, "matches-whitespace.json", errorCode); runTestsFromJsonFile(*this, "alias-selector-annotations.json", errorCode); runTestsFromJsonFile(*this, "runtime-errors.json", errorCode); + runTestsFromJsonFile(*this, "more-syntax-errors.json", errorCode); // Re: the expected output for the first test in this file: // Note: the more "correct" fallback output seems like it should be "1.000 3" (ignoring the diff --git a/icu4c/source/test/intltest/messageformat2test_utils.h b/icu4c/source/test/intltest/messageformat2test_utils.h index a7e5b80256ce..7eacab9998de 100644 --- a/icu4c/source/test/intltest/messageformat2test_utils.h +++ b/icu4c/source/test/intltest/messageformat2test_utils.h @@ -294,10 +294,10 @@ class TestUtils { } // Re-run the formatter result = mf.formatToString(MessageArguments(testCase.getArguments(), errorCode), errorCode); - if (!testCase.outputMatches(result)) { - failWrongOutput(tmsg, testCase, result); - return; - } + } + if (!testCase.outputMatches(result)) { + failWrongOutput(tmsg, testCase, result); + return; } errorCode.reset(); } diff --git a/testdata/message2/bidi.json b/testdata/message2/bidi.json new file mode 100644 index 000000000000..0654befba25b --- /dev/null +++ b/testdata/message2/bidi.json @@ -0,0 +1,160 @@ +{ + "scenario": "Bidi support", + "description": "Tests for correct parsing of messages with bidirectional marks and isolates", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { + "comment": "simple-message = o [simple-start pattern]", + "src": " \u061C Hello world!", + "exp": " \u061C Hello world!" + }, + { + "comment": "complex-message = o *(declaration o) complex-body o", + "src": "\u200E .local $x = {1} {{ {$x}}}", + "exp": " 1" + }, + { + "comment": "complex-message = o *(declaration o) complex-body o", + "src": ".local $x = {1} \u200F {{ {$x}}}", + "exp": " 1" + }, + { + "comment": "complex-message = o *(declaration o) complex-body o", + "src": ".local $x = {1} {{ {$x}}} \u2066", + "exp": " 1" + }, + { + "comment": "input-declaration = input o variable-expression", + "src": ".input \u2067 {$x :number} {{hello}}", + "params": [{"name": "x", "value": "1"}], + "exp": "hello" + }, + { + "comment": "local s variable o \"=\" o expression", + "src": ".local $x \u2068 = \u2069 {1} {{hello}}", + "exp": "hello" + }, + { + "comment": "local s variable o \"=\" o expression", + "src": ".local \u2067 $x = {1} {{hello}}", + "exp": "hello" + }, + { + "comment": "local s variable o \"=\" o expression", + "src": ".local\u2067 $x = {1} {{hello}}", + "exp": "hello" + }, + { + "comment": "o \"{{\" pattern \"}}\"", + "src": "\u2067 {{hello}}", + "exp": "hello" + }, + { + "comment": "match-statement s variant *(o variant)", + "src": [".local $x = {1 :number}\n", + ".match $x\n", + "1 {{one}}\n", + "\u061C * {{other}}"], + "exp": "one" + }, + { + "comment": "match-statement s variant *(o variant)", + "src": [".local $x = {1 :number}", + ".match $x \u061c", + "1 {{one}}", + "* {{other}}"], + "exp": "one" + }, + { + "comment": "match-statement s variant *(o variant)", + "src": [".local $x = {1 :number}", + ".match $x \u061c", + "1 {{one}}", + "* {{other}}"], + "exp": "one" + }, + { + "comment": "variant = key *(s key) quoted-pattern", + "src": [".local $x = {1 :number} .local $y = {$x :number}", + ".match $x $y\n", + "1 \u200E 1 {{one}}", + "* * {{other}}"], + "exp": "one" + }, + { + "comment": "variant = key *(s key) quoted-pattern", + "src": [".local $x = {1 :number} .local $y = {$x :number}", + ".match $x $y\n", + "1\u200E 1 {{one}}", + "* * {{other}}"], + "exp": "one" + }, + { + "comment": "literal-expression = \"{\" o literal [s function] *(s attribute) o \"}\"", + "src": "{\u200E hello \u200F}", + "exp": "hello" + }, + { + "comment": "variable-expression = \"{\" o variable [s function] *(s attribute) o \"}\"", + "src": ".local $x = {1} {{ {\u200E $x \u200F} }}", + "exp": " 1 " + }, + { + "comment": "function-expression = \"{\" o function *(s attribute) o \"}\"", + "src": "{1 \u200E :number \u200F}", + "exp": "1" + }, + { + "comment": "markup = \"{\" o \"#\" identifier *(s option) *(s attribute) o [\"/\"] \"}\"", + "src": "{\u200F #b \u200E }", + "exp": "" + }, + { + "comment": "markup = \"{\" o \"/\" identifier *(s option) *(s attribute) o \"}\"", + "src": "{\u200F /b \u200E }", + "exp": "" + }, + { + "comment": "option = identifier o \"=\" o (literal / variable)", + "src": "{1 :number minimumFractionDigits\u200F=\u200E1 }", + "exp": "1.0" + }, + { + "comment": "attribute = \"@\" identifier [o \"=\" o (literal / variable)]", + "src": "{1 :number @locale\u200F=\u200Een }", + "exp": "1" + }, + { + "comment": " name... excludes U+FFFD and U+061C -- this pases as name -> [bidi] name-start *name-char", + "src": ".local $\u061Cfoo = {1} {{ {$\u061Cfoo} }}", + "exp": " 1 " + }, + { + "comment": " name matches https://www.w3.org/TR/REC-xml-names/#NT-NCName but excludes U+FFFD and U+061C", + "src": ".local $foo\u061Cbar = {2} {{ }}", + "expErrors": [{"type": "syntax-error"}] + }, + { + "comment": "name = [bidi] name-start *name-char [bidi]", + "src": ".local $\u200Efoo\u200F = {3} {{{$\u200Efoo\u200F}}}", + "exp": "3" + }, + { + "comment": "name = [bidi] name-start *name-char [bidi]", + "src": ".local $foo = {4} {{{$\u200Efoo\u200F}}}", + "exp": "4" + }, + { + "comment": "name = [bidi] name-start *name-char [bidi]", + "src": ".local $\u200Efoo\u200F = {5} {{{$foo}}}", + "exp": "5" + }, + { + "comment": "name = [bidi] name-start *name-char [bidi]", + "src": ".local $foo\u200Ebar = {6} {{{$foo\u200Ebar}}}", + "expErrors": [{"type": "syntax-error"}] + } + ] +} diff --git a/testdata/message2/matches-whitespace.json b/testdata/message2/matches-whitespace.json index 2255a0203bb7..fd4b2b2ced15 100644 --- a/testdata/message2/matches-whitespace.json +++ b/testdata/message2/matches-whitespace.json @@ -6,7 +6,7 @@ }, "tests": [ { "src": ".local $one = {1 :string} .local $bar = {bar :string} .match $one $bar one * {{one}} * * {{other}}", - "exp": "one" }, + "exp": "other" }, { "src": ".local $foo = {foo :string} .local $bar = {bar :string} .match $foo $bar one * {{one}}* * {{other}}", "exp": "other" }, { "src": ".local $foo = {foo :string} .local $bar = {bar :string} .match $foo $bar one *{{one}} * * {{foo}}", diff --git a/testdata/message2/more-syntax-errors.json b/testdata/message2/more-syntax-errors.json new file mode 100644 index 000000000000..6e1b86e8efba --- /dev/null +++ b/testdata/message2/more-syntax-errors.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://raw.githubusercontent.com/unicode-org/message-format-wg/main/test/schemas/v0/tests.schema.json", + "scenario": "Syntax errors", + "description": "Strings that produce syntax errors when parsed.", + "defaultTestProperties": { + "locale": "en-US", + "expErrors": [ + { + "type": "syntax-error" + } + ] + }, + "tests": [ + { + "src": "{\u0000/\u0000g }\u0000\u0000\u0000\u0000\u000c" + }, + { + "src": ".\u0000$\u0000.\u0000\u00ca$\u0000\u0000\u00f9\u00f9{\u0000{\u0000{\u0000/\u0000\u00ff$\u00ff\u00ff\u00ff\u00ff" + } + ] +} From 494e8cdc9326461dc7f8d236733527219951ac02 Mon Sep 17 00:00:00 2001 From: Henri Sivonen Date: Mon, 11 Nov 2024 09:33:40 +0200 Subject: [PATCH 03/24] ICU-22968 Rearrange bits in trie values in normalization data export for ICU4X --- .../tools/icuexportdata/icuexportdata.cpp | 332 +++++++----------- 1 file changed, 133 insertions(+), 199 deletions(-) diff --git a/icu4c/source/tools/icuexportdata/icuexportdata.cpp b/icu4c/source/tools/icuexportdata/icuexportdata.cpp index 0a96c9e0e62a..dea5d3ace64f 100644 --- a/icu4c/source/tools/icuexportdata/icuexportdata.cpp +++ b/icu4c/source/tools/icuexportdata/icuexportdata.cpp @@ -489,12 +489,29 @@ FILE* prepareOutputFile(const char* basename) { #if !UCONFIG_NO_NORMALIZATION -struct PendingDescriptor { +class PendingDescriptor { +public: UChar32 scalar; - uint32_t descriptor; + uint32_t descriptorOrFlags; + // If false, we use the above fields only. If true, descriptor only + // contains the two highest-bit flags and the rest is computed later + // from the fields below. + UBool complex; UBool supplementary; + UBool onlyNonStartersInTrail; + uint32_t len; + uint32_t offset; + + PendingDescriptor(UChar32 scalar, uint32_t descriptor); + PendingDescriptor(UChar32 scalar, uint32_t flags, UBool supplementary, UBool onlyNonStartersInTrail, uint32_t len, uint32_t offset); }; +PendingDescriptor::PendingDescriptor(UChar32 scalar, uint32_t descriptor) + : scalar(scalar), descriptorOrFlags(descriptor), complex(false), supplementary(false), onlyNonStartersInTrail(false), len(0), offset(0) {} + +PendingDescriptor::PendingDescriptor(UChar32 scalar, uint32_t flags, UBool supplementary, UBool onlyNonStartersInTrail, uint32_t len, uint32_t offset) + : scalar(scalar), descriptorOrFlags(flags), complex(true), supplementary(supplementary), onlyNonStartersInTrail(onlyNonStartersInTrail), len(len), offset(offset) {} + void writeCanonicalCompositions(USet* backwardCombiningStarters) { IcuToolErrorCode status("icuexportdata: computeCanonicalCompositions"); const char* basename = "compositions"; @@ -557,21 +574,18 @@ void writeDecompositionTables(const char* basename, const uint16_t* ptr16, size_ fclose(f); } -void writeDecompositionData(const char* basename, uint32_t baseSize16, uint32_t baseSize32, uint32_t supplementSize16, USet* uset, USet* reference, const std::vector& pendingTrieInsertions, char16_t passthroughCap) { - IcuToolErrorCode status("icuexportdata: writeDecompositionData"); - FILE* f = prepareOutputFile(basename); - - // Zero is a magic number that means the character decomposes to itself. - LocalUMutableCPTriePointer builder(umutablecptrie_open(0, 0, status)); - +void pendingInsertionsToTrie(const char* basename, UMutableCPTrie* trie, const std::vector& pendingTrieInsertions, uint32_t baseSize16, uint32_t baseSize32, uint32_t supplementSize16) { + IcuToolErrorCode status("icuexportdata: pendingInsertionsToTrie"); // Iterate backwards to insert lower code points in the trie first in case it matters // for trie block allocation. for (int32_t i = pendingTrieInsertions.size() - 1; i >= 0; --i) { const PendingDescriptor& pending = pendingTrieInsertions[i]; - uint32_t additional = 0; - if (!(pending.descriptor & 0xFFFC0000)) { - uint32_t offset = pending.descriptor & 0xFFF; + if (pending.complex) { + uint32_t additional = 0; + uint32_t offset = pending.offset; + uint32_t len = pending.len; if (!pending.supplementary) { + len -= 2; if (offset >= baseSize16) { // This is a offset to supplementary 16-bit data. We have // 16-bit base data and 32-bit base data before. However, @@ -579,6 +593,7 @@ void writeDecompositionData(const char* basename, uint32_t baseSize16, uint32_t additional = baseSize32; } } else { + len -= 1; if (offset >= baseSize32) { // This is an offset to supplementary 32-bit data. We have 16-bit // base data, 32-bit base data, and 16-bit supplementary data before. @@ -591,21 +606,55 @@ void writeDecompositionData(const char* basename, uint32_t baseSize16, uint32_t additional = baseSize16; } } + // +1 to make offset always non-zero + offset += 1; if (offset + additional > 0xFFF) { status.set(U_INTERNAL_PROGRAM_ERROR); handleError(status, __LINE__, basename); } + if (len > 7) { + status.set(U_INTERNAL_PROGRAM_ERROR); + handleError(status, __LINE__, basename); + } + umutablecptrie_set(trie, pending.scalar, pending.descriptorOrFlags | (uint32_t(pending.onlyNonStartersInTrail) << 4) | len | (offset + additional) << 16, status); + } else { + umutablecptrie_set(trie, pending.scalar, pending.descriptorOrFlags, status); } - // It turns out it's better to swap the halves compared to the initial - // idea in order to put special marker values close to zero so that - // an important marker value becomes 1, so it's efficient to compare - // "1 or 0". Unfortunately, going through all the code to swap - // things is too error prone, so let's do the swapping here in one - // place. - uint32_t oldTrieValue = pending.descriptor + additional; - uint32_t swappedTrieValue = (oldTrieValue >> 16) | (oldTrieValue << 16); - umutablecptrie_set(builder.getAlias(), pending.scalar, swappedTrieValue, status); } +} + +/// Marker that the decomposition does not round trip via NFC. +const uint32_t NON_ROUND_TRIP_MASK = (1 << 30); + +/// Marker that the first character of the decomposition can combine +/// backwards. +const uint32_t BACKWARD_COMBINING_MASK = (1 << 31); + +void writeDecompositionData(const char* basename, uint32_t baseSize16, uint32_t baseSize32, uint32_t supplementSize16, USet* uset, USet* reference, const std::vector& pendingTrieInsertions, const std::vector& nfdPendingTrieInsertions, char16_t passthroughCap) { + IcuToolErrorCode status("icuexportdata: writeDecompositionData"); + FILE* f = prepareOutputFile(basename); + + // Zero is a magic number that means the character decomposes to itself. + LocalUMutableCPTriePointer builder(umutablecptrie_open(0, 0, status)); + + if (uprv_strcmp(basename, "uts46d") != 0) { + // Make surrogates decompose to U+FFFD. Don't do this for UTS 46, since this + // optimization is only used by the UTF-16 slice mode, and UTS 46 is not + // supported in slice modes (which do not support ignorables). + // Mark these as potentially backward-combining, to make lead surrogates + // for non-BMP characters that are backward-combining count as + // backward-combining just in case, though the backward-combiningness + // is not actually being looked at today. + umutablecptrie_setRange(builder.getAlias(), 0xD800, 0xDFFF, NON_ROUND_TRIP_MASK | BACKWARD_COMBINING_MASK | 0xFFFD, status); + } + + // Add a marker value for Hangul syllables + umutablecptrie_setRange(builder.getAlias(), 0xAC00, 0xD7A3, 1, status); + + // First put the NFD data in the trie, to be partially overwritten in the NFKD and UTS 46 cases. + // This is easier that changing the logic that computes the pending insertions. + pendingInsertionsToTrie(basename, builder.getAlias(), nfdPendingTrieInsertions, baseSize16, baseSize32, supplementSize16); + pendingInsertionsToTrie(basename, builder.getAlias(), pendingTrieInsertions, baseSize16, baseSize32, supplementSize16); LocalUCPTriePointer utrie(umutablecptrie_buildImmutable( builder.getAlias(), trieType, @@ -613,6 +662,7 @@ void writeDecompositionData(const char* basename, uint32_t baseSize16, uint32_t status)); handleError(status, __LINE__, basename); + // The ICU4X side has changed enough this whole block of expectation checking might be more appropriate to remove. if (reference) { if (uset_contains(reference, 0xFF9E) || uset_contains(reference, 0xFF9F) || !uset_contains(reference, 0x0345)) { // NFD expectations don't hold. The set must not contain the half-width @@ -628,13 +678,9 @@ void writeDecompositionData(const char* basename, uint32_t baseSize16, uint32_t USet* iotaSubscript = uset_openEmpty(); uset_add(iotaSubscript, 0x0345); - uint8_t flags = 0; - USet* halfWidthCheck = uset_cloneAsThawed(uset); uset_removeAll(halfWidthCheck, reference); - if (uset_equals(halfWidthCheck, halfWidthVoicing)) { - flags |= 1; - } else if (!uset_isEmpty(halfWidthCheck)) { + if (!uset_equals(halfWidthCheck, halfWidthVoicing) && !uset_isEmpty(halfWidthCheck)) { // The result was neither empty nor contained exactly // the two half-width voicing marks. The ICU4X // normalizer doesn't know how to deal with this case. @@ -655,72 +701,14 @@ void writeDecompositionData(const char* basename, uint32_t baseSize16, uint32_t uset_close(iotaSubscript); uset_close(halfWidthVoicing); - - fprintf(f, "flags = 0x%X\n", flags); - fprintf(f, "cap = 0x%X\n", passthroughCap); } + fprintf(f, "cap = 0x%X\n", passthroughCap); fprintf(f, "[trie]\n"); usrc_writeUCPTrie(f, "trie", utrie.getAlias(), UPRV_TARGET_SYNTAX_TOML); fclose(f); handleError(status, __LINE__, basename); } -// Special marker for the NFKD form of U+FDFA -const int32_t FDFA_MARKER = 3; - -// Special marker for characters whose decomposition starts with a non-starter -// and the decomposition isn't the character itself. -const int32_t SPECIAL_NON_STARTER_DECOMPOSITION_MARKER = 2; - -// Special marker for starters that decompose to themselves but that may -// combine backwards under canonical composition -const int32_t BACKWARD_COMBINING_STARTER_MARKER = 1; - -/// Marker that a complex decomposition isn't round-trippable -/// under re-composition. -/// -/// TODO: When taking a data format break, swap this around with -/// `BACKWARD_COMBINING_STARTER_DECOMPOSITION_MARKER`. -const uint32_t NON_ROUND_TRIP_MARKER = 1; - -/// Marker that a complex decomposition starts with a starter -/// that can combine backwards. -/// -/// TODO: When taking a data format break, swap this around with -/// `NON_ROUND_TRIP_MARKER` to use the same bit as with characters -/// that decompose to self but can combine backwards. -const uint32_t BACKWARD_COMBINING_STARTER_DECOMPOSITION_MARKER = 2; - -UBool permissibleBmpPair(UBool knownToRoundTrip, UChar32 c, UChar32 second) { - if (knownToRoundTrip) { - return true; - } - // Nuktas, Hebrew presentation forms and polytonic Greek with oxia - // are special-cased in ICU4X. - if (c >= 0xFB1D && c <= 0xFB4E) { - // Hebrew presentation forms - return true; - } - if (c >= 0x1F71 && c <= 0x1FFB) { - // Polytonic Greek with oxia - return true; - } - if ((second & 0x7F) == 0x3C && second >= 0x0900 && second <= 0x0BFF) { - // Nukta - return true; - } - // To avoid more branchiness, 4 characters that decompose to - // a BMP starter followed by a BMP non-starter are excluded - // from being encoded directly into the trie value and are - // handled as complex decompositions instead. These are: - // U+0F76 TIBETAN VOWEL SIGN VOCALIC R - // U+0F78 TIBETAN VOWEL SIGN VOCALIC L - // U+212B ANGSTROM SIGN - // U+2ADC FORKING - return false; -} - - // Find the slice `needle` within `storage` and return its index, failing which, // append all elements of `needle` to `storage` and return the index of it at the end. template @@ -749,6 +737,8 @@ size_t findOrAppend(std::vector& storage, const UChar32* needle, size_t needl // Computes data for canonical decompositions +// See components/normalizer/trie-value-format.md in the ICU4X repo +// for documentation of the trie value format. void computeDecompositions(const char* basename, const USet* backwardCombiningStarters, std::vector& storage16, @@ -814,12 +804,23 @@ void computeDecompositions(const char* basename, // Surrogate continue; } + if (c == 0xFFFD) { + // REPLACEMENT CHARACTER + // This character is a starter that decomposes to self, + // so without a special case here it would end up as + // passthrough-eligible in all normalizations forms. + // However, in the potentially-ill-formed UTF-8 case + // UTF-8 errors return U+FFFD from the iterator, and + // errors need to be treated as ineligible for + // passthrough on the slice fast path. By giving + // U+FFFD a trie value whose flags make it ineligible + // for passthrough avoids a specific U+FFFD branch on + // the passthrough fast path. + pendingTrieInsertions.push_back({c, NON_ROUND_TRIP_MASK | BACKWARD_COMBINING_MASK}); + continue; + } UnicodeString src; UnicodeString dst; - // True if we're building non-NFD or we're building NFD but - // the `c` round trips to NFC. - // False if we're building NFD and `c` does not round trip to NFC. - UBool nonNfdOrRoundTrips = true; src.append(c); if (mainNormalizer != nfdNormalizer) { UnicodeString inter; @@ -827,39 +828,12 @@ void computeDecompositions(const char* basename, nfdNormalizer->normalize(inter, dst, status); } else { nfdNormalizer->normalize(src, dst, status); - UnicodeString nfc; - nfcNormalizer->normalize(dst, nfc, status); - nonNfdOrRoundTrips = (src == nfc); - } - if (uts46) { - // Work around https://unicode-org.atlassian.net/browse/ICU-22658 - // TODO: Remove the workaround after data corresponding to - // https://www.unicode.org/L2/L2024/24061.htm#179-C36 lands - // for Unicode 16. - switch (c) { - case 0x2F868: - dst.truncate(0); - dst.append(static_cast(0x36FC)); - break; - case 0x2F874: - dst.truncate(0); - dst.append(static_cast(0x5F53)); - break; - case 0x2F91F: - dst.truncate(0); - dst.append(static_cast(0x243AB)); - break; - case 0x2F95F: - dst.truncate(0); - dst.append(static_cast(0x7AEE)); - break; - case 0x2F9BF: - dst.truncate(0); - dst.append(static_cast(0x45D7)); - break; - } } + UnicodeString nfc; + nfcNormalizer->normalize(dst, nfc, status); + UBool roundTripsViaCanonicalComposition = (src == nfc); + int32_t len = dst.toUTF32(utf32, DECOMPOSITION_BUFFER_SIZE, status); if (!len || (len == 1 && utf32[0] == 0xFFFD && c != 0xFFFD)) { @@ -880,7 +854,7 @@ void computeDecompositions(const char* basename, compositionPassthroughBound = c; uset_add(decompositionStartsWithNonStarter, c); if (src != dst) { - if (c == 0x0340 || c == 0x0341 || c == 0x0343 || c == 0x0344 || c == 0x0F73 || c == 0x0F75 || c == 0x0F81 || c == 0xFF9E || c == 0xFF9F) { + if (c == 0x0340 || c == 0x0341 || c == 0x0343 || c == 0x0344 || c == 0x0F73 || c == 0x0F75 || c == 0x0F81 || (c == 0xFF9E && utf32[0] == 0x3099) || (c == 0xFF9F && utf32[0] == 0x309A)) { specialNonStarterDecomposition = true; } else { // A character whose decomposition starts with a non-starter and isn't the same as the character itself and isn't already hard-coded into ICU4X. @@ -893,18 +867,6 @@ void computeDecompositions(const char* basename, startsWithBackwardCombiningStarter = true; uset_add(decompositionStartsWithBackwardCombiningStarter, c); } - if (c != BACKWARD_COMBINING_STARTER_MARKER && len == 1 && utf32[0] == BACKWARD_COMBINING_STARTER_MARKER) { - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, __LINE__, basename); - } - if (c != SPECIAL_NON_STARTER_DECOMPOSITION_MARKER && len == 1 && utf32[0] == SPECIAL_NON_STARTER_DECOMPOSITION_MARKER) { - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, __LINE__, basename); - } - if (c != FDFA_MARKER && len == 1 && utf32[0] == FDFA_MARKER) { - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, __LINE__, basename); - } if (mainNormalizer != nfdNormalizer) { UnicodeString nfd; nfdNormalizer->normalize(src, nfd, status); @@ -913,24 +875,29 @@ void computeDecompositions(const char* basename, } decompositionPassthroughBound = c; compositionPassthroughBound = c; - } else if (firstCombiningClass) { + } + if (firstCombiningClass) { len = 1; if (specialNonStarterDecomposition) { - utf32[0] = SPECIAL_NON_STARTER_DECOMPOSITION_MARKER; // magic value + // Special marker + pendingTrieInsertions.push_back({c, NON_ROUND_TRIP_MASK | BACKWARD_COMBINING_MASK | 0xD900 | u_getCombiningClass(c)}); } else { // Use the surrogate range to store the canonical combining class - utf32[0] = 0xD800 | static_cast(firstCombiningClass); + // XXX: Should non-started that decompose to self be marked as non-round-trippable in + // case such semantics turn out to be more useful for `NON_ROUND_TRIP_MASK`? + pendingTrieInsertions.push_back({c, BACKWARD_COMBINING_MASK | 0xD800 | static_cast(firstCombiningClass)}); } + continue; } else { if (src == dst) { if (startsWithBackwardCombiningStarter) { - pendingTrieInsertions.push_back({c, BACKWARD_COMBINING_STARTER_MARKER << 16, false}); + pendingTrieInsertions.push_back({c, BACKWARD_COMBINING_MASK}); } continue; } decompositionPassthroughBound = c; // ICU4X hard-codes ANGSTROM SIGN - if (c != 0x212B) { + if (c != 0x212B && mainNormalizer == nfdNormalizer) { UnicodeString raw; if (!nfdNormalizer->getRawDecomposition(c, raw)) { // We're always supposed to have a non-recursive decomposition @@ -978,7 +945,7 @@ void computeDecompositions(const char* basename, } } } - if (!nonNfdOrRoundTrips) { + if (!roundTripsViaCanonicalComposition) { compositionPassthroughBound = c; } if (!len) { @@ -986,7 +953,7 @@ void computeDecompositions(const char* basename, status.set(U_INTERNAL_PROGRAM_ERROR); handleError(status, __LINE__, basename); } - pendingTrieInsertions.push_back({c, 0xFFFFFFFF, false}); + pendingTrieInsertions.push_back({c, uint32_t(0xFFFFFFFF)}); } else if (len == 1 && ((utf32[0] >= 0x1161 && utf32[0] <= 0x1175) || (utf32[0] >= 0x11A8 && utf32[0] <= 0x11C2))) { // Singleton decompositions to conjoining jamo. if (mainNormalizer == nfdNormalizer) { @@ -994,16 +961,18 @@ void computeDecompositions(const char* basename, status.set(U_INTERNAL_PROGRAM_ERROR); handleError(status, __LINE__, basename); } - pendingTrieInsertions.push_back({c, static_cast(utf32[0]) << 16, false}); + pendingTrieInsertions.push_back({c, static_cast(utf32[0]) | NON_ROUND_TRIP_MASK | (startsWithBackwardCombiningStarter ? BACKWARD_COMBINING_MASK : 0)}); } else if (!startsWithBackwardCombiningStarter && len == 1 && utf32[0] <= 0xFFFF) { - pendingTrieInsertions.push_back({c, static_cast(utf32[0]) << 16, false}); - } else if (!startsWithBackwardCombiningStarter && + pendingTrieInsertions.push_back({c, static_cast(utf32[0]) | NON_ROUND_TRIP_MASK | (startsWithBackwardCombiningStarter ? BACKWARD_COMBINING_MASK : 0)}); + } else if (c != 0x212B && // ANGSTROM SIGN is special to make the Harfbuzz case branch less in the more common case. + !startsWithBackwardCombiningStarter && len == 2 && - utf32[0] <= 0xFFFF && - utf32[1] <= 0xFFFF && + utf32[0] <= 0x7FFF && + utf32[1] <= 0x7FFF && + utf32[0] > 0x1F && + utf32[1] > 0x1F && !u_getCombiningClass(utf32[0]) && - u_getCombiningClass(utf32[1]) && - permissibleBmpPair(nonNfdOrRoundTrips, c, utf32[1])) { + u_getCombiningClass(utf32[1])) { for (int32_t i = 0; i < len; ++i) { if (((utf32[i] == 0x0345) && (uprv_strcmp(basename, "uts46d") == 0)) || utf32[i] == 0xFF9E || utf32[i] == 0xFF9F) { // Assert that iota subscript and half-width voicing marks never occur in these @@ -1012,7 +981,7 @@ void computeDecompositions(const char* basename, handleError(status, __LINE__, basename); } } - pendingTrieInsertions.push_back({c, (static_cast(utf32[0]) << 16) | static_cast(utf32[1]), false}); + pendingTrieInsertions.push_back({c, static_cast(utf32[0]) | (static_cast(utf32[1]) << 15) | (roundTripsViaCanonicalComposition ? 0 : NON_ROUND_TRIP_MASK)}); } else { UBool supplementary = false; UBool nonInitialStarter = false; @@ -1046,73 +1015,38 @@ void computeDecompositions(const char* basename, if (len > LONGEST_ENCODABLE_LENGTH_16 || !len || len == 1) { if (len == 18 && c == 0xFDFA) { // Special marker for the one character whose decomposition - // is too long. - pendingTrieInsertions.push_back({c, FDFA_MARKER << 16, supplementary}); + // is too long. (Too long even if we took the fourth bit into use!) + pendingTrieInsertions.push_back({c, NON_ROUND_TRIP_MASK | 1}); continue; } else { + // Note: There's a fourth bit available, but let's error out + // if it's ever needed so that it doesn't get used without + // updating docs. status.set(U_INTERNAL_PROGRAM_ERROR); handleError(status, __LINE__, basename); } } } else if (len > LONGEST_ENCODABLE_LENGTH_32 || !len) { + // Note: There's a fourth bit available, but let's error out + // if it's ever needed so that it doesn't get used without + // updating docs. status.set(U_INTERNAL_PROGRAM_ERROR); handleError(status, __LINE__, basename); } - // Complex decomposition - // Format for 16-bit value: - // 15..13: length minus two for 16-bit case and length minus one for - // the 32-bit case. Length 8 needs to fit in three bits in - // the 16-bit case, and this way the value is future-proofed - // up to 9 in the 16-bit case. Zero is unused and length one - // in the 16-bit case goes directly into the trie. - // 12: 1 if all trailing characters are guaranteed non-starters, - // 0 if no guarantees about non-starterness. - // Note: The bit choice is this way around to allow for - // dynamically falling back to not having this but instead - // having one more bit for length by merely choosing - // different masks. - // 11..0: Start offset in storage. The offset is to the logical - // sequence of scalars16, scalars32, supplementary_scalars16, - // supplementary_scalars32. - uint32_t descriptor = static_cast(!nonInitialStarter) << 12; - if (!supplementary) { - descriptor |= (static_cast(len) - 2) << 13; - } else { - descriptor |= (static_cast(len) - 1) << 13; - } - if (descriptor & 0xFFF) { - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, __LINE__, basename); - } + size_t index = 0; if (!supplementary) { index = findOrAppend(storage16, utf32, len); } else { index = findOrAppend(storage32, utf32, len); } - if (index > 0xFFF) { - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, __LINE__, basename); - } - descriptor |= static_cast(index); - if (!descriptor || descriptor > 0xFFFF) { - // > 0xFFFF should never happen if the code above is correct. - // == 0 should not happen due to the nature of the data. - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, __LINE__, basename); - } - uint32_t nonRoundTripMarker = 0; - if (!nonNfdOrRoundTrips) { - nonRoundTripMarker = (NON_ROUND_TRIP_MARKER << 16); - } - uint32_t canCombineBackwardsMarker = 0; - if (startsWithBackwardCombiningStarter) { - canCombineBackwardsMarker = (BACKWARD_COMBINING_STARTER_DECOMPOSITION_MARKER << 16); - } - pendingTrieInsertions.push_back({c, descriptor | nonRoundTripMarker | canCombineBackwardsMarker, supplementary}); + pendingTrieInsertions.push_back({c, (startsWithBackwardCombiningStarter ? BACKWARD_COMBINING_MASK : 0) | (roundTripsViaCanonicalComposition ? 0 : NON_ROUND_TRIP_MASK), supplementary, !nonInitialStarter, uint32_t(len), uint32_t(index)}); } } if (storage16.size() + storage32.size() > 0xFFF) { + // We actually have 14 bits available, but let's error out so + // that docs can be updated when taking a reserved bit out of + // potential future flag usage. status.set(U_INTERNAL_PROGRAM_ERROR); } if (f) { @@ -1489,9 +1423,9 @@ int exportNorm() { uint32_t supplementSize16 = storage16.size() - baseSize16; uint32_t supplementSize32 = storage32.size() - baseSize32; - writeDecompositionData("nfd", baseSize16, baseSize32, supplementSize16, nfdDecompositionStartsWithNonStarter, nullptr, nfdPendingTrieInsertions, static_cast(nfcBound)); - writeDecompositionData("nfkd", baseSize16, baseSize32, supplementSize16, nfkdDecompositionStartsWithNonStarter, nfdDecompositionStartsWithNonStarter, nfkdPendingTrieInsertions, static_cast(nfkcBound)); - writeDecompositionData("uts46d", baseSize16, baseSize32, supplementSize16, uts46DecompositionStartsWithNonStarter, nfdDecompositionStartsWithNonStarter, uts46PendingTrieInsertions, static_cast(uts46Bound)); + writeDecompositionData("nfd", baseSize16, baseSize32, supplementSize16, nfdDecompositionStartsWithNonStarter, nullptr, nfdPendingTrieInsertions, nfdPendingTrieInsertions, static_cast(nfcBound)); + writeDecompositionData("nfkd", baseSize16, baseSize32, supplementSize16, nfkdDecompositionStartsWithNonStarter, nfdDecompositionStartsWithNonStarter, nfkdPendingTrieInsertions, nfdPendingTrieInsertions, static_cast(nfkcBound)); + writeDecompositionData("uts46d", baseSize16, baseSize32, supplementSize16, uts46DecompositionStartsWithNonStarter, nfdDecompositionStartsWithNonStarter, uts46PendingTrieInsertions, nfdPendingTrieInsertions, static_cast(uts46Bound)); writeDecompositionTables("nfdex", storage16.data(), baseSize16, storage32.data(), baseSize32); writeDecompositionTables("nfkdex", storage16.data() + baseSize16, supplementSize16, storage32.data() + baseSize32, supplementSize32); From 02951053b45f270c04ffeac6e0787dd2313bbd23 Mon Sep 17 00:00:00 2001 From: Mihai Nita Date: Thu, 12 Dec 2024 19:27:53 +0000 Subject: [PATCH 04/24] ICU-22921 Document a way to remove unused includes from command line --- docs/processes/release/tasks/healthy-code.md | 31 ++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/docs/processes/release/tasks/healthy-code.md b/docs/processes/release/tasks/healthy-code.md index 5d4aa295faf2..f1e7bf6a7bf2 100644 --- a/docs/processes/release/tasks/healthy-code.md +++ b/docs/processes/release/tasks/healthy-code.md @@ -126,6 +126,37 @@ the UTF-8 signature byte sequence ("BOM").~~ ## Clean up import statements +### From command line + +This can be done from command line using the +[Google Java Format](https://github.com/google/google-java-format) tool. + +**WARNING:** requires JDK 17 or newer (December 2024) + +Download the latest Google Java Format from Maven Central: +```sh +mvn dependency:copy -Dartifact=com.google.googlejavaformat:google-java-format:LATEST:jar:all-deps \ + -DoutputDirectory=/tmp \ + -Dmdep.stripVersion=true \ + -q -ntp +``` + +Cleanup all Java files (only imports, nothing else): +```sh +find . -type f -name '*.java' | xargs java -jar /tmp/google-java-format-all-deps.jar -i --aosp --fix-imports-only --skip-sorting-imports +``` + +Remove the Google Java Format artifact from the temporary folder: +```sh +rm /tmp/google-java-format-all-deps.jar +``` + +You can (of course) download it from +[GitHub Releases](https://github.com/google/google-java-format/releases). \ +Or save it in a personal tools folder and keep it around. + +### From Eclipse + The Eclipse IDE provides a feature which allow you to organize import statements for multiple files. Right click on projects/source folders/files, you can select \[Source\] - \[Organize Imports\] which resolve all wildcard imports and sort From 4ff5d6a0703f733eb34b329a443e221858c230bb Mon Sep 17 00:00:00 2001 From: Mihai Nita Date: Sat, 14 Dec 2024 08:32:19 +0000 Subject: [PATCH 05/24] ICU-22920 Fix raw type warnings in icu4j core tests --- .../java/com/ibm/icu/dev/test/ModuleTest.java | 2 +- .../com/ibm/icu/dev/test/ResourceModule.java | 33 ++++--- .../com/ibm/icu/dev/test/TestBoilerplate.java | 29 +++--- .../com/ibm/icu/dev/test/TestDataModule.java | 6 +- .../dev/test/UnicodeMapBoilerplateTest.java | 8 +- .../com/ibm/icu/dev/test/UnicodeMapTest.java | 98 +++++++++---------- .../test/calendar/CalendarRegressionTest.java | 2 +- .../dev/test/calendar/CalendarTestFmwk.java | 10 +- .../dev/test/duration/LanguageTestFmwk.java | 13 ++- ...ceBasedPeriodFormatterDataServiceTest.java | 7 +- .../test/format/DateTimeGeneratorTest.java | 9 +- .../dev/test/format/ListFormatterTest.java | 2 +- .../test/format/MessageRegressionTest.java | 32 +++--- .../dev/test/format/PluralFormatUnitTest.java | 4 +- .../dev/test/lang/DataDrivenUScriptTest.java | 12 +-- .../test/lang/UCharacterSurrogateTest.java | 6 +- .../ibm/icu/dev/test/lang/UCharacterTest.java | 2 +- .../dev/test/lang/UCharacterThreadTest.java | 9 +- .../ibm/icu/dev/test/lang/UnicodeSetTest.java | 62 ++++++------ .../normalizer/TestCanonicalIterator.java | 16 ++- .../com/ibm/icu/dev/test/rbbi/RBBITest.java | 4 +- .../ibm/icu/dev/test/rbbi/RBBITestMonkey.java | 18 ++-- .../DataDrivenArabicShapingRegTest.java | 10 +- .../test/stringprep/IDNAConformanceTest.java | 21 ++-- .../test/stringprep/NamePrepTransform.java | 2 +- .../icu/dev/test/text/SpoofCheckerTest.java | 4 +- .../dev/test/timezone/TimeZoneAliasTest.java | 59 +++++------ .../icu/dev/test/timezone/TimeZoneTest.java | 2 +- .../icu/dev/test/util/DisplayNameTest.java | 33 +++---- .../dev/test/util/ICUServiceTestSample.java | 18 ++-- .../dev/test/util/ICUServiceThreadTest.java | 44 ++++----- .../com/ibm/icu/dev/test/util/RegionTest.java | 3 +- .../icu/dev/test/util/TestLocaleValidity.java | 7 +- .../icu/dev/test/util/TextTrieMapTest.java | 10 +- .../ibm/icu/dev/test/util/UtilityTest.java | 4 +- 35 files changed, 282 insertions(+), 319 deletions(-) diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/ModuleTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/ModuleTest.java index a229fe49dd6e..b371b6aa61b5 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/ModuleTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/ModuleTest.java @@ -70,7 +70,7 @@ public static List getTestData(String moduleLocation, String modul Iterator tIter = m.getTestDataIterator(); while (tIter.hasNext()) { TestData t = tIter.next(); - for (Iterator siter = t.getSettingsIterator(); siter.hasNext();) { + for (Iterator siter = t.getSettingsIterator(); siter.hasNext();) { DataMap settings = (DataMap) siter.next(); list.add(new TestDataPair(t, settings)); } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/ResourceModule.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/ResourceModule.java index 97dc7947803e..0ee8c4fb5a4f 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/ResourceModule.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/ResourceModule.java @@ -103,9 +103,9 @@ public TestData getTestData(String testName) throws DataModuleFormatError { return new UResourceTestData(defaultHeader, testData.get(testName)); } - public Iterator getTestDataIterator() { - return new IteratorAdapter(testData){ - protected Object prepareNext(UResourceBundle nextRes) throws DataModuleFormatError { + public Iterator getTestDataIterator() { + return new IteratorAdapter(testData){ + protected TestData prepareNext(UResourceBundle nextRes) throws DataModuleFormatError { return new UResourceTestData(defaultHeader, nextRes); } }; @@ -116,11 +116,12 @@ protected Object prepareNext(UResourceBundle nextRes) throws DataModuleFormatErr * and return various data-driven test object for next() call * * @author Raymond Yang + * @param */ - private abstract static class IteratorAdapter implements Iterator{ + private abstract static class IteratorAdapter implements Iterator{ private UResourceBundle res; private UResourceBundleIterator itr; - private Object preparedNextElement = null; + private T preparedNextElement = null; // fix a strange behavior for UResourceBundleIterator for // UResourceBundle.STRING. It support hasNext(), but does // not support next() now. @@ -178,9 +179,9 @@ public boolean hasNext() { } } - public Object next(){ + public T next(){ if (hasNext()) { - Object t = preparedNextElement; + T t = preparedNextElement; preparedNextElement = null; return t; } else { @@ -190,7 +191,7 @@ public Object next(){ /** * To prepare data-driven test object for next() call, should not return null */ - abstract protected Object prepareNext(UResourceBundle nextRes) throws DataModuleFormatError; + abstract protected T prepareNext(UResourceBundle nextRes) throws DataModuleFormatError; } @@ -327,21 +328,21 @@ public DataMap getInfo() { return info == null ? null : new UTableResource(info); } - public Iterator getSettingsIterator() { + public Iterator getSettingsIterator() { assert_is (settings.getType() == UResourceBundle.ARRAY); - return new IteratorAdapter(settings){ - protected Object prepareNext(UResourceBundle nextRes) throws DataModuleFormatError { + return new IteratorAdapter(settings){ + protected DataMap prepareNext(UResourceBundle nextRes) throws DataModuleFormatError { return new UTableResource(nextRes); } }; } - public Iterator getDataIterator() { + public Iterator getDataIterator() { // unfortunately, assert_is (data.getType() == UResourceBundle.ARRAY || data.getType() == UResourceBundle.STRING); - return new IteratorAdapter(data){ - protected Object prepareNext(UResourceBundle nextRes) throws DataModuleFormatError { + return new IteratorAdapter(data){ + protected DataMap prepareNext(UResourceBundle nextRes) throws DataModuleFormatError { return new UArrayResource(header, nextRes); } }; @@ -370,7 +371,7 @@ public Object getObject(String key) { } private static class UArrayResource implements DataMap{ - private Map theMap; + private Map theMap; UArrayResource(UResourceBundle theHeader, UResourceBundle theData) throws DataModuleFormatError{ assert_is (theHeader != null && theData != null); String[] header; @@ -378,7 +379,7 @@ private static class UArrayResource implements DataMap{ header = getStringArrayHelper(theHeader); if (theData.getSize() != header.length) throw new DataModuleFormatError("The count of Header and Data is mismatch."); - theMap = new HashMap(); + theMap = new HashMap<>(); for (int i = 0; i < header.length; i++) { if(theData.getType()==UResourceBundle.ARRAY){ theMap.put(header[i], theData.get(i)); diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/TestBoilerplate.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/TestBoilerplate.java index 730c9f3d938f..c809f4f4d121 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/TestBoilerplate.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/TestBoilerplate.java @@ -129,12 +129,12 @@ protected boolean _canClone(T a) { * @return clone */ protected T _clone(T a) throws Exception { - Class aClass = a.getClass(); + Class aClass = a.getClass(); try { Method cloner = aClass.getMethod("clone", (Class[])null); return (T) cloner.invoke(a,(Object[])null); } catch (NoSuchMethodException e) { - Constructor constructor = aClass.getConstructor(new Class[] {aClass}); + Constructor constructor = aClass.getConstructor(new Class[] {aClass}); return (T) constructor.newInstance(new Object[]{a}); } } @@ -150,26 +150,25 @@ public static boolean verifySetsIdentical(AbstractTestLog here, UnicodeSet set1, return false; } - public static boolean verifySetsIdentical(AbstractTestLog here, Set values1, Set values2) { + public static boolean verifySetsIdentical(AbstractTestLog here, Set values1, Set values2) { if (values1.equals(values2)) return true; - Set temp; + Set temp; TestFmwk.errln("Values differ:"); TestFmwk.errln("UnicodeMap - HashMap"); - temp = new TreeSet(values1); + temp = new TreeSet<>(values1); temp.removeAll(values2); TestFmwk.errln(show(temp)); TestFmwk.errln("HashMap - UnicodeMap"); - temp = new TreeSet(values2); + temp = new TreeSet<>(values2); temp.removeAll(values1); TestFmwk.errln(show(temp)); return false; } - - public static String show(Map m) { + + public static String show(Map m) { StringBuilder buffer = new StringBuilder(); - for (Iterator it = m.keySet().iterator(); it.hasNext();) { - Object key = it.next(); - buffer.append(key + "=>" + m.get(key) + "\r\n"); + for (Map.Entry e : m.entrySet()) { + buffer.append(e.getKey() + "=>" + e.getValue() + "\r\n"); } return buffer.toString(); } @@ -184,11 +183,11 @@ public static UnicodeSet getSet(Map m, T value) { } return result; } - - public static String show(Collection c) { + + public static String show(Collection c) { StringBuilder buffer = new StringBuilder(); - for (Iterator it = c.iterator(); it.hasNext();) { - buffer.append(it.next() + "\r\n"); + for (T item : c) { + buffer.append(item + "\r\n"); } return buffer.toString(); } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/TestDataModule.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/TestDataModule.java index 1e2ca94efdf7..997375ba8189 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/TestDataModule.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/TestDataModule.java @@ -36,7 +36,7 @@ public interface TestDataModule { /** * @return Iterator */ - public Iterator getTestDataIterator(); + public Iterator getTestDataIterator(); public static class Factory{ @@ -74,11 +74,11 @@ public static interface TestData { /** * @return Iterator */ - public Iterator getSettingsIterator(); + public Iterator getSettingsIterator(); /** * @return Iterator */ - public Iterator getDataIterator(); + public Iterator getDataIterator(); } /** diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/UnicodeMapBoilerplateTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/UnicodeMapBoilerplateTest.java index 8118a3c2fbfa..7c540f1ba190 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/UnicodeMapBoilerplateTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/UnicodeMapBoilerplateTest.java @@ -17,7 +17,7 @@ /** * Moved from UnicodeMapTest */ -public class UnicodeMapBoilerplateTest extends TestBoilerplate { +public class UnicodeMapBoilerplateTest extends TestBoilerplate> { private static String[] TEST_VALUES = {"A", "B", "C", "D", "E", "F"}; @@ -32,7 +32,7 @@ public void test() throws Exception { /* (non-Javadoc) * @see com.ibm.icu.dev.test.TestBoilerplate#_hasSameBehavior(java.lang.Object, java.lang.Object) */ - protected boolean _hasSameBehavior(UnicodeMap a, UnicodeMap b) { + protected boolean _hasSameBehavior(UnicodeMap a, UnicodeMap b) { // we are pretty confident in the equals method, so won't bother with this right now. return true; } @@ -40,9 +40,9 @@ protected boolean _hasSameBehavior(UnicodeMap a, UnicodeMap b) { /* (non-Javadoc) * @see com.ibm.icu.dev.test.TestBoilerplate#_addTestObject(java.util.List) */ - protected boolean _addTestObject(List list) { + protected boolean _addTestObject(List> list) { if (list.size() > 30) return false; - UnicodeMap result = new UnicodeMap(); + UnicodeMap result = new UnicodeMap<>(); for (int i = 0; i < 50; ++i) { int start = random.nextInt(25); String value = TEST_VALUES[random.nextInt(TEST_VALUES.length)]; diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/UnicodeMapTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/UnicodeMapTest.java index b1144aed93b3..400380d433fe 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/UnicodeMapTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/UnicodeMapTest.java @@ -13,7 +13,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Map; -import java.util.Map.Entry; import java.util.Random; import java.util.Set; import java.util.SortedMap; @@ -46,7 +45,7 @@ public class UnicodeMapTest extends TestFmwk { @Test public void TestIterations() { - UnicodeMap foo = new UnicodeMap(); + UnicodeMap foo = new UnicodeMap<>(); checkToString(foo, ""); foo.put(3, 6d).put(5, 10d); checkToString(foo, "0003=6.0\n0005=10.0\n"); @@ -64,7 +63,7 @@ public void TestIterations() { public void checkToString(UnicodeMap foo, String expected) { StringJoiner joiner = new StringJoiner("\n"); - for (UnicodeMap.EntryRange range : foo.entryRanges()) { + for (UnicodeMap.EntryRange range : foo.entryRanges()) { joiner.add(range.toString()); } assertEquals("EntryRange", expected, joiner.toString() + (foo.size() == 0 ? "" : "\n")); @@ -73,30 +72,30 @@ public void checkToString(UnicodeMap foo, String expected) { @Test public void TestRemove() { - UnicodeMap foo = new UnicodeMap() - .putAll(0x20, 0x29, -2d) - .put("abc", 3d) - .put("xy", 2d) - .put("mark", 4d) - .freeze(); - UnicodeMap fii = new UnicodeMap() - .putAll(0x21, 0x25, -2d) - .putAll(0x26, 0x28, -3d) - .put("abc", 3d) - .put("mark", 999d) - .freeze(); - - UnicodeMap afterFiiRemoval = new UnicodeMap() - .put(0x20, -2d) - .putAll(0x26, 0x29, -2d) - .put("xy", 2d) - .put("mark", 4d) - .freeze(); - - UnicodeMap afterFiiRetained = new UnicodeMap() - .putAll(0x21, 0x25, -2d) - .put("abc", 3d) - .freeze(); + UnicodeMap foo = new UnicodeMap() + .putAll(0x20, 0x29, -2d) + .put("abc", 3d) + .put("xy", 2d) + .put("mark", 4d) + .freeze(); + UnicodeMap fii = new UnicodeMap() + .putAll(0x21, 0x25, -2d) + .putAll(0x26, 0x28, -3d) + .put("abc", 3d) + .put("mark", 999d) + .freeze(); + + UnicodeMap afterFiiRemoval = new UnicodeMap() + .put(0x20, -2d) + .putAll(0x26, 0x29, -2d) + .put("xy", 2d) + .put("mark", 4d) + .freeze(); + + UnicodeMap afterFiiRetained = new UnicodeMap() + .putAll(0x21, 0x25, -2d) + .put("abc", 3d) + .freeze(); UnicodeMap test = new UnicodeMap().putAll(foo) .removeAll(fii); @@ -117,7 +116,7 @@ public void TestAMonkey() { me.remove(0x10FFFF); int iterations = 100000; - SortedMap test = new TreeMap(); + SortedMap test = new TreeMap<>(); Random rand = new Random(0); String other; @@ -178,17 +177,16 @@ private SortedMap fillRandomMap(Random rand, int max, SortedMap return test; } - Set temp = new HashSet(); /** * @param me * @param stayWithMe */ private void checkEquals(UnicodeMap me, SortedMap stayWithMe) { - temp.clear(); - for (Entry e : me.entrySet()) { + Set> temp = new HashSet<>(); + for (Map.Entry e : me.entrySet()) { temp.add(e); } - Set> entrySet = stayWithMe.entrySet(); + Set> entrySet = stayWithMe.entrySet(); if (!entrySet.equals(temp)) { logln(me.entrySet().toString()); logln(me.toString()); @@ -260,8 +258,8 @@ private String getRandomKey(Random rand) { @Test public void TestModify() { Random random = new Random(0); - UnicodeMap unicodeMap = new UnicodeMap(); - HashMap hashMap = new HashMap(); + UnicodeMap unicodeMap = new UnicodeMap<>(); + HashMap hashMap = new HashMap<>(); String[] values = {null, "the", "quick", "brown", "fox"}; for (int count = 1; count <= MODIFY_TEST_ITERATIONS; ++count) { String value = values[random.nextInt(values.length)]; @@ -291,10 +289,10 @@ public void TestModify() { } } - private boolean hasSameValues(UnicodeMap unicodeMap, HashMap hashMap) { + private boolean hasSameValues(UnicodeMap unicodeMap, HashMap hashMap) { for (int i = 0; i < MODIFY_TEST_LIMIT; ++i) { - Object unicodeMapValue = unicodeMap.getValue(i); - Object hashMapValue = hashMap.get(i); + String unicodeMapValue = unicodeMap.getValue(i); + String hashMapValue = hashMap.get(i); if (unicodeMapValue != hashMapValue) { return false; } @@ -304,7 +302,7 @@ private boolean hasSameValues(UnicodeMap unicodeMap, HashMap hashMap) { @Test public void TestCloneAsThawed11721 () { - UnicodeMap test = new UnicodeMap().put("abc", 3).freeze(); + UnicodeMap test = new UnicodeMap().put("abc", 3).freeze(); UnicodeMap copy = test.cloneAsThawed(); copy.put("def", 4); assertEquals("original-abc", (Integer) 3, test.get("abc")); @@ -326,7 +324,7 @@ public void TestUnicodeMapRandom() { // do random change to both, then compare random.setSeed(12345); // reproducible results logln("Comparing against HashMap"); - UnicodeMap map1 = new UnicodeMap(); + UnicodeMap map1 = new UnicodeMap<>(); Map map2 = new HashMap(); for (int counter = 0; counter < ITERATIONS; ++counter) { int start = random.nextInt(LIMIT); @@ -349,7 +347,7 @@ public void TestUnicodeMapRandom() { @Test public void TestUnicodeMapGeneralCategory() { logln("Setting General Category"); - UnicodeMap map1 = new UnicodeMap(); + UnicodeMap map1 = new UnicodeMap<>(); Map map2 = new HashMap(); //Map map3 = new TreeMap(); map1 = new UnicodeMap(); @@ -396,11 +394,11 @@ public void TestUnicodeMapGeneralCategory() { @Test public void TestAUnicodeMap2() { - UnicodeMap foo = new UnicodeMap(); + UnicodeMap foo = new UnicodeMap<>(); @SuppressWarnings("unused") int hash = foo.hashCode(); // make sure doesn't NPE @SuppressWarnings("unused") - Set fii = foo.stringKeys(); // make sure doesn't NPE + Set fii = foo.stringKeys(); // make sure doesn't NPE } @Test @@ -413,13 +411,13 @@ public void TestAUnicodeMapInverse() { ; Map target = new HashMap(); foo1.addInverseTo(target); - UnicodeMap reverse = new UnicodeMap().putAllInverse(target); + UnicodeMap reverse = new UnicodeMap().putAllInverse(target); assertEquals("", foo1, reverse); } private void checkNext(UnicodeMap map1, Map map2, int limit) { logln("Comparing nextRange"); - Map localMap = new TreeMap(); + Map localMap = new TreeMap<>(); UnicodeMapIterator mi = new UnicodeMapIterator(map1); while (mi.nextRange()) { logln(Utility.hex(mi.codepoint) + ".." + Utility.hex(mi.codepointEnd) + " => " + mi.value); @@ -432,7 +430,7 @@ private void checkNext(UnicodeMap map1, Map map2, int li logln("Comparing next"); mi.reset(); - localMap = new TreeMap(); + localMap = new TreeMap<>(); // String lastValue = null; while (mi.next()) { // if (!UnicodeMap.areEqual(lastValue, mi.value)) { @@ -460,11 +458,11 @@ public void check(UnicodeMap map1, Map map2, int counter } } - void checkMap(Map m1, Map m2) { + void checkMap(Map m1, Map m2) { if (m1.equals(m2)) return; StringBuilder buffer = new StringBuilder(); - Set m1entries = m1.entrySet(); - Set m2entries = m2.entrySet(); + Set> m1entries = m1.entrySet(); + Set> m2entries = m2.entrySet(); getEntries("\r\nIn First, and not Second", m1entries, m2entries, buffer, 20); getEntries("\r\nIn Second, and not First", m2entries, m1entries, buffer, 20); errln(buffer.toString()); @@ -482,7 +480,7 @@ public int compare(Map.Entry o1, Map.Entry o2) if (result != 0) return result; return compare2(a.getValue(), b.getValue()); } - private int compare2(T o1, T o2) { + private > int compare2(T o1, T o2) { if (o1 == o2) return 0; if (o1 == null) return -1; if (o2 == null) return 1; @@ -495,7 +493,7 @@ private void getEntries(String title, Set> m1entries, m1_m2.addAll(m1entries); m1_m2.removeAll(m2entries); buffer.append(title + ": " + m1_m2.size() + "\r\n"); - for (Entry entry : m1_m2) { + for (Map.Entry entry : m1_m2) { if (limit-- < 0) return; buffer.append(entry.getKey()).append(" => ") .append(entry.getValue()).append("\r\n"); diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/calendar/CalendarRegressionTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/calendar/CalendarRegressionTest.java index 746b5b08bd35..5e247ad8050f 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/calendar/CalendarRegressionTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/calendar/CalendarRegressionTest.java @@ -2193,7 +2193,7 @@ public void TestGetKeywordValuesForLocale(){ }; String[] ALL = Calendar.getKeywordValuesForLocale("calendar", ULocale.getDefault(), false); - HashSet ALLSET = new HashSet(); + HashSet ALLSET = new HashSet<>(); for (int i = 0; i < ALL.length; i++) { if (ALL[i] == "unknown") { errln("Calendar.getKeywordValuesForLocale should not return \"unknown\""); diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/calendar/CalendarTestFmwk.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/calendar/CalendarTestFmwk.java index fc9f33eed39c..f04ce436720e 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/calendar/CalendarTestFmwk.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/calendar/CalendarTestFmwk.java @@ -241,7 +241,7 @@ protected void doLimitsTest(Calendar cal, int[] fieldsToTest, // Keep a record of minima and maxima that we actually see. // These are kept in an array of arrays of hashes. - Map[][] limits = new Map[fieldsToTest.length][2]; + Map[][] limits = new Map[fieldsToTest.length][2]; Object nub = new Object(); // Meaningless placeholder // This test can run for a long time; show progress. @@ -273,10 +273,10 @@ protected void doLimitsTest(Calendar cal, int[] fieldsToTest, // Fetch the hash for this field and keep track of the // minima and maxima. - Map[] h = limits[j]; + Map[] h = limits[j]; if (h[0] == null) { - h[0] = new HashMap(); - h[1] = new HashMap(); + h[0] = new HashMap<>(); + h[1] = new HashMap<>(); } h[0].put(minActual, nub); h[1].put(maxActual, nub); @@ -311,7 +311,7 @@ protected void doLimitsTest(Calendar cal, int[] fieldsToTest, int f = fieldsToTest[j]; buf.setLength(0); buf.append(FIELD_NAME[f]); - Map[] h = limits[j]; + Map[] h = limits[j]; boolean fullRangeSeen = true; for (int k=0; k<2; ++k) { int rangeLow = (k==0) ? diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/duration/LanguageTestFmwk.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/duration/LanguageTestFmwk.java index e7dbb058f610..13f7484114d6 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/duration/LanguageTestFmwk.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/duration/LanguageTestFmwk.java @@ -63,7 +63,7 @@ protected boolean inheritTargets() { private PrintWriter pw; - private static final Map datacache = new HashMap(); // String->TestData + private static final Map datacache = new HashMap<>(); // String->TestData private static final long[] approxDurations = { 36525L*24*60*60*10, 3045*24*60*60*10L, 7*24*60*60*1000L, 24*60*60*1000L, @@ -79,7 +79,7 @@ private static TestData getTestData(String locale) { if (locale.equals("testFullPluralizedForms")) { Thread.dumpStack(); } - TestData data = (TestData) datacache.get(locale); + TestData data = datacache.get(locale); if (data == null) { try { InputStream is = LanguageTestFmwk.class @@ -604,14 +604,13 @@ class Wrapup { String[] stringArray; - void wrapup(List /* of String */list, Element element) { + void wrapup(List list, Element element) { if (list == null) return; switch (element.mode) { case EMode.mString: - stringArray = (String[]) list.toArray(new String[list - .size()]); + stringArray = list.toArray(new String[list.size()]); break; case EMode.mInt: @@ -668,7 +667,7 @@ void wrapup(List /* of String */list, Element element) { } Wrapup w = new Wrapup(); - List /* of String */list = null; + List list = null; Element element = null; String line = null; while (null != (line = br.readLine())) { @@ -678,7 +677,7 @@ void wrapup(List /* of String */list, Element element) { if (line.charAt(0) == '=') { w.wrapup(list, element); - list = new ArrayList(); + list = new ArrayList<>(); element = Element.forString(line.substring(1)); } else if (line.equals("null")) { list.add(null); diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/duration/ResourceBasedPeriodFormatterDataServiceTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/duration/ResourceBasedPeriodFormatterDataServiceTest.java index 17af5f8214e7..ea94b7b63130 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/duration/ResourceBasedPeriodFormatterDataServiceTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/duration/ResourceBasedPeriodFormatterDataServiceTest.java @@ -11,9 +11,6 @@ package com.ibm.icu.dev.test.duration; -import java.util.Collection; -import java.util.Iterator; - import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -28,9 +25,7 @@ public class ResourceBasedPeriodFormatterDataServiceTest extends CoreTestFmwk { public void testAvailable() { ResourceBasedPeriodFormatterDataService service = ResourceBasedPeriodFormatterDataService.getInstance(); - Collection locales = service.getAvailableLocales(); - for (Iterator i = locales.iterator(); i.hasNext();) { - String locale = (String)i.next(); + for (String locale : service.getAvailableLocales()) { PeriodFormatterData pfd = service.get(locale); assertFalse(locale + ": " + pfd.pluralization(), -1 == pfd.pluralization()); } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/DateTimeGeneratorTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/DateTimeGeneratorTest.java index 2a34123a4fec..25de60c10a85 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/DateTimeGeneratorTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/DateTimeGeneratorTest.java @@ -13,7 +13,6 @@ import java.util.Collection; import java.util.Date; import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; @@ -777,7 +776,7 @@ public boolean equals(Object that) { * @return */ public String replaceZoneString(String pattern, String newZone) { - final List itemList = formatParser.set(pattern).getItems(); + final List itemList = formatParser.set(pattern).getItems(); boolean changed = false; for (int i = 0; i < itemList.size(); ++i) { Object item = itemList.get(i); @@ -795,8 +794,7 @@ public String replaceZoneString(String pattern, String newZone) { } public boolean containsZone(String pattern) { - for (Iterator it = formatParser.set(pattern).getItems().iterator(); it.hasNext();) { - Object item = it.next(); + for (Object item : formatParser.set(pattern).getItems()) { if (item instanceof VariableField) { VariableField variableField = (VariableField) item; if (variableField.getType() == DateTimePatternGenerator.ZONE) { @@ -829,8 +827,7 @@ private DateOrder getOrdering(int style, ULocale locale) { int count = 0; DateOrder result = new DateOrder(); - for (Iterator it = formatParser.set(pattern).getItems().iterator(); it.hasNext();) { - Object item = it.next(); + for (Object item : formatParser.set(pattern).getItems()) { if (!(item instanceof String)) { // the first character of the variable field determines the type, // according to CLDR. diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/ListFormatterTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/ListFormatterTest.java index feb47927100e..debc63b0c4b7 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/ListFormatterTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/ListFormatterTest.java @@ -418,7 +418,7 @@ public void TestContextual() { String expected = (String) cas[2]; for (String locale : locales) { ULocale uloc = new ULocale(locale); - List inputs = Arrays.asList(cas).subList(3, cas.length); + List inputs = Arrays.asList(cas).subList(3, cas.length); ListFormatter fmt = ListFormatter.getInstance(uloc, type, width); String message = "TestContextual uloc=" + uloc + " type=" diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/MessageRegressionTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/MessageRegressionTest.java index 71638854c14b..e38df34f4498 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/MessageRegressionTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/MessageRegressionTest.java @@ -677,19 +677,17 @@ public void testBugTestsWithNamesArguments() { try { logln("Apply with pattern : " + pattern1); messageFormatter.applyPattern(pattern1); - HashMap paramsMap = new HashMap(); + HashMap paramsMap = new HashMap<>(); paramsMap.put("arg0", 7); String tempBuffer = messageFormatter.format(paramsMap); if (!tempBuffer.equals("Impossible {arg1} has occurred -- status code is 7 and message is {arg2}.")) errln("Tests arguments < substitution failed"); logln("Formatted with 7 : " + tempBuffer); ParsePosition status = new ParsePosition(0); - Map objs = messageFormatter.parseToMap(tempBuffer, status); + Map objs = messageFormatter.parseToMap(tempBuffer, status); if (objs.get("arg1") != null || objs.get("arg2") != null) errln("Parse failed with more than expected arguments"); - for (Iterator keyIter = objs.keySet().iterator(); - keyIter.hasNext();) { - String key = (String) keyIter.next(); + for (String key : objs.keySet()) { if (objs.get(key) != null && !objs.get(key).toString().equals(paramsMap.get(key).toString())) { errln("Parse failed on object " + objs.get(key) + " with argument name : " + key ); } @@ -721,7 +719,7 @@ public void testBugTestsWithNamesArguments() { } MessageFormat fmt = new MessageFormat("There are {numberOfApples} apples growing on the {whatKindOfTree} tree."); String str = new String("There is one apple growing on the peach tree."); - Map objs = fmt.parseToMap(str, pos); + Map objs = fmt.parseToMap(str, pos); logln("unparsable string , should fail at " + pos.getErrorIndex()); if (pos.getErrorIndex() == -1) errln("Bug 4052223 failed : parsing string " + str); @@ -773,14 +771,14 @@ public void testBugTestsWithNamesArguments() { String pattern = patterns[i]; mf.applyPattern(pattern); try { - Map objs = mf.parseToMap(null, new ParsePosition(0)); + Map objs = mf.parseToMap(null, new ParsePosition(0)); logln("pattern: \"" + pattern + "\""); log(" parsedObjects: "); if (objs != null) { log("{"); - for (Iterator keyIter = objs.keySet().iterator(); + for (Iterator keyIter = objs.keySet().iterator(); keyIter.hasNext();) { - String key = (String)keyIter.next(); + String key = keyIter.next(); if (objs.get(key) != null) { err("\"" + objs.get(key).toString() + "\""); } else { @@ -802,9 +800,9 @@ public void testBugTestsWithNamesArguments() { } }{ // Taken from Test4114739(). MessageFormat mf = new MessageFormat("<{arg}>"); - Map objs1 = null; - Map objs2 = new HashMap(); - Map objs3 = new HashMap(); + Map objs1 = null; + Map objs2 = new HashMap<>(); + Map objs3 = new HashMap<>(); objs3.put("arg", null); try { logln("pattern: \"" + mf.toPattern() + "\""); @@ -821,14 +819,14 @@ public void testBugTestsWithNamesArguments() { String argName = "something_stupid"; MessageFormat mf = new MessageFormat("{"+ argName + "}, {" + argName + "}, {" + argName + "}"); String forParsing = "x, y, z"; - Map objs = mf.parseToMap(forParsing, new ParsePosition(0)); + Map objs = mf.parseToMap(forParsing, new ParsePosition(0)); logln("pattern: \"" + mf.toPattern() + "\""); logln("text for parsing: \"" + forParsing + "\""); if (!objs.get(argName).toString().equals("z")) errln("argument0: \"" + objs.get(argName) + "\""); mf.setLocale(Locale.US); mf.applyPattern("{" + argName + ",number,#.##}, {" + argName + ",number,#.#}"); - Map oldobjs = new HashMap(); + Map oldobjs = new HashMap<>(); oldobjs.put(argName, 3.1415d); String result = mf.format( oldobjs ); logln("pattern: \"" + mf.toPattern() + "\""); @@ -836,7 +834,7 @@ public void testBugTestsWithNamesArguments() { // result now equals "3.14, 3.1" if (!result.equals("3.14, 3.1")) errln("result = " + result); - Map newobjs = mf.parseToMap(result, new ParsePosition(0)); + Map newobjs = mf.parseToMap(result, new ParsePosition(0)); // newobjs now equals {Double.valueOf(3.1)} if (((Number)newobjs.get(argName)).doubleValue() != 3.1) // was (Double) [alan] errln( "newobjs.get(argName) = " + newobjs.get(argName)); @@ -850,14 +848,14 @@ public void testBugTestsWithNamesArguments() { ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart); form1.setFormat(1, fileform); form2.setFormat(0, fileform); - Map testArgs = new HashMap(); + Map testArgs = new HashMap<>(); testArgs.put("diskName", "MyDisk"); testArgs.put("numberOfFiles", 12373L); logln(form1.format(testArgs)); logln(form2.format(testArgs)); }{ // Taken from test4293229(). MessageFormat format = new MessageFormat("'''{'myNamedArgument}'' '''{myNamedArgument}'''"); - Map args = new HashMap(); + Map args = new HashMap<>(); String expected = "'{myNamedArgument}' '{myNamedArgument}'"; String result = format.format(args); if (!result.equals(expected)) { diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/PluralFormatUnitTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/PluralFormatUnitTest.java index 89339fe959d7..7b8d87fbd2a5 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/PluralFormatUnitTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/PluralFormatUnitTest.java @@ -215,11 +215,11 @@ public void TestApplyPatternAndFormat() { @Test public void TestSamples() { - Map> same = new LinkedHashMap(); + Map> same = new LinkedHashMap<>(); for (ULocale locale : PluralRules.getAvailableULocales()) { ULocale otherLocale = PluralRules.getFunctionalEquivalent(locale, null); Set others = same.get(otherLocale); - if (others == null) same.put(otherLocale, others = new LinkedHashSet()); + if (others == null) same.put(otherLocale, others = new LinkedHashSet<>()); others.add(locale); continue; } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/DataDrivenUScriptTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/DataDrivenUScriptTest.java index 00df24b6bedc..ce1e084b9ef9 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/DataDrivenUScriptTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/DataDrivenUScriptTest.java @@ -48,7 +48,7 @@ public LocaleGetCodeTest(ULocale testLocaleName, int expected) { } @Parameterized.Parameters - public static Collection testData() { + public static Collection testData() { return Arrays.asList(new Object[][] { { new ULocale("en"), UScript.LATIN }, { new ULocale("en_US"), UScript.LATIN }, { new ULocale("sr"), UScript.CYRILLIC }, @@ -126,7 +126,7 @@ public TestMultipleUScript(String testLocaleName, int[] expected, Locale testLoc } @Parameterized.Parameters - public static Collection testData() { + public static Collection testData() { return Arrays.asList(new Object[][] { { "ja", new int[] { UScript.KATAKANA, UScript.HIRAGANA, UScript.HAN }, Locale.JAPANESE }, { "ko_KR", new int[] { UScript.HANGUL, UScript.HAN }, Locale.KOREA }, @@ -175,7 +175,7 @@ public GetCodeTest(String testName, int expected) { } @Parameterized.Parameters - public static Collection testData() { + public static Collection testData() { return Arrays.asList(new Object[][] { /* test locale */ { "en", UScript.LATIN }, @@ -269,7 +269,7 @@ public GetNameTest(int testCode, String expected) { } @Parameterized.Parameters - public static Collection testData() { + public static Collection testData() { return Arrays.asList(new Object[][] { { UScript.CYRILLIC, "Cyrillic" }, { UScript.DESERET, "Deseret" }, @@ -302,7 +302,7 @@ public GetShortNameTest(int testCode, String expected) { } @Parameterized.Parameters - public static Collection testData() { + public static Collection testData() { return Arrays.asList(new Object[][] { { UScript.HAN, "Hani" }, { UScript.HANGUL, "Hang" }, @@ -338,7 +338,7 @@ public GetScriptTest(int[] codepoint) { } @Parameterized.Parameters - public static Collection testData() { + public static Collection testData() { return Arrays.asList(new int[][] { { 0x0000FF9D, UScript.KATAKANA }, { 0x0000FFBE, UScript.HANGUL }, diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterSurrogateTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterSurrogateTest.java index 9990c3870f76..75df58a3bcaa 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterSurrogateTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterSurrogateTest.java @@ -263,7 +263,7 @@ void test(String s, int start, int limit, int expected) { } } - void fail(String s, int start, int limit, Class exc) { + void fail(String s, int start, int limit, Class exc) { try { UCharacter.codePointCount(s, start, limit); errln("unexpected success " + str(s, start, limit)); @@ -350,7 +350,7 @@ void test(String s, int start, int count, int index, int offset, } void fail(char[] text, int start, int count, int index, int offset, - Class exc) { + Class exc) { try { UCharacter.offsetByCodePoints(text, start, count, index, offset); @@ -365,7 +365,7 @@ void fail(char[] text, int start, int count, int index, int offset, } } - void fail(String text, int index, int offset, Class exc) { + void fail(String text, int index, int offset, Class exc) { try { UCharacter.offsetByCodePoints(text, index, offset); errln("unexpected success " diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterTest.java index 1701b8f17a62..cd950653a617 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterTest.java @@ -2988,7 +2988,7 @@ public void TestCoverage() { @Test public void TestBlockData() { - Class ubc = UCharacter.UnicodeBlock.class; + Class ubc = UCharacter.UnicodeBlock.class; for (int b = 1; b < UCharacter.UnicodeBlock.COUNT; b += 1) { UCharacter.UnicodeBlock blk = UCharacter.UnicodeBlock.getInstance(b); diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterThreadTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterThreadTest.java index 5873fb36e5b5..86a9a2dd836b 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterThreadTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterThreadTest.java @@ -8,9 +8,8 @@ */ package com.ibm.icu.dev.test.lang; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; -import java.util.ListIterator; import org.junit.Test; import org.junit.runner.RunWith; @@ -42,7 +41,7 @@ public UCharacterThreadTest() // @Test public void TestUCharactersGetName() throws InterruptedException { - List threads = new LinkedList(); + List threads = new ArrayList<>(); for(int t=0; t<20; t++) { int codePoint = 47 + t; String correctName = UCharacter.getName(codePoint); @@ -50,9 +49,7 @@ public void TestUCharactersGetName() throws InterruptedException { thread.start(); threads.add(thread); } - ListIterator i = threads.listIterator(); - while (i.hasNext()) { - GetNameThread thread = (GetNameThread)i.next(); + for (GetNameThread thread : threads) { thread.join(); if (!thread.correctName.equals(thread.actualName)) { errln("FAIL, expected \"" + thread.correctName + "\", got \"" + thread.actualName + "\""); diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UnicodeSetTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UnicodeSetTest.java index 5c77f3c64c83..2bd6a8c18615 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UnicodeSetTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UnicodeSetTest.java @@ -781,8 +781,8 @@ public void TestAPI() { // Ram also add a similar test to UtilityTest.java logln("Testing addAll(Collection) ... "); String[] array = {"a", "b", "c", "de"}; - List list = Arrays.asList(array); - Set aset = new HashSet(list); + List list = Arrays.asList(array); + Set aset = new HashSet<>(list); logln(" *** The source set's size is: " + aset.size()); set.clear(); @@ -794,16 +794,16 @@ public void TestAPI() { logln("OK: After addAll, the UnicodeSet size got " + set.size()); } - List list2 = new ArrayList(); + List list2 = new ArrayList<>(); set.addAllTo(list2); //verify the result log(" *** The elements are: "); String s = set.toPattern(true); logln(s); - Iterator myiter = list2.iterator(); + Iterator myiter = list2.iterator(); while(myiter.hasNext()) { - log(myiter.next().toString() + " "); + log(myiter.next() + " "); } logln(""); // a new line } @@ -859,8 +859,8 @@ public void TestSetRelation() { String[] choices = {"a", "b", "cd", "ef"}; int limit = 1 << choices.length; - SortedSet iset = new TreeSet(); - SortedSet jset = new TreeSet(); + SortedSet iset = new TreeSet<>(); + SortedSet jset = new TreeSet<>(); for (int i = 0; i < limit; ++i) { pick(i, choices, iset); @@ -882,8 +882,8 @@ public void TestSetSpeed() { public void SetSpeed2(int size) { - SortedSet iset = new TreeSet(); - SortedSet jset = new TreeSet(); + SortedSet iset = new TreeSet<>(); + SortedSet jset = new TreeSet<>(); for (int i = 0; i < size*2; i += 2) { // only even values iset.add(i); @@ -907,12 +907,12 @@ public void SetSpeed2(int size) { CheckSpeed(jset, iset, "when a, b are disjoint", iterations); } - void CheckSpeed(SortedSet iset, SortedSet jset, String message, int iterations) { + void CheckSpeed(SortedSet iset, SortedSet jset, String message, int iterations) { CheckSpeed2(iset, jset, message, iterations); CheckSpeed3(iset, jset, message, iterations); } - void CheckSpeed2(SortedSet iset, SortedSet jset, String message, int iterations) { + void CheckSpeed2(SortedSet iset, SortedSet jset, String message, int iterations) { boolean x; boolean y; @@ -939,7 +939,7 @@ void CheckSpeed2(SortedSet iset, SortedSet jset, String message, int iterations) + ", Utility: " + utime + ", u:j: " + nf.format(utime/jtime)); } - void CheckSpeed3(SortedSet iset, SortedSet jset, String message, int iterations) { + void CheckSpeed3(SortedSet iset, SortedSet jset, String message, int iterations) { boolean x; boolean y; @@ -967,7 +967,7 @@ void CheckSpeed3(SortedSet iset, SortedSet jset, String message, int iterations) + ", Utility: " + utime + ", u:j: " + nf.format(utime/jtime)); } - void pick(int bits, Object[] examples, SortedSet output) { + void pick(int bits, String[] examples, SortedSet output) { output.clear(); for (int k = 0; k < 32; ++k) { if (((1< A, int filter, Collection B) { + Collection ab = new TreeSet<>(A); ab.retainAll(B); if (ab.size() > 0 && (filter & SortedSetRelation.A_AND_B) == 0) return false; @@ -999,7 +999,7 @@ boolean dumbHasRelation(Collection A, int filter, Collection B) { return true; } - void checkSetRelation(SortedSet a, SortedSet b, String message) { + void checkSetRelation(SortedSet a, SortedSet b, String message) { for (int i = 0; i < 8; ++i) { boolean hasRelation = SortedSetRelation.hasRelation(a, i, b); @@ -1768,16 +1768,16 @@ public void TestGenerics() { set1.addAllTo(list1); assertEquals("iteration test", oldList, list1); - list1 = set1.addAllTo(new ArrayList()); + list1 = set1.addAllTo(new ArrayList<>()); assertEquals("addAllTo", oldList, list1); - ArrayList list2 = set2.addAllTo(new ArrayList()); - ArrayList list3 = set3.addAllTo(new ArrayList()); + ArrayList list2 = set2.addAllTo(new ArrayList<>()); + ArrayList list3 = set3.addAllTo(new ArrayList<>()); // put them into different order, to check that order doesn't matter - TreeSet sorted1 = set1.addAllTo(new TreeSet()); - TreeSet sorted2 = set2.addAllTo(new TreeSet()); - TreeSet sorted3 = set3.addAllTo(new TreeSet()); + TreeSet sorted1 = set1.addAllTo(new TreeSet<>()); + TreeSet sorted2 = set2.addAllTo(new TreeSet<>()); + TreeSet sorted3 = set3.addAllTo(new TreeSet<>()); //containsAll(Collection collection) assertTrue("containsAll", set1.containsAll(list1)); @@ -1837,7 +1837,7 @@ public void TestComparison() { List goalLongest = Arrays.asList(set1, set3, set2); List goalLex = Arrays.asList(set1, set2, set3); - List sorted = new ArrayList(new TreeSet<>(unsorted)); + List sorted = new ArrayList<>(new TreeSet<>(unsorted)); assertNotEquals("compareTo-shorter-first", unsorted, sorted); assertEquals("compareTo-shorter-first", goalShortest, sorted); @@ -1848,7 +1848,7 @@ public int compare(UnicodeSet o1, UnicodeSet o2) { return o1.compareTo(o2, ComparisonStyle.LONGER_FIRST); }}); sorted1.addAll(unsorted); - sorted = new ArrayList(sorted1); + sorted = new ArrayList<>(sorted1); assertNotEquals("compareTo-longer-first", unsorted, sorted); assertEquals("compareTo-longer-first", goalLongest, sorted); @@ -1859,7 +1859,7 @@ public int compare(UnicodeSet o1, UnicodeSet o2) { return o1.compareTo(o2, ComparisonStyle.LEXICOGRAPHIC); }}); sorted1.addAll(unsorted); - sorted = new ArrayList(sorted1); + sorted = new ArrayList<>(sorted1); assertNotEquals("compareTo-lex", unsorted, sorted); assertEquals("compareTo-lex", goalLex, sorted); @@ -1931,8 +1931,8 @@ public void TestRangeConstructor() { UnicodeSet t = new UnicodeSet(3,5, 7,7); assertEquals("new constructor", w, t); // check to make sure right exceptions are thrown - Class expected = IllegalArgumentException.class; - Class actual; + Class expected = IllegalArgumentException.class; + Class actual; try { actual = null; @@ -2022,7 +2022,7 @@ public void checkModification(UnicodeSet original, boolean isFrozen) { case 0: test.add(0); break; case 1: test.add(0,1); break; case 2: test.add("a"); break; - case 3: List a = new ArrayList(); a.add("a"); test.addAll(a); break; + case 3: List a = new ArrayList<>(); a.add("a"); test.addAll(a); break; case 4: test.addAll("ab"); break; case 5: test.addAll(new UnicodeSet("[ab]")); break; case 6: test.applyIntPropertyValue(0,0); break; @@ -2135,7 +2135,7 @@ public void checkModification(UnicodeSet original, boolean isFrozen) { // } public class TokenSymbolTable implements SymbolTable { - HashMap contents = new HashMap(); + HashMap contents = new HashMap<>(); /** * (Non-SymbolTable API) Add the given variable and value to @@ -2163,8 +2163,8 @@ public void add(String var, char[] body) { @Override public char[] lookup(String s) { logln("TokenSymbolTable: lookup \"" + s + "\" => \"" + - new String((char[]) contents.get(s)) + "\""); - return (char[])contents.get(s); + new String(contents.get(s)) + "\""); + return contents.get(s); } /* (non-Javadoc) diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/normalizer/TestCanonicalIterator.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/normalizer/TestCanonicalIterator.java index 104825d2569b..510d61532c96 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/normalizer/TestCanonicalIterator.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/normalizer/TestCanonicalIterator.java @@ -9,9 +9,9 @@ package com.ibm.icu.dev.test.normalizer; import java.util.Collection; -import java.util.Iterator; import java.util.Set; import java.util.SortedSet; +import java.util.StringJoiner; import java.util.TreeSet; import org.junit.Test; @@ -135,12 +135,12 @@ public void TestBasic() { // check permute // NOTE: we use a TreeSet below to sort the output, which is not guaranteed to be sorted! - Set results = new TreeSet(); + Set results = new TreeSet<>(); CanonicalIterator.permute("ABC", false, results); expectEqual("Simple permutation ", "", collectionToString(results), "ABC, ACB, BAC, BCA, CAB, CBA"); // try samples - SortedSet set = new TreeSet(); + SortedSet set = new TreeSet<>(); for (int i = 0; i < testArray.length; ++i) { //logln("Results for: " + name.transliterate(testArray[i])); CanonicalIterator it = new CanonicalIterator(testArray[i][0]); @@ -263,12 +263,10 @@ private void characterTest(String s, int ch, CanonicalIterator it) } } - static String collectionToString(Collection col) { - StringBuffer result = new StringBuffer(); - Iterator it = col.iterator(); - while (it.hasNext()) { - if (result.length() != 0) result.append(", "); - result.append(it.next().toString()); + static String collectionToString(Collection col) { + StringJoiner result = new StringJoiner(", "); + for (String item : col) { + result.add(item); } return result.toString(); } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITest.java index 0c60e946222f..a7210ba12530 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITest.java @@ -499,8 +499,8 @@ public void TestBug12519() { static class T13512Thread extends Thread { private String fText; - public List fBoundaries; - public List fExpectedBoundaries; + public List fBoundaries; + public List fExpectedBoundaries; T13512Thread(String text) { fText = text; diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java index 56a4801bea29..994433250beb 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java @@ -55,14 +55,14 @@ public class RBBITestMonkey extends CoreTestFmwk { // abstract static class RBBIMonkeyKind { RBBIMonkeyKind() { - fSets = new ArrayList(); - fClassNames = new ArrayList(); - fAppliedRules = new ArrayList(); + fSets = new ArrayList<>(); + fClassNames = new ArrayList<>(); + fAppliedRules = new ArrayList<>(); } // Return a List of UnicodeSets, representing the character classes used // for this type of iterator. - abstract List charClasses(); + abstract List charClasses(); // Set the test text on which subsequent calls to next() will operate abstract void setText(StringBuffer text); @@ -207,7 +207,7 @@ void setText(StringBuffer s) { } @Override - List charClasses() { + List charClasses() { return fSets; } @@ -476,7 +476,7 @@ static class RBBIWordMonkey extends RBBIMonkeyKind { @Override - List charClasses() { + List charClasses() { return fSets; } @@ -1762,7 +1762,7 @@ private int[] LBNumberCheck(StringBuffer s, int startIdx, int[] retVals) { @Override - List charClasses() { + List charClasses() { return fSets; } } @@ -1845,7 +1845,7 @@ static class RBBISentenceMonkey extends RBBIMonkeyKind { @Override - List charClasses() { + List charClasses() { return fSets; } @@ -2203,7 +2203,7 @@ void RunMonkey(BreakIterator bi, RBBIMonkeyKind mk, String name, int seed, int int TESTSTRINGLEN = 500; StringBuffer testText = new StringBuffer(); int numCharClasses; - List chClasses; + List chClasses; @SuppressWarnings("unused") int expectedCount = 0; boolean[] expectedBreaks = new boolean[TESTSTRINGLEN*2 + 1]; diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/shaping/DataDrivenArabicShapingRegTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/shaping/DataDrivenArabicShapingRegTest.java index 2e7beef0c0aa..d7b1d87d4079 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/shaping/DataDrivenArabicShapingRegTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/shaping/DataDrivenArabicShapingRegTest.java @@ -60,7 +60,7 @@ public StandardDataTest(String source, int flags, String expected) { } @Parameterized.Parameters - public static Collection testData() { + public static Collection testData() { String lamAlefSpecialVLTR = "\u0020\u0646\u0622\u0644\u0627\u0020\u0646\u0623\u064E\u0644\u0627\u0020" + "\u0646\u0627\u0670\u0644\u0627\u0020\u0646\u0622\u0653\u0644\u0627\u0020" + @@ -390,7 +390,7 @@ public PreflightDataTest(String source, int flags, int length) { } @Parameterized.Parameters - public static Collection testData() { + public static Collection testData() { return Arrays.asList(new Object[][] { {"\u0644\u0627", LETTERS_SHAPE | LENGTH_GROW_SHRINK, 1}, {"\u0644\u0627\u0031", @@ -432,16 +432,16 @@ public void TestPreflight() { public static class ErrorDataTest extends CoreTestFmwk { private String source; private int flags; - private Class error; + private Class error; - public ErrorDataTest(String source, int flags, Class error) { + public ErrorDataTest(String source, int flags, Class error) { this.source = source; this.flags = flags; this.error = error; } @Parameterized.Parameters - public static Collection testData() { + public static Collection testData() { return Arrays.asList(new Object[][] { /* bad data */ {"\u0020\ufef7\u0644\u0020", LETTERS_UNSHAPE | LENGTH_FIXED_SPACES_NEAR, diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/stringprep/IDNAConformanceTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/stringprep/IDNAConformanceTest.java index c263039daf09..2bb9632bcd5a 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/stringprep/IDNAConformanceTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/stringprep/IDNAConformanceTest.java @@ -15,7 +15,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.HashMap; -import java.util.Iterator; +import java.util.Map; import java.util.Set; import java.util.TreeMap; @@ -38,7 +38,7 @@ public class IDNAConformanceTest extends CoreTestFmwk { @Test public void TestConformance() { - TreeMap inputData = null; + TreeMap> inputData = null; try { inputData = ReadInput.getInputData(); @@ -50,11 +50,8 @@ public void TestConformance() { return; } - Set keyMap = inputData.keySet(); - for (Iterator iter = keyMap.iterator(); iter.hasNext();) { - Long element = (Long) iter.next(); - HashMap tempHash = (HashMap) inputData.get(element); - + Set keyMap = inputData.keySet(); + for (Map tempHash : inputData.values()) { //get all attributes from input data String passfail = (String) tempHash.get("passfail"); String desc = (String) tempHash.get("desc"); @@ -244,16 +241,16 @@ private static String stringReplace(String str) { */ public static class ReadInput { - public static TreeMap getInputData() throws IOException, + public static TreeMap> getInputData() throws IOException, UnsupportedEncodingException { - TreeMap result = new TreeMap(); + TreeMap> result = new TreeMap<>(); BufferedReader in = TestUtil.getDataReader("IDNATestInput.txt", "utf-8"); try { String tempStr = null; int records = 0; boolean firstLine = true; - HashMap hashItem = new HashMap(); + HashMap hashItem = new HashMap<>(); while ((tempStr = in.readLine()) != null) { //ignore the first line if it's "=====" @@ -292,9 +289,9 @@ public static TreeMap getInputData() throws IOException, //if met "=====", it means this item is finished if ("=====".equals(tempStr)) { //set them into result, using records number as key - result.put((long)records, hashItem); + result.put(records, hashItem); //create another hash item and continue - hashItem = new HashMap(); + hashItem = new HashMap<>(); records++; continue; } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/stringprep/NamePrepTransform.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/stringprep/NamePrepTransform.java index 5b662041f9dc..a08f047b3cd6 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/stringprep/NamePrepTransform.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/stringprep/NamePrepTransform.java @@ -185,7 +185,7 @@ private static class MapTransform { boolean initialize(String id, String rule, int direction) { try { - Class cls = Class.forName("com.ibm.icu.text.Transliterator"); + Class cls = Class.forName("com.ibm.icu.text.Transliterator"); Method createMethod = cls.getMethod("createFromRules", String.class, String.class, Integer.TYPE); translitInstance = createMethod.invoke(null, id, rule, direction); translitMethod = cls.getMethod("transliterate", String.class); diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/text/SpoofCheckerTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/text/SpoofCheckerTest.java index 9ef1eb11137e..7b849976b565 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/text/SpoofCheckerTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/text/SpoofCheckerTest.java @@ -849,8 +849,8 @@ public void TestDeprecated() { @Test public void testScriptSet() { try { - Class ScriptSet = Class.forName("com.ibm.icu.text.SpoofChecker$ScriptSet"); - Constructor ctor = ScriptSet.getDeclaredConstructor(); + Class ScriptSet = Class.forName("com.ibm.icu.text.SpoofChecker$ScriptSet"); + Constructor ctor = ScriptSet.getDeclaredConstructor(); ctor.setAccessible(true); BitSet ss = (BitSet) ctor.newInstance(); diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/timezone/TimeZoneAliasTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/timezone/TimeZoneAliasTest.java index f069e9ff0a9e..9db505891e6b 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/timezone/TimeZoneAliasTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/timezone/TimeZoneAliasTest.java @@ -48,8 +48,8 @@ public class TimeZoneAliasTest extends CoreTestFmwk { @Test public void TestAliases() { Zone.Seconds seconds = new Zone.Seconds(); - for (Iterator it = Zone.getZoneSet().iterator(); it.hasNext(); ) { - Zone zone = (Zone)it.next(); + for (Iterator it = Zone.getZoneSet().iterator(); it.hasNext(); ) { + Zone zone = it.next(); String id = zone.id; if (id.indexOf('/') < 0 && (id.endsWith("ST") || id.endsWith("DT"))) { if (zone.minRecentOffset != zone.maxRecentOffset) { @@ -59,14 +59,12 @@ public void TestAliases() { + " != " + Zone.formatHours(zone.maxRecentOffset)); } } - Set aliases = zone.getPurportedAliases(); - Set aliasesSet = new TreeSet(aliases); + Set aliases = zone.getPurportedAliases(); + Set aliasesSet = new TreeSet<>(aliases); aliasesSet.add(id); // for comparison - Iterator aliasIterator = aliases.iterator(); - while (aliasIterator.hasNext()) { - String otherId = (String)aliasIterator.next(); + for (String otherId : aliases) { Zone otherZone = Zone.make(otherId); - Set otherAliases = otherZone.getPurportedAliases(); + Set otherAliases = otherZone.getPurportedAliases(); otherAliases.add(otherId); // for comparison if (!aliasesSet.equals(otherAliases)) { errln( @@ -92,8 +90,7 @@ public void TestAliases() { public void TestDifferences() { Zone last = null; Zone.Seconds diffDate = new Zone.Seconds(); - for (Iterator it = Zone.getZoneSet().iterator(); it.hasNext();) { - Zone testZone = (Zone)it.next(); + for (Zone testZone : Zone.getZoneSet()) { if (last != null) { String common = testZone + "\tvs " + last + ":\t"; int diff = testZone.findOffsetOrdering(last, diffDate); @@ -115,8 +112,7 @@ public void TestDifferences() { */ public static void TestGenerateZones() { int count = 1; - for (Iterator it = Zone.getUniqueZoneSet().iterator(); it.hasNext();) { - Zone zone = (Zone)it.next(); + for (Zone zone : Zone.getUniqueZoneSet()) { System.out.println(zone.toString(count++)); } } @@ -129,13 +125,13 @@ static class CollectionJoiner { CollectionJoiner(String separator) { this.separator = separator; } - String join(Collection c) { + String join(Collection c) { StringBuffer result = new StringBuffer(); boolean isFirst = true; - for (Iterator it = c.iterator(); it.hasNext(); ) { + for (String item : c) { if (!isFirst) result.append(separator); else isFirst = false; - result.append(it.next().toString()); + result.append(item); } return result.toString(); } @@ -152,7 +148,7 @@ String join(Collection c) { * avoid expensive comparisons. * @author Davis */ - static class Zone implements Comparable { + static class Zone implements Comparable { // class fields // static private final BagFormatter bf = new BagFormatter().setSeparator(", "); private static final CollectionJoiner bf = new CollectionJoiner(", "); @@ -169,10 +165,10 @@ static class Zone implements Comparable { static private final long recentLimit = getDate((currentYear-1),6,1).getTime(); static private final long startDate = getDate(1905,0,1).getTime(); - static private final Map idToZone = new HashMap(); - static private final Set zoneSet = new TreeSet(); - static private final Set uniqueZoneSet = new TreeSet(); - static private final Map idToRealAliases = new HashMap(); + static private final Map idToZone = new HashMap<>(); + static private final Set zoneSet = new TreeSet<>(); + static private final Set uniqueZoneSet = new TreeSet<>(); + static private final Map> idToRealAliases = new HashMap<>(); // build everything once. static { @@ -183,8 +179,7 @@ static class Zone implements Comparable { Zone last = null; Zone.Seconds diffDate = new Zone.Seconds(); String lastUnique = ""; - for (Iterator it = Zone.getZoneSet().iterator(); it.hasNext();) { - Zone testZone = (Zone)it.next(); + for (Zone testZone : Zone.getZoneSet()) { if (last == null) { uniqueZoneSet.add(testZone); lastUnique = testZone.id; @@ -194,9 +189,9 @@ static class Zone implements Comparable { uniqueZoneSet.add(testZone); lastUnique = testZone.id; } else { - Set aliases = (Set)idToRealAliases.get(lastUnique); + Set aliases = idToRealAliases.get(lastUnique); if (aliases == null) { - aliases = new TreeSet(); + aliases = new TreeSet<>(); idToRealAliases.put(lastUnique, aliases); } aliases.add(testZone.id); @@ -206,16 +201,16 @@ static class Zone implements Comparable { } } - static public Set getZoneSet() { + static public Set getZoneSet() { return zoneSet; } - public static Set getUniqueZoneSet() { + public static Set getUniqueZoneSet() { return uniqueZoneSet; } static public Zone make(String id) { - Zone result = (Zone)idToZone.get(id); + Zone result = idToZone.get(id); if (result != null) return result; result = new Zone(id); idToZone.put(id, result); @@ -344,7 +339,7 @@ public int findOffsetOrdering(Zone other, Seconds dateDiffFound) { private Seconds diffDateReturn = new Seconds(); @Override - public int compareTo(Object o) { + public int compareTo(Zone o) { Zone other = (Zone)o; // first order by max and min offsets // min will usually correspond to standard time, max to daylight @@ -364,8 +359,8 @@ public int compareTo(Object o) { return id.compareTo(other.id); } - public Set getPurportedAliases() { - return new TreeSet(purportedAliases); // clone for safety + public Set getPurportedAliases() { + return new TreeSet<>(purportedAliases); // clone for safety } public boolean isPurportedAlias(String zoneID) { @@ -377,13 +372,13 @@ public boolean isRealAlias(Zone z) { } public String getPurportedAliasesAsString() { - Set s = getPurportedAliases(); + Set s = getPurportedAliases(); if (s.size() == 0) return ""; return " " + bf.join(s); } public String getRealAliasesAsString() { - Set s = (Set)idToRealAliases.get(id); + Set s = idToRealAliases.get(id); if (s == null) return ""; return " *" + bf.join(s); } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/timezone/TimeZoneTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/timezone/TimeZoneTest.java index 7febdd27e3d5..c7065e4ebea2 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/timezone/TimeZoneTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/timezone/TimeZoneTest.java @@ -1390,7 +1390,7 @@ public void TestMark(){ TimeZone tz = TimeZone.getTimeZone(tzid); int offset = tz.getOffset(new Date().getTime()); logln(tzid + ":\t" + offset); - List list = Arrays.asList(TimeZone.getAvailableIDs()); + List list = Arrays.asList(TimeZone.getAvailableIDs()); if(!list.contains(tzid)){ errln("Could create the time zone but it is not in getAvailableIDs"); } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/DisplayNameTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/DisplayNameTest.java index 0330a7282de2..a2298c3d6a62 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/DisplayNameTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/DisplayNameTest.java @@ -42,9 +42,9 @@ interface DisplayNameGetter { public String get(ULocale locale, String code, Object context); } - Map[] codeToName = new Map[10]; + Map[] codeToName = new Map[10]; { - for (int k = 0; k < codeToName.length; ++k) codeToName[k] = new HashMap(); + for (int k = 0; k < codeToName.length; ++k) codeToName[k] = new HashMap<>(); } static final Object[] zoneFormats = {0, 1, 2, 3, 4, 5, 6, 7}; @@ -82,9 +82,9 @@ public void TestLocales() { * @return */ private String[] getRealZoneIDs() { - Set temp = new TreeSet(Arrays.asList(TimeZone.getAvailableIDs())); + Set temp = new TreeSet<>(Arrays.asList(TimeZone.getAvailableIDs())); temp.removeAll(getAliasMap().keySet()); - return (String[])temp.toArray(new String[temp.size()]); + return temp.toArray(new String[temp.size()]); } @Ignore @@ -141,12 +141,12 @@ public String get(ULocale loc, String code, Object context) { } - Map zoneData = new HashMap(); + Map> zoneData = new HashMap<>(); private String getZoneString(ULocale locale, String olsonID, int item) { - Map data = (Map)zoneData.get(locale); + Map data = zoneData.get(locale); if (data == null) { - data = new HashMap(); + data = new HashMap<>(); if (SHOW_ALL) System.out.println(); if (SHOW_ALL) System.out.println("zones for " + locale); ICUResourceBundle bundle = (ICUResourceBundle)UResourceBundle.getBundleInstance(locale); @@ -156,7 +156,7 @@ private String getZoneString(ULocale locale, String olsonID, int item) { //ICUResourceBundle stringSet = table.getWithFallback(String.valueOf(i)); String key = stringSet.getString(0); if (SHOW_ALL) System.out.println("key: " + key); - ArrayList list = new ArrayList(); + ArrayList list = new ArrayList<>(); for (int j = 1; j < stringSet.getSize(); ++j) { String entry = stringSet.getString(j); if (SHOW_ALL) System.out.println(" entry: " + entry); @@ -337,8 +337,8 @@ private static String[] getCodes(ULocale locale, String tableName) { ICUResourceBundle bundle = (ICUResourceBundle)UResourceBundle.getBundleInstance(locale); ICUResourceBundle table = bundle.getWithFallback(tableName); // copy into array - ArrayList stuff = new ArrayList(); - for (Enumeration keys = table.getKeys(); keys.hasMoreElements();) { + ArrayList stuff = new ArrayList<>(); + for (Enumeration keys = table.getKeys(); keys.hasMoreElements();) { stuff.add(keys.nextElement()); } String[] result = new String[stuff.size()]; @@ -359,19 +359,14 @@ private String[] addUnknown(String[] strings, int len) { return result; } - Map bogusZones = null; - - private Map getAliasMap() { - if (bogusZones == null) { - bogusZones = new TreeMap(); - for (int i = 0; i < zonesAliases.length; ++i) { - bogusZones.put(zonesAliases[i][0], zonesAliases[i][1]); - } + private Map getAliasMap() { + Map bogusZones = new TreeMap<>(); + for (int i = 0; i < zonesAliases.length; ++i) { + bogusZones.put(zonesAliases[i][0], zonesAliases[i][1]); } return bogusZones; } - private void check(String type, ULocale locale, String[] codes, Object[] contextList, DisplayNameGetter getter) { if (contextList == null) contextList = NO_CONTEXT; diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/ICUServiceTestSample.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/ICUServiceTestSample.java index c81b7df4335e..8e33b3b8b0e7 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/ICUServiceTestSample.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/ICUServiceTestSample.java @@ -10,9 +10,7 @@ import java.text.Collator; import java.util.EventListener; -import java.util.Iterator; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import java.util.SortedMap; @@ -60,13 +58,11 @@ public void helloServiceChanged() { } private void display() { - Map names = HelloService.getDisplayNames(ULocale.US); + Map names = HelloService.getDisplayNames(ULocale.US); System.out.println("displaying " + names.size() + " names."); - Iterator iter = names.entrySet().iterator(); - while (iter.hasNext()) { - Entry entry = (Entry)iter.next(); - String displayName = (String)entry.getKey(); - HelloService service = HelloService.get((String)entry.getValue()); + for (Map.Entry entry : names.entrySet()) { + String displayName = entry.getKey(); + HelloService service = HelloService.get(entry.getValue()); System.out.println(displayName + " says " + service.hello()); try { Thread.sleep(50); @@ -184,11 +180,11 @@ public static HelloService get(String id) { return (HelloService)registry().get(id); } - public static Set getVisibleIDs() { + public static Set getVisibleIDs() { return registry().getVisibleIDs(); } - public static Map getDisplayNames(ULocale locale) { + public static Map getDisplayNames(ULocale locale) { return getDisplayNames(registry(), locale); } @@ -210,7 +206,7 @@ private static void doRegister(String hello, String id) { * uses the default collator for the locale as the comparator to * sort the display names, and null for the matchID. */ - public static SortedMap getDisplayNames(ICUService service, ULocale locale) { + public static SortedMap getDisplayNames(ICUService service, ULocale locale) { Collator col = Collator.getInstance(locale.toLocale()); return service.getDisplayNames(locale, col, null); } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/ICUServiceThreadTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/ICUServiceThreadTest.java index 7e449e3581e6..ae34d2e9d9ff 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/ICUServiceThreadTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/ICUServiceThreadTest.java @@ -18,7 +18,6 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Map.Entry; import java.util.MissingResourceException; import java.util.Random; import java.util.Set; @@ -71,7 +70,7 @@ public String toString() { * uses the default collator for the locale as the comparator to * sort the display names, and null for the matchID. */ - public static SortedMap getDisplayNames(ICUService service, ULocale locale) { + public static SortedMap getDisplayNames(ICUService service, ULocale locale) { Collator col; try { col = Collator.getInstance(locale.toLocale()); @@ -206,7 +205,7 @@ protected void iterate() { static class UnregisterFactoryThread extends TestThread { private Random r; - List factories; + List factories; UnregisterFactoryThread(String name, ICUService service, long delay) { super("UNREG " + name, service, delay); @@ -257,11 +256,11 @@ static class GetVisibleThread extends TestThread { @Override protected void iterate() { - Set ids = service.getVisibleIDs(); - Iterator iter = ids.iterator(); + Set ids = service.getVisibleIDs(); + Iterator iter = ids.iterator(); int n = 10; while (--n >= 0 && iter.hasNext()) { - String id = (String)iter.next(); + String id = iter.next(); Object result = service.get(id); TestFmwk.logln("iter: " + n + " id: " + id + " result: " + result); } @@ -279,11 +278,11 @@ static class GetDisplayThread extends TestThread { @Override protected void iterate() { - Map names = getDisplayNames(service,locale); - Iterator iter = names.entrySet().iterator(); + Map names = getDisplayNames(service,locale); + Iterator> iter = names.entrySet().iterator(); int n = 10; while (--n >= 0 && iter.hasNext()) { - Entry e = (Entry)iter.next(); + Map.Entry e = iter.next(); String dname = (String)e.getKey(); String id = (String)e.getValue(); Object result = service.get(id); @@ -342,23 +341,22 @@ protected void iterate() { } // return a collection of unique factories, might be fewer than requested - Collection getFactoryCollection(int requested) { - Set locales = new HashSet(); + Collection getFactoryCollection(int requested) { + Set locales = new HashSet<>(); for (int i = 0; i < requested; ++i) { locales.add(getCLV()); } - List factories = new ArrayList(locales.size()); - Iterator iter = locales.iterator(); - while (iter.hasNext()) { - factories.add(new TestFactory((String)iter.next())); + List factories = new ArrayList<>(locales.size()); + Iterator iter = locales.iterator(); + for (String locale : locales) { + factories.add(new TestFactory(locale)); } return factories; } - void registerFactories(ICUService service, Collection c) { - Iterator iter = c.iterator(); - while (iter.hasNext()) { - service.registerFactory((Factory)iter.next()); + void registerFactories(ICUService service, Collection c) { + for (Factory factory : c) { + service.registerFactory(factory); } } @@ -429,13 +427,13 @@ public void Test04_WitheringService() { ICUService service = new ICULocaleService(); if (PRINTSTATS) service.stats(); // Enable the stats collection - Collection fc = getFactoryCollection(50); + Collection fc = getFactoryCollection(50); registerFactories(service, fc); - Factory[] factories = (Factory[])fc.toArray(new Factory[fc.size()]); - Comparator comp = new Comparator() { + Factory[] factories = fc.toArray(new Factory[fc.size()]); + Comparator comp = new Comparator() { @Override - public int compare(Object lhs, Object rhs) { + public int compare(Factory lhs, Factory rhs) { return lhs.toString().compareTo(rhs.toString()); } }; diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/RegionTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/RegionTest.java index 579b9d9fc58e..f1058a67c838 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/RegionTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/RegionTest.java @@ -13,6 +13,7 @@ package com.ibm.icu.dev.test.util; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Set; @@ -611,7 +612,7 @@ public void TestGroupingChildren() { try { Region grouping = Region.getInstance(groupingCode); Set actualChildren = grouping.getContainedRegions(); - List actualChildIDs = new java.util.ArrayList(); + List actualChildIDs = new ArrayList<>(); for (Region childRegion : actualChildren) { actualChildIDs.add(childRegion.toString()); } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/TestLocaleValidity.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/TestLocaleValidity.java index 2142a1537ec9..5d8ae0f0e66a 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/TestLocaleValidity.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/TestLocaleValidity.java @@ -12,7 +12,6 @@ import java.util.EnumSet; import java.util.LinkedHashSet; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import org.junit.Test; @@ -187,7 +186,7 @@ public void testBasic() { final LinkedHashSet foundKeys = new LinkedHashSet(); check(tests, foundKeys, Datasubtype.regular, Datasubtype.unknown); - LinkedHashSet missing = new LinkedHashSet(KeyTypeData.getBcp47Keys()); + LinkedHashSet missing = new LinkedHashSet<>(KeyTypeData.getBcp47Keys()); missing.removeAll(foundKeys); if (!assertEquals("Missing keys", Collections.EMPTY_SET, missing)) { // print out template for missing cases for adding @@ -313,9 +312,9 @@ public void testValidIdentifierData() { private static void showAll() { Map> data = ValidIdentifiers.getData(); - for (Entry> e1 : data.entrySet()) { + for (Map.Entry> e1 : data.entrySet()) { System.out.println(e1.getKey()); - for (Entry e2 : e1.getValue().entrySet()) { + for (Map.Entry e2 : e1.getValue().entrySet()) { System.out.println("\t" + e2.getKey()); System.out.println("\t\t" + e2.getValue()); } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/TextTrieMapTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/TextTrieMapTest.java index 422edb657064..a360957e54fa 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/TextTrieMapTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/TextTrieMapTest.java @@ -87,8 +87,8 @@ public class TextTrieMapTest extends CoreTestFmwk { @Test public void TestCaseSensitive() { - Iterator itr = null; - TextTrieMap map = new TextTrieMap(false); + Iterator itr = null; + TextTrieMap map = new TextTrieMap<>(false); for (int i = 0; i < TESTDATA.length; i++) { map.put((String)TESTDATA[i][0], TESTDATA[i][1]); } @@ -147,8 +147,8 @@ public void TestCaseSensitive() { @Test public void TestCaseInsensitive() { - Iterator itr = null; - TextTrieMap map = new TextTrieMap(true); + Iterator itr = null; + TextTrieMap map = new TextTrieMap<>(true); for (int i = 0; i < TESTDATA.length; i++) { map.put((String)TESTDATA[i][0], TESTDATA[i][1]); } @@ -214,7 +214,7 @@ private boolean eql(Object o1, Object o2) { return o1.equals(o2); } - private void checkResult(String memo, Iterator itr, Object expected) { + private void checkResult(String memo, Iterator itr, Object expected) { if (itr == null) { if (expected != null) { String expectedStr = (expected instanceof Object[]) diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/UtilityTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/UtilityTest.java index cb27835b1273..dd3432fde651 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/UtilityTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/UtilityTest.java @@ -195,8 +195,8 @@ else if (x1 > y1) { @Test public void TestUnicodeSet(){ String[] array = new String[]{"a", "b", "c", "{de}"}; - List list = Arrays.asList(array); - Set aset = new HashSet(list); + List list = Arrays.asList(array); + Set aset = new HashSet<>(list); logln(" *** The source set's size is: " + aset.size()); //The size reads 4 UnicodeSet set = new UnicodeSet(); From 81d047524ccbec4fb1a1b5e630227e64e24a25f1 Mon Sep 17 00:00:00 2001 From: Frank Tang Date: Fri, 13 Dec 2024 10:22:53 -0800 Subject: [PATCH 06/24] ICU-22991 Remove protected direct access to fStamp --- icu4c/source/i18n/chnsecal.cpp | 4 +++- icu4c/source/i18n/gregocal.cpp | 8 ++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/icu4c/source/i18n/chnsecal.cpp b/icu4c/source/i18n/chnsecal.cpp index 050994fcbaf6..fb8e5191c524 100644 --- a/icu4c/source/i18n/chnsecal.cpp +++ b/icu4c/source/i18n/chnsecal.cpp @@ -219,7 +219,9 @@ int32_t ChineseCalendar::handleGetExtendedYear(UErrorCode& status) { } int32_t year; - if (newestStamp(UCAL_ERA, UCAL_YEAR, kUnset) <= fStamp[UCAL_EXTENDED_YEAR]) { + // if UCAL_EXTENDED_YEAR is not older than UCAL_ERA nor UCAL_YEAR + if (newerField(UCAL_EXTENDED_YEAR, newerField(UCAL_ERA, UCAL_YEAR)) == + UCAL_EXTENDED_YEAR) { year = internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 } else { // adjust to the instance specific epoch diff --git a/icu4c/source/i18n/gregocal.cpp b/icu4c/source/i18n/gregocal.cpp index 23366c7ab7a3..0c09faf3f2ff 100644 --- a/icu4c/source/i18n/gregocal.cpp +++ b/icu4c/source/i18n/gregocal.cpp @@ -1186,14 +1186,10 @@ int32_t GregorianCalendar::handleGetExtendedYear(UErrorCode& status) { int32_t year = kEpochYear; // year field to use - int32_t yearField = UCAL_EXTENDED_YEAR; - // There are three separate fields which could be used to // derive the proper year. Use the one most recently set. - if (fStamp[yearField] < fStamp[UCAL_YEAR]) - yearField = UCAL_YEAR; - if (fStamp[yearField] < fStamp[UCAL_YEAR_WOY]) - yearField = UCAL_YEAR_WOY; + UCalendarDateFields yearField = newerField( + newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR), UCAL_YEAR_WOY); // based on the "best" year field, get the year switch(yearField) { From a7291c4e515d0fb76204b2dc3bd1683803c1bb01 Mon Sep 17 00:00:00 2001 From: Frank Tang Date: Mon, 16 Dec 2024 15:53:14 -0800 Subject: [PATCH 07/24] ICU-22962 Fix int32 overflow in Chinese Calendar --- icu4c/source/i18n/chnsecal.cpp | 7 ++++++- icu4c/source/test/intltest/caltest.cpp | 12 ++++++++++++ icu4c/source/test/intltest/caltest.h | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/icu4c/source/i18n/chnsecal.cpp b/icu4c/source/i18n/chnsecal.cpp index fb8e5191c524..63dcba994025 100644 --- a/icu4c/source/i18n/chnsecal.cpp +++ b/icu4c/source/i18n/chnsecal.cpp @@ -1045,7 +1045,12 @@ void ChineseCalendar::offsetMonth(int32_t newMoon, int32_t dayOfMonth, int32_t d } // Find the target dayOfMonth - int32_t jd = newMoon + kEpochStartAsJulianDay - 1 + dayOfMonth; + int32_t jd; + if (uprv_add32_overflow(newMoon, kEpochStartAsJulianDay - 1, &jd) || + uprv_add32_overflow(jd, dayOfMonth, &jd)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } // Pin the dayOfMonth. In this calendar all months are 29 or 30 days // so pinning just means handling dayOfMonth 30. diff --git a/icu4c/source/test/intltest/caltest.cpp b/icu4c/source/test/intltest/caltest.cpp index ca3597c3f02a..83b410967c4b 100644 --- a/icu4c/source/test/intltest/caltest.cpp +++ b/icu4c/source/test/intltest/caltest.cpp @@ -192,6 +192,7 @@ void CalendarTest::runIndexedTest( int32_t index, UBool exec, const char* &name, TESTCASE_AUTO(TestFirstDayOfWeek); TESTCASE_AUTO(Test22633ChineseOverflow); + TESTCASE_AUTO(Test22962ChineseOverflow); TESTCASE_AUTO(Test22633IndianOverflow); TESTCASE_AUTO(Test22633IslamicUmalquraOverflow); TESTCASE_AUTO(Test22633PersianOverflow); @@ -5663,6 +5664,17 @@ void CalendarTest::Test22633ChineseOverflow() { cal->add(UCAL_YEAR, 1935762034, status); assertTrue("Should return falure", U_FAILURE(status)); } + +void CalendarTest::Test22962ChineseOverflow() { + UErrorCode status = U_ZERO_ERROR; + LocalPointer cal(Calendar::createInstance(Locale("en@calendar=chinese"), status), status); + U_ASSERT(U_SUCCESS(status)); + cal->add(UCAL_DAY_OF_WEEK_IN_MONTH, 1661092210, status); + cal->add(UCAL_MINUTE, -1330638081, status); + cal->add(UCAL_MONTH, 643194, status); + assertTrue("Should return falure", U_FAILURE(status)); +} + void CalendarTest::Test22633IndianOverflow() { UErrorCode status = U_ZERO_ERROR; LocalPointer cal(Calendar::createInstance(Locale("en@calendar=indian"), status), status); diff --git a/icu4c/source/test/intltest/caltest.h b/icu4c/source/test/intltest/caltest.h index 5795a176d72a..c83c0ffe0440 100644 --- a/icu4c/source/test/intltest/caltest.h +++ b/icu4c/source/test/intltest/caltest.h @@ -335,6 +335,7 @@ class CalendarTest: public CalendarTimeZoneTest { void TestAddOverflow(); void TestRollWeekOfYear(); void Test22633ChineseOverflow(); + void Test22962ChineseOverflow(); void Test22633IndianOverflow(); void Test22633IslamicUmalquraOverflow(); void Test22633PersianOverflow(); From ba012a74a11405a502b6890e710bfb58cef7a2c7 Mon Sep 17 00:00:00 2001 From: Mihai Nita Date: Tue, 17 Dec 2024 23:50:58 +0000 Subject: [PATCH 08/24] ICU-22920 Fix raw type warnings in icu4j tests: charset, common_tests, translit --- .../ibm/icu/dev/test/charset/TestCharset.java | 10 +- .../icu/dev/test/charset/TestConversion.java | 4 +- .../icu/dev/test/charset/TestSelection.java | 2 +- .../test/collator/AlphabeticIndexTest.java | 67 ++++---- .../dev/test/collator/CollationMiscTest.java | 2 +- .../collator/CollationRegressionTest.java | 4 +- .../test/collator/CollationServiceTest.java | 28 ++-- .../format/GlobalizationPreferencesTest.java | 14 +- .../test/util/LocaleAliasCollationTest.java | 2 +- .../dev/test/util/ULocaleCollationTest.java | 4 +- .../test/calendar/DataDrivenCalendarTest.java | 6 +- .../dev/test/format/DataDrivenFormatTest.java | 4 +- .../icu/dev/test/format/DateFormatTest.java | 10 +- .../format/IntlTestDecimalFormatAPIC.java | 4 +- .../icu/dev/test/format/NumberFormatTest.java | 10 +- .../icu/dev/test/format/PluralRulesTest.java | 25 ++- .../dev/test/format/TestMessageFormat.java | 44 +++--- .../dev/test/format/TimeZoneFormatTest.java | 10 +- .../test/number/NumberFormatterApiTest.java | 4 +- .../test/serializable/CompatibilityTest.java | 6 +- .../dev/test/serializable/CoverageTest.java | 2 +- .../dev/test/serializable/FormatHandler.java | 10 +- .../serializable/SerializableChecker.java | 8 +- .../serializable/SerializableTestUtility.java | 8 +- .../ibm/icu/dev/test/util/CurrencyTest.java | 2 +- .../dev/test/util/ICUResourceBundleTest.java | 10 +- .../ibm/icu/dev/test/util/ICUServiceTest.java | 143 +++++++++--------- .../ibm/icu/dev/test/util/LocaleDataTest.java | 4 +- .../ibm/icu/dev/test/util/ULocaleTest.java | 15 +- .../dev/test/bigdec/DiagBigDecimalTest.java | 1 - .../com/ibm/icu/dev/test/message2/Args.java | 2 - .../ibm/icu/dev/test/UnicodeKnownIssues.java | 3 +- .../translit/IncrementalProgressTest.java | 8 +- .../dev/test/translit/RegexUtilitiesTest.java | 4 +- .../TransliteratorDisorderedMarksTest.java | 3 +- .../TransliteratorInstantiateAllTest.java | 6 +- .../dev/test/translit/TransliteratorTest.java | 44 +++--- .../icu/dev/test/translit/WriteCharts.java | 18 +-- 38 files changed, 271 insertions(+), 280 deletions(-) diff --git a/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestCharset.java b/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestCharset.java index f42a9f87a371..1f9fc626169e 100644 --- a/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestCharset.java +++ b/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestCharset.java @@ -802,8 +802,8 @@ public void TestSurrogateBehavior() { int[] badposindices = new int[n]; int[] malfindices = new int[n]; int[] unmapindices = new int[n]; - ArrayList pass = new ArrayList(); - ArrayList exempt = new ArrayList(); + ArrayList pass = new ArrayList<>(); + ArrayList exempt = new ArrayList<>(); outer: for (int conv=0; conv map = Charset.availableCharsets(); + Set keySet = map.keySet(); + Iterator iter = keySet.iterator(); while(iter.hasNext()){ logln("Charset name: "+iter.next().toString()); } diff --git a/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestConversion.java b/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestConversion.java index 46ce39e44d25..c58037261129 100644 --- a/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestConversion.java +++ b/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestConversion.java @@ -110,8 +110,8 @@ public void conversionTest(TestDataPair pair) { String testName = td.getName().toString(); // Iterate through and get each of the test case to process - for (Iterator iter = td.getDataIterator(); iter.hasNext();) { - DataMap testcase = (DataMap) iter.next(); + for (Iterator iter = td.getDataIterator(); iter.hasNext();) { + DataMap testcase = iter.next(); if (testName.equalsIgnoreCase("toUnicode")) { TestToUnicode(testcase, testToUnicode); diff --git a/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestSelection.java b/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestSelection.java index 4ba80fed1c36..4a74ed06037e 100644 --- a/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestSelection.java +++ b/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestSelection.java @@ -127,7 +127,7 @@ private void verifyResultUTF16(String s, List encodings, List re /* This test is to provide better code coverage for CharsetSelector */ @Test public void TestCharsetSelectorCodeCoverage() { - List emptyList = new ArrayList(); + List emptyList = new ArrayList<>(); UnicodeSet nonEmptySet = new UnicodeSet(); nonEmptySet.add(0x0001, 0x0FFF); diff --git a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/AlphabeticIndexTest.java b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/AlphabeticIndexTest.java index f67c9d8ddf48..72a38b8e8d6c 100644 --- a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/AlphabeticIndexTest.java +++ b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/AlphabeticIndexTest.java @@ -52,7 +52,7 @@ public class AlphabeticIndexTest extends TestFmwk { private static final String ARROW = "\u2192"; private static final boolean DEBUG = ICUDebug.enabled("alphabeticindex"); - public static Set KEY_LOCALES = new LinkedHashSet(Arrays.asList( + public static Set KEY_LOCALES = new LinkedHashSet<>(Arrays.asList( "en", "es", "de", "fr", "ja", "it", "tr", "pt", "zh", "nl", "pl", "ar", "ru", "zh_Hant", "ko", "th", "sv", "fi", "da", "he", "nb", "el", "hr", "bg", "sk", "lt", "vi", "lv", "sr", @@ -224,7 +224,7 @@ public void TestA() { final String probe = test[1]; final String expectedLabel = test[2]; alphabeticIndex.addRecord(probe, 1); - List labels = alphabeticIndex.getBucketLabels(); + List labels = alphabeticIndex.getBucketLabels(); logln(labels.toString()); Bucket bucket = find(alphabeticIndex, probe); assertEquals("locale " + test[0] + " name=" + probe + " in bucket", @@ -246,7 +246,7 @@ private Bucket find(AlphabeticIndex alphabeticIndex, final Str @Test public void TestFirstCharacters() { - AlphabeticIndex alphabeticIndex = new AlphabeticIndex(Locale.ENGLISH); + AlphabeticIndex alphabeticIndex = new AlphabeticIndex<>(Locale.ENGLISH); RuleBasedCollator collator = alphabeticIndex.getCollator(); collator.setStrength(Collator.IDENTICAL); Collection firsts = alphabeticIndex.getFirstCharactersInScripts(); @@ -316,7 +316,7 @@ public void TestEmpty() { locales.addAll(Arrays.asList(ULocale.getAvailableLocales())); for (ULocale locale : locales) { try { - AlphabeticIndex alphabeticIndex = new AlphabeticIndex(locale); + AlphabeticIndex alphabeticIndex = new AlphabeticIndex<>(locale); alphabeticIndex.addRecord("hi", "HI"); for (Bucket bucket : alphabeticIndex) { @SuppressWarnings("unused") @@ -331,7 +331,7 @@ public void TestEmpty() { @Test public void TestSetGetSpecialLabels() { - AlphabeticIndex index = new AlphabeticIndex(Locale.GERMAN).addLabels(new Locale("ru")); + AlphabeticIndex index = new AlphabeticIndex(Locale.GERMAN).addLabels(new Locale("ru")); index.setUnderflowLabel("__"); index.setInflowLabel("--"); index.setOverflowLabel("^^"); @@ -339,7 +339,7 @@ public void TestSetGetSpecialLabels() { assertEquals("inflow label", "--", index.getInflowLabel()); assertEquals("overflow label", "^^", index.getOverflowLabel()); - ImmutableIndex ii = index.buildImmutableIndex(); + ImmutableIndex ii = index.buildImmutableIndex(); assertEquals("0 -> underflow", "__", ii.getBucket(ii.getBucketIndex("0")).getLabel()); assertEquals("Ω -> inflow", "--", ii.getBucket(ii.getBucketIndex("Ω")).getLabel()); assertEquals("字 -> overflow", "^^", ii.getBucket(ii.getBucketIndex("字")).getLabel()); @@ -357,7 +357,7 @@ public void TestInflow() { }; for (Object[] test : tests) { int expected = (Integer) test[0]; - AlphabeticIndex alphabeticIndex = new AlphabeticIndex((ULocale)test[1]); + AlphabeticIndex alphabeticIndex = new AlphabeticIndex<>((ULocale)test[1]); for (int i = 2; i < test.length; ++i) { if (test[i] instanceof ULocale) { alphabeticIndex.addLabels((ULocale)test[i]); @@ -365,7 +365,7 @@ public void TestInflow() { alphabeticIndex.addLabels((UnicodeSet)test[i]); } } - Counter counter = new Counter(); + Counter counter = new Counter<>(); for (Bucket bucket : alphabeticIndex) { LabelType labelType = bucket.getLabelType(); counter.add(labelType, 1); @@ -375,7 +375,7 @@ public void TestInflow() { assertEquals(LabelType.INFLOW + "\t" + printList, expected, counter.get(LabelType.INFLOW)); if (expected != counter.get(LabelType.INFLOW)) { // for debugging - AlphabeticIndex indexCharacters2 = new AlphabeticIndex((ULocale)test[1]); + AlphabeticIndex indexCharacters2 = new AlphabeticIndex<>((ULocale)test[1]); for (int i = 2; i < test.length; ++i) { if (test[i] instanceof ULocale) { indexCharacters2.addLabels((ULocale)test[i]); @@ -398,7 +398,7 @@ private void checkBuckets(String localeString, String[] test, ULocale additional // Create a simple index where the values for the strings are Integers, and add the strings AlphabeticIndex index = new AlphabeticIndex(desiredLocale).addLabels(additionalLocale); int counter = 0; - Counter itemCount = new Counter(); + Counter itemCount = new Counter<>(); for (String item : test) { index.addRecord(item, counter++); itemCount.add(item, 1); @@ -524,7 +524,7 @@ private void showLabelInList(StringBuilder buffer, String label) { private Counter getKeys(AlphabeticIndex.Bucket entry) { Counter keys = new Counter(); - for (AlphabeticIndex.Record x : entry) { + for (AlphabeticIndex.Record x : entry) { String key = x.getName().toString(); keys.add(key, 1); } @@ -536,7 +536,7 @@ public void TestIndexCharactersList() { for (String[] localeAndIndexCharacters : localeAndIndexCharactersLists) { ULocale locale = new ULocale(localeAndIndexCharacters[0]); String expectedIndexCharacters = "\u2026:" + localeAndIndexCharacters[1] + ":\u2026"; - Collection alphabeticIndex = new AlphabeticIndex(locale).getBucketLabels(); + Collection alphabeticIndex = new AlphabeticIndex<>(locale).getBucketLabels(); // Join the elements of the list to a string with delimiter ":" StringBuilder sb = new StringBuilder(); @@ -561,7 +561,7 @@ public void TestBasics() { ULocale[] list = ULocale.getAvailableLocales(); // get keywords combinations // don't bother with multiple combinations at this point - List keywords = new ArrayList(); + List keywords = new ArrayList<>(); keywords.add(""); String[] collationValues = Collator.getKeywordValues("collation"); @@ -570,8 +570,7 @@ public void TestBasics() { } for (int i = 0; i < list.length; ++i) { - for (Iterator it = keywords.iterator(); it.hasNext();) { - String collationValue = (String) it.next(); + for (String collationValue : keywords) { String localeString = list[i].toString(); if (!KEY_LOCALES.contains(localeString)) continue; // TODO change in exhaustive ULocale locale = new ULocale(localeString + collationValue); @@ -584,13 +583,13 @@ public void TestBasics() { continue; } boolean isUnihan = collationValue.contains("unihan"); - AlphabeticIndex alphabeticIndex = new AlphabeticIndex(locale); + AlphabeticIndex alphabeticIndex = new AlphabeticIndex<>(locale); if (isUnihan) { // Unihan tailorings have a label per radical, and there are at least 214, // if not more when simplified radicals are distinguished. alphabeticIndex.setMaxLabelCount(500); } - final Collection mainChars = alphabeticIndex.getBucketLabels(); + final Collection mainChars = alphabeticIndex.getBucketLabels(); String mainCharString = mainChars.toString(); if (mainCharString.length() > 500) { mainCharString = mainCharString.substring(0,500) + "..."; @@ -687,7 +686,7 @@ public void TestClientSupport() { @Test public void TestFirstScriptCharacters() { Collection firstCharacters = - new AlphabeticIndex(ULocale.ENGLISH).getFirstCharactersInScripts(); + new AlphabeticIndex<>(ULocale.ENGLISH).getFirstCharactersInScripts(); Collection expectedFirstCharacters = firstStringsInScript((RuleBasedCollator) Collator.getInstance(ULocale.ROOT)); Collection diff = new TreeSet(firstCharacters); diff.removeAll(expectedFirstCharacters); @@ -923,7 +922,7 @@ public void TestTraditional() { public void TestHaniFirst() { RuleBasedCollator coll = (RuleBasedCollator) Collator.getInstance(ULocale.ROOT); coll.setReorderCodes(UScript.HAN); - AlphabeticIndex index = new AlphabeticIndex(coll); + AlphabeticIndex index = new AlphabeticIndex<>(coll); assertEquals("getBucketCount()", 1, index.getBucketCount()); // ... (underflow only) index.addLabels(Locale.ENGLISH); assertEquals("getBucketCount()", 28, index.getBucketCount()); // ... A-Z ... @@ -947,7 +946,7 @@ public void TestHaniFirst() { public void TestPinyinFirst() { RuleBasedCollator coll = (RuleBasedCollator) Collator.getInstance(ULocale.CHINESE); coll.setReorderCodes(UScript.HAN); - AlphabeticIndex index = new AlphabeticIndex(coll); + AlphabeticIndex index = new AlphabeticIndex<>(coll); assertEquals("getBucketCount()", 28, index.getBucketCount()); // ... A-Z ... index.addLabels(Locale.CHINESE); assertEquals("getBucketCount()", 28, index.getBucketCount()); // ... A-Z ... @@ -969,10 +968,10 @@ public void TestPinyinFirst() { */ @Test public void TestSchSt() { - AlphabeticIndex index = new AlphabeticIndex(ULocale.GERMAN); + AlphabeticIndex index = new AlphabeticIndex<>(ULocale.GERMAN); index.addLabels(new UnicodeSet("[Æ{Sch*}{St*}]")); // ... A Æ B-R S Sch St T-Z ... - ImmutableIndex immIndex = index.buildImmutableIndex(); + ImmutableIndex immIndex = index.buildImmutableIndex(); assertEquals("getBucketCount()", 31, index.getBucketCount()); assertEquals("immutable getBucketCount()", 31, immIndex.getBucketCount()); String[][] testCases = new String[][] { @@ -1028,8 +1027,8 @@ public void TestNoLabels() { */ @Test public void TestChineseZhuyin() { - AlphabeticIndex index = new AlphabeticIndex(ULocale.forLanguageTag("zh-u-co-zhuyin")); - ImmutableIndex immIndex = index.buildImmutableIndex(); + AlphabeticIndex index = new AlphabeticIndex<>(ULocale.forLanguageTag("zh-u-co-zhuyin")); + ImmutableIndex immIndex = index.buildImmutableIndex(); assertEquals("getBucketCount()", 38, immIndex.getBucketCount()); // ... ㄅ ㄆ ㄇ ㄈ ㄉ -- ㄩ ... assertEquals("label 1", "ㄅ", immIndex.getBucket(1).getLabel()); assertEquals("label 2", "ㄆ", immIndex.getBucket(2).getLabel()); @@ -1040,8 +1039,8 @@ public void TestChineseZhuyin() { @Test public void TestJapaneseKanji() { - AlphabeticIndex index = new AlphabeticIndex(ULocale.JAPANESE); - AlphabeticIndex.ImmutableIndex immIndex = index.buildImmutableIndex(); + AlphabeticIndex index = new AlphabeticIndex<>(ULocale.JAPANESE); + AlphabeticIndex.ImmutableIndex immIndex = index.buildImmutableIndex(); // There are no index characters for Kanji in the Japanese standard collator. // They should all go into the overflow bucket. final int[] kanji = { 0x4E9C, 0x95C7, 0x4E00, 0x58F1 }; @@ -1061,17 +1060,17 @@ public void TestFrozenCollator() { // The AlphabeticIndex constructor used to throw an exception // because it cloned the collator (which preserves frozenness) // and set the clone's strength to PRIMARY. - AlphabeticIndex index = new AlphabeticIndex(coll); + AlphabeticIndex index = new AlphabeticIndex<>(coll); assertEquals("same strength as input Collator", Collator.IDENTICAL, index.getCollator().getStrength()); } @Test public void TestChineseUnihan() { - AlphabeticIndex index = new AlphabeticIndex(new ULocale("zh-u-co-unihan")); + AlphabeticIndex index = new AlphabeticIndex<>(new ULocale("zh-u-co-unihan")); index.setMaxLabelCount(500); // ICU 54 default is 99. assertEquals("getMaxLabelCount()", 500, index.getMaxLabelCount()); // code coverage - AlphabeticIndex.ImmutableIndex immIndex = index.buildImmutableIndex(); + AlphabeticIndex.ImmutableIndex immIndex = index.buildImmutableIndex(); int bucketCount = immIndex.getBucketCount(); if(bucketCount < 216) { // There should be at least an underflow and overflow label, @@ -1095,8 +1094,8 @@ public void TestChineseUnihan() { @Test public void testAddLabels_Locale() { - AlphabeticIndex ulocaleIndex = new AlphabeticIndex(ULocale.CANADA); - AlphabeticIndex localeIndex = new AlphabeticIndex(Locale.CANADA); + AlphabeticIndex ulocaleIndex = new AlphabeticIndex<>(ULocale.CANADA); + AlphabeticIndex localeIndex = new AlphabeticIndex<>(Locale.CANADA); ulocaleIndex.addLabels(ULocale.SIMPLIFIED_CHINESE); localeIndex.addLabels(Locale.SIMPLIFIED_CHINESE); assertEquals("getBucketLables() results of ulocaleIndex and localeIndex differ", @@ -1171,12 +1170,12 @@ public void testHasBuckets() { } private void checkHasBuckets(Locale locale, int script) { - AlphabeticIndex.ImmutableIndex index = + AlphabeticIndex.ImmutableIndex index = new AlphabeticIndex(locale).buildImmutableIndex(); String loc = locale.toString(); assertTrue(loc + " at least 3 buckets", index.getBucketCount() >= 3); - AlphabeticIndex.Bucket bucket = index.getBucket(1); - assertEquals(loc + " real bucket", AlphabeticIndex.Bucket.LabelType.NORMAL, + AlphabeticIndex.Bucket bucket = index.getBucket(1); + assertEquals(loc + " real bucket", LabelType.NORMAL, bucket.getLabelType()); assertEquals(loc + " expected script", script, UScript.getScript(bucket.getLabel().codePointAt(0))); diff --git a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationMiscTest.java b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationMiscTest.java index f8ef4f982183..54b0ce0825ce 100644 --- a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationMiscTest.java +++ b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationMiscTest.java @@ -2256,7 +2256,7 @@ public void TestJB5298(){ } } - Set foundValues = new TreeSet(Arrays.asList(values)); + Set foundValues = new TreeSet<>(Arrays.asList(values)); for (int i = 0; i < locales.length; ++i) { for (int j = 0; j < values.length; ++j) { diff --git a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationRegressionTest.java b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationRegressionTest.java index 33b24a3e16c8..855b11ff7f53 100644 --- a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationRegressionTest.java +++ b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationRegressionTest.java @@ -1072,7 +1072,7 @@ public void Test4179686() throws Exception { String text = "T\u00f6ne"; // o-umlaut CollationElementIterator iter = coll.getCollationElementIterator(text); - List elements = new ArrayList(); + List elements = new ArrayList<>(); int elem; // Iterate forward and collect all of the elements into a Vector @@ -1084,7 +1084,7 @@ public void Test4179686() throws Exception { iter.reset(); int index = elements.size() - 1; while ((elem = iter.previous()) != CollationElementIterator.NULLORDER) { - int expect = ((Integer)elements.get(index)).intValue(); + int expect = (elements.get(index)).intValue(); if (elem != expect) { errln("Mismatch at index " + index diff --git a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationServiceTest.java b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationServiceTest.java index 8ed39d72d33f..6e40d5c133dc 100644 --- a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationServiceTest.java +++ b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationServiceTest.java @@ -131,9 +131,9 @@ public void TestRegisterFactory() { class CollatorInfo { ULocale locale; Collator collator; - Map displayNames; // locale -> string + Map displayNames; // locale -> string - CollatorInfo(ULocale locale, Collator collator, Map displayNames) { + CollatorInfo(ULocale locale, Collator collator, Map displayNames) { this.locale = locale; this.collator = collator; this.displayNames = displayNames; @@ -142,7 +142,7 @@ class CollatorInfo { String getDisplayName(ULocale displayLocale) { String name = null; if (displayNames != null) { - name = (String)displayNames.get(displayLocale); + name = displayNames.get(displayLocale); } if (name == null) { name = locale.getDisplayName(displayLocale); @@ -152,11 +152,11 @@ String getDisplayName(ULocale displayLocale) { } class TestFactory extends CollatorFactory { - private Map map; - private Set ids; + private Map map; + private Set ids; TestFactory(CollatorInfo[] info) { - map = new HashMap(); + map = new HashMap<>(); for (int i = 0; i < info.length; ++i) { CollatorInfo ci = info[i]; map.put(ci.locale, ci); @@ -165,7 +165,7 @@ class TestFactory extends CollatorFactory { @Override public Collator createCollator(ULocale loc) { - CollatorInfo ci = (CollatorInfo)map.get(loc); + CollatorInfo ci = map.get(loc); if (ci != null) { return ci.collator; } @@ -174,7 +174,7 @@ public Collator createCollator(ULocale loc) { @Override public String getDisplayName(ULocale objectLocale, ULocale displayLocale) { - CollatorInfo ci = (CollatorInfo)map.get(objectLocale); + CollatorInfo ci = map.get(objectLocale); if (ci != null) { return ci.getDisplayName(displayLocale); } @@ -182,12 +182,12 @@ public String getDisplayName(ULocale objectLocale, ULocale displayLocale) { } @Override - public Set getSupportedLocaleIDs() { + public Set getSupportedLocaleIDs() { if (ids == null) { - HashSet set = new HashSet(); - Iterator iter = map.keySet().iterator(); + HashSet set = new HashSet<>(); + Iterator iter = map.keySet().iterator(); while (iter.hasNext()) { - ULocale locale = (ULocale)iter.next(); + ULocale locale = iter.next(); String id = locale.toString(); set.add(id); } @@ -212,7 +212,7 @@ public Collator createCollator(ULocale loc) { // use CollatorFactory getDisplayName(ULocale, ULocale) for coverage @Override - public Set getSupportedLocaleIDs() { + public Set getSupportedLocaleIDs() { return delegate.getSupportedLocaleIDs(); } } @@ -220,7 +220,7 @@ public Set getSupportedLocaleIDs() { ULocale fu_FU = new ULocale("fu_FU"); ULocale fu_FU_FOO = new ULocale("fu_FU_FOO"); - Map fuFUNames = new HashMap(); + Map fuFUNames = new HashMap<>(); fuFUNames.put(fu_FU, "ze leetle bunny Fu-Fu"); fuFUNames.put(fu_FU_FOO, "zee leetel bunny Foo-Foo"); fuFUNames.put(ULocale.US, "little bunny Foo Foo"); diff --git a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/format/GlobalizationPreferencesTest.java b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/format/GlobalizationPreferencesTest.java index 503b9c18eac8..84d533e6c75b 100644 --- a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/format/GlobalizationPreferencesTest.java +++ b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/format/GlobalizationPreferencesTest.java @@ -166,7 +166,7 @@ public void TestFreezable() { // setLocales(ULocale[]) logln("Call setLocales(List) after frozen"); bSet = true; - ArrayList list = new ArrayList(1); + ArrayList list = new ArrayList<>(1); list.add(new ULocale("fr_FR")); try { gp.setLocales(list); @@ -274,7 +274,7 @@ public void TestSetLocales() { // setLocales(List) for (int i = 0; i < INPUT_LOCALEIDS.length; i++) { String[] localeStrings = INPUT_LOCALEIDS[i]; - ArrayList locales = new ArrayList(); + ArrayList locales = new ArrayList<>(); StringBuffer sb = new StringBuffer(); for (int j = 0; j < localeStrings.length; j++) { locales.add(new ULocale(localeStrings[j])); @@ -288,7 +288,7 @@ public void TestSetLocales() { gp.reset(); gp.setLocales(locales); - List resultLocales = gp.getLocales(); + List resultLocales = gp.getLocales(); if (resultLocales.size() != RESULTS_LOCALEIDS[i].length) { errln("FAIL: Number of locales mismatch - GP:" + resultLocales.size() + " Expected:" + RESULTS_LOCALEIDS[i].length); @@ -322,7 +322,7 @@ public void TestSetLocales() { gp.reset(); gp.setLocales(localeArray); - List resultLocales = gp.getLocales(); + List resultLocales = gp.getLocales(); if (resultLocales.size() != RESULTS_LOCALEIDS[i].length) { errln("FAIL: Number of locales mismatch - GP:" + resultLocales.size() + " Expected:" + RESULTS_LOCALEIDS[i].length); @@ -1004,11 +1004,11 @@ public void TestDisplayName() { ULocale loc_peo = new ULocale("peo"); // Locale list - fr_FR_Paris - ArrayList locales1 = new ArrayList(1); + ArrayList locales1 = new ArrayList<>(1); locales1.add(loc_fr_FR_Paris); // Locale list - ain, fr_FR_Paris - ArrayList locales2 = new ArrayList(2); + ArrayList locales2 = new ArrayList<>(2); locales2.add(loc_peo); locales2.add(loc_fr_FR_Paris); @@ -1200,7 +1200,7 @@ public void TestDateFormat() { } // Set locale - fr, fr_CA, fr_FR - ArrayList lcls = new ArrayList(3); + ArrayList lcls = new ArrayList<>(3); lcls.add(new ULocale("fr")); lcls.add(new ULocale("fr_CA")); lcls.add(new ULocale("fr_FR")); diff --git a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/util/LocaleAliasCollationTest.java b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/util/LocaleAliasCollationTest.java index 8f1f43fc9761..b9428743a321 100644 --- a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/util/LocaleAliasCollationTest.java +++ b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/util/LocaleAliasCollationTest.java @@ -39,7 +39,7 @@ public class LocaleAliasCollationTest extends com.ibm.icu.dev.test.TestFmwk { private static final int _LOCALE_NUMBER = _LOCALES.length; private ULocale[] available = null; - private HashMap availableMap = new HashMap(); + private HashMap availableMap = new HashMap<>(); private static final ULocale _DEFAULT_LOCALE = ULocale.US; public LocaleAliasCollationTest() { diff --git a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/util/ULocaleCollationTest.java b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/util/ULocaleCollationTest.java index d4ca74fd03aa..4eae21bc52f6 100644 --- a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/util/ULocaleCollationTest.java +++ b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/util/ULocaleCollationTest.java @@ -150,9 +150,9 @@ void checklocs(String label, */ void checkObject(String requestedLocale, Object obj, String expReqValid, String expValidActual) { - Class[] getLocaleParams = new Class[] { ULocale.Type.class }; + Class[] getLocaleParams = new Class[] { ULocale.Type.class }; try { - Class cls = obj.getClass(); + Class cls = obj.getClass(); Method getLocale = cls.getMethod("getLocale", getLocaleParams); ULocale valid = (ULocale) getLocale.invoke(obj, new Object[] { ULocale.VALID_LOCALE }); diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/calendar/DataDrivenCalendarTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/calendar/DataDrivenCalendarTest.java index 04f6a9c22830..3469c626c153 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/calendar/DataDrivenCalendarTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/calendar/DataDrivenCalendarTest.java @@ -135,9 +135,9 @@ private void testConvert(TestDataModule.TestData testData, DataMap settings, boo // DateFormat fmt = new SimpleDateFormat("EEE MMM dd yyyy / YYYY'-W'ww-ee"); // Start the processing int n = 0; - for (Iterator iter = testData.getDataIterator(); iter.hasNext();) { + for (Iterator iter = testData.getDataIterator(); iter.hasNext();) { ++n; - DataMap currentCase = (DataMap) iter.next(); + DataMap currentCase = iter.next(); String caseString = "["+testData.getName()+"#"+n+" "+"]"; String locale = testSetting = currentCase.getString("locale"); @@ -180,7 +180,7 @@ private void testOps(TestDataModule.TestData testData, DataMap settings) { boolean useDate = false; - for (Iterator iter = testData.getDataIterator(); iter.hasNext();) { + for (Iterator iter = testData.getDataIterator(); iter.hasNext();) { ++n; DataMap currentCase = (DataMap) iter.next(); diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/DataDrivenFormatTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/DataDrivenFormatTest.java index 8afcf8cf6cf6..819cf1da6e36 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/DataDrivenFormatTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/DataDrivenFormatTest.java @@ -86,10 +86,10 @@ private void testConvertDate(TestDataModule.TestData testData, DataMap settings DateFormat basicFmt = new SimpleDateFormat("EEE MMM dd yyyy / YYYY'-W'ww-ee"); int n = 0; - for (Iterator iter = testData.getDataIterator(); iter.hasNext();) { + for (Iterator iter = testData.getDataIterator(); iter.hasNext();) { ++n; long now = System.currentTimeMillis(); - DataMap currentCase = (DataMap) iter.next(); + DataMap currentCase = iter.next(); String caseString = "["+testData.getName()+"#"+n+(fmt?"format":"parse")+"]"; String locale = currentCase.getString("locale"); diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/DateFormatTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/DateFormatTest.java index f972ee709cd1..5bdf2faabfbc 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/DateFormatTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/DateFormatTest.java @@ -3533,7 +3533,7 @@ public void TestFormatToCharacterIterator() { int patidx = 0; while (true) { - Map map = acit.getAttributes(); + Map map = acit.getAttributes(); int limit = acit.getRunLimit(); if (map.isEmpty()) { // Must be pattern literal - '~' @@ -3544,10 +3544,10 @@ public void TestFormatToCharacterIterator() { acit.next(); } } else { - Set keySet = map.keySet(); + Set keySet = map.keySet(); if (keySet.size() == 1) { // Check the attribute - Iterator keyIterator = keySet.iterator(); + Iterator keyIterator = keySet.iterator(); DateFormat.Field attr = (DateFormat.Field)keyIterator.next(); if (!DATEFORMAT_FIELDS[patidx].equals(attr)) { errln("FAIL: The attribute at " + acit.getIndex() + " in patterns[" + i + "" + @@ -3577,7 +3577,7 @@ public void TestFormatToCharacterIterator() { ChineseDateFormat cdf = new ChineseDateFormat("y'x'G-Ml-d", ULocale.US); acit = cdf.formatToCharacterIterator(nonLeapMonthDate); - Set keys = acit.getAllAttributeKeys(); + Set keys = acit.getAllAttributeKeys(); if (keys.contains(ChineseDateFormat.Field.IS_LEAP_MONTH)) { errln("FAIL: separate IS_LEAP_MONTH field should not be present for a Chinese calendar non-leap date" + cdf.format(nonLeapMonthDate)); @@ -4744,7 +4744,7 @@ public TestRelativeContextItem(String loc, DisplayContext capCtxt, String expFmt @Test public void TestDotAndAtLeniency() { for (ULocale locale : Arrays.asList(ULocale.ENGLISH, ULocale.FRENCH)) { - List tests = new ArrayList(); + List tests = new ArrayList<>(); for (int dateStyle = DateFormat.FULL; dateStyle <= DateFormat.SHORT; ++dateStyle) { DateFormat dateFormat = DateFormat.getDateInstance(dateStyle, locale); diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/IntlTestDecimalFormatAPIC.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/IntlTestDecimalFormatAPIC.java index 2cb92a4d09e5..3fb5fcbe563b 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/IntlTestDecimalFormatAPIC.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/IntlTestDecimalFormatAPIC.java @@ -459,7 +459,7 @@ private void t_Format(int count, Object object, Format format, /** * compares two vectors regardless of the order of their elements */ - private static boolean compare(List vector1, List vector2) { + private static boolean compare(List vector1, List vector2) { return vector1.size() == vector2.size() && vector1.containsAll(vector2); } @@ -478,7 +478,7 @@ private static List findFields(AttributedCharacterIterator itera int start = iterator.getRunStart(); int end = iterator.getRunLimit(); - Iterator it = iterator.getAttributes().keySet().iterator(); + Iterator it = iterator.getAttributes().keySet().iterator(); while (it.hasNext()) { AttributedCharacterIterator.Attribute attribute = (AttributedCharacterIterator.Attribute) it .next(); diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/NumberFormatTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/NumberFormatTest.java index 87790d103806..138200357fc5 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/NumberFormatTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/NumberFormatTest.java @@ -3181,7 +3181,7 @@ public void TestJB5358() { double expected = 12345; DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US); DecimalFormat fmt = new DecimalFormat("#.#", sym); - ArrayList errors = new ArrayList(); + ArrayList errors = new ArrayList<>(); ParseThreadJB5358[] threads = new ParseThreadJB5358[numThreads]; for (int i = 0; i < numThreads; i++) { @@ -3198,7 +3198,7 @@ public void TestJB5358() { if (errors.size() != 0) { StringBuffer errBuf = new StringBuffer(); for (int i = 0; i < errors.size(); i++) { - errBuf.append((String)errors.get(i)); + errBuf.append(errors.get(i)); errBuf.append("\n"); } errln("FAIL: " + errBuf); @@ -3209,9 +3209,9 @@ static private class ParseThreadJB5358 extends Thread { private final DecimalFormat decfmt; private final String numstr; private final double expect; - private final ArrayList errors; + private final ArrayList errors; - public ParseThreadJB5358(DecimalFormat decfmt, String numstr, double expect, ArrayList errors) { + public ParseThreadJB5358(DecimalFormat decfmt, String numstr, double expect, ArrayList errors) { this.decfmt = decfmt; this.numstr = numstr; this.expect = expect; @@ -4793,7 +4793,7 @@ private void CompareAttributedCharacterFormatOutput(AttributedCharacterIterator while (iterator.getIndex() != iterator.getEndIndex()) { int start = iterator.getRunStart(); int end = iterator.getRunLimit(); - Iterator it = iterator.getAttributes().keySet().iterator(); + Iterator it = iterator.getAttributes().keySet().iterator(); AttributedCharacterIterator.Attribute attribute = (AttributedCharacterIterator.Attribute) it.next(); // For positions with both INTEGER and GROUPING attributes, we want the GROUPING attribute. if (it.hasNext() && attribute.equals(NumberFormat.Field.INTEGER)) { diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/PluralRulesTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/PluralRulesTest.java index 52c182b45ce4..099af383e4f3 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/PluralRulesTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/PluralRulesTest.java @@ -29,7 +29,6 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Map.Entry; import java.util.Objects; import java.util.Set; import java.util.TreeMap; @@ -168,8 +167,8 @@ public void testSyntaxRestrictions() { { "a:n in 3 .. 10 , 13 .. 19 ,", ParseException.class }, }; for (Object[] shouldFailTest : shouldFail) { String rules = (String) shouldFailTest[0]; - Class exception = shouldFailTest.length < 2 ? null : (Class) shouldFailTest[1]; - Class actualException = null; + Class exception = shouldFailTest.length < 2 ? null : (Class) shouldFailTest[1]; + Class actualException = null; try { PluralRules.parseDescription(rules); } catch (Exception e) { @@ -279,8 +278,8 @@ public void checkOldSamples(String description, PluralRules rules, String keywor // Collect actual (oldSamples) and expected (expectedSamplesList) into the // same concrete collection for comparison purposes. - ArrayList oldSamplesList = new ArrayList(oldSamples); - ArrayList expectedSamplesList = new ArrayList(Arrays.asList(expected)); + ArrayList oldSamplesList = new ArrayList<>(oldSamples); + ArrayList expectedSamplesList = new ArrayList<>(Arrays.asList(expected)); if (!assertEquals("getOldSamples; " + keyword + "; " + description, expectedSamplesList, oldSamplesList)) { @@ -329,7 +328,7 @@ public void checkNewSamples(String description, PluralRules test, String keyword "a:2,3,5,6,7,13,15,16,17", "a: n in 2..6,3..7", "a:2,3,4,5,6,7", }; private String[] getTargetStrings(String targets) { - List list = new ArrayList(50); + List list = new ArrayList<>(50); String[] valSets = Utility.split(targets, ';'); for (int i = 0; i < valSets.length; ++i) { String[] temp = Utility.split(valSets[i], ':'); @@ -459,7 +458,7 @@ public void testUniqueRules() { keywordToRule.put(keyword, singleRule); } - Map collisionTest = new LinkedHashMap(); + Map collisionTest = new LinkedHashMap<>(); // get all of the sample ranges from all of the samples Stream ranges = samples.stream() @@ -474,7 +473,7 @@ public void testUniqueRules() { items.forEach(item -> { collisionTest.clear(); - for (Entry entry : keywordToRule.entrySet()) { + for (Map.Entry entry : keywordToRule.entrySet()) { PluralRules rule = entry.getValue(); String foundKeyword = rule.select(item); if (foundKeyword.equals("other")) { @@ -724,7 +723,7 @@ public void testFunctionalEquivalent() { @Test public void testAvailableULocales() { ULocale[] locales = factory.getAvailableULocales(); - Set localeSet = new HashSet(); + Set localeSet = new HashSet<>(); localeSet.addAll(Arrays.asList(locales)); assertEquals("locales are unique in list", locales.length, localeSet.size()); @@ -1072,7 +1071,7 @@ public void TestGetAllKeywordValues() { } Collection values; if (valueList == null || valueList.length() == 0) { - values = Collections.EMPTY_SET; + values = Collections.emptySet(); } else if ("null".equals(valueList)) { values = null; } else { @@ -1186,7 +1185,7 @@ public void TestLimitedAndSamplesConsistency() { @Test public void TestKeywords() { - Set possibleKeywords = new LinkedHashSet(Arrays.asList("zero", "one", "two", "few", "many", "other")); + Set possibleKeywords = new LinkedHashSet<>(Arrays.asList("zero", "one", "two", "few", "many", "other")); DecimalQuantity ONE_INTEGER = DecimalQuantity_DualStorageBCD.fromExponentString("1"); Object[][][] tests = { // format is locale, explicits, then triples of keyword, status, unique value. @@ -1205,7 +1204,7 @@ public void TestKeywords() { // NumberType numberType = (NumberType) test[1]; Set explicits = (Set) test[0][1]; PluralRules pluralRules = factory.forLocale(locale); - LinkedHashSet remaining = new LinkedHashSet(possibleKeywords); + LinkedHashSet remaining = new LinkedHashSet<>(possibleKeywords); for (int i = 1; i < test.length; ++i) { Object[] row = test[i]; String keyword = (String) row[0]; @@ -1536,7 +1535,7 @@ private void generateLOCALE_SNAPSHOT() { setsToRules.put(set, pr); data.put(pr, locale); } - for (Entry, Set> entry1 : setsToRules.keyValuesSet()) { + for (Map.Entry, Set> entry1 : setsToRules.keyValuesSet()) { Set set = entry1.getKey(); Set rules = entry1.getValue(); System.out.println("\n // " + set); diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/TestMessageFormat.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/TestMessageFormat.java index a6fd6eb381d6..9e9029bf5c82 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/TestMessageFormat.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/TestMessageFormat.java @@ -1001,7 +1001,7 @@ public void TestAutoQuoteApostrophe() { // This tests passing named arguments instead of numbers to format(). @Test public void testFormatNamedArguments() { - Map arguments = new HashMap(); + Map arguments = new HashMap<>(); arguments.put("startDate", new Date(871068000000L)); StringBuffer result = new StringBuffer(); @@ -1035,7 +1035,7 @@ public void testParseNamedArguments() { String source = "abc =sep= def"; try { - Map fmt_map = msg.parseToMap(source); + Map fmt_map = msg.parseToMap(source); if (fmt_map.keySet().size() != 2) { errln("*** MSG parse (ustring, count, err) count err."); } else { @@ -1047,7 +1047,7 @@ public void testParseNamedArguments() { } ParsePosition pp = new ParsePosition(0); - Map fmt_map = msg.parseToMap(source, pp); + Map fmt_map = msg.parseToMap(source, pp); if (pp.getIndex()==0 || fmt_map==null) { errln("*** MSG parse (ustring, parsepos., count) error."); } else { @@ -1061,7 +1061,7 @@ public void testParseNamedArguments() { pp.setIndex(0); - Map fmta = (Map) msg.parseObject( source, pp ); + Map fmta = (Map) msg.parseObject( source, pp ); if (pp.getIndex() == 0) { errln("*** MSG parse (ustring, Object, parsepos ) error."); } else { @@ -1229,7 +1229,7 @@ public void testNumericFormatWithMap() { errln("should not use named arguments"); } - Map map12 = new HashMap(); + Map map12 = new HashMap<>(); map12.put("1", "one"); map12.put("2", "two"); @@ -1240,7 +1240,7 @@ public void testNumericFormatWithMap() { } try { - Map mapResult = mf.parseToMap(target); + Map mapResult = mf.parseToMap(target); if (!map12.equals(mapResult)) { errln("expected " + map12 + " but got " + mapResult); } @@ -1248,7 +1248,7 @@ public void testNumericFormatWithMap() { errln("unexpected exception: " + e.getMessage()); } - Map map10 = new HashMap(); + Map map10 = new HashMap<>(); map10.put("1", "one"); map10.put("0", "zero"); target = "X:{2} Y:one"; @@ -1259,7 +1259,7 @@ public void testNumericFormatWithMap() { DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM); DateFormat timeFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM); - Map fmtMap = new HashMap(); + Map fmtMap = new HashMap<>(); fmtMap.put("1", dateFormat); fmtMap.put("2", timeFormat); mf.setFormatsByArgumentName(fmtMap); @@ -1272,7 +1272,7 @@ public void testNumericFormatWithMap() { // expect this } - Map argMap = new HashMap(); + Map argMap = new HashMap<>(); argMap.put("1", date); argMap.put("2", date); target = "X:5:17:00\u202FAM Y:Dec 17, 1990"; @@ -1291,7 +1291,7 @@ public void testNestedFormatsInPluralFormat() { "other {Ce sont # fichiers}} dans la liste.", new ULocale("fr")); Object objArray[] = {0L}; - HashMap objMap = new HashMap(); + HashMap objMap = new HashMap<>(); objMap.put("argument", objArray[0]); String result = msgFmt.format(objArray); if (!result.equals("C'est 0,0 fichier dans la liste.")) { @@ -1316,7 +1316,7 @@ public void testPluralFormat() { "sont # fichiers}} dans la liste.", new ULocale("fr")); Object objArray[] = {0L}; - HashMap objMap = new HashMap(); + HashMap objMap = new HashMap<>(); objMap.put("argument", objArray[0]); String result = mfNum.format(objArray); if (!result.equals(mfAlpha.format(objMap))) { @@ -1339,7 +1339,7 @@ public void testPluralFormat() { "zavodov}} in the directory.", new ULocale("uk")); Object objArray[] = {4L}; - HashMap objMap = new HashMap(); + HashMap objMap = new HashMap<>(); objMap.put("argument", objArray[0]); String result = mfNum.format(objArray); if (!result.equals(mfAlpha.format(objMap))) { @@ -1586,12 +1586,12 @@ public void TestSetFormat() { final SimpleDateFormat dateFormat = new SimpleDateFormat("'year:'yy 'month:'MM 'day:'dd"); dateFormat.setTimeZone(TimeZone.getTimeZone("Etc/GMT")); ms.setFormatByArgumentName("date", dateFormat); - Map map = new HashMap(); + Map map = new HashMap<>(); map.put("number", 1234); map.put("date", new Date(0,0,0)); String result = ms.format(map); assertEquals("setFormatByArgumentName", "1234.000 year:99 month:12 day:31", result); - Set formatNames = ms.getArgumentNames(); + Set formatNames = ms.getArgumentNames(); assertEquals("Format Names match", formatNames, map.keySet()); assertEquals("Decimal", decimalFormat, ms.getFormatByArgumentName("number")); assertEquals("Date", dateFormat, ms.getFormatByArgumentName("date")); @@ -1619,7 +1619,7 @@ public void TestFormatToCharacterIterator() { Object[] args0 = new Object[] { "tmp", new Date(1184777888000L), 15, 2 }; - HashMap args1 = new HashMap(); + HashMap args1 = new HashMap<>(); args1.put("arg0", "tmp"); args1.put("arg1", new Date(1184777888000L)); args1.put("arg2", 15); @@ -1680,12 +1680,12 @@ public void TestFormatToCharacterIterator() { AttributedCharacterIterator expectedAcit = expectedAttributedStrings[i].getIterator(); // Check available attributes - Set attrSet = acit.getAllAttributeKeys(); - Set expectedAttrSet = expectedAcit.getAllAttributeKeys(); + Set attrSet = acit.getAllAttributeKeys(); + Set expectedAttrSet = expectedAcit.getAllAttributeKeys(); if (attrSet.size() != expectedAttrSet.size()) { errln("FAIL: Number of attribute keys is " + attrSet.size() + " expected: " + expectedAttrSet.size()); } - Iterator attrIterator = attrSet.iterator(); + Iterator attrIterator = attrSet.iterator(); while (attrIterator.hasNext()) { AttributedCharacterIterator.Attribute attr = (AttributedCharacterIterator.Attribute) attrIterator .next(); @@ -1708,16 +1708,16 @@ public void TestFormatToCharacterIterator() { buf.append(c); expectedAcit.setIndex(indexExp); - Map attrs = acit.getAttributes(); - Map attrsExp = expectedAcit.getAttributes(); + Map attrs = acit.getAttributes(); + Map attrsExp = expectedAcit.getAttributes(); if (attrs.size() != attrsExp.size()) { errln("FAIL: Number of attributes associated with index " + index + " is " + attrs.size() + " expected: " + attrsExp.size()); } else { // Check all attributes at the index - Iterator entryIterator = attrsExp.entrySet().iterator(); + Iterator> entryIterator = attrsExp.entrySet().iterator(); while (entryIterator.hasNext()) { - Map.Entry entry = (Map.Entry) entryIterator.next(); + Map.Entry entry = entryIterator.next(); if (attrs.containsKey(entry.getKey())) { Object value = attrs.get(entry.getKey()); assertEquals("Attribute value at index " + index, entry.getValue(), value); diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/TimeZoneFormatTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/TimeZoneFormatTest.java index dacde3f74c8a..4b60d594cb5d 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/TimeZoneFormatTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/TimeZoneFormatTest.java @@ -275,10 +275,10 @@ public void TestTimeZoneRoundTrip() { } else { // Specific or generic: raw offset must be preserved. if (inOffsets[0] != outOffsets[0] ) { - if ((LOCALES[locidx].toString().equals("tg") || LOCALES[locidx].toString().equals("tg_TJ")) - && logKnownIssue("ICU-22857", "Time zone round test fails for tg/tg_TJ")) { - continue; - } + if ((LOCALES[locidx].toString().equals("tg") || LOCALES[locidx].toString().equals("tg_TJ")) + && logKnownIssue("ICU-22857", "Time zone round test fails for tg/tg_TJ")) { + continue; + } if (JDKTZ && tzids[tzidx].startsWith("SystemV/")) { // JDK uses rule SystemV for these zones while // ICU handles these zones as aliases of existing time zones @@ -1233,7 +1233,7 @@ public void TestDefaultTimeZoneNames() { long date = System.currentTimeMillis(); TimeZoneNames.Factory factory; try { - Class cls = Class.forName("com.ibm.icu.text.TimeZoneNames$DefaultTimeZoneNames$FactoryImpl"); + Class cls = Class.forName("com.ibm.icu.text.TimeZoneNames$DefaultTimeZoneNames$FactoryImpl"); factory = (Factory) cls.newInstance(); } catch (Exception e) { errln("Could not create class DefaultTimeZoneNames.FactoryImpl: " + e.getClass() + ": " + e.getMessage()); diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/number/NumberFormatterApiTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/number/NumberFormatterApiTest.java index 28dbbe617be6..746e0ebddb1b 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/number/NumberFormatterApiTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/number/NumberFormatterApiTest.java @@ -5900,7 +5900,7 @@ public void validRanges() throws NoSuchMethodException, IllegalAccessException { // We require that the upper bounds all be 999 inclusive. // The lower bound may be either -1, 0, or 1. - Set methodsWithLowerBound1 = new HashSet(); + Set methodsWithLowerBound1 = new HashSet<>(); methodsWithLowerBound1.add("fixedSignificantDigits"); methodsWithLowerBound1.add("minSignificantDigits"); methodsWithLowerBound1.add("maxSignificantDigits"); @@ -5914,7 +5914,7 @@ public void validRanges() throws NoSuchMethodException, IllegalAccessException { // maxFraction // minMaxFraction // zeroFillTo - Set methodsWithLowerBoundN1 = new HashSet(); + Set methodsWithLowerBoundN1 = new HashSet<>(); methodsWithLowerBoundN1.add("truncateAt"); // Some of the methods require an object to be called upon. diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/CompatibilityTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/CompatibilityTest.java index 2ee07bf2db0c..02fb6a231c64 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/CompatibilityTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/CompatibilityTest.java @@ -126,7 +126,7 @@ private List generateClassList() throws IOException { } private List getFileList(URL dataURL) throws IOException { - List classList = new ArrayList(); + List classList = new ArrayList<>(); File topDir = new File(dataURL.getPath()); File dataDirs[] = topDir.listFiles(new FileFilter() { @@ -157,7 +157,7 @@ public boolean accept(File pathname) { } private List getJarList(URL jarURL) throws IOException { - List classList = new ArrayList(); + List classList = new ArrayList<>(); String prefix = jarURL.getPath(); int ix = prefix.indexOf("!/"); @@ -175,7 +175,7 @@ private List getJarList(URL jarURL) throws IOException { JarURLConnection conn = (JarURLConnection) jarURL.openConnection(); jarFile = conn.getJarFile(); - Enumeration entries = jarFile.entries(); + Enumeration entries = jarFile.entries(); while (entries.hasMoreElements()) { JarEntry entry = (JarEntry) entries.nextElement(); if (!entry.isDirectory()) { diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/CoverageTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/CoverageTest.java index 2518fa996459..fc38420e9415 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/CoverageTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/CoverageTest.java @@ -32,7 +32,7 @@ public class CoverageTest extends CoreTestFmwk { @Test @Parameters(method="generateClassList") public void testSerialization(String className) throws ClassNotFoundException, IOException { - Class c = Class.forName(className); + Class c = Class.forName(className); int m = c.getModifiers(); Handler classHandler = SerializableTestUtility.getHandler(className); diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/FormatHandler.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/FormatHandler.java index bb71dd1afd9c..0b51cf532374 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/FormatHandler.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/FormatHandler.java @@ -67,8 +67,8 @@ public class FormatHandler * of ICU4J to another. To guard against this, we store the following canned * data into the test objects we create. */ - static HashMap cannedMonthNames = new HashMap(); - static HashMap cannedShortMonthNames = new HashMap(); + static HashMap cannedMonthNames = new HashMap<>(); + static HashMap cannedShortMonthNames = new HashMap<>(); static String en_CA_MonthNames[] = { "January", @@ -742,7 +742,7 @@ private static SimpleDateFormat getCannedSimpleDateFormat(String pattern, ULocal * of ICU4J to another. To guard against this, we store the following canned * data into the test objects we create. */ - static HashMap cannedDecimalFormatSymbols = new HashMap(); + static HashMap cannedDecimalFormatSymbols = new HashMap<>(); static String en_CA_StringSymbols[] = { "$", @@ -1582,7 +1582,7 @@ public static class RuleBasedNumberFormatHandler extends NumberFormatHandler "%%lenient-parse:\n" + "& ':' = '.' = ' ' = '-';\n"; - HashMap cannedData = new HashMap(); + HashMap cannedData = new HashMap<>(); { cannedData.put("en_CA/SpelloutRules", en_SpelloutRules); @@ -1880,7 +1880,7 @@ public boolean hasSameBehavior(Object a, Object b) public static class DateFormatHandler implements SerializableTestUtility.Handler { - static HashMap cannedPatterns = new HashMap(); + static HashMap cannedPatterns = new HashMap<>(); static Date fixedDate; { diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/SerializableChecker.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/SerializableChecker.java index 16578b768be9..4ad003e85a84 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/SerializableChecker.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/SerializableChecker.java @@ -34,7 +34,7 @@ */ public class SerializableChecker implements URLHandler.URLVisitor { - private static Class serializable; + private static Class serializable; //private static Class throwable; private String path = null; @@ -90,7 +90,7 @@ public void visit(String str) } try { - Class c = Class.forName(className); + Class c = Class.forName(className); int m = c.getModifiers(); if (serializable.isAssignableFrom(c) /*&& @@ -172,10 +172,10 @@ public void visit(String str) public static void main(String[] args) { - List argList = Arrays.asList(args); + List argList = Arrays.asList(args); String path = null; - for (Iterator it = argList.iterator(); it.hasNext(); /*anything?*/) { + for (Iterator it = argList.iterator(); it.hasNext(); /*anything?*/) { String arg = (String) it.next(); if (arg.equals("-w")) { diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/SerializableTestUtility.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/SerializableTestUtility.java index d92b8335cbf7..1c38ac7e265b 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/SerializableTestUtility.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/SerializableTestUtility.java @@ -66,7 +66,7 @@ * Window - Preferences - Java - Code Style - Code Templates */ public class SerializableTestUtility { - private static Class serializable; + private static Class serializable; static { try { serializable = Class.forName("java.io.Serializable"); @@ -772,7 +772,7 @@ public Object[] getTestObjects() { } } - private static HashMap map = new HashMap(); + private static HashMap map = new HashMap<>(); static { map.put("com.ibm.icu.util.TimeZone", new TimeZoneHandler()); @@ -914,7 +914,7 @@ static byte[] copyStreamBytes(InputStream is) throws IOException { } static List getSerializationClassList(Object caller) throws IOException { - List classList = new ArrayList(); + List classList = new ArrayList<>(); Enumeration urlEnum = caller.getClass().getClassLoader().getResources("com/ibm/icu"); while (urlEnum.hasMoreElements()) { URL url = urlEnum.nextElement(); @@ -951,7 +951,7 @@ public void visit(String classPath) { if (className.startsWith("com.ibm.icu.dev.")) { return; } - Class c; + Class c; try { c = Class.forName(className); } catch (ClassNotFoundException e) { diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/CurrencyTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/CurrencyTest.java index 26c0615997bc..c0ea610f448c 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/CurrencyTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/CurrencyTest.java @@ -799,7 +799,7 @@ public void TestGetKeywordValues(){ }; String[] ALL = Currency.getKeywordValuesForLocale("currency", ULocale.getDefault(), false); - HashSet ALLSET = new HashSet(); + HashSet ALLSET = new HashSet<>(); for (int i = 0; i < ALL.length; i++) { ALLSET.add(ALL[i]); } diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/ICUResourceBundleTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/ICUResourceBundleTest.java index 6b270de7cbe5..7a3f92ab5b42 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/ICUResourceBundleTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/ICUResourceBundleTest.java @@ -53,9 +53,9 @@ public void TestGetResources(){ // It does not work well in eclipse plug-in test because of class loader configuration?? // For now, specify resource path explicitly in this test case //Enumeration en = testLoader.getResources("META-INF"); - Enumeration en = testLoader.getResources("com.ibm.icu.dev.data"); + Enumeration en = testLoader.getResources("com.ibm.icu.dev.data"); for(;en.hasMoreElements();) { - URL url = (URL)en.nextElement(); + URL url = en.nextElement(); if (url == null) { warnln("could not load resource data"); return; @@ -903,7 +903,7 @@ class Stub extends UResourceBundle{ @Override protected UResourceBundle getParent() {return null;} @Override - public Enumeration getKeys() {return null;} + public Enumeration getKeys() {return null;} @Override protected Object handleGetObject(String aKey) {return null;} } @@ -965,7 +965,7 @@ public void TestJavaULocaleBundleLoading(){ } //reset the default ULocale.setDefault(defaultLocale); - Enumeration keys = bundle.getKeys(); + Enumeration keys = bundle.getKeys(); int i=0; while(keys.hasMoreElements()){ logln("key: "+ keys.nextElement()); @@ -1198,7 +1198,7 @@ public void TestResourceBundleCrash() { // enrure is that we don't crash with a StackOverflowError when trying to retrieve the bundle } ULocale.setDefault(oldDefaultLocale); - } + } @Test public void TestPersonUnits() { diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/ICUServiceTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/ICUServiceTest.java index e62326712161..9b5bbab819fd 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/ICUServiceTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/ICUServiceTest.java @@ -18,7 +18,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import java.util.SortedMap; @@ -71,7 +70,7 @@ public void confirmIdentical(String message, int lhs, int rhs) { * the locale as the comparator to sort the display names, and null for * the matchID. */ - public SortedMap getDisplayNames(ICUService service) { + public SortedMap getDisplayNames(ICUService service) { ULocale locale = ULocale.getDefault(); Collator col = Collator.getInstance(locale.toLocale()); return service.getDisplayNames(locale, col, null); @@ -82,7 +81,7 @@ public SortedMap getDisplayNames(ICUService service) { * uses the default collator for the locale as the comparator to * sort the display names, and null for the matchID. */ - public SortedMap getDisplayNames(ICUService service, ULocale locale) { + public SortedMap getDisplayNames(ICUService service, ULocale locale) { Collator col = Collator.getInstance(locale.toLocale()); return service.getDisplayNames(locale, col, null); } @@ -91,7 +90,7 @@ public SortedMap getDisplayNames(ICUService service, ULocale locale) { * uses the default collator for the locale as the comparator to * sort the display names. */ - public SortedMap getDisplayNames(ICUService service, ULocale locale, String matchID) { + public SortedMap getDisplayNames(ICUService service, ULocale locale, String matchID) { Collator col = Collator.getInstance(locale.toLocale()); return service.getDisplayNames(locale, col, matchID); } @@ -136,7 +135,7 @@ public void TestAPI() { confirmIdentical("3) en_US_BAR -> en_US", result, singleton0); // get a list of the factories, should be two - List factories = service.factories(); + List factories = service.factories(); confirmIdentical("4) factory size", factories.size(), 2); // register a new object with yet another locale @@ -194,7 +193,7 @@ public void TestAPI() { confirmIdentical("17) get invisible", result, singleton4); // should not be able to locate invisible services - Set ids = service.getVisibleIDs(); + Set ids = service.getVisibleIDs(); confirmBoolean("18) find invisible", !ids.contains("en_US_BAR")); service.reset(); @@ -207,7 +206,7 @@ public Object create(Key key, ICUService unusedService) { } @Override - public void updateVisibleIDs(Map unusedResult) { + public void updateVisibleIDs(Map unusedResult) { } @Override @@ -249,13 +248,13 @@ public String getDisplayName(String id, ULocale l) { // iterate over the visual ids returned by the multiple factory { - Set vids = service.getVisibleIDs(); - Iterator iter = vids.iterator(); + Set vids = service.getVisibleIDs(); + Iterator iter = vids.iterator(); int count = 0; while (iter.hasNext()) { - ++count; - String id = (String)iter.next(); - logln(" " + id + " --> " + service.get(id)); + ++count; + String id = (String)iter.next(); + logln(" " + id + " --> " + service.get(id)); } // four visible ids confirmIdentical("25) visible ids", count, 4); @@ -263,13 +262,13 @@ public String getDisplayName(String id, ULocale l) { // iterate over the display names { - Map dids = getDisplayNames(service, ULocale.GERMANY); - Iterator iter = dids.entrySet().iterator(); + Map dids = getDisplayNames(service, ULocale.GERMANY); + Iterator> iter = dids.entrySet().iterator(); int count = 0; while (iter.hasNext()) { - ++count; - Entry e = (Entry)iter.next(); - logln(" " + e.getKey() + " -- > " + e.getValue()); + ++count; + Map.Entry e = iter.next(); + logln(" " + e.getKey() + " -- > " + e.getValue()); } // four display names, in german confirmIdentical("26) display names", count, 4); @@ -294,13 +293,13 @@ public String getDisplayName(String id, ULocale l) { // this time, we have seven display names // Rad dude's surfer gal 'replaces' later's surfer gal { - Map dids = getDisplayNames(service); - Iterator iter = dids.entrySet().iterator(); + Map dids = getDisplayNames(service); + Iterator> iter = dids.entrySet().iterator(); int count = 0; while (iter.hasNext()) { - ++count; - Entry e = (Entry)iter.next(); - logln(" " + e.getKey() + " --> " + e.getValue()); + ++count; + Map.Entry e = iter.next(); + logln(" " + e.getKey() + " --> " + e.getValue()); } // seven display names, in spanish confirmIdentical("29) display names", count, 7); @@ -372,11 +371,11 @@ public String getDisplayName(String id, ULocale l) { */ { - Set xids = service.getVisibleIDs(); - Iterator iter = xids.iterator(); + Set xids = service.getVisibleIDs(); + Iterator iter = xids.iterator(); while (iter.hasNext()) { - String xid = (String)iter.next(); - logln(xid + "? " + service.get(xid)); + String xid = (String)iter.next(); + logln(xid + "? " + service.get(xid)); } logln("valleygirl? " + service.get("en_US_VALLEY_GIRL")); @@ -426,26 +425,26 @@ public String getDisplayName(String id, ULocale l) { // list the display names in reverse order { logln("display names in reverse order: " + - service.getDisplayNames(ULocale.US, new Comparator() { - @Override + service.getDisplayNames(ULocale.US, new Comparator() { + @Override public int compare(Object lhs, Object rhs) { - return -String.CASE_INSENSITIVE_ORDER.compare((String)lhs, (String)rhs); - } - })); + return -String.CASE_INSENSITIVE_ORDER.compare((String)lhs, (String)rhs); + } + })); } // get all the display names of these resources // this should be fast since the display names were cached. { - logln("service display names for de_DE"); - Map names = getDisplayNames(service, new ULocale("de_DE")); + logln("service display names for de_DE"); + Map names = getDisplayNames(service, new ULocale("de_DE")); StringBuffer buf = new StringBuffer("{"); - Iterator iter = names.entrySet().iterator(); + Iterator> iter = names.entrySet().iterator(); while (iter.hasNext()) { - Entry e = (Entry)iter.next(); - String name = (String)e.getKey(); - String id = (String)e.getValue(); - buf.append("\n " + name + " --> " + id); + Map.Entry e = iter.next(); + String name = e.getKey(); + String id = e.getValue(); + buf.append("\n " + name + " --> " + id); } buf.append("\n}"); logln(buf.toString()); @@ -466,12 +465,12 @@ public int compare(Object lhs, Object rhs) { for (int i = 0; i < idNames.length; ++i) { String idName = idNames[i]; buf.append("\n --- " + idName + " ---"); - Map names = getDisplayNames(service, new ULocale(idName)); - Iterator iter = names.entrySet().iterator(); + Map names = getDisplayNames(service, new ULocale(idName)); + Iterator> iter = names.entrySet().iterator(); while (iter.hasNext()) { - Entry e = (Entry)iter.next(); - String name = (String)e.getKey(); - String id = (String)e.getValue(); + Map.Entry e = iter.next(); + String name = e.getKey(); + String id = e.getValue(); buf.append("\n " + name + " --> " + id); } } @@ -550,13 +549,13 @@ public void serviceChanged(ICUService s) { } static class TestLocaleKeyFactory extends LocaleKeyFactory { - protected final Set ids; + protected final Set ids; protected final String factoryID; public TestLocaleKeyFactory(String[] ids, String factoryID) { super(VISIBLE, factoryID); - this.ids = Collections.unmodifiableSet(new HashSet(Arrays.asList(ids))); + this.ids = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(ids))); this.factoryID = factoryID + ": "; } @@ -566,7 +565,7 @@ protected Object handleCreate(ULocale loc, int kind, ICUService service) { } @Override - protected Set getSupportedIDs() { + protected Set getSupportedIDs() { return ids; } } @@ -626,19 +625,19 @@ static class CalifornioLanguageFactory extends ICUResourceBundleFactory { public static String valley = californio + "_VALLEY"; public static String surfer = californio + "_SURFER"; public static String geek = californio + "_GEEK"; - public static Set supportedIDs; + public static Set supportedIDs; static { - HashSet result = new HashSet(); + HashSet result = new HashSet<>(); result.addAll(ICUResourceBundle.getAvailableLocaleNameSet()); - result.add(californio); - result.add(valley); - result.add(surfer); - result.add(geek); + result.add(californio); + result.add(valley); + result.add(surfer); + result.add(geek); supportedIDs = Collections.unmodifiableSet(result); } @Override - public Set getSupportedIDs() { + public Set getSupportedIDs() { return supportedIDs; } @@ -745,15 +744,13 @@ public void TestLocale() { target = service.get("za_PPP"); confirmEqual("test with ja locale", "japanese", target); - Set ids = service.getVisibleIDs(); - for (Iterator iter = ids.iterator(); iter.hasNext();) { - logln("id: " + iter.next()); + for (String id : service.getVisibleIDs()) { + logln("id: " + id); } ULocale.setDefault(loc); - ids = service.getVisibleIDs(); - for (Iterator iter = ids.iterator(); iter.hasNext();) { - logln("id: " + iter.next()); + for (String id : service.getVisibleIDs()) { + logln("id: " + id); } target = service.get("za_PPP"); @@ -772,8 +769,8 @@ public void TestLocale() { { int n = 0; - List factories = service.factories(); - Iterator iter = factories.iterator(); + List factories = service.factories(); + Iterator iter = factories.iterator(); while (iter.hasNext()) { logln("[" + n++ + "] " + iter.next()); } @@ -783,14 +780,14 @@ public void TestLocale() { // since we're using locale keys, we should get all and only the es locales // hmmm, the default toString function doesn't print in sorted order for TreeMap { - SortedMap map = service.getDisplayNames(ULocale.US, - new Comparator() { - @Override - public int compare(Object lhs, Object rhs) { + SortedMap map = service.getDisplayNames(ULocale.US, + new Comparator() { + @Override + public int compare(Object lhs, Object rhs) { return -String.CASE_INSENSITIVE_ORDER.compare((String)lhs, (String)rhs); - } - }, - "es"); + } + }, + "es"); logln("es display names in reverse order " + map); } @@ -817,7 +814,7 @@ public Object create(Key key, ICUService serviceArg) { } @Override - public void updateVisibleIDs(Map result) { + public void updateVisibleIDs(Map result) { result.put("greeting", this); } @@ -950,13 +947,13 @@ public void TestCoverage() { logln("obj: " + lkf.create(lkey, null)); logln(lkf.getDisplayName("foo", null)); logln(lkf.getDisplayName("bar", null)); - lkf.updateVisibleIDs(new HashMap()); + lkf.updateVisibleIDs(new HashMap<>()); LocaleKeyFactory invisibleLKF = new LKFSubclass(false); logln("obj: " + invisibleLKF.create(lkey, null)); logln(invisibleLKF.getDisplayName("foo", null)); logln(invisibleLKF.getDisplayName("bar", null)); - invisibleLKF.updateVisibleIDs(new HashMap()); + invisibleLKF.updateVisibleIDs(new HashMap<>()); // ResourceBundleFactory ICUResourceBundleFactory rbf = new ICUResourceBundleFactory(); @@ -1027,8 +1024,8 @@ static class LKFSubclass extends LocaleKeyFactory { } @Override - protected Set getSupportedIDs() { - return Collections.EMPTY_SET; + protected Set getSupportedIDs() { + return Collections.emptySet(); } } } diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/LocaleDataTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/LocaleDataTest.java index 473bbff0eb9c..4c82d1fdbbca 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/LocaleDataTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/LocaleDataTest.java @@ -199,7 +199,7 @@ public boolean equals(Object other) { @Test public void TestExemplarSet(){ - HashSet testedExemplars = new HashSet(); + HashSet testedExemplars = new HashSet<>(); int equalCount = 0; for(int i=0; i testedExemplars = new HashSet<>(); for(int i=0; i[] getLocaleParams = new Class[] { ULocale.Type.class }; try { - Class cls = obj.getClass(); + Class cls = obj.getClass(); Method getLocale = cls.getMethod("getLocale", getLocaleParams); ULocale valid = (ULocale) getLocale.invoke(obj, new Object[] { ULocale.VALID_LOCALE }); @@ -1490,12 +1490,12 @@ public void TestDisplayKeyword() { logln("Testing locale " + localeID + " ..."); ULocale loc = new ULocale(localeID); - Iterator it = loc.getKeywords(); - Iterator it2 = ULocale.getKeywords(localeID); + Iterator it = loc.getKeywords(); + Iterator it2 = ULocale.getKeywords(localeID); //it and it2 are not equal here. No way to verify their equivalence yet. while(it.hasNext()) { - String key = (String)it.next(); - String key2 = (String)it2.next(); + String key = it.next(); + String key2 = it2.next(); if (!key.equals(key2)) { errln("FAIL: static and non-static getKeywords returned different results."); } @@ -1678,7 +1678,8 @@ private void initHashtable() { } //Hashtables for storing expected display of keys/types of locale in English and Chinese - private static Map[] h = new Map[2]; + @SuppressWarnings("unchecked") + private static Map[] h = new Map[2]; private static final String ACCEPT_LANGUAGE_TESTS[][] = { /*# result fallback? */ diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/bigdec/DiagBigDecimalTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/bigdec/DiagBigDecimalTest.java index 2395167c627a..f7dd5ce0212d 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/bigdec/DiagBigDecimalTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/bigdec/DiagBigDecimalTest.java @@ -21,7 +21,6 @@ import com.ibm.icu.dev.test.TestFmwk; import com.ibm.icu.dev.test.TestUtil; import com.ibm.icu.dev.test.TestUtil.JavaVendor; -import com.ibm.icu.math.BigDecimal; /* ------------------------------------------------------------------ */ /* Decimal diagnostic tests mfc */ diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/message2/Args.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/message2/Args.java index 6d37d97e5a82..97e971e8c34d 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/message2/Args.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/message2/Args.java @@ -7,8 +7,6 @@ import java.util.HashMap; import java.util.Map; -import com.ibm.icu.message2.MessageFormatter; - /** * Convenience class that provides the same functionality as * Map.of introduced in JDK 11, which can't be used yet for ICU4J. diff --git a/icu4j/main/framework/src/test/java/com/ibm/icu/dev/test/UnicodeKnownIssues.java b/icu4j/main/framework/src/test/java/com/ibm/icu/dev/test/UnicodeKnownIssues.java index 0c4c2c307829..ff9fd382d124 100644 --- a/icu4j/main/framework/src/test/java/com/ibm/icu/dev/test/UnicodeKnownIssues.java +++ b/icu4j/main/framework/src/test/java/com/ibm/icu/dev/test/UnicodeKnownIssues.java @@ -6,7 +6,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -120,7 +119,7 @@ public boolean printKnownIssues(Consumer logFn) { return false; } logFn.accept("\n " + knownIssues.size() + " Known Issues:"); - for (Entry> entry : knownIssues.entrySet()) { + for (Map.Entry> entry : knownIssues.entrySet()) { String ticketLink = entry.getKey(); if (UNICODE_JIRA_PATTERN.matcher(ticketLink) != null) { logFn.accept(ticketLink + " <" + UNICODE_JIRA_BROWSE + ticketLink + ">"); diff --git a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/IncrementalProgressTest.java b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/IncrementalProgressTest.java index 285de0b490a3..e683239fb035 100644 --- a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/IncrementalProgressTest.java +++ b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/IncrementalProgressTest.java @@ -66,12 +66,12 @@ public void CheckIncrementalAux(Transliterator t, String input) { @Test public void TestIncrementalProgress() { - Enumeration targets = Transliterator.getAvailableTargets(this.lang); + Enumeration targets = Transliterator.getAvailableTargets(this.lang); while(targets.hasMoreElements()) { - String target = (String) targets.nextElement(); - Enumeration variants = Transliterator.getAvailableVariants(this.lang, target); + String target = targets.nextElement(); + Enumeration variants = Transliterator.getAvailableVariants(this.lang, target); while(variants.hasMoreElements()) { - String variant = (String) variants.nextElement(); + String variant = variants.nextElement(); String id = this.lang + "-" + target + "/" + variant; logln("id: " + id); diff --git a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/RegexUtilitiesTest.java b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/RegexUtilitiesTest.java index ea0afe876af0..2adcd6e50451 100644 --- a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/RegexUtilitiesTest.java +++ b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/RegexUtilitiesTest.java @@ -184,9 +184,9 @@ public void TestBnf() { String result; if (test.endsWith(".txt")) { java.io.InputStream is = RegexUtilitiesTest.class.getResourceAsStream(test); - List lines; + List lines; try { - lines = UnicodeRegex.appendLines(new ArrayList(), is, "UTF-8"); + lines = UnicodeRegex.appendLines(new ArrayList<>(), is, "UTF-8"); } finally { is.close(); } diff --git a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorDisorderedMarksTest.java b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorDisorderedMarksTest.java index 47be5b3a8d1c..651131a666f6 100644 --- a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorDisorderedMarksTest.java +++ b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorDisorderedMarksTest.java @@ -5,7 +5,6 @@ import java.util.HashMap; import java.util.Map; -import java.util.Map.Entry; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -102,7 +101,7 @@ public static void disorderedMarksAddAll() { } - for (Entry x : leadToSources.entrySet()) { + for (Map.Entry x : leadToSources.entrySet()) { Integer lead = x.getKey(); UnicodeSet sources = x.getValue(); UnicodeSet trailSet = leadToTrail.get(lead); diff --git a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorInstantiateAllTest.java b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorInstantiateAllTest.java index 855182964c05..42c08334a81a 100644 --- a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorInstantiateAllTest.java +++ b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorInstantiateAllTest.java @@ -29,11 +29,11 @@ public class TransliteratorInstantiateAllTest extends TestFmwk { } @Parameterized.Parameters - public static Collection testData() { + public static Collection testData() { ArrayList allTranslitIDs = new ArrayList(); - for (Enumeration e = Transliterator.getAvailableIDs(); e.hasMoreElements(); ) { - String id = (String) e.nextElement(); + for (Enumeration e = Transliterator.getAvailableIDs(); e.hasMoreElements(); ) { + String id = e.nextElement(); allTranslitIDs.add(id); } diff --git a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorTest.java b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorTest.java index 42a364a72196..2971f9407012 100644 --- a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorTest.java +++ b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorTest.java @@ -139,8 +139,8 @@ public void TestRegistry() { checkRegistry("foo3", "::[a-z]; ::NFC; [:letter:] a > b;"); // check compound checkRegistry("foo2", "::NFC; [:letter:] a > b;"); // check compound checkRegistry("foo1", "[:letter:] a > b;"); - for (Enumeration e = Transliterator.getAvailableIDs(); e.hasMoreElements(); ) { - String id = (String) e.nextElement(); + for (Enumeration e = Transliterator.getAvailableIDs(); e.hasMoreElements(); ) { + String id = e.nextElement(); checkRegistry(id); } // Need to remove these test-specific transliterators in order not to interfere with other tests. @@ -1538,25 +1538,25 @@ public Transliterator getInstance(String ignoredID) { @Test public void TestSTV() { - Enumeration es = Transliterator.getAvailableSources(); + Enumeration es = Transliterator.getAvailableSources(); for (int i=0; es.hasMoreElements(); ++i) { - String source = (String) es.nextElement(); + String source = es.nextElement(); logln("" + i + ": " + source); if (source.length() == 0) { errln("FAIL: empty source"); continue; } - Enumeration et = Transliterator.getAvailableTargets(source); + Enumeration et = Transliterator.getAvailableTargets(source); for (int j=0; et.hasMoreElements(); ++j) { - String target = (String) et.nextElement(); + String target = et.nextElement(); logln(" " + j + ": " + target); if (target.length() == 0) { errln("FAIL: empty target"); continue; } - Enumeration ev = Transliterator.getAvailableVariants(source, target); + Enumeration ev = Transliterator.getAvailableVariants(source, target); for (int k=0; ev.hasMoreElements(); ++k) { - String variant = (String) ev.nextElement(); + String variant = ev.nextElement(); if (variant.length() == 0) { logln(" " + k + ": "); } else { @@ -1599,25 +1599,25 @@ public void TestSTV() { } // Make sure getAvailable API reflects removal - for (Enumeration e = Transliterator.getAvailableIDs(); + for (Enumeration e = Transliterator.getAvailableIDs(); e.hasMoreElements(); ) { - String id = (String) e.nextElement(); + String id = e.nextElement(); for (int i=0; i<3; ++i) { if (id.equals(FULL_IDS[i])) { errln("FAIL: unregister(" + id + ") failed"); } } } - for (Enumeration e = Transliterator.getAvailableTargets("Any"); + for (Enumeration e = Transliterator.getAvailableTargets("Any"); e.hasMoreElements(); ) { - String t = (String) e.nextElement(); + String t = e.nextElement(); if (t.equals(IDS[0])) { errln("FAIL: unregister(Any-" + t + ") failed"); } } - for (Enumeration e = Transliterator.getAvailableSources(); + for (Enumeration e = Transliterator.getAvailableSources(); e.hasMoreElements(); ) { - String s = (String) e.nextElement(); + String s = e.nextElement(); for (int i=0; i<3; ++i) { if (SOURCES[i] == null) continue; if (s.equals(SOURCES[i])) { @@ -2545,8 +2545,8 @@ public void TestAnchorMasking() { @Test public void TestScriptAllCodepoints(){ int code; - HashSet scriptIdsChecked = new HashSet(); - HashSet scriptAbbrsChecked = new HashSet(); + HashSet scriptIdsChecked = new HashSet<>(); + HashSet scriptAbbrsChecked = new HashSet<>(); for( int i =0; i <= 0x10ffff; i++){ code = UScript.getScript(i); if(code==UScript.INVALID_CODE){ @@ -2683,7 +2683,7 @@ public void TestSpecialCases() { static class DummyFactory implements Transliterator.Factory { static DummyFactory singleton = new DummyFactory(); - static HashMap m = new HashMap(); + static HashMap m = new HashMap<>(); // Since Transliterators are immutable, we don't have to clone on set & get static void add(String ID, Transliterator t) { @@ -2693,7 +2693,7 @@ static void add(String ID, Transliterator t) { } @Override public Transliterator getInstance(String ID) { - return (Transliterator) m.get(ID); + return m.get(ID); } } @@ -2896,7 +2896,7 @@ public void TestUserFunction() { static class TestUserFunctionFactory implements Transliterator.Factory { static TestUserFunctionFactory singleton = new TestUserFunctionFactory(); - static HashMap m = new HashMap(); + static HashMap m = new HashMap<>(); static void add(String ID, Transliterator t) { m.put(new CaseInsensitiveString(ID), t); @@ -2905,13 +2905,13 @@ static void add(String ID, Transliterator t) { @Override public Transliterator getInstance(String ID) { - return (Transliterator) m.get(new CaseInsensitiveString(ID)); + return m.get(new CaseInsensitiveString(ID)); } static void unregister() { - Iterator ids = m.keySet().iterator(); + Iterator ids = m.keySet().iterator(); while (ids.hasNext()) { - CaseInsensitiveString id = (CaseInsensitiveString) ids.next(); + CaseInsensitiveString id = ids.next(); Transliterator.unregister(id.getString()); ids.remove(); // removes pair from m } diff --git a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/WriteCharts.java b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/WriteCharts.java index 2cb05f3440b1..5504af39b04d 100644 --- a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/WriteCharts.java +++ b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/WriteCharts.java @@ -58,11 +58,11 @@ public static void printSet(String source) { } public static String[] getAllScripts() { - Set set = new TreeSet(); + Set set = new TreeSet<>(); int scripts[]; - Enumeration sources = Transliterator.getAvailableSources(); + Enumeration sources = Transliterator.getAvailableSources(); while(sources.hasMoreElements()) { - String source = (String) sources.nextElement(); + String source = sources.nextElement(); scripts = UScript.getCode(source); if (scripts == null) { System.out.println("[Skipping " + source + "]"); @@ -70,9 +70,9 @@ public static String[] getAllScripts() { } int sourceScript = scripts[0]; System.out.println("Source: " + source + ";\tScripts: " + showScripts(scripts)); - Enumeration targets = Transliterator.getAvailableTargets(source); + Enumeration targets = Transliterator.getAvailableTargets(source); while(targets.hasMoreElements()) { - String target = (String) targets.nextElement(); + String target = targets.nextElement(); scripts = UScript.getCode(target); if (scripts == null || priority(scripts[0]) < priority(sourceScript)) { @@ -81,9 +81,9 @@ public static String[] getAllScripts() { continue; } System.out.println("\tTarget: " + target + ";\tScripts: " + showScripts(scripts)); - Enumeration variants = Transliterator.getAvailableVariants(source, target); + Enumeration variants = Transliterator.getAvailableVariants(source, target); while(variants.hasMoreElements()) { - String variant = (String) variants.nextElement(); + String variant = variants.nextElement(); String id = source + "-" + target; if (variant.length() != 0) { id += "/" + variant; @@ -167,7 +167,7 @@ public static void print(String testSet, String rawId) throws IOException { UnicodeSet leftOverSet = new UnicodeSet(targetSet); UnicodeSet privateUse = new UnicodeSet("[:private use:]"); - Map map = new TreeMap(); + Map map = new TreeMap<>(); UnicodeSet targetSetPlusAnyways = new UnicodeSet(targetSet); targetSetPlusAnyways.addAll(okAnyway); @@ -315,7 +315,7 @@ public static void print(String testSet, String rawId) throws IOException { out.println("

Round Trip

"); out.println(tableHeader); - Iterator it = map.keySet().iterator(); + Iterator it = map.keySet().iterator(); char lastGroup = 0; int count = 0; int column = 0; From 3b85a6c1b2b29d38b6924b562af09e3e941d7c41 Mon Sep 17 00:00:00 2001 From: Robin Leroy Date: Wed, 18 Dec 2024 23:13:01 +0100 Subject: [PATCH 09/24] d not zu --- icu4c/source/test/intltest/rbbitst.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/icu4c/source/test/intltest/rbbitst.cpp b/icu4c/source/test/intltest/rbbitst.cpp index 7d992198fa74..fd72c8e4afd6 100644 --- a/icu4c/source/test/intltest/rbbitst.cpp +++ b/icu4c/source/test/intltest/rbbitst.cpp @@ -3153,7 +3153,7 @@ void RBBILineMonkey::setText(const UnicodeString &s) { if (resolved[i].appliedRule == nullptr) { printf("Failed to resolve at %zu between U+%04X and U+%04X ", i, s.char32At(i-1), s.char32At(i)); if (resolved[i].indexInRemapped.has_value()) { - printf("which is remapped %zu between U+%04X and U+%04X", *resolved[i].indexInRemapped, + printf("which is remapped %d between U+%04X and U+%04X", *resolved[i].indexInRemapped, remapped.char32At(*resolved[i].indexInRemapped - 1), remapped.char32At(*resolved[i].indexInRemapped)); } From 6c3b350aa76908ad3fda6c3f7fda79674210f663 Mon Sep 17 00:00:00 2001 From: Markus Scherer Date: Wed, 18 Dec 2024 14:42:28 -0800 Subject: [PATCH 10/24] ICU-22986 big-endian line brk --- .../ibm/icu/impl/data/icudata/brkitr/line.brk | Bin 73232 -> 73232 bytes .../icu/impl/data/icudata/brkitr/line_cj.brk | Bin 73264 -> 73264 bytes .../impl/data/icudata/brkitr/line_loose.brk | Bin 75384 -> 75392 bytes .../data/icudata/brkitr/line_loose_cj.brk | Bin 80920 -> 80928 bytes .../icudata/brkitr/line_loose_phrase_cj.brk | Bin 86328 -> 86336 bytes .../impl/data/icudata/brkitr/line_normal.brk | Bin 73120 -> 73120 bytes .../data/icudata/brkitr/line_normal_cj.brk | Bin 74216 -> 74224 bytes .../icudata/brkitr/line_normal_phrase_cj.brk | Bin 79416 -> 79424 bytes .../data/icudata/brkitr/line_phrase_cj.brk | Bin 78416 -> 78416 bytes 9 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line.brk index ab4a491c49bd389cf1b519aacf365dfda6aa43e4..fea6eaaf279007b84b7d3a48a606a7b31da82043 100644 GIT binary patch delta 6212 zcmb_g32;pd$5g$wM(7k=zV1D~@AgqxrVk6bWj-(voBt~2@lDs6% zzE;xDADYif9a1PI-zwx=3B9WWf$49aGuR|or! zbbe%zAUn<2&ZshE6B=5B7zfAXaEya?Rn^foU5h1f(xxs?)#j4% z5GB;Np`a9E5QkAD1f{BoGQyl&4x@Ca*}D9Q^`g zxqYfQZ7k9Zs=L^ks_9T`oW8dO-Bm-Y+D2QTmi&t~s3x@Rrh>Il$D4>#s7uCa9mcAl z8N>*wh2&d|(>m2!Djii3`jJdMIpU#zX%$4B*KRG2{LYw>&5vnX&XqR~8nkM*3ngs({?Mane*4 z z@Yu=bD%k~6OLcIWYF)E~LxXg1WR5^;sZJg#E*>dP4YD~MDRX$FG;8Qi9w{!tS&MGr zk#ZSFwrG%Ux_MpM-2Za{)zR`StO@sY=~=b>Xd71OXoda<#vF5#h8p8_)d=A}dJavm`AH1v8NYL^JhY0>j}sI@Yr7v^h_!)yL$+tM|^7K{Jz z1ZxvEgb6<>&R3*vgYWrma3x&DD@&V(My0DZ$nHkez zF-I;DNNut#3zC4W>VvE|{y$*PEX)pSO%93CnuRF3Z!F_mVPuP_)&{Cf0`JQt~kB z+6~s-)+5&MvnFI+oAo3~WSu4nTdr-cZKv&s?aOR$_5yiK_TAYh?GF1q`&Ro)B;n9; zE{Iu1L|QJS>KcMRL(!y!0FTioYS4#oriPf+{w8&=01~q+BIr8 z-L=xSL(E;rUEhl_N#r4)y!j*n?mU|JhTG{L?Ov<4-R^ht^Yh#CcjceLd9g>%|JXCd zP5*H0UCFbh@4;g`BzdjpFg^KNV7%vR?-;?+yUu%G)=BT%VqV}XXeqd};FUsSVN>De z!WWC6sHv!@C~35!uj$b1-_f(LUoHQx_%D4!Ck!w-kvsrD2EL2GDXA0eSYI+-eQz&$ z*(Z~PZ;Wr9?{VLtzsPjE=~2_mrhk}e{i#kmbiyZD4`Wv-$r9^)@YHZFY^;A3{n*V{ zO>W$jD@o_E8zot<$1YE@b~9wmzliPe<4*skkvt4V{@eMQpW^0_*>FTUFP+D&`*51u z<9}Kp@b`RDZK&jDF}xyHk{tT8_h5U`f6D)%|Fr)C+|AYl=0HB{rSohK6@gfwUR|HY z=};YL3oK_VP#XA^)Xzq|S=W;(Y&iyZNaq7v1HFOWfrkUn23`uh1vKz!;H&ICfggjm zU~!g>17K`$bg)st5m^U!sTRo}3$b8JaB*-&a$}wKf^*TBqcH(TCbb%y{e+}Lf z+!yQ%_A?7APzrZ2J6y_45Z;(}CJ!8eRGEWO_XXDVlIIB@UhF-yr_o4lvXZc>+MfsenM`5*nUg)LJTcJ;~ z_k_-deh7~^N7z#^M?{2R7LKFT3S+pEErchsBY49z1vS+-hua;EunWoclJ#cnd`8Uj z)le6*;UwP|UY**Cu4H5XV|*pN(YirBU0J?0dEoR`HnLwt4!Qa0$6EINJbVjxJR^ng zgL^OuC(;vd`(vIh|Gha+V&N!vwD`R>A{t7Y;`8 zZ19i#!oIq_!iGW03(?ej>E_eNPV?MfFi9 zFGx{uG#0JKm8sFoqn+4an_S-<-4XqL^pWV3(dVPbq65*>$@R}Yhdi4+&qpuD%(%NE z=83F|#UslitFW)Zr-|=#uZ=acv&0s$dGu(kJGLoyd+h#LPcl5jkz;_$_F-Vip9w12uH-fJKT8vRL!CvLeI1$=_*4d_*fhaM4L0=%=Hfjk#8~dom(i0Scw_pR zVoASDzfs>yj%u6!AUUc(ssDs-9`w!Ce`RnP$^^hLMT}T)Xf<48*l4&LM~~y9$~Sy& zl#MRA!&rmQY<#+mw;2x@Uo(DYvY1LuWwdFqfzBP&Nv3AxKS76VOx=Ai4DOAyKkmhE O3)Wxrr(YUjuj}9MTLwx1 delta 6177 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 rx9iP=vUr*2E#o4X3YNzYHKK}mx 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 Q{I+2Ib$|Y)5e~cl4PCqj{Qv*} delta 6177 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 diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose.brk index 31c737abf2473a1c78ffca78d7d0f70336f21dfc..5ddccb23944c636e4f09ce2feb4ac72771f55db6 100644 GIT binary patch delta 7250 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 delta 7117 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 UQuq%y{$PI{yt}t+^l<*a0L>s@@&Et; diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose_cj.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose_cj.brk index 0608fb2f4de90a86cd3e6a3948514441eb9acc47..b890ebe13fe1289e82428ec96fcecd87241b3adc 100644 GIT binary patch delta 7500 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 delta 7186 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 diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose_phrase_cj.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose_phrase_cj.brk index bba43a75fc6c08bcf31ada147e2dff82247e11e4..14aa5b32f8d0ad4d1946d6cb3c959777f51c9e4a 100644 GIT binary patch delta 7155 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 delta 7144 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

F$%>p!*~)Hk8P{As=gu4aBo1 zY5nc8HF7spKs^(bW1SQERpfVq8FMZ!=PJ;r*(KkO|9xtrpgi&%Qv4WK+@A`RN#}9J zm!tQ7`XLofr8$av@407t$?ij$Dj-qOqt4DaN#LKFU21jYnrio3+*! zO++`b!W5-VZ+m;S(ShiLyi`RWjXoKD9%*kxKa76n*$^}E^;ljk6swL+iOr5(5lh52 z#cocnZ}ql&3%$!@dt&z@>e<*Mkqfb>*!i%30iQqdeaPuuc9z(uY#!@SiRx7SYL(iX z3>tsy@id`ZTRd{x2XNN!XfC*^>RYFLwQs=qP(emVelC04K0Qq!(PK-!wESdCk*GX;ThIENjh~tFOcerPnk`1GH?^3q zHElNS$I&DBX!1?x%(6L8PMGWPxfGvn^X=wC<`>QXwAd`=mI^xaY$I(xYmh8W$bYH< a*;v*OK7F>TjQy=Ies-|_+TWU?KkwhW8wUgc delta 6202 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 XvHv}&KR(!a_lr&&oX$7xNq_zgI!-MZ delta 6349 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 ZauoA_8R$QP`8f9tKm4uPXWOiO{tcY#NeTb} delta 6283 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 diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_phrase_cj.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_phrase_cj.brk index 3920cf5e5dbacf1429d2c3ddbca66619fe9bbbf0..c627f2f2d60ef586067c228bf95beed83a1060fd 100644 GIT binary patch delta 7924 zcmcIpd303O8Nc6qZM_Pg)So0rHuV*hCF zdGBuD{oU_=>wS~`Cx!hd1(9qy93?J7phJ9QEFoRn%>@5o#BO}o;4_<$1M~3t9U+$g z5c0`(LMG=DkZ|681?!ziliP7#a=i58Mg9Aq@f#l7=LKC$A6mAF%L7FMftKJqHzan?ctsactXNkpBClLRd|Tc-BQ zQxp|MB(IP%q#H>_;ak96w7=x+CO_E0oMzLalyXu4tk*as60;+iiSosg=Qt3RHL{oQ z0h{u4Toxb;>}*~nN!zl~z(KZB@(aJxxV(e|hjOB1lmyxR_yLU>R9ud-Mx4Y!u96gy zDklTg^GM}nnz$B|PK`+?Q4TjFlX=Sd>*LB{u8@O#iq1nGNnTv>kd*@$+q8fUyNGge z4K8r&3kuncn<&y+obf17=@ojwOO&H)Ljp)p#18Bs$?@yzISzctV0hI;CPWyL!BTuE zalfj@V(>!%N+3ugBnlyrA*_}NM9EMx3}R$B83BHRY6KrdAqa6uATxz8M4iJpUBcrT<+uTq7S%B5`Kpw<`Eg~zCRARv zqRcPLg6qf?TA&KuXj8ZyCa|J85==-r(gbuSZO)>#aMnk@MMs*TYCxUG!)kQeVYPm_ zHiPt+@d>j&uGRiJEM?`Tv zfh^nv)7iEM*CYp-wcQoW(q8HuH~J22`SQ zzIhTxUTt3^v^w46Zl;LsP&WY4n)bMC?YtOeR0B>W6D?6W(}@c8lA0TksKD_95>;s# zT}t|8s*IU|IzzVNEWslpDiiIsGDuvJ0w~&RWD)8bISesZL;L~R#>fU!*+v5A0C8&J zfvDLB^O~A@B+NXSEj5pEl&^7QL`M@=>WpgAlE7tv=wgTk8ln*$O?Jqin&>2O8=$!v zTA_w!MCZ}XTVm$zF+iNd%zG{~?>Pok9%kN>wyzOdy>8yOFvNNTL^VM-&;(7*_y3ci zlT)Ah(!#Oa+@j`Yx>tt03uWkR>@x5_?x{xhiW{r+s!)tcdefb#TmEEb`I(YC zjXv|3<QtV!DlZGmq2w^2kH78oFAybu`KN$Nt-V0a-|sObf!UX@!H z;rEQ1CRE#h-QWh(0JpP%zR-Z-8eOEdOr$jil#NWJiGbQ&Na=ULDyH-m1`N|{PbwS@a`l7~)(F(J05!+=cuNlDFy^+AR!?hkE?FeG5NHX*5ak zGe|_4#}MXg{1`0!Sk}^I~mpqd-Fg2ug5};L*g;mS|{3L57Bo6n}$+ zkEIN8nTBW-W@z|8{?yPRfl=sK&d{1QG$Xndx`yvy8aDFn)l9={m_Ak;=wk)b@EzK| zMrduihSxI0HUmUzSt$t)VqGol%y(*g8(AT>E|lOPmetD8?$XeVERf12#or*ZS1>QDA)<3lfOLpD~oe(+scuI%bJyF;u}e? z1%K|Gbhxk`Dq#ibWd&YH)knEvu7OiXFSnQbmLJK_;5YK`^OuBDVX^SEaKt2;=Hc@c zJ|CMTbH2IGyxIJrCEGIH@|fivtJPX-{i*d$>t(S@Tra*MUbKy}t+Vym`m!oWZ&q7Y zXI6LC;nbe(xV2rP9eY)3D8-CAw%-1feV_eG_I257vVTu{v%es{4wqxLV~b;-<7|$U zvw$zpc_QaPt~0kT_o3WBkzS{Xp*U;4hqlN0kn?Tlg}f1Yt!yUmH?(fg+nM)w+Q`oz zxFEka|B?K+UA$|G>j77f>x+U!|M`OEg3VgL;QfLtTATE`5yw4;^g^LqaUUwoFC13b zs+Ok;KlXS$^`1`8K`-yQ;2q*Q;a%j-;=LOSTfIGA-peappMJo3`;uLsZszz_X_V4+ zDp)NwOWQSc=~$61`#{l+TEFPwqTZtKeB*rg`nrAp98xi)ZAkZ!bH&5id~ve^$1Zgq zYvM2X%aZW91?qZJydX#Z7TmVm|BC;#hDK}uW%>?O2kr~}0qc_`a>PZ^Req{59;Pz zs;z_(j2FwFwUHFUJvrO3ycK*j_+)TeIom?7h4zL%%66~? zP!T#ALf*B4-ndnjh^GQ#vLNTnz7%1l{UX;Vm!*1TumyY7+(puB{i8fxo-ePI@1YVD z@Dp<*mBS5GB=V#3)|_qfvvQBTSKETs@*(*+dW&lM@>%&izKxE<&~Q$;Sf>mRLnz-^ z3Pn$4s|jC6+u<458!eoG4xN;?!VANz7_H+ne?dKmZ&Yqwczt+7808#(KHL-j9v|Tk zi*{)ip@D@z!(E44!>3fte^C~s@ORp5x}F}%aZZ3voF2>BAH^zQ#VD{6D&@V{@dP6N zG%2c*wu4P7=xkdl?a29@OI))JSDyB2zq_ip+}Kj*dA(*?lTk zIeu!gHU9txkD=c2xMBhqxl8%{NLYM1az9dTifltlKmM|gya|yVuoW8#X7K?V1?Gq2 zy8}nd+>vhF2k|YtbykEtoO0)S`?Qk3-`khJ9|y-4^X+mqEffYS9plt`18CP|xnR<4@nXA*!-8@(s=e&~}*41c-ANa74-*sNtv>^{Nng z%ZhekBL-2$^QAwkZ^2rwZPAs{bSIe|t+5}+eje+L?TGD6jVGm{-mj$c*q+#aT>W+Iv*@tc*=RgE z4C_nLVQ~wi^YU>ugv5iiAKMbIh);>%9B+!Zt9Gt49DlH1yEEDy-x2R-Bk|YcJ+u{n z9iM&i?)bs@M`}44Yl&@)UtmXwJ5^*34cOm!OJH`Bqm0CxWp_J zTro9*XHHitJ5P&T{8_XapFr1QBf@$2VCCVwyRfR}yzkJ;;eA&R-8jPx&;g@yGRAq| z!fH%{aYElTCNaZcZ=EOBQaa8Q)uP#uUSYIQFRbMog-yb%!XDuh;Tuz-X^d&Esm;`B z>NdU4H}Z|9ujpGVW~(`(wfRPKnexmzDQ2Fg4Vjmi?=^RryS`Vtv47C~HzW?sHh*n# zTZU>2EK{`>tu6JIWtN{q6>Ap83laglgm|329-b|SGfUVIvxZ)z-Jd$+ku+%u4r_Qc}@$Hadti_eWy mR-dzQ;vPIpRp(g~XDdt|J=c_={|MH8ZKCzk7iJeh;eP=h(6`*XI%zm`(qP?0K8)rO__bOet=if_hzaU@$|z}oaw>c?4ioY#`2J%iWa|fn zILE-aLdoTPLUuywZ2j7sxrP$5354t6%V_<2YjOj2Ky+Qx_DmvEnHV4$iGixWX)028_}wyeG9j6& zJLW|f5F^EuNwP>4al-OBB$rsA*8+?1F|$@;tAM;hWN4d-U+WE#Fp02woD{QUqzTq8 z)g+Qt^J`%NQ(7A{RfiOMi>|Q~kY!4msCq|ev|6%ok&jr@^E+U-7Gfnfl0obwlXMXq zRiBNA3>nl;)xXnn$x4$Mi>hEkCRNAXIZ7s3RQ+slrIHD%g-Hdegd9ws{yC_++B#Zt zQgxTLQgQSn^#aIdQ#Du^zLwtEn%*FJbn$kXJDxt}z?oC>5BSZSp_au;x>pPT|(qS}2 z%9y_8R3}{ptz`O^64bYp>3f`1(lDu_)wGNzw?DYdE|VH=`QiMaYx+58?u_4?->M2k9)vBlbYSqKl(#Oo{T0LB? z?_ihp>}v7xPxD*Jn&cy+(g#Ig znci1uG*x}Az@ssAEaQUyJcO|J&R=nF#Q z1Ymuzl7y{|8icY=QM}q7&IEgeC|;CZ$0pGjD1@Z>m0!a7)}=$|S)=E8KuCU~L9f7fF?h zRUkHnUzDl*3QQ450a(Q^Mi~H%oskf28oy9CGqjdzz0fSk2zH?|(|gkWNblg3oeoZD z`u>7b79b25oJ!bKJvyOd>n|+e4aeva9W4VYGVof_<3!?`(F1n~F$Te$8rZ-=M#L{I z$SB#p%!o_y9|WEAFkr)Ig+#3&7N}d1=q!4V71||}Nc!rws=%(Zg zz(5MYTpE~2%&iew;Y4-|&~D*Gp3aGUi$Ds%7?BliQ4v}rC-SWvtxR!r;%Kdmfqpq#^iW7*I&!r z`{=Ru>iGRqI{NmG-*sT_0poWGdlp~-zfF4})IzBT@SgUDhXk4co)^Ysg$(bCWNi}P zw4*fQkKx4cFHYm8W^m%qP|<#=w&27y=;H|0ET$|ivnfPpDx zcsr=uV?xf(=Z0LsvE~b~CTNP?#1#|00v2+`7ICnJVlZ~bH)&@qLc5czwwRysodUGJ zFAsPk-JkGk&yI1TXUCHCVNSm4Fqfte(}IVo9;|cAbQwRnB?2wreS%(OfcFVV;nkn2 zZCvz>f#(VO5&k?;dOuID_z{pou$wh7kr)IV)NFu&15yY!T>}%vC5Shu*#Pkdq!8>@ z4kkhK=Un4B!Dk3MbFhG!Z!pZ~&+YcL0jW0e}>O-JyYr#Aa#qp2O)ax}M89 zz3=AqUM`>lfH8W{(H0eE-t$^P#H+{%^8`rU*|jYPFAPku*nAr4-pOeJ54OljQaCTk=J@#4ykBjNzz3G0re5 z#wX!>AHH1EG}A`YJElzYMDx$hZvJPaO%~Bk< zJ4)p(j>C>@=QQWT&ObR*#F)+JHfW`ew3j@by)XNGc3IAf9NzadmMvsw&gZNnH&++s z<@nr3bNA)Sd1Lb)%^bi)^qg?d_Sj|5dd~`1mq&)Ac6{`<)a^-je6&%LU6qR3aVju! zv9eXsSN=q?c@Jma=+)bgcvIf*y(0?lFX$}zXF+*kb75!Uxx!&Zd_4K=vAI+(O8AoW zQ!|}PxE`1<_pNYsdS3RO_UTAiUSh2}{{#Nt`BUViKQws3;LU^I9b98;v^CpWZ5@zy z+m6~U+A=dTGqTjC;}g`C$1T$243&QBm-gAAD3Bx>3;)hEsq`iOVoH(a+8Mj7Ae1L{ zOHdR`Yj9@1w44FNasoIb0C_p9>GQEHG>_H#CInzk$acWo4Jaux6PtN0OVTq+((9K| zuFIdzJ&{u6zCgR9-SN8PvA`37t%03^Eo{b~z}pO?Tf+7*`f=b4YhTpHD``g18$_fM zS`yp~OY5oGo*D;@7+p`hrP|>5;N;-!;IiP_;JTnnp9<~>wmWtO_Xpn#W&w#YmD7{K zZU)8MHFPt~gnhWnW7H7J4Hbm+feZF-DWSCzbQ6fxg)YF_f3!>t%?vFK-4{X&8cJYo zw8IT(lE*@uL+y^|LtUZ$+Dwj?BJYNdL(k{zhMWz3A8H17kb*xm9pR#|E|Vfd!vIw< z9HDSm4YupTSf2zURrG|RHEm!%Wmb3@8wVa`otN1@3M!{L*M`@H+r#aS7s6fP{XNie z(mUbZUY!y8y2o(UVU|-&^j}N`<@-MKQe+}=MC!BKaI?du$B;LE%QWXwXARwtmT>!h z5gjl^_zva=cu#5MUN9yICEUB9az#w9U2?);o;wErT&{sMD#D3@!&4%2BXB9p)zqmh z^~9+$R?lJZ8bfkNdSFVuv@)W8dNgF);ra=zz9G_%vPDu24*Ct-BAZd&VorL$4Y7yG zHMA9b6ZxHy8k&M>dwQ@m#{fh5&TfyM4&`=x4&_4U@S+yEE`$kTYUqe8%-2zy{AMHp zisM2#4Ys3^fAp|J47>B-;Mn%_?UWrm68YN*jQD{*{MZa}dLAvL(_> z<~W}(dvfBaO@OsG#meJj<2T3W$6K0Nx2|Z4Jk+Dz7VnI1i+5^0ug1Gr?N!JRK<|U((71MYwI8m zdL_;ao?p?4*VNWC-toW}xX6Y^!)im5yut8_VXxr>!?y;PvD!G@*lcVwb{gL@Hpxx$ zS1iXGCW|Rz((6rf!lXWTPKixOcP%j8Z)!Dl^hur2K4SU|h5b{%G3A?wn01Wn(>3gA zG%qs$$ovHKy#n9cZ0wBLV9B>M$<^>pgm1a!am&k=gO<}4yES1QVpTiNmZ^KrIzp4I zhe*#f+xkGCo;DO#Mm_`GuUT~^50O1k-`htNfsXg-`?pn{cW#8b>YQ2HYlXekww*Of YE?e^BbMuRx`u}&ZTnOKbQ@zynUr>jjD*ylh From d03826cdeec4ad3fd0667f00a551e6a46272897b Mon Sep 17 00:00:00 2001 From: Markus Scherer Date: Mon, 9 Dec 2024 16:06:39 -0800 Subject: [PATCH 11/24] ICU-22954 USet C++ iterator return std::u16string --- icu4c/source/common/unicode/uniset.h | 11 ++++--- icu4c/source/common/unicode/uset.h | 44 ++++++++++++++----------- icu4c/source/test/intltest/usettest.cpp | 6 ++-- 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/icu4c/source/common/unicode/uniset.h b/icu4c/source/common/unicode/uniset.h index d070fd631a22..5b32f3ca5d4d 100644 --- a/icu4c/source/common/unicode/uniset.h +++ b/icu4c/source/common/unicode/uniset.h @@ -1173,10 +1173,12 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { inline U_HEADER_NESTED_NAMESPACE::USetStrings strings() const { return U_HEADER_NESTED_NAMESPACE::USetStrings(toUSet()); } +#endif // U_HIDE_DRAFT_API +#ifndef U_HIDE_DRAFT_API /** * Returns a C++ iterator for iterating over all of the elements of this set. - * Convenient all-in one iteration, but creates a UnicodeString for each + * Convenient all-in one iteration, but creates a std::u16string for each * code point or string. * (Similar to how Java UnicodeSet *is an* Iterable<String>.) * @@ -1185,13 +1187,14 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * \code * UnicodeSet set(u"[abcçカ🚴{}{abc}{de}]", errorCode); * for (auto el : set) { + * UnicodeString us(el); * std::string u8; - * printf("set.string length %ld \"%s\"\n", (long)el.length(), el.toUTF8String(u8).c_str()); + * printf("set.string length %ld \"%s\"\n", (long)us.length(), us.toUTF8String(u8).c_str()); * } * \endcode * * @return an all-elements iterator. - * @draft ICU 76 + * @draft ICU 77 * @see end * @see codePoints * @see ranges @@ -1203,7 +1206,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { /** * @return an exclusive-end sentinel for iterating over all of the elements of this set. - * @draft ICU 76 + * @draft ICU 77 * @see begin * @see codePoints * @see ranges diff --git a/icu4c/source/common/unicode/uset.h b/icu4c/source/common/unicode/uset.h index c8f9b5592df2..914c4c4e5ded 100644 --- a/icu4c/source/common/unicode/uset.h +++ b/icu4c/source/common/unicode/uset.h @@ -33,10 +33,11 @@ #include "unicode/uchar.h" #if U_SHOW_CPLUSPLUS_API +#include #include #include "unicode/char16ptr.h" #include "unicode/localpointer.h" -#include "unicode/unistr.h" +#include "unicode/utf16.h" #endif // U_SHOW_CPLUSPLUS_API #ifndef USET_DEFINED @@ -1737,17 +1738,19 @@ class USetStrings { const USet *uset; int32_t count; }; +#endif // U_HIDE_DRAFT_API +#ifndef U_HIDE_DRAFT_API /** * Iterator returned by USetElements. - * @draft ICU 76 + * @draft ICU 77 */ class USetElementIterator { public: - /** @draft ICU 76 */ + /** @draft ICU 77 */ USetElementIterator(const USetElementIterator &other) = default; - /** @draft ICU 76 */ + /** @draft ICU 77 */ bool operator==(const USetElementIterator &other) const { // No need to compare rangeCount & end given private constructor // and assuming we don't compare iterators across the set being modified. @@ -1756,26 +1759,28 @@ class USetElementIterator { return uset == other.uset && c == other.c && index == other.index; } - /** @draft ICU 76 */ + /** @draft ICU 77 */ bool operator!=(const USetElementIterator &other) const { return !operator==(other); } - /** @draft ICU 76 */ - UnicodeString operator*() const { + /** @draft ICU 77 */ + std::u16string operator*() const { if (c >= 0) { - return UnicodeString(c); + return c <= 0xffff ? + std::u16string({static_cast(c)}) : + std::u16string({U16_LEAD(c), U16_TRAIL(c)}); } else if (index < totalCount) { int32_t length; const UChar *uchars = uset_getString(uset, index - rangeCount, &length); // assert uchars != nullptr; - return UnicodeString(uchars, length); + return {ConstChar16Ptr(uchars), static_cast(length)}; } else { - return UnicodeString(); + return {}; } } /** * Pre-increment. - * @draft ICU 76 + * @draft ICU 77 */ USetElementIterator &operator++() { if (c < end) { @@ -1800,7 +1805,7 @@ class USetElementIterator { /** * Post-increment. - * @draft ICU 76 + * @draft ICU 77 */ USetElementIterator operator++(int) { USetElementIterator result(*this); @@ -1840,7 +1845,7 @@ class USetElementIterator { /** * A C++ "range" for iterating over all of the elements of a USet. - * Convenient all-in one iteration, but creates a UnicodeString for each + * Convenient all-in one iteration, but creates a std::u16string for each * code point or string. * * Code points are returned first, then empty and multi-character strings. @@ -1849,15 +1854,16 @@ class USetElementIterator { * using U_HEADER_NESTED_NAMESPACE::USetElements; * LocalUSetPointer uset(uset_openPattern(u"[abcçカ🚴{}{abc}{de}]", -1, &errorCode)); * for (auto el : USetElements(uset.getAlias())) { + * UnicodeString us(el); * std::string u8; - * printf("uset.string length %ld \"%s\"\n", (long)el.length(), el.toUTF8String(u8).c_str()); + * printf("uset.string length %ld \"%s\"\n", (long)us.length(), us.toUTF8String(u8).c_str()); * } * \endcode * * C++ UnicodeSet has member functions for iteration, including begin() and end(). * * @return an all-elements iterator. - * @draft ICU 76 + * @draft ICU 77 * @see USetCodePoints * @see USetRanges * @see USetStrings @@ -1866,21 +1872,21 @@ class USetElements { public: /** * Constructs a C++ "range" object over all of the elements of the USet. - * @draft ICU 76 + * @draft ICU 77 */ USetElements(const USet *uset) : uset(uset), rangeCount(uset_getRangeCount(uset)), stringCount(uset_getStringCount(uset)) {} - /** @draft ICU 76 */ + /** @draft ICU 77 */ USetElements(const USetElements &other) = default; - /** @draft ICU 76 */ + /** @draft ICU 77 */ USetElementIterator begin() const { return USetElementIterator(uset, 0, rangeCount, rangeCount + stringCount); } - /** @draft ICU 76 */ + /** @draft ICU 77 */ USetElementIterator end() const { return USetElementIterator(uset, rangeCount + stringCount, rangeCount, rangeCount + stringCount); } diff --git a/icu4c/source/test/intltest/usettest.cpp b/icu4c/source/test/intltest/usettest.cpp index a53e813ad2f7..477639e86598 100644 --- a/icu4c/source/test/intltest/usettest.cpp +++ b/icu4c/source/test/intltest/usettest.cpp @@ -4448,8 +4448,9 @@ void UnicodeSetTest::TestElementIterator() { UnicodeSet set(u"[abcçカ🚴{}{abc}{de}]", errorCode); UnicodeString result; for (auto el : set) { + // UnicodeString us(el); // std::string u8; - // printf("set.string length %ld \"%s\"\n", (long)el.length(), el.toUTF8String(u8).c_str()); + // printf("set.string length %ld \"%s\"\n", (long)us.length(), us.toUTF8String(u8).c_str()); result.append(u" \"").append(el).append(u'"'); } assertEquals(WHERE, uR"( "a" "b" "c" "ç" "カ" "🚴" "" "abc" "de")", result); @@ -4463,8 +4464,9 @@ void UnicodeSetTest::TestUSetElementIterator() { LocalUSetPointer uset(uset_openPattern(u"[abcçカ🚴{}{abc}{de}]", -1, errorCode)); UnicodeString result; for (auto el : USetElements(uset.getAlias())) { + // UnicodeString us(el); // std::string u8; - // printf("uset.string length %ld \"%s\"\n", (long)el.length(), el.toUTF8String(u8).c_str()); + // printf("uset.string length %ld \"%s\"\n", (long)us.length(), us.toUTF8String(u8).c_str()); result.append(u" \"").append(el).append(u'"'); } assertEquals(WHERE, uR"( "a" "b" "c" "ç" "カ" "🚴" "" "abc" "de")", result); From 8655718531e478428151162313f67432ed28cd9d Mon Sep 17 00:00:00 2001 From: Markus Scherer Date: Mon, 9 Dec 2024 18:42:23 -0800 Subject: [PATCH 12/24] ICU-22954 U_ICU_NAMESPACE_OR_INTERNAL, header-only localpointer header-only parts of char16ptr.h --- icu4c/source/common/unicode/char16ptr.h | 51 ++++++++++++++++++++-- icu4c/source/common/unicode/localpointer.h | 10 ++--- icu4c/source/common/unicode/normlzr.h | 4 +- icu4c/source/common/unicode/unistr.h | 8 ++-- icu4c/source/common/unicode/uset.h | 14 +++--- icu4c/source/common/unicode/uversion.h | 19 +++++++- icu4c/source/i18n/unicode/ucol.h | 4 +- 7 files changed, 84 insertions(+), 26 deletions(-) diff --git a/icu4c/source/common/unicode/char16ptr.h b/icu4c/source/common/unicode/char16ptr.h index daf35cd43ba2..a2722d9f463f 100644 --- a/icu4c/source/common/unicode/char16ptr.h +++ b/icu4c/source/common/unicode/char16ptr.h @@ -9,10 +9,13 @@ #include "unicode/utypes.h" -#if U_SHOW_CPLUSPLUS_API +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API #include #include +#include + +#endif /** * \file @@ -21,8 +24,6 @@ * Also conversion functions from char16_t * to UChar * and OldUChar *. */ -U_NAMESPACE_BEGIN - /** * \def U_ALIASING_BARRIER * Barrier for pointer anti-aliasing optimizations even across function boundaries. @@ -36,6 +37,11 @@ U_NAMESPACE_BEGIN # define U_ALIASING_BARRIER(ptr) #endif +// ICU DLL-exported +#if U_SHOW_CPLUSPLUS_API + +U_NAMESPACE_BEGIN + /** * char16_t * wrapper with implicit conversion from distinct but bit-compatible pointer types. * @stable ICU 59 @@ -251,6 +257,34 @@ const char16_t *ConstChar16Ptr::get() const { return u_.cp; } #endif /// \endcond +U_NAMESPACE_END + +#endif // U_SHOW_CPLUSPLUS_API + +// Usable in header-only definitions +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API + +namespace U_ICU_NAMESPACE_OR_INTERNAL { + +#ifndef U_FORCE_HIDE_INTERNAL_API +/** @internal */ +template>> +inline const char16_t *uprv_char16PtrFromUChar(const T *p) { + if constexpr (std::is_same_v) { + return p; + } else { +#if U_SHOW_CPLUSPLUS_API + return ConstChar16Ptr(p).get(); +#else +#ifdef U_ALIASING_BARRIER + U_ALIASING_BARRIER(p); +#endif + return reinterpret_cast(p); +#endif + } +} +#endif + /** * Converts from const char16_t * to const UChar *. * Includes an aliasing barrier if available. @@ -307,6 +341,15 @@ inline OldUChar *toOldUCharPtr(char16_t *p) { return reinterpret_cast(p); } +} // U_ICU_NAMESPACE_OR_INTERNAL + +#endif // U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API + +// ICU DLL-exported +#if U_SHOW_CPLUSPLUS_API + +U_NAMESPACE_BEGIN + #ifndef U_FORCE_HIDE_INTERNAL_API /** * Is T convertible to a std::u16string_view or some other 16-bit string view? @@ -379,6 +422,6 @@ inline std::u16string_view toU16StringViewNullable(const T& text) { U_NAMESPACE_END -#endif /* U_SHOW_CPLUSPLUS_API */ +#endif // U_SHOW_CPLUSPLUS_API #endif // __CHAR16PTR_H__ diff --git a/icu4c/source/common/unicode/localpointer.h b/icu4c/source/common/unicode/localpointer.h index 9c891bf30885..487ddb48b780 100644 --- a/icu4c/source/common/unicode/localpointer.h +++ b/icu4c/source/common/unicode/localpointer.h @@ -21,7 +21,7 @@ /** * \file - * \brief C++ API: "Smart pointers" for use with and in ICU4C C++ code. + * \brief C++ header-only API: "Smart pointers" for use with and in ICU4C C++ code. * * These classes are inspired by * - std::auto_ptr @@ -40,11 +40,11 @@ #include "unicode/utypes.h" -#if U_SHOW_CPLUSPLUS_API +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API #include -U_NAMESPACE_BEGIN +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * "Smart pointer" base class; do not use directly: use LocalPointer etc. @@ -603,7 +603,7 @@ class LocalOpenPointer : public LocalPointerBase { } // namespace internal #endif -U_NAMESPACE_END +} // U_ICU_NAMESPACE_OR_INTERNAL -#endif /* U_SHOW_CPLUSPLUS_API */ +#endif // U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API #endif /* __LOCALPOINTER_H__ */ diff --git a/icu4c/source/common/unicode/normlzr.h b/icu4c/source/common/unicode/normlzr.h index 0309bce5382d..40848bf00ca4 100644 --- a/icu4c/source/common/unicode/normlzr.h +++ b/icu4c/source/common/unicode/normlzr.h @@ -801,8 +801,8 @@ Normalizer::compare(const UnicodeString &s1, const UnicodeString &s2, uint32_t options, UErrorCode &errorCode) { // all argument checking is done in unorm_compare - return unorm_compare(toUCharPtr(s1.getBuffer()), s1.length(), - toUCharPtr(s2.getBuffer()), s2.length(), + return unorm_compare(U_ICU_NAMESPACE_OR_INTERNAL::toUCharPtr(s1.getBuffer()), s1.length(), + U_ICU_NAMESPACE_OR_INTERNAL::toUCharPtr(s2.getBuffer()), s2.length(), options, &errorCode); } diff --git a/icu4c/source/common/unicode/unistr.h b/icu4c/source/common/unicode/unistr.h index 39d789fd6ef7..a1901c915043 100644 --- a/icu4c/source/common/unicode/unistr.h +++ b/icu4c/source/common/unicode/unistr.h @@ -4676,7 +4676,7 @@ UnicodeString::startsWith(const UnicodeString& srcText, inline UBool UnicodeString::startsWith(ConstChar16Ptr srcChars, int32_t srcLength) const { if(srcLength < 0) { - srcLength = u_strlen(toUCharPtr(srcChars)); + srcLength = u_strlen(U_ICU_NAMESPACE_OR_INTERNAL::toUCharPtr(srcChars)); } return doEqualsSubstring(0, srcLength, srcChars, 0, srcLength); } @@ -4684,7 +4684,7 @@ UnicodeString::startsWith(ConstChar16Ptr srcChars, int32_t srcLength) const { inline UBool UnicodeString::startsWith(const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const { if(srcLength < 0) { - srcLength = u_strlen(toUCharPtr(srcChars)); + srcLength = u_strlen(U_ICU_NAMESPACE_OR_INTERNAL::toUCharPtr(srcChars)); } return doEqualsSubstring(0, srcLength, srcChars, srcStart, srcLength); } @@ -4707,7 +4707,7 @@ inline UBool UnicodeString::endsWith(ConstChar16Ptr srcChars, int32_t srcLength) const { if(srcLength < 0) { - srcLength = u_strlen(toUCharPtr(srcChars)); + srcLength = u_strlen(U_ICU_NAMESPACE_OR_INTERNAL::toUCharPtr(srcChars)); } return doEqualsSubstring(length() - srcLength, srcLength, srcChars, 0, srcLength); } @@ -4717,7 +4717,7 @@ UnicodeString::endsWith(const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const { if(srcLength < 0) { - srcLength = u_strlen(toUCharPtr(srcChars + srcStart)); + srcLength = u_strlen(U_ICU_NAMESPACE_OR_INTERNAL::toUCharPtr(srcChars + srcStart)); } return doEqualsSubstring(length() - srcLength, srcLength, srcChars, srcStart, srcLength); diff --git a/icu4c/source/common/unicode/uset.h b/icu4c/source/common/unicode/uset.h index 914c4c4e5ded..345d62445448 100644 --- a/icu4c/source/common/unicode/uset.h +++ b/icu4c/source/common/unicode/uset.h @@ -32,13 +32,13 @@ #include "unicode/utypes.h" #include "unicode/uchar.h" -#if U_SHOW_CPLUSPLUS_API +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API #include #include #include "unicode/char16ptr.h" #include "unicode/localpointer.h" #include "unicode/utf16.h" -#endif // U_SHOW_CPLUSPLUS_API +#endif #ifndef USET_DEFINED @@ -346,9 +346,9 @@ uset_openPatternOptions(const UChar* pattern, int32_t patternLength, U_CAPI void U_EXPORT2 uset_close(USet* set); -#if U_SHOW_CPLUSPLUS_API +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API -U_NAMESPACE_BEGIN +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUSetPointer @@ -361,7 +361,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUSetPointer, USet, uset_close); -U_NAMESPACE_END +} // U_ICU_NAMESPACE_OR_INTERNAL #endif @@ -1658,7 +1658,7 @@ class USetStringIterator { int32_t length; const UChar *uchars = uset_getString(uset, index, &length); // assert uchars != nullptr; - return {ConstChar16Ptr(uchars), static_cast(length)}; + return {uprv_char16PtrFromUChar(uchars), static_cast(length)}; } return {}; } @@ -1772,7 +1772,7 @@ class USetElementIterator { int32_t length; const UChar *uchars = uset_getString(uset, index - rangeCount, &length); // assert uchars != nullptr; - return {ConstChar16Ptr(uchars), static_cast(length)}; + return {uprv_char16PtrFromUChar(uchars), static_cast(length)}; } else { return {}; } diff --git a/icu4c/source/common/unicode/uversion.h b/icu4c/source/common/unicode/uversion.h index 25d73a3aeb54..a29bf21efda5 100644 --- a/icu4c/source/common/unicode/uversion.h +++ b/icu4c/source/common/unicode/uversion.h @@ -125,7 +125,7 @@ typedef uint8_t UVersionInfo[U_MAX_VERSION_LENGTH]; U_NAMESPACE_USE # endif -#ifndef U_HIDE_DRAFT_API +#ifndef U_FORCE_HIDE_DRAFT_API /** * \def U_HEADER_NESTED_NAMESPACE * Nested namespace used inside U_ICU_NAMESPACE for header-only APIs. @@ -150,22 +150,37 @@ typedef uint8_t UVersionInfo[U_MAX_VERSION_LENGTH]; * @draft ICU 76 */ +/** + * \def U_ICU_NAMESPACE_OR_INTERNAL + * Namespace used for header-only APIs that used to be regular C++ APIs. + * Different when used inside ICU to prevent public use of internal instantiations. + * Similar to U_HEADER_ONLY_NAMESPACE, but the public definition is the same as U_ICU_NAMESPACE. + * "U_ICU_NAMESPACE" or "U_ICU_NAMESPACE::internal". + * + * @draft ICU 77 + */ + // The first test is the same as for defining U_EXPORT for Windows. #if defined(_MSC_VER) || (UPRV_HAS_DECLSPEC_ATTRIBUTE(__dllexport__) && \ UPRV_HAS_DECLSPEC_ATTRIBUTE(__dllimport__)) # define U_HEADER_NESTED_NAMESPACE header +# define U_ICU_NAMESPACE_OR_INTERNAL U_ICU_NAMESPACE #elif defined(U_COMBINED_IMPLEMENTATION) || defined(U_COMMON_IMPLEMENTATION) || \ defined(U_I18N_IMPLEMENTATION) || defined(U_IO_IMPLEMENTATION) || \ defined(U_LAYOUTEX_IMPLEMENTATION) || defined(U_TOOLUTIL_IMPLEMENTATION) # define U_HEADER_NESTED_NAMESPACE internal +# define U_ICU_NAMESPACE_OR_INTERNAL U_ICU_NAMESPACE::internal + namespace U_ICU_NAMESPACE_OR_INTERNAL {} + using namespace U_ICU_NAMESPACE_OR_INTERNAL; #else # define U_HEADER_NESTED_NAMESPACE header +# define U_ICU_NAMESPACE_OR_INTERNAL U_ICU_NAMESPACE #endif #define U_HEADER_ONLY_NAMESPACE U_ICU_NAMESPACE::U_HEADER_NESTED_NAMESPACE namespace U_HEADER_ONLY_NAMESPACE {} -#endif // U_HIDE_DRAFT_API +#endif // U_FORCE_HIDE_DRAFT_API #endif /* __cplusplus */ diff --git a/icu4c/source/i18n/unicode/ucol.h b/icu4c/source/i18n/unicode/ucol.h index ae4f29c3c6c4..8b6dfeaa0a8c 100644 --- a/icu4c/source/i18n/unicode/ucol.h +++ b/icu4c/source/i18n/unicode/ucol.h @@ -1572,8 +1572,8 @@ class Predicate { return compare( ucol_strcoll( collator, - toUCharPtr(lhs.getBuffer()), lhs.length(), - toUCharPtr(rhs.getBuffer()), rhs.length()), + U_ICU_NAMESPACE_OR_INTERNAL::toUCharPtr(lhs.getBuffer()), lhs.length(), + U_ICU_NAMESPACE_OR_INTERNAL::toUCharPtr(rhs.getBuffer()), rhs.length()), result); } From 70409090de817283323e7dc995c3025dcda2c59c Mon Sep 17 00:00:00 2001 From: Markus Scherer Date: Mon, 9 Dec 2024 20:14:08 -0800 Subject: [PATCH 13/24] ICU-22954 make all LocalXyzPointer header-only --- icu4c/source/common/characterproperties.cpp | 4 +-- icu4c/source/common/locavailable.cpp | 3 ++- icu4c/source/common/locdispnames.cpp | 17 +++++++------ icu4c/source/common/locresdata.cpp | 3 ++- icu4c/source/common/locutil.cpp | 3 ++- icu4c/source/common/uloc_tag.cpp | 25 +++++++++---------- icu4c/source/common/unicode/localpointer.h | 3 ++- icu4c/source/common/unicode/ubidi.h | 8 +++--- icu4c/source/common/unicode/ubiditransform.h | 8 +++--- icu4c/source/common/unicode/ubrk.h | 8 +++--- icu4c/source/common/unicode/ucasemap.h | 8 +++--- icu4c/source/common/unicode/ucnv.h | 8 +++--- icu4c/source/common/unicode/ucnvsel.h | 8 +++--- icu4c/source/common/unicode/ucptrie.h | 10 +++----- icu4c/source/common/unicode/udata.h | 10 +++----- icu4c/source/common/unicode/uenum.h | 8 +++--- icu4c/source/common/unicode/uidna.h | 8 +++--- icu4c/source/common/unicode/uldnames.h | 8 +++--- icu4c/source/common/unicode/ulocale.h | 10 +++----- icu4c/source/common/unicode/ulocbuilder.h | 10 +++----- icu4c/source/common/unicode/umutablecptrie.h | 8 +++--- icu4c/source/common/unicode/unorm2.h | 8 +++--- icu4c/source/common/unicode/ures.h | 8 +++--- icu4c/source/common/unicode/uset.h | 4 +-- icu4c/source/common/unicode/usprep.h | 8 +++--- icu4c/source/common/unicode/utext.h | 8 +++--- icu4c/source/i18n/unicode/ucal.h | 8 +++--- icu4c/source/i18n/unicode/ucol.h | 8 +++--- icu4c/source/i18n/unicode/ucsdet.h | 8 +++--- icu4c/source/i18n/unicode/udat.h | 8 +++--- .../source/i18n/unicode/udateintervalformat.h | 8 +++--- icu4c/source/i18n/unicode/udatpg.h | 8 +++--- icu4c/source/i18n/unicode/ufieldpositer.h | 8 +++--- icu4c/source/i18n/unicode/uformattable.h | 8 +++--- icu4c/source/i18n/unicode/uformattednumber.h | 8 +++--- icu4c/source/i18n/unicode/uformattedvalue.h | 8 +++--- icu4c/source/i18n/unicode/ulistformatter.h | 8 +++--- icu4c/source/i18n/unicode/ulocdata.h | 8 +++--- icu4c/source/i18n/unicode/umsg.h | 8 +++--- icu4c/source/i18n/unicode/unum.h | 8 +++--- icu4c/source/i18n/unicode/unumberformatter.h | 8 +++--- .../i18n/unicode/unumberrangeformatter.h | 8 +++--- icu4c/source/i18n/unicode/unumsys.h | 6 ++--- icu4c/source/i18n/unicode/upluralrules.h | 8 +++--- icu4c/source/i18n/unicode/uregex.h | 8 +++--- icu4c/source/i18n/unicode/ureldatefmt.h | 8 +++--- icu4c/source/i18n/unicode/usearch.h | 8 +++--- .../i18n/unicode/usimplenumberformatter.h | 6 ++--- icu4c/source/i18n/unicode/uspoof.h | 10 +++++--- icu4c/source/i18n/unicode/utrans.h | 8 +++--- icu4c/source/io/unicode/ustdio.h | 8 +++--- 51 files changed, 173 insertions(+), 239 deletions(-) diff --git a/icu4c/source/common/characterproperties.cpp b/icu4c/source/common/characterproperties.cpp index 963ac8342151..db42fa4eea70 100644 --- a/icu4c/source/common/characterproperties.cpp +++ b/icu4c/source/common/characterproperties.cpp @@ -24,7 +24,7 @@ #include "umutex.h" #include "uprops.h" -using icu::LocalPointer; +using U_ICU_NAMESPACE_OR_INTERNAL::LocalPointer; #if !UCONFIG_NO_NORMALIZATION using icu::Normalizer2Factory; using icu::Normalizer2Impl; @@ -340,7 +340,7 @@ UnicodeSet *makeSet(UProperty property, UErrorCode &errorCode) { UCPMap *makeMap(UProperty property, UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return nullptr; } uint32_t nullValue = property == UCHAR_SCRIPT ? USCRIPT_UNKNOWN : 0; - icu::LocalUMutableCPTriePointer mutableTrie( + U_ICU_NAMESPACE_OR_INTERNAL::LocalUMutableCPTriePointer mutableTrie( umutablecptrie_open(nullValue, nullValue, &errorCode)); const UnicodeSet *inclusions = icu::CharacterProperties::getInclusionsForProperty(property, errorCode); diff --git a/icu4c/source/common/locavailable.cpp b/icu4c/source/common/locavailable.cpp index 4a2600e88c59..e02ad88a17e9 100644 --- a/icu4c/source/common/locavailable.cpp +++ b/icu4c/source/common/locavailable.cpp @@ -208,7 +208,8 @@ UBool U_CALLCONV uloc_cleanup() { void U_CALLCONV loadInstalledLocales(UErrorCode& status) { ucln_common_registerCleanup(UCLN_COMMON_ULOC, uloc_cleanup); - icu::LocalUResourceBundlePointer rb(ures_openDirect(nullptr, "res_index", &status)); + U_ICU_NAMESPACE_OR_INTERNAL::LocalUResourceBundlePointer rb( + ures_openDirect(nullptr, "res_index", &status)); AvailableLocalesSink sink; ures_getAllItemsWithFallback(rb.getAlias(), "", sink, status); } diff --git a/icu4c/source/common/locdispnames.cpp b/icu4c/source/common/locdispnames.cpp index d3521e879b60..294d8edb8c10 100644 --- a/icu4c/source/common/locdispnames.cpp +++ b/icu4c/source/common/locdispnames.cpp @@ -37,6 +37,9 @@ #include "ureslocs.h" #include "ustr_imp.h" +using U_ICU_NAMESPACE_OR_INTERNAL::LocalUEnumerationPointer; +using U_ICU_NAMESPACE_OR_INTERNAL::LocalUResourceBundlePointer; + // C++ API ----------------------------------------------------------------- *** U_NAMESPACE_BEGIN @@ -313,7 +316,7 @@ _getStringOrCopyKey(const char *path, const char *locale, if(itemKey==nullptr) { /* top-level item: normal resource bundle access */ - icu::LocalUResourceBundlePointer rb(ures_open(path, locale, &errorCode)); + LocalUResourceBundlePointer rb(ures_open(path, locale, &errorCode)); if(U_SUCCESS(errorCode)) { s=ures_getStringByKey(rb.getAlias(), tableKey, &length, &errorCode); @@ -539,9 +542,9 @@ uloc_getDisplayName(const char *locale, { UErrorCode status = U_ZERO_ERROR; - icu::LocalUResourceBundlePointer locbundle( + LocalUResourceBundlePointer locbundle( ures_open(U_ICUDATA_LANG, displayLocale, &status)); - icu::LocalUResourceBundlePointer dspbundle( + LocalUResourceBundlePointer dspbundle( ures_getByKeyWithFallback(locbundle.getAlias(), _kLocaleDisplayPattern, nullptr, &status)); separator=ures_getStringByKeyWithFallback(dspbundle.getAlias(), _kSeparator, &sepLen, &status); @@ -613,7 +616,7 @@ uloc_getDisplayName(const char *locale, int32_t langPos=0; /* position in output of language substitution */ int32_t restLen=0; /* length of 'everything else' substitution */ int32_t restPos=0; /* position in output of 'everything else' substitution */ - icu::LocalUEnumerationPointer kenum; /* keyword enumeration */ + LocalUEnumerationPointer kenum; /* keyword enumeration */ /* prefix of pattern, extremely likely to be empty */ if(sub0Pos) { @@ -855,11 +858,11 @@ uloc_getDisplayKeywordValue( const char* locale, int32_t dispNameLen = 0; const char16_t *dispName = nullptr; - icu::LocalUResourceBundlePointer bundle( + LocalUResourceBundlePointer bundle( ures_open(U_ICUDATA_CURR, displayLocale, status)); - icu::LocalUResourceBundlePointer currencies( + LocalUResourceBundlePointer currencies( ures_getByKey(bundle.getAlias(), _kCurrencies, nullptr, status)); - icu::LocalUResourceBundlePointer currency( + LocalUResourceBundlePointer currency( ures_getByKeyWithFallback(currencies.getAlias(), keywordValue.data(), nullptr, status)); dispName = ures_getStringByIndex(currency.getAlias(), UCURRENCY_DISPLAY_NAME_INDEX, &dispNameLen, status); diff --git a/icu4c/source/common/locresdata.cpp b/icu4c/source/common/locresdata.cpp index 725e66091598..35b7ff3f1e59 100644 --- a/icu4c/source/common/locresdata.cpp +++ b/icu4c/source/common/locresdata.cpp @@ -59,7 +59,8 @@ uloc_getTableStringWithFallback(const char *path, const char *locale, * this falls back through the locale's chain to root */ errorCode=U_ZERO_ERROR; - icu::LocalUResourceBundlePointer rb(ures_open(path, locale, &errorCode)); + U_ICU_NAMESPACE_OR_INTERNAL::LocalUResourceBundlePointer rb( + ures_open(path, locale, &errorCode)); if(U_FAILURE(errorCode)) { /* total failure, not even root could be opened */ diff --git a/icu4c/source/common/locutil.cpp b/icu4c/source/common/locutil.cpp index a257ec593a80..f5623f2fe4ae 100644 --- a/icu4c/source/common/locutil.cpp +++ b/icu4c/source/common/locutil.cpp @@ -233,7 +233,8 @@ LocaleUtility::getAvailableLocaleNames(const UnicodeString& bundleID) CharString cbundleID; cbundleID.appendInvariantChars(bundleID, status); const char* path = cbundleID.isEmpty() ? nullptr : cbundleID.data(); - icu::LocalUEnumerationPointer uenum(ures_openAvailableLocales(path, &status)); + U_ICU_NAMESPACE_OR_INTERNAL::LocalUEnumerationPointer uenum( + ures_openAvailableLocales(path, &status)); for (;;) { const char16_t* id = uenum_unext(uenum.getAlias(), nullptr, &status); if (id == nullptr) { diff --git a/icu4c/source/common/uloc_tag.cpp b/icu4c/source/common/uloc_tag.cpp index 4a5a83a6c548..0678c15c50e5 100644 --- a/icu4c/source/common/uloc_tag.cpp +++ b/icu4c/source/common/uloc_tag.cpp @@ -27,6 +27,9 @@ #include "ulocimp.h" #include "uassert.h" +using U_ICU_NAMESPACE_OR_INTERNAL::LocalPointer; +using U_ICU_NAMESPACE_OR_INTERNAL::LocalUEnumerationPointer; + namespace { /* struct holding a single variant */ @@ -354,10 +357,6 @@ const char* ultag_getLegacy(const ULanguageTag* langtag); #endif -} // namespace - -U_NAMESPACE_BEGIN - /** * \class LocalULanguageTagPointer * "Smart pointer" class, closes a ULanguageTag via ultag_close(). @@ -369,7 +368,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalULanguageTagPointer, ULanguageTag, ultag_close); -U_NAMESPACE_END +} // namespace /* * ------------------------------------------------- @@ -869,7 +868,7 @@ namespace { */ bool -_addVariantToList(VariantListEntry **first, icu::LocalPointer var) { +_addVariantToList(VariantListEntry **first, LocalPointer var) { if (*first == nullptr) { var->next = nullptr; *first = var.orphan(); @@ -1212,7 +1211,7 @@ _appendVariantsToLanguageTag(std::string_view localeID, icu::ByteSink& sink, boo if (_isVariantSubtag(pVar, -1)) { if (uprv_strcmp(pVar, POSIX_VALUE) || buf.length() != static_cast(uprv_strlen(POSIX_VALUE))) { /* emit the variant to the list */ - icu::LocalPointer var(new VariantListEntry, status); + LocalPointer var(new VariantListEntry, status); if (U_FAILURE(status)) { break; } @@ -1284,7 +1283,7 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, bool str icu::MemoryPool extPool; icu::MemoryPool strPool; - icu::LocalUEnumerationPointer keywordEnum(uloc_openKeywords(localeID, &status)); + LocalUEnumerationPointer keywordEnum(uloc_openKeywords(localeID, &status)); if (U_FAILURE(status) && !hadPosix) { return; } @@ -1984,7 +1983,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode& sta char *pSubtag, *pNext, *pLastGoodPosition; int32_t subtagLen; int32_t extlangIdx; - icu::LocalPointer pExtension; + LocalPointer pExtension; char *pExtValueSubtag, *pExtValueSubtagEnd; int32_t i; bool privateuseVar = false; @@ -2011,7 +2010,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode& sta *(tagBuf + tagLen) = 0; /* create a ULanguageTag */ - icu::LocalULanguageTagPointer t( + LocalULanguageTagPointer t( static_cast(uprv_malloc(sizeof(ULanguageTag)))); if (t.isNull()) { uprv_free(tagBuf); @@ -2197,7 +2196,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode& sta if (next & VART) { if (_isVariantSubtag(pSubtag, subtagLen) || (privateuseVar && _isPrivateuseVariantSubtag(pSubtag, subtagLen))) { - icu::LocalPointer var(new VariantListEntry, status); + LocalPointer var(new VariantListEntry, status); if (U_FAILURE(status)) { return nullptr; } @@ -2609,7 +2608,7 @@ ulocimp_toLanguageTag(const char* localeID, int kwdCnt = 0; bool done = false; - icu::LocalUEnumerationPointer kwdEnum(uloc_openKeywords(canonical.data(), &tmpStatus)); + LocalUEnumerationPointer kwdEnum(uloc_openKeywords(canonical.data(), &tmpStatus)); if (U_SUCCESS(tmpStatus)) { kwdCnt = uenum_count(kwdEnum.getAlias(), &tmpStatus); if (kwdCnt == 1) { @@ -2691,7 +2690,7 @@ ulocimp_forLanguageTag(const char* langtag, int32_t i, n; bool noRegion = true; - icu::LocalULanguageTagPointer lt(ultag_parse(langtag, tagLen, parsedLength, status)); + LocalULanguageTagPointer lt(ultag_parse(langtag, tagLen, parsedLength, status)); if (U_FAILURE(status)) { return; } diff --git a/icu4c/source/common/unicode/localpointer.h b/icu4c/source/common/unicode/localpointer.h index 487ddb48b780..1bc4ea6cda6f 100644 --- a/icu4c/source/common/unicode/localpointer.h +++ b/icu4c/source/common/unicode/localpointer.h @@ -548,7 +548,8 @@ class LocalArray : public LocalPointerBase { * @stable ICU 4.4 */ #define U_DEFINE_LOCAL_OPEN_POINTER(LocalPointerClassName, Type, closeFunction) \ - using LocalPointerClassName = internal::LocalOpenPointer + using LocalPointerClassName = \ + U_ICU_NAMESPACE_OR_INTERNAL::internal::LocalOpenPointer #ifndef U_IN_DOXYGEN namespace internal { diff --git a/icu4c/source/common/unicode/ubidi.h b/icu4c/source/common/unicode/ubidi.h index 536f4172bc20..93b2612c8c86 100644 --- a/icu4c/source/common/unicode/ubidi.h +++ b/icu4c/source/common/unicode/ubidi.h @@ -563,9 +563,8 @@ ubidi_openSized(int32_t maxLength, int32_t maxRunCount, UErrorCode *pErrorCode); U_CAPI void U_EXPORT2 ubidi_close(UBiDi *pBiDi); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUBiDiPointer @@ -578,8 +577,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUBiDiPointer, UBiDi, ubidi_close); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/common/unicode/ubiditransform.h b/icu4c/source/common/unicode/ubiditransform.h index 24433aa8aca0..77d64899313a 100644 --- a/icu4c/source/common/unicode/ubiditransform.h +++ b/icu4c/source/common/unicode/ubiditransform.h @@ -304,9 +304,8 @@ ubiditransform_open(UErrorCode *pErrorCode); U_CAPI void U_EXPORT2 ubiditransform_close(UBiDiTransform *pBidiTransform); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUBiDiTransformPointer @@ -319,8 +318,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUBiDiTransformPointer, UBiDiTransform, ubiditransform_close); -U_NAMESPACE_END - +} #endif #endif diff --git a/icu4c/source/common/unicode/ubrk.h b/icu4c/source/common/unicode/ubrk.h index 2b3dc7aa5768..ba6597a0e14d 100644 --- a/icu4c/source/common/unicode/ubrk.h +++ b/icu4c/source/common/unicode/ubrk.h @@ -356,9 +356,8 @@ ubrk_clone(const UBreakIterator *bi, U_CAPI void U_EXPORT2 ubrk_close(UBreakIterator *bi); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUBreakIteratorPointer @@ -371,8 +370,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUBreakIteratorPointer, UBreakIterator, ubrk_close); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/common/unicode/ucasemap.h b/icu4c/source/common/unicode/ucasemap.h index 4b623e691071..c84401611b14 100644 --- a/icu4c/source/common/unicode/ucasemap.h +++ b/icu4c/source/common/unicode/ucasemap.h @@ -83,9 +83,8 @@ ucasemap_open(const char *locale, uint32_t options, UErrorCode *pErrorCode); U_CAPI void U_EXPORT2 ucasemap_close(UCaseMap *csm); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUCaseMapPointer @@ -98,8 +97,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUCaseMapPointer, UCaseMap, ucasemap_close); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/common/unicode/ucnv.h b/icu4c/source/common/unicode/ucnv.h index 4a7972c95b75..b8d04d8e62e4 100644 --- a/icu4c/source/common/unicode/ucnv.h +++ b/icu4c/source/common/unicode/ucnv.h @@ -581,9 +581,8 @@ ucnv_safeClone(const UConverter *cnv, U_CAPI void U_EXPORT2 ucnv_close(UConverter * converter); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUConverterPointer @@ -596,8 +595,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUConverterPointer, UConverter, ucnv_close); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/common/unicode/ucnvsel.h b/icu4c/source/common/unicode/ucnvsel.h index 9373ec951bf8..2921a6da6b68 100644 --- a/icu4c/source/common/unicode/ucnvsel.h +++ b/icu4c/source/common/unicode/ucnvsel.h @@ -97,9 +97,8 @@ ucnvsel_open(const char* const* converterList, int32_t converterListSize, U_CAPI void U_EXPORT2 ucnvsel_close(UConverterSelector *sel); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUConverterSelectorPointer @@ -112,8 +111,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUConverterSelectorPointer, UConverterSelector, ucnvsel_close); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/common/unicode/ucptrie.h b/icu4c/source/common/unicode/ucptrie.h index dadef79c5120..710b393dfcd6 100644 --- a/icu4c/source/common/unicode/ucptrie.h +++ b/icu4c/source/common/unicode/ucptrie.h @@ -623,9 +623,8 @@ U_CDECL_END #endif // U_IN_DOXYGEN -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUCPTriePointer @@ -638,8 +637,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUCPTriePointer, UCPTrie, ucptrie_close); -U_NAMESPACE_END - -#endif // U_SHOW_CPLUSPLUS_API +} +#endif #endif diff --git a/icu4c/source/common/unicode/udata.h b/icu4c/source/common/unicode/udata.h index 4cda255010ad..e969f6aca4b3 100644 --- a/icu4c/source/common/unicode/udata.h +++ b/icu4c/source/common/unicode/udata.h @@ -418,9 +418,8 @@ udata_setFileAccess(UDataFileAccess access, UErrorCode *status); U_CDECL_END -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUDataMemoryPointer @@ -433,8 +432,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUDataMemoryPointer, UDataMemory, udata_close); -U_NAMESPACE_END - -#endif // U_SHOW_CPLUSPLUS_API +} +#endif #endif diff --git a/icu4c/source/common/unicode/uenum.h b/icu4c/source/common/unicode/uenum.h index d9c893e06d92..89997bd32dc7 100644 --- a/icu4c/source/common/unicode/uenum.h +++ b/icu4c/source/common/unicode/uenum.h @@ -53,9 +53,8 @@ typedef struct UEnumeration UEnumeration; U_CAPI void U_EXPORT2 uenum_close(UEnumeration* en); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUEnumerationPointer @@ -68,8 +67,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUEnumerationPointer, UEnumeration, uenum_close); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/common/unicode/uidna.h b/icu4c/source/common/unicode/uidna.h index 362a2dcbe65a..f6647ab48e28 100644 --- a/icu4c/source/common/unicode/uidna.h +++ b/icu4c/source/common/unicode/uidna.h @@ -171,9 +171,8 @@ uidna_openUTS46(uint32_t options, UErrorCode *pErrorCode); U_CAPI void U_EXPORT2 uidna_close(UIDNA *idna); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUIDNAPointer @@ -186,8 +185,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUIDNAPointer, UIDNA, uidna_close); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/common/unicode/uldnames.h b/icu4c/source/common/unicode/uldnames.h index 47b047ece97b..174f14666e24 100644 --- a/icu4c/source/common/unicode/uldnames.h +++ b/icu4c/source/common/unicode/uldnames.h @@ -81,9 +81,8 @@ uldn_open(const char * locale, U_CAPI void U_EXPORT2 uldn_close(ULocaleDisplayNames *ldn); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalULocaleDisplayNamesPointer @@ -96,8 +95,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalULocaleDisplayNamesPointer, ULocaleDisplayNames, uldn_close); -U_NAMESPACE_END - +} #endif /* getters for state */ diff --git a/icu4c/source/common/unicode/ulocale.h b/icu4c/source/common/unicode/ulocale.h index 1b3af3a5f26d..9bf91a426572 100644 --- a/icu4c/source/common/unicode/ulocale.h +++ b/icu4c/source/common/unicode/ulocale.h @@ -204,9 +204,8 @@ ulocale_getUnicodeKeywordValue( const ULocale* locale, const char* keyword, int32_t keywordLength, char* valueBuffer, int32_t valueBufferCapacity, UErrorCode *err); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalULocalePointer @@ -219,8 +218,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalULocalePointer, ULocale, ulocale_close); -U_NAMESPACE_END - -#endif /* U_SHOW_CPLUSPLUS_API */ +} +#endif #endif /*_ULOCALE */ diff --git a/icu4c/source/common/unicode/ulocbuilder.h b/icu4c/source/common/unicode/ulocbuilder.h index ce61995bde62..18f8c7ea9244 100644 --- a/icu4c/source/common/unicode/ulocbuilder.h +++ b/icu4c/source/common/unicode/ulocbuilder.h @@ -415,9 +415,8 @@ ulocbld_buildLanguageTag(ULocaleBuilder* builder, char* language, U_CAPI UBool U_EXPORT2 ulocbld_copyErrorTo(const ULocaleBuilder* builder, UErrorCode *outErrorCode); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalULocaleBuilderPointer @@ -430,8 +429,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalULocaleBuilderPointer, ULocaleBuilder, ulocbld_close); -U_NAMESPACE_END - -#endif /* U_SHOW_CPLUSPLUS_API */ +} +#endif #endif // __ULOCBUILDER_H__ diff --git a/icu4c/source/common/unicode/umutablecptrie.h b/icu4c/source/common/unicode/umutablecptrie.h index d60fd618191c..4740e04d7ac1 100644 --- a/icu4c/source/common/unicode/umutablecptrie.h +++ b/icu4c/source/common/unicode/umutablecptrie.h @@ -218,9 +218,8 @@ umutablecptrie_buildImmutable(UMutableCPTrie *trie, UCPTrieType type, UCPTrieVal U_CDECL_END -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUMutableCPTriePointer @@ -233,8 +232,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUMutableCPTriePointer, UMutableCPTrie, umutablecptrie_close); -U_NAMESPACE_END - +} #endif #endif diff --git a/icu4c/source/common/unicode/unorm2.h b/icu4c/source/common/unicode/unorm2.h index 48f614d74fbf..3fc4fd14bf2d 100644 --- a/icu4c/source/common/unicode/unorm2.h +++ b/icu4c/source/common/unicode/unorm2.h @@ -268,9 +268,8 @@ unorm2_openFiltered(const UNormalizer2 *norm2, const USet *filterSet, UErrorCode U_CAPI void U_EXPORT2 unorm2_close(UNormalizer2 *norm2); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUNormalizer2Pointer @@ -283,8 +282,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUNormalizer2Pointer, UNormalizer2, unorm2_close); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/common/unicode/ures.h b/icu4c/source/common/unicode/ures.h index babc01d426a6..c8cdecd6a4ea 100644 --- a/icu4c/source/common/unicode/ures.h +++ b/icu4c/source/common/unicode/ures.h @@ -252,9 +252,8 @@ ures_countArrayItems(const UResourceBundle* resourceBundle, U_CAPI void U_EXPORT2 ures_close(UResourceBundle* resourceBundle); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUResourceBundlePointer @@ -267,8 +266,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUResourceBundlePointer, UResourceBundle, ures_close); -U_NAMESPACE_END - +} #endif #ifndef U_HIDE_DEPRECATED_API diff --git a/icu4c/source/common/unicode/uset.h b/icu4c/source/common/unicode/uset.h index 345d62445448..c0ab617eccbf 100644 --- a/icu4c/source/common/unicode/uset.h +++ b/icu4c/source/common/unicode/uset.h @@ -347,7 +347,6 @@ U_CAPI void U_EXPORT2 uset_close(USet* set); #if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API - namespace U_ICU_NAMESPACE_OR_INTERNAL { /** @@ -361,8 +360,7 @@ namespace U_ICU_NAMESPACE_OR_INTERNAL { */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUSetPointer, USet, uset_close); -} // U_ICU_NAMESPACE_OR_INTERNAL - +} #endif /** diff --git a/icu4c/source/common/unicode/usprep.h b/icu4c/source/common/unicode/usprep.h index f8a0f58e0de2..d9c3e3d00dc0 100644 --- a/icu4c/source/common/unicode/usprep.h +++ b/icu4c/source/common/unicode/usprep.h @@ -212,9 +212,8 @@ usprep_openByType(UStringPrepProfileType type, U_CAPI void U_EXPORT2 usprep_close(UStringPrepProfile* profile); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUStringPrepProfilePointer @@ -227,8 +226,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUStringPrepProfilePointer, UStringPrepProfile, usprep_close); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/common/unicode/utext.h b/icu4c/source/common/unicode/utext.h index 423b281631db..c0189feb5d39 100644 --- a/icu4c/source/common/unicode/utext.h +++ b/icu4c/source/common/unicode/utext.h @@ -1580,9 +1580,8 @@ enum { U_CDECL_END -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUTextPointer @@ -1595,8 +1594,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUTextPointer, UText, utext_close); -U_NAMESPACE_END - +} #endif diff --git a/icu4c/source/i18n/unicode/ucal.h b/icu4c/source/i18n/unicode/ucal.h index d9bce21419a1..1677762584b4 100644 --- a/icu4c/source/i18n/unicode/ucal.h +++ b/icu4c/source/i18n/unicode/ucal.h @@ -787,9 +787,8 @@ ucal_open(const UChar* zoneID, U_CAPI void U_EXPORT2 ucal_close(UCalendar *cal); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUCalendarPointer @@ -802,8 +801,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUCalendarPointer, UCalendar, ucal_close); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/i18n/unicode/ucol.h b/icu4c/source/i18n/unicode/ucol.h index 8b6dfeaa0a8c..d5a6dafc9a97 100644 --- a/icu4c/source/i18n/unicode/ucol.h +++ b/icu4c/source/i18n/unicode/ucol.h @@ -537,9 +537,8 @@ ucol_getContractionsAndExpansions( const UCollator *coll, U_CAPI void U_EXPORT2 ucol_close(UCollator *coll); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUCollatorPointer @@ -552,8 +551,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUCollatorPointer, UCollator, ucol_close); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/i18n/unicode/ucsdet.h b/icu4c/source/i18n/unicode/ucsdet.h index 8c62fde9d2ee..41af6a66a476 100644 --- a/icu4c/source/i18n/unicode/ucsdet.h +++ b/icu4c/source/i18n/unicode/ucsdet.h @@ -93,9 +93,8 @@ ucsdet_open(UErrorCode *status); U_CAPI void U_EXPORT2 ucsdet_close(UCharsetDetector *ucsd); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUCharsetDetectorPointer @@ -108,8 +107,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUCharsetDetectorPointer, UCharsetDetector, ucsdet_close); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/i18n/unicode/udat.h b/icu4c/source/i18n/unicode/udat.h index 3823dc88c4fa..b6320ec23ef5 100644 --- a/icu4c/source/i18n/unicode/udat.h +++ b/icu4c/source/i18n/unicode/udat.h @@ -1006,9 +1006,8 @@ typedef enum UDateFormatHourCycle { UDAT_HOUR_CYCLE_24 } UDateFormatHourCycle; -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUDateFormatPointer @@ -1021,8 +1020,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUDateFormatPointer, UDateFormat, udat_close); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/i18n/unicode/udateintervalformat.h b/icu4c/source/i18n/unicode/udateintervalformat.h index 8439444d0796..061df7fcd762 100644 --- a/icu4c/source/i18n/unicode/udateintervalformat.h +++ b/icu4c/source/i18n/unicode/udateintervalformat.h @@ -182,9 +182,8 @@ U_CAPI void U_EXPORT2 udtitvfmt_closeResult(UFormattedDateInterval* uresult); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUDateIntervalFormatPointer @@ -208,8 +207,7 @@ U_DEFINE_LOCAL_OPEN_POINTER(LocalUDateIntervalFormatPointer, UDateIntervalFormat */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUFormattedDateIntervalPointer, UFormattedDateInterval, udtitvfmt_closeResult); -U_NAMESPACE_END - +} #endif diff --git a/icu4c/source/i18n/unicode/udatpg.h b/icu4c/source/i18n/unicode/udatpg.h index 1d3060350ec0..c553781813b2 100644 --- a/icu4c/source/i18n/unicode/udatpg.h +++ b/icu4c/source/i18n/unicode/udatpg.h @@ -185,9 +185,8 @@ udatpg_openEmpty(UErrorCode *pErrorCode); U_CAPI void U_EXPORT2 udatpg_close(UDateTimePatternGenerator *dtpg); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUDateTimePatternGeneratorPointer @@ -200,8 +199,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUDateTimePatternGeneratorPointer, UDateTimePatternGenerator, udatpg_close); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/i18n/unicode/ufieldpositer.h b/icu4c/source/i18n/unicode/ufieldpositer.h index 83df184f0a59..d41bc6f99227 100644 --- a/icu4c/source/i18n/unicode/ufieldpositer.h +++ b/icu4c/source/i18n/unicode/ufieldpositer.h @@ -67,9 +67,8 @@ U_CAPI void U_EXPORT2 ufieldpositer_close(UFieldPositionIterator *fpositer); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUFieldPositionIteratorPointer @@ -82,8 +81,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUFieldPositionIteratorPointer, UFieldPositionIterator, ufieldpositer_close); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/i18n/unicode/uformattable.h b/icu4c/source/i18n/unicode/uformattable.h index 4c4a307a24b4..e282fa76749a 100644 --- a/icu4c/source/i18n/unicode/uformattable.h +++ b/icu4c/source/i18n/unicode/uformattable.h @@ -93,9 +93,8 @@ ufmt_open(UErrorCode* status); U_CAPI void U_EXPORT2 ufmt_close(UFormattable* fmt); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUFormattablePointer @@ -108,8 +107,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUFormattablePointer, UFormattable, ufmt_close); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/i18n/unicode/uformattednumber.h b/icu4c/source/i18n/unicode/uformattednumber.h index 174a040a0833..8518c5124dea 100644 --- a/icu4c/source/i18n/unicode/uformattednumber.h +++ b/icu4c/source/i18n/unicode/uformattednumber.h @@ -196,8 +196,8 @@ U_CAPI void U_EXPORT2 unumf_closeResult(UFormattedNumber* uresult); -#if U_SHOW_CPLUSPLUS_API -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUFormattedNumberPointer @@ -216,8 +216,8 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUFormattedNumberPointer, UFormattedNumber, unumf_closeResult); -U_NAMESPACE_END -#endif // U_SHOW_CPLUSPLUS_API +} +#endif #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icu4c/source/i18n/unicode/uformattedvalue.h b/icu4c/source/i18n/unicode/uformattedvalue.h index af6d18f3bc99..2d8b551be5d8 100644 --- a/icu4c/source/i18n/unicode/uformattedvalue.h +++ b/icu4c/source/i18n/unicode/uformattedvalue.h @@ -418,8 +418,8 @@ ufmtval_nextPosition( UErrorCode* ec); -#if U_SHOW_CPLUSPLUS_API -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUConstrainedFieldPositionPointer @@ -437,8 +437,8 @@ U_DEFINE_LOCAL_OPEN_POINTER(LocalUConstrainedFieldPositionPointer, UConstrainedFieldPosition, ucfpos_close); -U_NAMESPACE_END -#endif // U_SHOW_CPLUSPLUS_API +} +#endif #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icu4c/source/i18n/unicode/ulistformatter.h b/icu4c/source/i18n/unicode/ulistformatter.h index 8334c7852f0c..b1f4c6b5e682 100644 --- a/icu4c/source/i18n/unicode/ulistformatter.h +++ b/icu4c/source/i18n/unicode/ulistformatter.h @@ -220,9 +220,8 @@ U_CAPI void U_EXPORT2 ulistfmt_closeResult(UFormattedList* uresult); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUListFormatterPointer @@ -246,8 +245,7 @@ U_DEFINE_LOCAL_OPEN_POINTER(LocalUListFormatterPointer, UListFormatter, ulistfmt */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUFormattedListPointer, UFormattedList, ulistfmt_closeResult); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/i18n/unicode/ulocdata.h b/icu4c/source/i18n/unicode/ulocdata.h index 3647df9596ae..c6e9000f6ad1 100644 --- a/icu4c/source/i18n/unicode/ulocdata.h +++ b/icu4c/source/i18n/unicode/ulocdata.h @@ -102,9 +102,8 @@ ulocdata_open(const char *localeID, UErrorCode *status); U_CAPI void U_EXPORT2 ulocdata_close(ULocaleData *uld); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalULocaleDataPointer @@ -117,8 +116,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalULocaleDataPointer, ULocaleData, ulocdata_close); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/i18n/unicode/umsg.h b/icu4c/source/i18n/unicode/umsg.h index c955dc18ac4d..fb3cdf77e7fd 100644 --- a/icu4c/source/i18n/unicode/umsg.h +++ b/icu4c/source/i18n/unicode/umsg.h @@ -415,9 +415,8 @@ umsg_open( const UChar *pattern, U_CAPI void U_EXPORT2 umsg_close(UMessageFormat* format); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUMessageFormatPointer @@ -430,8 +429,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUMessageFormatPointer, UMessageFormat, umsg_close); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/i18n/unicode/unum.h b/icu4c/source/i18n/unicode/unum.h index 2dd2badc1bd7..65aec8cbab00 100644 --- a/icu4c/source/i18n/unicode/unum.h +++ b/icu4c/source/i18n/unicode/unum.h @@ -444,9 +444,8 @@ unum_open( UNumberFormatStyle style, U_CAPI void U_EXPORT2 unum_close(UNumberFormat* fmt); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUNumberFormatPointer @@ -459,8 +458,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUNumberFormatPointer, UNumberFormat, unum_close); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/i18n/unicode/unumberformatter.h b/icu4c/source/i18n/unicode/unumberformatter.h index 09fa000b826b..27c95ed59cf5 100644 --- a/icu4c/source/i18n/unicode/unumberformatter.h +++ b/icu4c/source/i18n/unicode/unumberformatter.h @@ -549,8 +549,8 @@ unumf_close(UNumberFormatter* uformatter); -#if U_SHOW_CPLUSPLUS_API -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUNumberFormatterPointer @@ -569,8 +569,8 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUNumberFormatterPointer, UNumberFormatter, unumf_close); -U_NAMESPACE_END -#endif // U_SHOW_CPLUSPLUS_API +} +#endif #endif /* #if !UCONFIG_NO_FORMATTING */ #endif //__UNUMBERFORMATTER_H__ diff --git a/icu4c/source/i18n/unicode/unumberrangeformatter.h b/icu4c/source/i18n/unicode/unumberrangeformatter.h index 106942f25af0..3a58b4d72129 100644 --- a/icu4c/source/i18n/unicode/unumberrangeformatter.h +++ b/icu4c/source/i18n/unicode/unumberrangeformatter.h @@ -426,8 +426,8 @@ U_CAPI void U_EXPORT2 unumrf_closeResult(UFormattedNumberRange* uresult); -#if U_SHOW_CPLUSPLUS_API -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUNumberRangeFormatterPointer @@ -464,8 +464,8 @@ U_DEFINE_LOCAL_OPEN_POINTER(LocalUNumberRangeFormatterPointer, UNumberRangeForma */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUFormattedNumberRangePointer, UFormattedNumberRange, unumrf_closeResult); -U_NAMESPACE_END -#endif // U_SHOW_CPLUSPLUS_API +} +#endif #endif /* #if !UCONFIG_NO_FORMATTING */ #endif //__UNUMBERRANGEFORMATTER_H__ diff --git a/icu4c/source/i18n/unicode/unumsys.h b/icu4c/source/i18n/unicode/unumsys.h index fe713ea77a6c..ad4f548ac73d 100644 --- a/icu4c/source/i18n/unicode/unumsys.h +++ b/icu4c/source/i18n/unicode/unumsys.h @@ -89,8 +89,8 @@ unumsys_openByName(const char *name, UErrorCode *status); U_CAPI void U_EXPORT2 unumsys_close(UNumberingSystem *unumsys); -#if U_SHOW_CPLUSPLUS_API -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUNumberingSystemPointer @@ -102,7 +102,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUNumberingSystemPointer, UNumberingSystem, unumsys_close); -U_NAMESPACE_END +} #endif /** diff --git a/icu4c/source/i18n/unicode/upluralrules.h b/icu4c/source/i18n/unicode/upluralrules.h index 983651b1cac0..7d9f97141a36 100644 --- a/icu4c/source/i18n/unicode/upluralrules.h +++ b/icu4c/source/i18n/unicode/upluralrules.h @@ -120,9 +120,8 @@ U_CAPI void U_EXPORT2 uplrules_close(UPluralRules *uplrules); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUPluralRulesPointer @@ -135,8 +134,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUPluralRulesPointer, UPluralRules, uplrules_close); -U_NAMESPACE_END - +} #endif diff --git a/icu4c/source/i18n/unicode/uregex.h b/icu4c/source/i18n/unicode/uregex.h index e946e632623a..a9d510646143 100644 --- a/icu4c/source/i18n/unicode/uregex.h +++ b/icu4c/source/i18n/unicode/uregex.h @@ -213,9 +213,8 @@ uregex_openC( const char *pattern, U_CAPI void U_EXPORT2 uregex_close(URegularExpression *regexp); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalURegularExpressionPointer @@ -228,8 +227,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalURegularExpressionPointer, URegularExpression, uregex_close); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/i18n/unicode/ureldatefmt.h b/icu4c/source/i18n/unicode/ureldatefmt.h index 0882360d147a..9d6899624998 100644 --- a/icu4c/source/i18n/unicode/ureldatefmt.h +++ b/icu4c/source/i18n/unicode/ureldatefmt.h @@ -299,9 +299,8 @@ U_CAPI void U_EXPORT2 ureldatefmt_closeResult(UFormattedRelativeDateTime* ufrdt); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalURelativeDateTimeFormatterPointer @@ -325,8 +324,7 @@ U_DEFINE_LOCAL_OPEN_POINTER(LocalURelativeDateTimeFormatterPointer, URelativeDat */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUFormattedRelativeDateTimePointer, UFormattedRelativeDateTime, ureldatefmt_closeResult); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/i18n/unicode/usearch.h b/icu4c/source/i18n/unicode/usearch.h index fd0b84f67235..f3d917c969cb 100644 --- a/icu4c/source/i18n/unicode/usearch.h +++ b/icu4c/source/i18n/unicode/usearch.h @@ -360,9 +360,8 @@ U_CAPI UStringSearch * U_EXPORT2 usearch_openFromCollator( */ U_CAPI void U_EXPORT2 usearch_close(UStringSearch *searchiter); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUStringSearchPointer @@ -375,8 +374,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUStringSearchPointer, UStringSearch, usearch_close); -U_NAMESPACE_END - +} #endif /* get and set methods -------------------------------------------------- */ diff --git a/icu4c/source/i18n/unicode/usimplenumberformatter.h b/icu4c/source/i18n/unicode/usimplenumberformatter.h index 22e81ba2c939..b28ebe394235 100644 --- a/icu4c/source/i18n/unicode/usimplenumberformatter.h +++ b/icu4c/source/i18n/unicode/usimplenumberformatter.h @@ -250,8 +250,8 @@ U_CAPI void U_EXPORT2 usnumf_close(USimpleNumberFormatter* uformatter); -#if U_SHOW_CPLUSPLUS_API -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUSimpleNumberPointer @@ -290,7 +290,7 @@ U_DEFINE_LOCAL_OPEN_POINTER(LocalUSimpleNumberPointer, USimpleNumber, usnum_clos */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUSimpleNumberFormatterPointer, USimpleNumberFormatter, usnumf_close); -U_NAMESPACE_END +} #endif // U_SHOW_CPLUSPLUS_API #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icu4c/source/i18n/unicode/uspoof.h b/icu4c/source/i18n/unicode/uspoof.h index 4e029fe951c9..41817f7e6e06 100644 --- a/icu4c/source/i18n/unicode/uspoof.h +++ b/icu4c/source/i18n/unicode/uspoof.h @@ -1550,9 +1550,8 @@ uspoof_serialize(USpoofChecker *sc, U_CDECL_END -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUSpoofCheckerPointer @@ -1589,7 +1588,10 @@ U_DEFINE_LOCAL_OPEN_POINTER(LocalUSpoofCheckerPointer, USpoofChecker, uspoof_clo U_DEFINE_LOCAL_OPEN_POINTER(LocalUSpoofCheckResultPointer, USpoofCheckResult, uspoof_closeCheckResult); /** \endcond */ -U_NAMESPACE_END +} +#endif + +#if U_SHOW_CPLUSPLUS_API /** * Limit the acceptable characters to those specified by a Unicode Set. diff --git a/icu4c/source/i18n/unicode/utrans.h b/icu4c/source/i18n/unicode/utrans.h index 1ad7dbda62f6..b33ec5d6682d 100644 --- a/icu4c/source/i18n/unicode/utrans.h +++ b/icu4c/source/i18n/unicode/utrans.h @@ -242,9 +242,8 @@ utrans_clone(const UTransliterator* trans, U_CAPI void U_EXPORT2 utrans_close(UTransliterator* trans); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUTransliteratorPointer @@ -257,8 +256,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUTransliteratorPointer, UTransliterator, utrans_close); -U_NAMESPACE_END - +} #endif /** diff --git a/icu4c/source/io/unicode/ustdio.h b/icu4c/source/io/unicode/ustdio.h index 5aad6b9bbead..e5ec930c12c0 100644 --- a/icu4c/source/io/unicode/ustdio.h +++ b/icu4c/source/io/unicode/ustdio.h @@ -341,9 +341,8 @@ u_fstropen(UChar *stringBuf, U_CAPI void U_EXPORT2 u_fclose(UFILE *file); -#if U_SHOW_CPLUSPLUS_API - -U_NAMESPACE_BEGIN +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +namespace U_ICU_NAMESPACE_OR_INTERNAL { /** * \class LocalUFILEPointer @@ -356,8 +355,7 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUFILEPointer, UFILE, u_fclose); -U_NAMESPACE_END - +} #endif /** From 320220ef694123393a5c5d6eb6a1c7536fc57aba Mon Sep 17 00:00:00 2001 From: Markus Scherer Date: Wed, 11 Dec 2024 15:34:40 -0800 Subject: [PATCH 14/24] ICU-22954 intltest.h & IcuTestErrorCode usable without U_SHOW_CPLUSPLUS_API --- icu4c/source/test/intltest/intltest.cpp | 152 +++++++++++------- icu4c/source/test/intltest/intltest.h | 127 +++++++++------ icu4c/source/test/intltest/itutil.cpp | 8 +- .../test/intltest/localematchertest.cpp | 4 +- icu4c/source/test/intltest/numfmtst.cpp | 37 +++-- icu4c/source/test/iotest/iotest.cpp | 21 +-- icu4c/source/tools/ctestfw/tstdtmod.cpp | 25 ++- icu4c/source/tools/ctestfw/unicode/testlog.h | 40 +++-- 8 files changed, 264 insertions(+), 150 deletions(-) diff --git a/icu4c/source/test/intltest/intltest.cpp b/icu4c/source/test/intltest/intltest.cpp index e46eaafca327..3806d0ff529b 100644 --- a/icu4c/source/test/intltest/intltest.cpp +++ b/icu4c/source/test/intltest/intltest.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include "unicode/ctest.h" // for str_timeDelta #include "unicode/curramt.h" @@ -501,13 +502,13 @@ IntlTest* IntlTest::gTest = nullptr; static int32_t execCount = 0; -void it_log( UnicodeString message ) +void it_log(std::u16string_view message) { if (IntlTest::gTest) IntlTest::gTest->log( message ); } -void it_logln( UnicodeString message ) +void it_logln(std::u16string_view message) { if (IntlTest::gTest) IntlTest::gTest->logln( message ); @@ -519,13 +520,13 @@ void it_logln() IntlTest::gTest->logln(); } -void it_info( UnicodeString message ) +void it_info(std::u16string_view message) { if (IntlTest::gTest) IntlTest::gTest->info( message ); } -void it_infoln( UnicodeString message ) +void it_infoln(std::u16string_view message) { if (IntlTest::gTest) IntlTest::gTest->infoln( message ); @@ -543,30 +544,47 @@ void it_err() IntlTest::gTest->err(); } -void it_err( UnicodeString message ) +void it_err(std::u16string_view message) { if (IntlTest::gTest) IntlTest::gTest->err( message ); } -void it_errln( UnicodeString message ) +void it_errln(std::u16string_view message) { if (IntlTest::gTest) IntlTest::gTest->errln( message ); } -void it_dataerr( UnicodeString message ) +void it_dataerr(std::u16string_view message) { if (IntlTest::gTest) IntlTest::gTest->dataerr( message ); } -void it_dataerrln( UnicodeString message ) +void it_dataerrln(std::u16string_view message) { if (IntlTest::gTest) IntlTest::gTest->dataerrln( message ); } +void it_logln(const char* message) { + it_logln(UnicodeString(message)); +} + +void it_err(const char* message) { + it_err(UnicodeString(message)); +} + +void it_errln(const char* message) { + it_errln(UnicodeString(message)); +} + +void it_dataerrln(const char* message) { + it_dataerrln(UnicodeString(message)); +} + + IntlTest::IntlTest() { caller = nullptr; @@ -784,7 +802,7 @@ UBool IntlTest::runTestLoop( char* testname, char* par, char *baseName ) execCount++; char msg[256]; snprintf(msg, sizeof(msg), "%s {", name); - LL_message(msg, true); + LL_message(UnicodeString(msg), true); UDate timeStart = uprv_getRawUTCtime(); strcpy(saveBaseLoc,name); strcat(saveBaseLoc,"/"); @@ -828,11 +846,11 @@ UBool IntlTest::runTestLoop( char* testname, char* par, char *baseName ) } LL_indentlevel -= 3; if (lastTestFailed) { - LL_message( "", true); + LL_message({}, true); } - LL_message( msg, true); + LL_message(UnicodeString(msg), true); if (lastTestFailed) { - LL_message( "", true); + LL_message({}, true); } LL_indentlevel += 3; } @@ -849,7 +867,7 @@ UBool IntlTest::runTestLoop( char* testname, char* par, char *baseName ) /** * Adds given string to the log if we are in verbose mode. */ -void IntlTest::log( const UnicodeString &message ) +void IntlTest::log(std::u16string_view message) { if( verbose ) { LL_message( message, false ); @@ -860,7 +878,7 @@ void IntlTest::log( const UnicodeString &message ) * Adds given string to the log if we are in verbose mode. Adds a new line to * the given message. */ -void IntlTest::logln( const UnicodeString &message ) +void IntlTest::logln(std::u16string_view message) { if( verbose ) { LL_message( message, true ); @@ -870,14 +888,14 @@ void IntlTest::logln( const UnicodeString &message ) void IntlTest::logln() { if( verbose ) { - LL_message( "", true ); + LL_message({}, true ); } } /** * Unconditionally adds given string to the log. */ -void IntlTest::info( const UnicodeString &message ) +void IntlTest::info(std::u16string_view message) { LL_message( message, false ); } @@ -886,14 +904,14 @@ void IntlTest::info( const UnicodeString &message ) * Unconditionally adds given string to the log. Adds a new line to * the given message. */ -void IntlTest::infoln( const UnicodeString &message ) +void IntlTest::infoln(std::u16string_view message) { LL_message( message, true ); } void IntlTest::infoln() { - LL_message( "", true ); + LL_message({}, true ); } int32_t IntlTest::IncErrorCount() @@ -915,19 +933,19 @@ void IntlTest::err() IncErrorCount(); } -void IntlTest::err( const UnicodeString &message ) +void IntlTest::err(std::u16string_view message) { IncErrorCount(); if (!no_err_msg) LL_message( message, false ); } -void IntlTest::errln( const UnicodeString &message ) +void IntlTest::errln(std::u16string_view message) { IncErrorCount(); if (!no_err_msg) LL_message( message, true ); } -void IntlTest::dataerr( const UnicodeString &message ) +void IntlTest::dataerr(std::u16string_view message) { IncDataErrorCount(); @@ -938,7 +956,7 @@ void IntlTest::dataerr( const UnicodeString &message ) if (!no_err_msg) LL_message( message, false ); } -void IntlTest::dataerrln( const UnicodeString &message ) +void IntlTest::dataerrln(std::u16string_view message) { int32_t errCount = IncDataErrorCount(); UnicodeString msg; @@ -958,7 +976,7 @@ void IntlTest::dataerrln( const UnicodeString &message ) } } -void IntlTest::errcheckln(UErrorCode status, const UnicodeString &message ) { +void IntlTest::errcheckln(UErrorCode status, std::u16string_view message) { if (status == U_FILE_ACCESS_ERROR || status == U_MISSING_RESOURCE_ERROR) { dataerrln(message); } else { @@ -1011,7 +1029,7 @@ UBool IntlTest::logKnownIssue(const char *ticket) { return logKnownIssue(ticket, UnicodeString()); } -UBool IntlTest::logKnownIssue(const char *ticket, const UnicodeString &msg) { +UBool IntlTest::logKnownIssue(const char *ticket, std::u16string_view msg) { if(noKnownIssues) return false; char fullpath[2048]; @@ -1123,7 +1141,7 @@ UBool IntlTest::printKnownIssues() } -void IntlTest::LL_message( UnicodeString message, UBool newline ) +void IntlTest::LL_message(std::u16string_view message, UBool newline) { // Synchronize this function. // All error messages generated by tests funnel through here. @@ -1160,10 +1178,11 @@ void IntlTest::LL_message( UnicodeString message, UBool newline ) } // replace each LineFeed by the indentation string - message.findAndReplace(UnicodeString(static_cast('\n')), indent); + UnicodeString us(message); + us.findAndReplace(UnicodeString(static_cast('\n')), indent); // stream out the message - length = message.extract(0, message.length(), buffer, sizeof(buffer)); + length = us.extract(0, us.length(), buffer, sizeof(buffer)); if (length > 0) { length = length > 30000 ? 30000 : length; fwrite(buffer, sizeof(*buffer), length, static_cast(testoutfp)); @@ -1938,8 +1957,8 @@ static inline char16_t toHex(int32_t i) { return static_cast(i + (i < 10 ? 0x30 : (0x41 - 10))); } -static UnicodeString& escape(const UnicodeString& s, UnicodeString& result) { - for (int32_t i=0; i(s.length()); ++i) { char16_t c = s[i]; if (c <= static_cast(0x7F)) { result += c; @@ -2014,8 +2033,8 @@ UBool IntlTest::assertSuccess(const char* message, UErrorCode ec, UBool possible } UBool IntlTest::assertEquals(const char* message, - const UnicodeString& expected, - const UnicodeString& actual, + std::u16string_view expected, + std::u16string_view actual, UBool possibleDataError) { if (expected != actual) { if (possibleDataError) { @@ -2056,6 +2075,22 @@ UBool IntlTest::assertEquals(const char* message, return true; } +UBool IntlTest::assertEquals(const char* message, const char* expected, + std::u16string_view actual, UBool possibleDataError) { + return assertEquals( + message, + UnicodeString(expected), actual, + possibleDataError); +} + +UBool IntlTest::assertEquals(const char* message, std::u16string_view expected, + const char* actual, UBool possibleDataError) { + return assertEquals( + message, + expected, UnicodeString(actual), + possibleDataError); +} + UBool IntlTest::assertEquals(const char* message, int32_t expected, int32_t actual) { @@ -2163,10 +2198,10 @@ UBool IntlTest::assertEquals(const char* message, #if !UCONFIG_NO_FORMATTING -UBool IntlTest::assertEquals(const char* message, - const Formattable& expected, - const Formattable& actual, - UBool possibleDataError) { +UBool IntlTest::assertEqualFormattables(const char* message, + const Formattable& expected, + const Formattable& actual, + UBool possibleDataError) { if (expected != actual) { if (possibleDataError) { dataerrln(UnicodeString("FAIL: ") + message + "; got " + @@ -2273,7 +2308,7 @@ UBool IntlTest::assertEqualsNear(const char* message, static char ASSERT_BUF[256]; -static const char* extractToAssertBuf(const UnicodeString& message) { +static const char* extractToAssertBuf(std::u16string_view message) { UnicodeString buf; escape(message, buf); buf.extract(0, 0x7FFFFFFF, ASSERT_BUF, sizeof(ASSERT_BUF) - 1, nullptr); @@ -2281,82 +2316,87 @@ static const char* extractToAssertBuf(const UnicodeString& message) { return ASSERT_BUF; } -UBool IntlTest::assertTrue(const UnicodeString& message, UBool condition, UBool quiet, UBool possibleDataError) { +UBool IntlTest::assertTrue(std::u16string_view message, UBool condition, UBool quiet, UBool possibleDataError) { return assertTrue(extractToAssertBuf(message), condition, quiet, possibleDataError); } -UBool IntlTest::assertFalse(const UnicodeString& message, UBool condition, UBool quiet, UBool possibleDataError) { +UBool IntlTest::assertFalse(std::u16string_view message, UBool condition, UBool quiet, UBool possibleDataError) { return assertFalse(extractToAssertBuf(message), condition, quiet, possibleDataError); } -UBool IntlTest::assertSuccess(const UnicodeString& message, UErrorCode ec) { +UBool IntlTest::assertSuccess(std::u16string_view message, UErrorCode ec) { return assertSuccess(extractToAssertBuf(message), ec); } -UBool IntlTest::assertEquals(const UnicodeString& message, - const UnicodeString& expected, - const UnicodeString& actual, +UBool IntlTest::assertEquals(std::u16string_view message, + std::u16string_view expected, + std::u16string_view actual, UBool possibleDataError) { return assertEquals(extractToAssertBuf(message), expected, actual, possibleDataError); } -UBool IntlTest::assertEquals(const UnicodeString& message, +UBool IntlTest::assertEquals(std::u16string_view message, const char* expected, const char* actual) { return assertEquals(extractToAssertBuf(message), expected, actual); } -UBool IntlTest::assertEquals(const UnicodeString& message, +UBool IntlTest::assertEquals(std::u16string_view message, UBool expected, UBool actual) { return assertEquals(extractToAssertBuf(message), expected, actual); } -UBool IntlTest::assertEquals(const UnicodeString& message, +UBool IntlTest::assertEquals(std::u16string_view message, int32_t expected, int32_t actual) { return assertEquals(extractToAssertBuf(message), expected, actual); } -UBool IntlTest::assertEquals(const UnicodeString& message, +UBool IntlTest::assertEquals(std::u16string_view message, int64_t expected, int64_t actual) { return assertEquals(extractToAssertBuf(message), expected, actual); } -UBool IntlTest::assertEquals(const UnicodeString& message, +UBool IntlTest::assertEquals(std::u16string_view message, double expected, double actual) { return assertEquals(extractToAssertBuf(message), expected, actual); } -UBool IntlTest::assertEquals(const UnicodeString& message, +UBool IntlTest::assertEquals(std::u16string_view message, UErrorCode expected, UErrorCode actual) { return assertEquals(extractToAssertBuf(message), expected, actual); } -UBool IntlTest::assertEquals(const UnicodeString& message, +UBool IntlTest::assertEquals(std::u16string_view message, const UnicodeSet& expected, const UnicodeSet& actual) { return assertEquals(extractToAssertBuf(message), expected, actual); } -UBool IntlTest::assertEquals(const UnicodeString& message, +UBool IntlTest::assertEquals(std::u16string_view message, const std::vector& expected, const std::vector& actual) { return assertEquals(extractToAssertBuf(message), expected, actual); } -UBool IntlTest::assertNotEquals(const UnicodeString &message, +UBool IntlTest::assertNotEquals(std::u16string_view message, int32_t expectedNot, int32_t actual) { return assertNotEquals(extractToAssertBuf(message), expectedNot, actual); } -UBool IntlTest::assertEqualsNear(const UnicodeString& message, +UBool IntlTest::assertEqualsNear(std::u16string_view message, double expected, double actual, double delta) { return assertEqualsNear(extractToAssertBuf(message), expected, actual, delta); } +UBool IntlTest::assertEquals(std::u16string_view message, const char* expected, + std::u16string_view actual, UBool possibleDataError) { + return assertEquals(message, UnicodeString(expected), actual, possibleDataError); +} + #if !UCONFIG_NO_FORMATTING -UBool IntlTest::assertEquals(const UnicodeString& message, - const Formattable& expected, - const Formattable& actual) { - return assertEquals(extractToAssertBuf(message), expected, actual); +UBool IntlTest::assertEqualFormattables(std::u16string_view message, + const Formattable& expected, + const Formattable& actual) { + return assertEqualFormattables(extractToAssertBuf(message), expected, actual); } #endif diff --git a/icu4c/source/test/intltest/intltest.h b/icu4c/source/test/intltest/intltest.h index 8fb825f6de6d..d4ecb9c0353c 100644 --- a/icu4c/source/test/intltest/intltest.h +++ b/icu4c/source/test/intltest/intltest.h @@ -13,16 +13,22 @@ #ifndef _INTLTEST #define _INTLTEST -// The following includes utypes.h, uobject.h and unistr.h -#include "unicode/fmtable.h" -#include "unicode/testlog.h" -#include "unicode/uniset.h" - #include #include +#include + +#include "unicode/utypes.h" +#include "unicode/testlog.h" + +#if U_SHOW_CPLUSPLUS_API +#include "unicode/fmtable.h" +#include "unicode/uniset.h" +#include "unicode/unistr.h" +#endif U_NAMESPACE_USE +#if U_SHOW_CPLUSPLUS_API //----------------------------------------------------------------------------- //convenience classes to ease porting code that uses the Java @@ -47,6 +53,8 @@ UnicodeString toString(int32_t n); #endif UnicodeString toString(UBool b); +#endif // U_SHOW_CPLUSPLUS_API + //----------------------------------------------------------------------------- // Use the TESTCASE macro in subclasses of IntlTest. Define the @@ -154,9 +162,9 @@ class IntlTest : public TestLog { virtual void setCaller( IntlTest* callingTest ); // for internal use only virtual void setPath( char* path ); // for internal use only - virtual void log( const UnicodeString &message ); + virtual void log(std::u16string_view message); - virtual void logln( const UnicodeString &message ) override; + virtual void logln(std::u16string_view message) override; virtual void logln(); @@ -168,7 +176,7 @@ class IntlTest : public TestLog { * @param message optional message string * @return true if test should be skipped */ - UBool logKnownIssue( const char *ticket, const UnicodeString &message ); + UBool logKnownIssue( const char *ticket, std::u16string_view message); /** * Logs that an issue is known. Can be called multiple times. * Usually used this way: @@ -192,23 +200,23 @@ class IntlTest : public TestLog { UBool skipLSTMTest(); #endif /* #if !UCONFIG_NO_BREAK_ITERATION */ - virtual void info( const UnicodeString &message ); + virtual void info(std::u16string_view message); - virtual void infoln( const UnicodeString &message ); + virtual void infoln(std::u16string_view message); virtual void infoln(); virtual void err(); - virtual void err( const UnicodeString &message ); + virtual void err(std::u16string_view message); - virtual void errln( const UnicodeString &message ) override; + virtual void errln(std::u16string_view message) override; - virtual void dataerr( const UnicodeString &message ); + virtual void dataerr(std::u16string_view message); - virtual void dataerrln( const UnicodeString &message ) override; + virtual void dataerrln(std::u16string_view message) override; - void errcheckln(UErrorCode status, const UnicodeString &message ); + void errcheckln(UErrorCode status, std::u16string_view message); // convenience functions: sprintf() + errln() etc. void log(const char *fmt, ...); @@ -289,13 +297,20 @@ class IntlTest : public TestLog { * @return true on success, false on failure. */ UBool assertSuccess(const char* message, UErrorCode ec, UBool possibleDataError=false, const char *file=nullptr, int line=0); - UBool assertEquals(const char* message, const UnicodeString& expected, - const UnicodeString& actual, UBool possibleDataError=false); + UBool assertEquals(const char* message, std::u16string_view expected, + std::u16string_view actual, UBool possibleDataError=false); UBool assertEquals(const char* message, const char* expected, const char* actual); UBool assertEquals(const char* message, UBool expected, UBool actual); UBool assertEquals(const char* message, int32_t expected, int32_t actual); UBool assertEquals(const char* message, int64_t expected, int64_t actual); UBool assertEquals(const char* message, double expected, double actual); + + // for disambiguation + UBool assertEquals(const char* message, const char* expected, + std::u16string_view actual, UBool possibleDataError=false); + UBool assertEquals(const char* message, std::u16string_view expected, + const char* actual, UBool possibleDataError=false); + /** * Asserts that two doubles are equal to within a positive delta. Returns * false if they are not. @@ -311,27 +326,36 @@ class IntlTest : public TestLog { */ UBool assertEqualsNear(const char* message, double expected, double actual, double delta); UBool assertEquals(const char* message, UErrorCode expected, UErrorCode actual); +#if U_SHOW_CPLUSPLUS_API UBool assertEquals(const char* message, const UnicodeSet& expected, const UnicodeSet& actual); +#endif UBool assertEquals(const char* message, const std::vector& expected, const std::vector& actual); +#if U_SHOW_CPLUSPLUS_API #if !UCONFIG_NO_FORMATTING - UBool assertEquals(const char* message, const Formattable& expected, - const Formattable& actual, UBool possibleDataError=false); - UBool assertEquals(const UnicodeString& message, const Formattable& expected, - const Formattable& actual); + UBool assertEqualFormattables(const char* message, const Formattable& expected, + const Formattable& actual, UBool possibleDataError=false); + UBool assertEqualFormattables(std::u16string_view message, const Formattable& expected, + const Formattable& actual); +#endif #endif UBool assertNotEquals(const char* message, int32_t expectedNot, int32_t actual); - UBool assertTrue(const UnicodeString& message, UBool condition, UBool quiet=false, UBool possibleDataError=false); - UBool assertFalse(const UnicodeString& message, UBool condition, UBool quiet=false, UBool possibleDataError=false); - UBool assertSuccess(const UnicodeString& message, UErrorCode ec); - UBool assertEquals(const UnicodeString& message, const UnicodeString& expected, - const UnicodeString& actual, UBool possibleDataError=false); - UBool assertEquals(const UnicodeString& message, const char* expected, const char* actual); - UBool assertEquals(const UnicodeString& message, UBool expected, UBool actual); - UBool assertEquals(const UnicodeString& message, int32_t expected, int32_t actual); - UBool assertEquals(const UnicodeString& message, int64_t expected, int64_t actual); - UBool assertEquals(const UnicodeString& message, double expected, double actual); + UBool assertTrue(std::u16string_view message, UBool condition, UBool quiet=false, UBool possibleDataError=false); + UBool assertFalse(std::u16string_view message, UBool condition, UBool quiet=false, UBool possibleDataError=false); + UBool assertSuccess(std::u16string_view message, UErrorCode ec); + UBool assertEquals(std::u16string_view message, std::u16string_view expected, + std::u16string_view actual, UBool possibleDataError=false); + UBool assertEquals(std::u16string_view message, const char* expected, const char* actual); + UBool assertEquals(std::u16string_view message, UBool expected, UBool actual); + UBool assertEquals(std::u16string_view message, int32_t expected, int32_t actual); + UBool assertEquals(std::u16string_view message, int64_t expected, int64_t actual); + UBool assertEquals(std::u16string_view message, double expected, double actual); + + // for disambiguation + UBool assertEquals(std::u16string_view message, const char* expected, + std::u16string_view actual, UBool possibleDataError=false); + /** * Asserts that two doubles are equal to within a positive delta. Returns * false if they are not. @@ -345,12 +369,14 @@ class IntlTest : public TestLog { * @param delta - the maximum delta between expected and actual for which * both numbers are still considered equal. */ - UBool assertEqualsNear(const UnicodeString& message, double expected, double actual, double delta); - UBool assertEquals(const UnicodeString& message, UErrorCode expected, UErrorCode actual); - UBool assertEquals(const UnicodeString& message, const UnicodeSet& expected, const UnicodeSet& actual); - UBool assertEquals(const UnicodeString& message, + UBool assertEqualsNear(std::u16string_view message, double expected, double actual, double delta); + UBool assertEquals(std::u16string_view message, UErrorCode expected, UErrorCode actual); +#if U_SHOW_CPLUSPLUS_API + UBool assertEquals(std::u16string_view message, const UnicodeSet& expected, const UnicodeSet& actual); +#endif + UBool assertEquals(std::u16string_view message, const std::vector& expected, const std::vector& actual); - UBool assertNotEquals(const UnicodeString& message, int32_t expectedNot, int32_t actual); + UBool assertNotEquals(std::u16string_view message, int32_t expectedNot, int32_t actual); virtual void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par = nullptr ); // override ! @@ -392,8 +418,9 @@ class IntlTest : public TestLog { protected: - virtual void LL_message( UnicodeString message, UBool newline ); + virtual void LL_message(std::u16string_view message, UBool newline); +#if U_SHOW_CPLUSPLUS_API // used for collation result reporting, defined here for convenience static UnicodeString &prettify(const UnicodeString &source, UnicodeString &target); @@ -404,6 +431,7 @@ class IntlTest : public TestLog { static inline UnicodeString toHex(int32_t number, int32_t digits=-1) { return toHex(static_cast(number), digits); } +#endif public: static void setICU_DATA(); // Set up ICU_DATA if necessary. @@ -428,17 +456,24 @@ class IntlTest : public TestLog { }; -void it_log( UnicodeString message ); -void it_logln( UnicodeString message ); +void it_log(std::u16string_view message); +void it_logln(std::u16string_view message); void it_logln(); -void it_info( UnicodeString message ); -void it_infoln( UnicodeString message ); +void it_info(std::u16string_view message); +void it_infoln(std::u16string_view message); void it_infoln(); void it_err(); -void it_err( UnicodeString message ); -void it_errln( UnicodeString message ); -void it_dataerr( UnicodeString message ); -void it_dataerrln( UnicodeString message ); +void it_err(std::u16string_view message); +void it_errln(std::u16string_view message); +void it_dataerr(std::u16string_view message); +void it_dataerrln(std::u16string_view message); + +void it_logln(const char* message); +void it_err(const char* message); +void it_errln(const char* message); +void it_dataerrln(const char* message); + +#if U_SHOW_CPLUSPLUS_API /** * This is a variant of cintltst/ccolltst.c:CharsToUChars(). @@ -450,4 +485,6 @@ extern UnicodeString CharsToUnicodeString(const char* chars); /* alias for CharsToUnicodeString */ extern UnicodeString ctou(const char* chars); +#endif + #endif // _INTLTEST diff --git a/icu4c/source/test/intltest/itutil.cpp b/icu4c/source/test/intltest/itutil.cpp index 398f68bc708e..ec69e20bed0b 100644 --- a/icu4c/source/test/intltest/itutil.cpp +++ b/icu4c/source/test/intltest/itutil.cpp @@ -204,19 +204,19 @@ void ErrorCodeTest::TestSubclass() { class IcuTestErrorCodeTestHelper : public IntlTest { public: - void errln( const UnicodeString &message ) override { + void errln(std::u16string_view message) override { test->assertFalse("Already saw an error", seenError); seenError = true; - test->assertEquals("Message for Error", expectedErrln, message); + test->assertEquals("Message for Error", std::u16string_view{expectedErrln}, message); if (expectedDataErr) { test->errln("Got non-data error, but expected data error"); } } - void dataerrln( const UnicodeString &message ) override { + void dataerrln(std::u16string_view message) override { test->assertFalse("Already saw an error", seenError); seenError = true; - test->assertEquals("Message for Error", expectedErrln, message); + test->assertEquals("Message for Error", std::u16string_view{expectedErrln}, message); if (!expectedDataErr) { test->errln("Got data error, but expected non-data error"); } diff --git a/icu4c/source/test/intltest/localematchertest.cpp b/icu4c/source/test/intltest/localematchertest.cpp index 2996f8aa706d..639b58682209 100644 --- a/icu4c/source/test/intltest/localematchertest.cpp +++ b/icu4c/source/test/intltest/localematchertest.cpp @@ -457,7 +457,7 @@ void LocaleMatcherTest::testResolvedLocale() { namespace { -bool toInvariant(const UnicodeString &s, CharString &inv, ErrorCode &errorCode) { +bool toInvariant(const UnicodeString &s, CharString &inv, IcuTestErrorCode &errorCode) { if (errorCode.isSuccess()) { inv.clear().appendInvariantChars(s, errorCode); return errorCode.isSuccess(); @@ -477,7 +477,7 @@ bool getSuffixAfterPrefix(const UnicodeString &s, int32_t limit, bool getInvariantSuffixAfterPrefix(const UnicodeString &s, int32_t limit, const UnicodeString &prefix, CharString &suffix, - ErrorCode &errorCode) { + IcuTestErrorCode &errorCode) { UnicodeString u_suffix; return getSuffixAfterPrefix(s, limit, prefix, u_suffix) && toInvariant(u_suffix, suffix, errorCode); diff --git a/icu4c/source/test/intltest/numfmtst.cpp b/icu4c/source/test/intltest/numfmtst.cpp index ede924722952..c855e3e29277 100644 --- a/icu4c/source/test/intltest/numfmtst.cpp +++ b/icu4c/source/test/intltest/numfmtst.cpp @@ -2516,7 +2516,7 @@ void NumberFormatTest::TestPerMill() { if (!assertSuccess("setup", ec)) return; str.truncate(0); assertEquals("0.4857 x ###.###m", - "485.7m", fmt2.format(0.4857, str)); + u"485.7m", fmt2.format(0.4857, str)); } /** @@ -2677,8 +2677,8 @@ void NumberFormatTest::TestCases() { Formattable m; fmt->parse(str, m, ec); assertSuccess("parse", ec); - assertEquals(where + "\"" + pat + "\".parse(\"" + str + "\")", - n, m); + assertEqualFormattables( + where + "\"" + pat + "\".parse(\"" + str + "\")", n, m); } } // p: @@ -2691,8 +2691,7 @@ void NumberFormatTest::TestCases() { assertSuccess("parse", ec); fmt->parse(str, n, ec); assertSuccess("parse", ec); - assertEquals(where + "\"" + pat + "\".parse(\"" + str + "\")", - exp, n); + assertEqualFormattables(where + "\"" + pat + "\".parse(\"" + str + "\")", exp, n); } break; case 8: // fpc: @@ -2734,8 +2733,8 @@ void NumberFormatTest::TestCases() { mfmt->parseObject(str, m, ec); if (assertSuccess("parseCurrency", ec)) { - assertEquals(where + "getCurrencyFormat(" + mloc + ").parse(\"" + str + "\")", - n, m); + assertEqualFormattables( + where + "getCurrencyFormat(" + mloc + ").parse(\"" + str + "\")", n, m); } else { errln("FAIL: source " + str); } @@ -3767,7 +3766,7 @@ void NumberFormatTest::TestMismatchedCurrencyFormatFail() { df->setLenient(false); { Formattable result; - ErrorCode failStatus; + UErrorCode failStatus = U_ZERO_ERROR; df->parse(u"1.23\u20AC", result, failStatus); assertEquals("Should fail to parse", U_INVALID_FORMAT_ERROR, failStatus); } @@ -6900,7 +6899,7 @@ void NumberFormatTest::TestDecimal() { StringPiece num("244444444444444444444444444444444444446.4"); fmtr->format(num, formattedResult, nullptr, status); ASSERT_SUCCESS(status); - ASSERT_EQUALS("244,444,444,444,444,444,444,444,444,444,444,444,446.4", formattedResult); + ASSERT_EQUALS(u"244,444,444,444,444,444,444,444,444,444,444,444,446.4", formattedResult); //std::string ss; std::cout << formattedResult.toUTF8String(ss); delete fmtr; } @@ -6921,7 +6920,7 @@ void NumberFormatTest::TestDecimal() { ASSERT_SUCCESS(status); fmtr->format(dl, formattedResult, nullptr, status); ASSERT_SUCCESS(status); - ASSERT_EQUALS("1,234,566,666,666,666,666,666,666,666,666,666,666,621,000", formattedResult); + ASSERT_EQUALS(u"1,234,566,666,666,666,666,666,666,666,666,666,666,621,000", formattedResult); status = U_ZERO_ERROR; num.set("666.666"); @@ -6931,7 +6930,7 @@ void NumberFormatTest::TestDecimal() { formattedResult.remove(); fmtr->format(dl, formattedResult, pos, status); ASSERT_SUCCESS(status); - ASSERT_EQUALS("666.666", formattedResult); + ASSERT_EQUALS(u"666.666", formattedResult); ASSERT_EQUALS(4, pos.getBeginIndex()); ASSERT_EQUALS(7, pos.getEndIndex()); delete fmtr; @@ -8788,7 +8787,7 @@ void NumberFormatTest::Test13391_chakmaParsing() { Formattable result; df->parse(expected, result, status); assertSuccess("Should not fail when parsing in ccp", status); - assertEquals("Should parse to 12345 in ccp", 12345, result); + assertEqualFormattables("Should parse to 12345 in ccp", 12345, result); const char16_t* expectedScientific = u"\U00011137.\U00011139E\U00011138"; UnicodeString actualScientific; @@ -8802,7 +8801,7 @@ void NumberFormatTest::Test13391_chakmaParsing() { Formattable resultScientific; df->parse(expectedScientific, resultScientific, status); assertSuccess("Should not fail when parsing scientific in ccp", status); - assertEquals("Should parse scientific to 130 in ccp", 130, resultScientific); + assertEqualFormattables("Should parse scientific to 130 in ccp", 130, resultScientific); } @@ -9592,7 +9591,7 @@ void NumberFormatTest::Test20037_ScientificIntegerOverflow() { StringPiece sp = result.getDecimalNumber(status); assertEquals(u"Should snap to zero", u"0", - {sp.data(), sp.length(), US_INV}); + UnicodeString(sp.data(), sp.length(), US_INV)); // Test edge case overflow of exponent result = Formattable(); @@ -9600,7 +9599,7 @@ void NumberFormatTest::Test20037_ScientificIntegerOverflow() { sp = result.getDecimalNumber(status); assertEquals(u"Should not overflow and should parse only the first exponent", u"1E-2147483647", - {sp.data(), sp.length(), US_INV}); + UnicodeString(sp.data(), sp.length(), US_INV)); // Test edge case overflow of exponent result = Formattable(); @@ -9608,7 +9607,7 @@ void NumberFormatTest::Test20037_ScientificIntegerOverflow() { sp = result.getDecimalNumber(status); assertEquals(u"Should not overflow", u"3E-2147483648", - {sp.data(), sp.length(), US_INV}); + UnicodeString(sp.data(), sp.length(), US_INV)); // Test largest parseable exponent result = Formattable(); @@ -9616,7 +9615,7 @@ void NumberFormatTest::Test20037_ScientificIntegerOverflow() { sp = result.getDecimalNumber(status); assertEquals(u"Should not overflow", u"9.876E+2147483646", - {sp.data(), sp.length(), US_INV}); + UnicodeString(sp.data(), sp.length(), US_INV)); // Test max value as well const char16_t* infinityInputs[] = { @@ -9632,8 +9631,8 @@ void NumberFormatTest::Test20037_ScientificIntegerOverflow() { nf->parse(input, result, status); sp = result.getDecimalNumber(status); assertEquals(UnicodeString("Should become Infinity: ") + input, - u"Infinity", - {sp.data(), sp.length(), US_INV}); + u"Infinity", + UnicodeString(sp.data(), sp.length(), US_INV)); } } diff --git a/icu4c/source/test/iotest/iotest.cpp b/icu4c/source/test/iotest/iotest.cpp index 64ff66fec5de..bb10088fe534 100644 --- a/icu4c/source/test/iotest/iotest.cpp +++ b/icu4c/source/test/iotest/iotest.cpp @@ -14,6 +14,9 @@ * created by: George Rhoten */ +#include +#include +#include #include "unicode/ustdio.h" #include "unicode/uclean.h" @@ -28,9 +31,6 @@ #include "unicode/tstdtmod.h" #include "putilimp.h" -#include -#include - class DataDrivenLogger : public TestLog { static const char* fgDataDir; static char *fgTestDataPath; @@ -42,23 +42,26 @@ class DataDrivenLogger : public TestLog { fgTestDataPath = nullptr; } } - virtual void errln( const UnicodeString &message ) override { + virtual void errln(std::u16string_view message) override { char buffer[4000]; - message.extract(0, message.length(), buffer, sizeof(buffer)); + UnicodeString us(message); + us.extract(0, us.length(), buffer, sizeof(buffer)); buffer[3999] = 0; /* NUL terminate */ log_err(buffer); } - virtual void logln( const UnicodeString &message ) override { + virtual void logln(std::u16string_view message) override { char buffer[4000]; - message.extract(0, message.length(), buffer, sizeof(buffer)); + UnicodeString us(message); + us.extract(0, us.length(), buffer, sizeof(buffer)); buffer[3999] = 0; /* NUL terminate */ log_info(buffer); } - virtual void dataerrln( const UnicodeString &message ) override { + virtual void dataerrln(std::u16string_view message) override { char buffer[4000]; - message.extract(0, message.length(), buffer, sizeof(buffer)); + UnicodeString us(message); + us.extract(0, us.length(), buffer, sizeof(buffer)); buffer[3999] = 0; /* NUL terminate */ log_data_err(buffer); } diff --git a/icu4c/source/tools/ctestfw/tstdtmod.cpp b/icu4c/source/tools/ctestfw/tstdtmod.cpp index 649065164b47..5a8e1ef73659 100644 --- a/icu4c/source/tools/ctestfw/tstdtmod.cpp +++ b/icu4c/source/tools/ctestfw/tstdtmod.cpp @@ -25,6 +25,22 @@ IcuTestErrorCode::~IcuTestErrorCode() { } } +UErrorCode IcuTestErrorCode::reset() { + UErrorCode code = errorCode; + errorCode = U_ZERO_ERROR; + return code; +} + +void IcuTestErrorCode::assertSuccess() const { + if(isFailure()) { + handleFailure(); + } +} + +const char* IcuTestErrorCode::errorName() const { + return u_errorName(errorCode); +} + UBool IcuTestErrorCode::errIfFailureAndReset() { if(isFailure()) { errlog(false, u"expected success", nullptr); @@ -103,10 +119,11 @@ UBool IcuTestErrorCode::expectErrorAndReset(UErrorCode expectedError, const char } void IcuTestErrorCode::setScope(const char* message) { - scopeMessage.remove().append({ message, -1, US_INV }); + UnicodeString us(message, -1, US_INV); + scopeMessage = us; } -void IcuTestErrorCode::setScope(const UnicodeString& message) { +void IcuTestErrorCode::setScope(std::u16string_view message) { scopeMessage = message; } @@ -114,12 +131,12 @@ void IcuTestErrorCode::handleFailure() const { errlog(false, u"(handleFailure)", nullptr); } -void IcuTestErrorCode::errlog(UBool dataErr, const UnicodeString& mainMessage, const char* extraMessage) const { +void IcuTestErrorCode::errlog(UBool dataErr, std::u16string_view mainMessage, const char* extraMessage) const { UnicodeString msg(testName, -1, US_INV); msg.append(u' ').append(mainMessage); msg.append(u" but got error: ").append(UnicodeString(errorName(), -1, US_INV)); - if (!scopeMessage.isEmpty()) { + if (!scopeMessage.empty()) { msg.append(u" scope: ").append(scopeMessage); } diff --git a/icu4c/source/tools/ctestfw/unicode/testlog.h b/icu4c/source/tools/ctestfw/unicode/testlog.h index a7ffbc608483..3951e729b748 100644 --- a/icu4c/source/tools/ctestfw/unicode/testlog.h +++ b/icu4c/source/tools/ctestfw/unicode/testlog.h @@ -13,8 +13,9 @@ #ifndef U_TESTFW_TESTLOG #define U_TESTFW_TESTLOG -#include "unicode/errorcode.h" -#include "unicode/unistr.h" +#include +#include +#include "unicode/utypes.h" #include "unicode/testtype.h" /** Facilitates internal logging of data driven test service @@ -24,18 +25,34 @@ class T_CTEST_EXPORT_API TestLog { public: virtual ~TestLog(); - virtual void errln( const UnicodeString &message ) = 0; - virtual void logln( const UnicodeString &message ) = 0; - virtual void dataerrln( const UnicodeString &message ) = 0; + virtual void errln(std::u16string_view message) = 0; + virtual void logln(std::u16string_view message) = 0; + virtual void dataerrln(std::u16string_view message) = 0; virtual const char* getTestDataPath(UErrorCode& err) = 0; }; -class T_CTEST_EXPORT_API IcuTestErrorCode : public ErrorCode { +// Note: The IcuTestErrorCode used to be a subclass of ErrorCode, but that made it not usable for +// unit tests that work without U_SHOW_CPLUSPLUS_API. +// So instead we *copy* the ErrorCode API. + +class T_CTEST_EXPORT_API IcuTestErrorCode { public: IcuTestErrorCode(TestLog &callingTestClass, const char *callingTestName) - : testClass(callingTestClass), testName(callingTestName), scopeMessage() {} + : errorCode(U_ZERO_ERROR), + testClass(callingTestClass), testName(callingTestName), scopeMessage() {} virtual ~IcuTestErrorCode(); + // ErrorCode API + operator UErrorCode & () { return errorCode; } + operator UErrorCode * () { return &errorCode; } + UBool isSuccess() const { return U_SUCCESS(errorCode); } + UBool isFailure() const { return U_FAILURE(errorCode); } + UErrorCode get() const { return errorCode; } + void set(UErrorCode value) { errorCode=value; } + UErrorCode reset(); + void assertSuccess() const; + const char* errorName() const; + // Returns true if isFailure(). UBool errIfFailureAndReset(); UBool errIfFailureAndReset(const char *fmt, ...); @@ -46,17 +63,18 @@ class T_CTEST_EXPORT_API IcuTestErrorCode : public ErrorCode { /** Sets an additional message string to be appended to failure output. */ void setScope(const char* message); - void setScope(const UnicodeString& message); + void setScope(std::u16string_view message); protected: - virtual void handleFailure() const override; + virtual void handleFailure() const; private: + UErrorCode errorCode; TestLog &testClass; const char *const testName; - UnicodeString scopeMessage; + std::u16string scopeMessage; - void errlog(UBool dataErr, const UnicodeString& mainMessage, const char* extraMessage) const; + void errlog(UBool dataErr, std::u16string_view mainMessage, const char* extraMessage) const; }; #endif From e3bc073737b226f8bd47302f32f83a3993f7792a Mon Sep 17 00:00:00 2001 From: Markus Scherer Date: Thu, 12 Dec 2024 16:32:34 -0800 Subject: [PATCH 15/24] ICU-22954 header-only-test USet C++ iterators --- icu4c/source/test/intltest/Makefile.in | 2 +- icu4c/source/test/intltest/intltest.vcxproj | 1 + .../test/intltest/intltest.vcxproj.filters | 15 +- icu4c/source/test/intltest/itutil.cpp | 2 + .../test/intltest/usetheaderonlytest.cpp | 219 ++++++++++++++++++ icu4c/source/test/intltest/usettest.cpp | 173 +------------- icu4c/source/test/intltest/usettest.h | 4 - 7 files changed, 243 insertions(+), 173 deletions(-) create mode 100644 icu4c/source/test/intltest/usetheaderonlytest.cpp diff --git a/icu4c/source/test/intltest/Makefile.in b/icu4c/source/test/intltest/Makefile.in index 66956355c841..81ad55578072 100644 --- a/icu4c/source/test/intltest/Makefile.in +++ b/icu4c/source/test/intltest/Makefile.in @@ -75,7 +75,7 @@ numbertest_parse.o numbertest_doubleconversion.o numbertest_skeletons.o \ static_unisets_test.o numfmtdatadriventest.o numbertest_range.o erarulestest.o \ formattedvaluetest.o formatted_string_builder_test.o numbertest_permutation.o \ units_data_test.o units_router_test.o units_test.o displayoptions_test.o \ -numbertest_simple.o uchar_type_build_test.o +numbertest_simple.o uchar_type_build_test.o usetheaderonlytest.o DEPS = $(OBJECTS:.o=.d) diff --git a/icu4c/source/test/intltest/intltest.vcxproj b/icu4c/source/test/intltest/intltest.vcxproj index 9e6480aa4e1b..b58b29b3d4e7 100644 --- a/icu4c/source/test/intltest/intltest.vcxproj +++ b/icu4c/source/test/intltest/intltest.vcxproj @@ -242,6 +242,7 @@ + diff --git a/icu4c/source/test/intltest/intltest.vcxproj.filters b/icu4c/source/test/intltest/intltest.vcxproj.filters index f3dca92d191c..d5c23d5e4cb5 100644 --- a/icu4c/source/test/intltest/intltest.vcxproj.filters +++ b/icu4c/source/test/intltest/intltest.vcxproj.filters @@ -571,9 +571,18 @@ configuration - - - + + formatting + + + formatting + + + formatting + + + misc + diff --git a/icu4c/source/test/intltest/itutil.cpp b/icu4c/source/test/intltest/itutil.cpp index ec69e20bed0b..4585792126d6 100644 --- a/icu4c/source/test/intltest/itutil.cpp +++ b/icu4c/source/test/intltest/itutil.cpp @@ -35,6 +35,7 @@ #include "usettest.h" extern IntlTest *createBytesTrieTest(); +extern IntlTest *createUSetHeaderOnlyTest(); extern IntlTest *createLocaleMatcherTest(); static IntlTest *createLocalPointerTest(); extern IntlTest *createUCharsTrieTest(); @@ -82,6 +83,7 @@ void IntlTestUtilities::runIndexedTest( int32_t index, UBool exec, const char* & TESTCASE_AUTO_CLASS(LocaleBuilderTest); TESTCASE_AUTO_CREATE_CLASS(LocaleMatcherTest); TESTCASE_AUTO_CREATE_CLASS(UHashTest); + TESTCASE_AUTO_CREATE_CLASS(USetHeaderOnlyTest); TESTCASE_AUTO_END; } diff --git a/icu4c/source/test/intltest/usetheaderonlytest.cpp b/icu4c/source/test/intltest/usetheaderonlytest.cpp new file mode 100644 index 000000000000..38bc175c1746 --- /dev/null +++ b/icu4c/source/test/intltest/usetheaderonlytest.cpp @@ -0,0 +1,219 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// usetheaderonlytest.cpp +// created: 2024dec11 Markus W. Scherer + +#include + +// Test header-only ICU C++ APIs. Do not use other ICU C++ APIs. +// Non-default configuration: +#define U_SHOW_CPLUSPLUS_API 0 +// Default configuration: +// #define U_SHOW_CPLUSPLUS_HEADER_API 1 + +#include "unicode/utypes.h" +#include "unicode/uset.h" +#include "unicode/utf.h" +#include "unicode/utf16.h" +#include "intltest.h" + +class USetHeaderOnlyTest : public IntlTest { +public: + USetHeaderOnlyTest() = default; + + void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=nullptr) override; + + void TestUSetCodePointIterator(); + void TestUSetRangeIterator(); + void TestUSetStringIterator(); + void TestUSetElementIterator(); +}; + +extern IntlTest *createUSetHeaderOnlyTest() { + return new USetHeaderOnlyTest(); +} + +void USetHeaderOnlyTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char * /*par*/) { + if(exec) { + logln("TestSuite USetHeaderOnlyTest: "); + } + TESTCASE_AUTO_BEGIN; + TESTCASE_AUTO(TestUSetCodePointIterator); + TESTCASE_AUTO(TestUSetRangeIterator); + TESTCASE_AUTO(TestUSetStringIterator); + TESTCASE_AUTO(TestUSetElementIterator); + TESTCASE_AUTO_END; +} + +std::u16string cpString(UChar32 c) { + if (U_IS_BMP(c)) { + return {static_cast(c)}; + } else { + return {U16_LEAD(c), U16_TRAIL(c)}; + } +} + +void USetHeaderOnlyTest::TestUSetCodePointIterator() { + IcuTestErrorCode errorCode(*this, "TestUSetCodePointIterator"); + using U_HEADER_NESTED_NAMESPACE::USetCodePoints; + LocalUSetPointer uset(uset_openPattern(u"[abcçカ🚴]", -1, errorCode)); + std::u16string result; + for (UChar32 c : USetCodePoints(uset.getAlias())) { + // Commented-out sample code for pasting into the API docs. + // printf("uset.codePoint U+%04lx\n", (long)c); + result.append(u" ").append(cpString(c)); + } + assertEquals(WHERE, u" a b c ç カ 🚴", result); + + USetCodePoints range1(uset.getAlias()); + auto range2(range1); // copy constructor + auto iter = range1.begin(); + auto limit = range2.end(); + // operator* with pre- and post-increment + assertEquals(WHERE, u'a', *iter); + ++iter; + assertEquals(WHERE, u'b', *iter); + assertEquals(WHERE, u'c', *++iter); + auto iter2(iter); // copy constructor + assertEquals(WHERE, u'c', *iter2++); + assertEquals(WHERE, u'ç', *iter2++); + assertEquals(WHERE, u'カ', *iter2); + assertTrue(WHERE, ++iter2 != limit); + auto iter3(iter2++); + assertEquals(WHERE, U'🚴', *iter3); + assertTrue(WHERE, iter2 == limit); +} + +void USetHeaderOnlyTest::TestUSetRangeIterator() { + IcuTestErrorCode errorCode(*this, "TestUSetRangeIterator"); + using U_HEADER_NESTED_NAMESPACE::USetRanges; + using U_HEADER_NESTED_NAMESPACE::CodePointRange; + LocalUSetPointer uset(uset_openPattern(u"[abcçカ🚴]", -1, errorCode)); + std::u16string result; + for (auto [start, end] : USetRanges(uset.getAlias())) { + // Commented-out sample code for pasting into the API docs. + // printf("uset.range U+%04lx..U+%04lx\n", (long)start, (long)end); + result.append(u" ").append(cpString(start)).append(u"-").append(cpString(end)); + } + assertEquals(WHERE, u" a-c ç-ç カ-カ 🚴-🚴", result); + result.clear(); + for (auto range : USetRanges(uset.getAlias())) { + for (UChar32 c : range) { + // Commented-out sample code for pasting into the API docs. + // printf("uset.range.c U+%04lx\n", (long)c); + result.append(u" ").append(cpString(c)); + } + result.append(u" |"); + } + assertEquals(WHERE, u" a b c | ç | カ | 🚴 |", result); + + USetRanges range1(uset.getAlias()); + auto range2(range1); // copy constructor + auto iter = range1.begin(); + auto limit = range2.end(); + // operator* with pre- and post-increment + { + auto cpRange = *iter; + assertEquals(WHERE, u'a', cpRange.rangeStart); + assertEquals(WHERE, u'c', cpRange.rangeEnd); + assertEquals(WHERE, 3, cpRange.size()); + auto cpRange2(cpRange); + auto cpIter = cpRange.begin(); + auto cpLimit = cpRange2.end(); + assertEquals(WHERE, u'a', *cpIter++); + assertEquals(WHERE, u'b', *cpIter); + assertTrue(WHERE, cpIter != cpLimit); + CodePointRange::iterator cpIter2(u'b'); // public constructor + assertTrue(WHERE, cpIter == cpIter2); + assertEquals(WHERE, u'c', *++cpIter); + assertTrue(WHERE, cpIter != cpIter2); + assertTrue(WHERE, ++cpIter == cpLimit); + } + ++iter; + auto iter2(iter); // copy constructor + assertEquals(WHERE, u'ç', (*iter2).rangeStart); + assertEquals(WHERE, u'ç', (*iter2).rangeEnd); + assertEquals(WHERE, 1, (*iter2).size()); + assertEquals(WHERE, u'ç', (*iter2++).rangeStart); + assertEquals(WHERE, u'カ', (*iter2).rangeStart); + assertTrue(WHERE, ++iter2 != limit); + auto iter3(iter2++); + assertEquals(WHERE, U'🚴', (*iter3).rangeStart); + assertTrue(WHERE, iter2 == limit); + + { + CodePointRange cpRange(u'h', u'k'); // public constructor + // FYI: currently no operator== + assertEquals(WHERE, u'h', cpRange.rangeStart); + assertEquals(WHERE, u'k', cpRange.rangeEnd); + assertEquals(WHERE, 4, cpRange.size()); + assertEquals(WHERE, u'i', *++(cpRange.begin())); + } +} + +void USetHeaderOnlyTest::TestUSetStringIterator() { + IcuTestErrorCode errorCode(*this, "TestUSetStringIterator"); + using U_HEADER_NESTED_NAMESPACE::USetStrings; + LocalUSetPointer uset(uset_openPattern(u"[abcçカ🚴{}{abc}{de}]", -1, errorCode)); + std::u16string result; + for (auto s : USetStrings(uset.getAlias())) { + // Commented-out sample code for pasting into the API docs. + // Needs U_SHOW_CPLUSPLUS_API=1 for UnicodeString. + // UnicodeString us(s); + // std::string u8; + // printf("uset.string length %ld \"%s\"\n", (long)s.length(), us.toUTF8String(u8).c_str()); + result.append(u" \"").append(s).append(u"\""); + } + assertEquals(WHERE, uR"( "" "abc" "de")", result); + + USetStrings range1(uset.getAlias()); + auto range2(range1); // copy constructor + auto iter = range1.begin(); + auto limit = range2.end(); + // operator* with pre- and post-increment + assertEquals(WHERE, u"", *iter); + assertEquals(WHERE, u"abc", *++iter); + auto iter2(iter); // copy constructor + assertEquals(WHERE, u"abc", *iter2++); + assertTrue(WHERE, iter2 != limit); + auto iter3(iter2++); + assertEquals(WHERE, u"de", *iter3); + assertTrue(WHERE, iter2 == limit); +} + +void USetHeaderOnlyTest::TestUSetElementIterator() { + IcuTestErrorCode errorCode(*this, "TestUSetElementIterator"); + using U_HEADER_NESTED_NAMESPACE::USetElements; + LocalUSetPointer uset(uset_openPattern(u"[abcçカ🚴{}{abc}{de}]", -1, errorCode)); + std::u16string result; + for (auto el : USetElements(uset.getAlias())) { + // Commented-out sample code for pasting into the API docs. + // Needs U_SHOW_CPLUSPLUS_API=1 for UnicodeString. + // UnicodeString us(el); + // std::string u8; + // printf("uset.string length %ld \"%s\"\n", (long)us.length(), us.toUTF8String(u8).c_str()); + result.append(u" \"").append(el).append(u"\""); + } + assertEquals(WHERE, uR"( "a" "b" "c" "ç" "カ" "🚴" "" "abc" "de")", result); + + USetElements range1(uset.getAlias()); + auto range2(range1); // copy constructor + auto iter = range1.begin(); + auto limit = range2.end(); + // operator* with pre- and post-increment + assertEquals(WHERE, u"a", *iter); + ++iter; + assertEquals(WHERE, u"b", *iter); + assertEquals(WHERE, u"c", *++iter); + auto iter2(iter); // copy constructor + assertEquals(WHERE, u"c", *iter2++); + // skip çカ🚴 + ++++++iter2; + assertEquals(WHERE, u"", *iter2++); + assertEquals(WHERE, u"abc", *iter2); + assertTrue(WHERE, ++iter2 != limit); + auto iter3(iter2++); + assertEquals(WHERE, u"de", *iter3); + assertTrue(WHERE, iter2 == limit); +} diff --git a/icu4c/source/test/intltest/usettest.cpp b/icu4c/source/test/intltest/usettest.cpp index 477639e86598..9da0612b148b 100644 --- a/icu4c/source/test/intltest/usettest.cpp +++ b/icu4c/source/test/intltest/usettest.cpp @@ -107,13 +107,9 @@ UnicodeSetTest::runIndexedTest(int32_t index, UBool exec, TESTCASE_AUTO(TestSkipToStrings); TESTCASE_AUTO(TestPatternCodePointComplement); TESTCASE_AUTO(TestCodePointIterator); - TESTCASE_AUTO(TestUSetCodePointIterator); TESTCASE_AUTO(TestRangeIterator); - TESTCASE_AUTO(TestUSetRangeIterator); TESTCASE_AUTO(TestStringIterator); - TESTCASE_AUTO(TestUSetStringIterator); TESTCASE_AUTO(TestElementIterator); - TESTCASE_AUTO(TestUSetElementIterator); TESTCASE_AUTO_END; } @@ -4280,37 +4276,8 @@ void UnicodeSetTest::TestCodePointIterator() { } assertEquals(WHERE, u" a b c ç カ 🚴", result); - // codePoints() returns USetCodePoints for which explicit APIs are tested via USet. -} - -void UnicodeSetTest::TestUSetCodePointIterator() { - IcuTestErrorCode errorCode(*this, "TestUSetCodePointIterator"); - using U_HEADER_NESTED_NAMESPACE::USetCodePoints; - LocalUSetPointer uset(uset_openPattern(u"[abcçカ🚴]", -1, errorCode)); - UnicodeString result; - for (UChar32 c : USetCodePoints(uset.getAlias())) { - // printf("uset.codePoint U+%04lx\n", (long)c); - result.append(u' ').append(c); - } - assertEquals(WHERE, u" a b c ç カ 🚴", result); - - USetCodePoints range1(uset.getAlias()); - auto range2(range1); // copy constructor - auto iter = range1.begin(); - auto limit = range2.end(); - // operator* with pre- and post-increment - assertEquals(WHERE, u'a', *iter); - ++iter; - assertEquals(WHERE, u'b', *iter); - assertEquals(WHERE, u'c', *++iter); - auto iter2(iter); // copy constructor - assertEquals(WHERE, u'c', *iter2++); - assertEquals(WHERE, u'ç', *iter2++); - assertEquals(WHERE, u'カ', *iter2); - assertTrue(WHERE, ++iter2 != limit); - auto iter3(iter2++); - assertEquals(WHERE, U'🚴', *iter3); - assertTrue(WHERE, iter2 == limit); + // codePoints() returns USetCodePoints for which explicit APIs are tested via USet + // in a header-only unit test file. } void UnicodeSetTest::TestRangeIterator() { @@ -4332,72 +4299,8 @@ void UnicodeSetTest::TestRangeIterator() { } assertEquals(WHERE, u" a b c | ç | カ | 🚴 |", result); - // ranges() returns USetRanges for which explicit APIs are tested via USet. -} - -void UnicodeSetTest::TestUSetRangeIterator() { - IcuTestErrorCode errorCode(*this, "TestUSetRangeIterator"); - using U_HEADER_NESTED_NAMESPACE::USetRanges; - using U_HEADER_NESTED_NAMESPACE::CodePointRange; - LocalUSetPointer uset(uset_openPattern(u"[abcçカ🚴]", -1, errorCode)); - UnicodeString result; - for (auto [start, end] : USetRanges(uset.getAlias())) { - // printf("uset.range U+%04lx..U+%04lx\n", (long)start, (long)end); - result.append(u' ').append(start).append(u'-').append(end); - } - assertEquals(WHERE, u" a-c ç-ç カ-カ 🚴-🚴", result); - result.remove(); - for (auto range : USetRanges(uset.getAlias())) { - for (UChar32 c : range) { - // printf("uset.range.c U+%04lx\n", (long)c); - result.append(u' ').append(c); - } - result.append(u" |"); - } - assertEquals(WHERE, u" a b c | ç | カ | 🚴 |", result); - - USetRanges range1(uset.getAlias()); - auto range2(range1); // copy constructor - auto iter = range1.begin(); - auto limit = range2.end(); - // operator* with pre- and post-increment - { - auto cpRange = *iter; - assertEquals(WHERE, u'a', cpRange.rangeStart); - assertEquals(WHERE, u'c', cpRange.rangeEnd); - assertEquals(WHERE, 3, cpRange.size()); - auto cpRange2(cpRange); - auto cpIter = cpRange.begin(); - auto cpLimit = cpRange2.end(); - assertEquals(WHERE, u'a', *cpIter++); - assertEquals(WHERE, u'b', *cpIter); - assertTrue(WHERE, cpIter != cpLimit); - CodePointRange::iterator cpIter2(u'b'); // public constructor - assertTrue(WHERE, cpIter == cpIter2); - assertEquals(WHERE, u'c', *++cpIter); - assertTrue(WHERE, cpIter != cpIter2); - assertTrue(WHERE, ++cpIter == cpLimit); - } - ++iter; - auto iter2(iter); // copy constructor - assertEquals(WHERE, u'ç', (*iter2).rangeStart); - assertEquals(WHERE, u'ç', (*iter2).rangeEnd); - assertEquals(WHERE, 1, (*iter2).size()); - assertEquals(WHERE, u'ç', (*iter2++).rangeStart); - assertEquals(WHERE, u'カ', (*iter2).rangeStart); - assertTrue(WHERE, ++iter2 != limit); - auto iter3(iter2++); - assertEquals(WHERE, U'🚴', (*iter3).rangeStart); - assertTrue(WHERE, iter2 == limit); - - { - CodePointRange cpRange(u'h', u'k'); // public constructor - // FYI: currently no operator== - assertEquals(WHERE, u'h', cpRange.rangeStart); - assertEquals(WHERE, u'k', cpRange.rangeEnd); - assertEquals(WHERE, 4, cpRange.size()); - assertEquals(WHERE, u'i', *++(cpRange.begin())); - } + // ranges() returns USetRanges for which explicit APIs are tested via USet + // in a header-only unit test file. } void UnicodeSetTest::TestStringIterator() { @@ -4412,35 +4315,8 @@ void UnicodeSetTest::TestStringIterator() { } assertEquals(WHERE, uR"( "" "abc" "de")", result); - // strings() returns USetStrins for which explicit APIs are tested via USet. -} - -void UnicodeSetTest::TestUSetStringIterator() { - IcuTestErrorCode errorCode(*this, "TestUSetStringIterator"); - using U_HEADER_NESTED_NAMESPACE::USetStrings; - LocalUSetPointer uset(uset_openPattern(u"[abcçカ🚴{}{abc}{de}]", -1, errorCode)); - UnicodeString result; - for (auto s : USetStrings(uset.getAlias())) { - // UnicodeString us(s); - // std::string u8; - // printf("uset.string length %ld \"%s\"\n", (long)s.length(), us.toUTF8String(u8).c_str()); - result.append(u" \"").append(s).append(u'"'); - } - assertEquals(WHERE, uR"( "" "abc" "de")", result); - - USetStrings range1(uset.getAlias()); - auto range2(range1); // copy constructor - auto iter = range1.begin(); - auto limit = range2.end(); - // operator* with pre- and post-increment - assertEquals(WHERE, UnicodeString(), UnicodeString(*iter)); - assertEquals(WHERE, u"abc", UnicodeString(*++iter)); - auto iter2(iter); // copy constructor - assertEquals(WHERE, u"abc", UnicodeString(*iter2++)); - assertTrue(WHERE, iter2 != limit); - auto iter3(iter2++); - assertEquals(WHERE, u"de", UnicodeString(*iter3)); - assertTrue(WHERE, iter2 == limit); + // strings() returns USetStrins for which explicit APIs are tested via USet + // in a header-only unit test file. } void UnicodeSetTest::TestElementIterator() { @@ -4455,39 +4331,6 @@ void UnicodeSetTest::TestElementIterator() { } assertEquals(WHERE, uR"( "a" "b" "c" "ç" "カ" "🚴" "" "abc" "de")", result); - // begin() & end() return USetElementIterator for which explicit APIs are tested via USet. -} - -void UnicodeSetTest::TestUSetElementIterator() { - IcuTestErrorCode errorCode(*this, "TestUSetElementIterator"); - using U_HEADER_NESTED_NAMESPACE::USetElements; - LocalUSetPointer uset(uset_openPattern(u"[abcçカ🚴{}{abc}{de}]", -1, errorCode)); - UnicodeString result; - for (auto el : USetElements(uset.getAlias())) { - // UnicodeString us(el); - // std::string u8; - // printf("uset.string length %ld \"%s\"\n", (long)us.length(), us.toUTF8String(u8).c_str()); - result.append(u" \"").append(el).append(u'"'); - } - assertEquals(WHERE, uR"( "a" "b" "c" "ç" "カ" "🚴" "" "abc" "de")", result); - - USetElements range1(uset.getAlias()); - auto range2(range1); // copy constructor - auto iter = range1.begin(); - auto limit = range2.end(); - // operator* with pre- and post-increment - assertEquals(WHERE, u"a", *iter); - ++iter; - assertEquals(WHERE, u"b", *iter); - assertEquals(WHERE, u"c", *++iter); - auto iter2(iter); // copy constructor - assertEquals(WHERE, u"c", *iter2++); - // skip çカ🚴 - ++++++iter2; - assertEquals(WHERE, UnicodeString(), *iter2++); - assertEquals(WHERE, u"abc", *iter2); - assertTrue(WHERE, ++iter2 != limit); - auto iter3(iter2++); - assertEquals(WHERE, u"de", *iter3); - assertTrue(WHERE, iter2 == limit); + // begin() & end() return USetElementIterator for which explicit APIs are tested via USet + // in a header-only unit test file. } diff --git a/icu4c/source/test/intltest/usettest.h b/icu4c/source/test/intltest/usettest.h index 0127042c7365..2ac22ba72e62 100644 --- a/icu4c/source/test/intltest/usettest.h +++ b/icu4c/source/test/intltest/usettest.h @@ -106,13 +106,9 @@ class UnicodeSetTest: public IntlTest { void TestPatternCodePointComplement(); void TestCodePointIterator(); - void TestUSetCodePointIterator(); void TestRangeIterator(); - void TestUSetRangeIterator(); void TestStringIterator(); - void TestUSetStringIterator(); void TestElementIterator(); - void TestUSetElementIterator(); private: From a7c3bbe1c7a468961df2dd67ecbdebf80ad1d056 Mon Sep 17 00:00:00 2001 From: Robin Leroy Date: Tue, 10 Dec 2024 18:04:54 +0100 Subject: [PATCH 16/24] ICU-22986 GL takes CM --- icu4c/source/data/brkitr/rules/line.txt | 2 +- icu4c/source/data/brkitr/rules/line_cj.txt | 2 +- icu4c/source/data/brkitr/rules/line_loose.txt | 2 +- .../data/brkitr/rules/line_loose_cj.txt | 2 +- .../brkitr/rules/line_loose_phrase_cj.txt | 2 +- .../source/data/brkitr/rules/line_normal.txt | 2 +- .../data/brkitr/rules/line_normal_cj.txt | 2 +- .../brkitr/rules/line_normal_phrase_cj.txt | 2 +- .../data/brkitr/rules/line_phrase_cj.txt | 2 +- icu4c/source/test/intltest/rbbitst.cpp | 66 +++++++++++++----- .../source/test/testdata/break_rules/line.txt | 2 +- .../test/testdata/break_rules/line_cj.txt | 2 +- .../test/testdata/break_rules/line_loose.txt | 2 +- .../testdata/break_rules/line_loose_cj.txt | 2 +- .../test/testdata/break_rules/line_normal.txt | 2 +- .../testdata/break_rules/line_normal_cj.txt | 2 +- icu4c/source/test/testdata/rbbitst.txt | 4 ++ .../ibm/icu/impl/data/icudata/brkitr/line.brk | Bin 73088 -> 73232 bytes .../icu/impl/data/icudata/brkitr/line_cj.brk | Bin 73120 -> 73264 bytes .../impl/data/icudata/brkitr/line_loose.brk | Bin 75232 -> 75392 bytes .../data/icudata/brkitr/line_loose_cj.brk | Bin 80768 -> 80928 bytes .../icudata/brkitr/line_loose_phrase_cj.brk | Bin 86176 -> 86336 bytes .../impl/data/icudata/brkitr/line_normal.brk | Bin 72976 -> 73120 bytes .../data/icudata/brkitr/line_normal_cj.brk | Bin 74080 -> 74224 bytes .../icudata/brkitr/line_normal_phrase_cj.brk | Bin 79264 -> 79424 bytes .../data/icudata/brkitr/line_phrase_cj.brk | Bin 78272 -> 78416 bytes .../ibm/icu/dev/test/rbbi/RBBITestMonkey.java | 4 +- .../icu/dev/test/rbbi/break_rules/line.txt | 2 +- .../icu/dev/test/rbbi/break_rules/line_cj.txt | 2 +- .../dev/test/rbbi/break_rules/line_loose.txt | 2 +- .../test/rbbi/break_rules/line_loose_cj.txt | 2 +- .../dev/test/rbbi/break_rules/line_normal.txt | 2 +- .../test/rbbi/break_rules/line_normal_cj.txt | 2 +- .../com/ibm/icu/dev/test/rbbi/rbbitst.txt | 4 ++ 34 files changed, 81 insertions(+), 39 deletions(-) diff --git a/icu4c/source/data/brkitr/rules/line.txt b/icu4c/source/data/brkitr/rules/line.txt index 9f3e44984eae..e43e70b36311 100644 --- a/icu4c/source/data/brkitr/rules/line.txt +++ b/icu4c/source/data/brkitr/rules/line.txt @@ -297,7 +297,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_cj.txt b/icu4c/source/data/brkitr/rules/line_cj.txt index fc615f55db21..793163898e00 100644 --- a/icu4c/source/data/brkitr/rules/line_cj.txt +++ b/icu4c/source/data/brkitr/rules/line_cj.txt @@ -298,7 +298,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_loose.txt b/icu4c/source/data/brkitr/rules/line_loose.txt index 2bb9be5845f8..9ff4e17eb3a5 100644 --- a/icu4c/source/data/brkitr/rules/line_loose.txt +++ b/icu4c/source/data/brkitr/rules/line_loose.txt @@ -306,7 +306,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_loose_cj.txt b/icu4c/source/data/brkitr/rules/line_loose_cj.txt index 15715a225123..428d225f16d9 100644 --- a/icu4c/source/data/brkitr/rules/line_loose_cj.txt +++ b/icu4c/source/data/brkitr/rules/line_loose_cj.txt @@ -318,7 +318,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_loose_phrase_cj.txt b/icu4c/source/data/brkitr/rules/line_loose_phrase_cj.txt index 87ab33b48a1c..2edf4b3bc33a 100644 --- a/icu4c/source/data/brkitr/rules/line_loose_phrase_cj.txt +++ b/icu4c/source/data/brkitr/rules/line_loose_phrase_cj.txt @@ -331,7 +331,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_normal.txt b/icu4c/source/data/brkitr/rules/line_normal.txt index c41280c28d1c..bf6dee8c05cd 100644 --- a/icu4c/source/data/brkitr/rules/line_normal.txt +++ b/icu4c/source/data/brkitr/rules/line_normal.txt @@ -299,7 +299,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_normal_cj.txt b/icu4c/source/data/brkitr/rules/line_normal_cj.txt index 31dd65854cb1..f596454621d0 100644 --- a/icu4c/source/data/brkitr/rules/line_normal_cj.txt +++ b/icu4c/source/data/brkitr/rules/line_normal_cj.txt @@ -304,7 +304,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_normal_phrase_cj.txt b/icu4c/source/data/brkitr/rules/line_normal_phrase_cj.txt index 85d771fcdbf9..e0bbd00025f9 100644 --- a/icu4c/source/data/brkitr/rules/line_normal_phrase_cj.txt +++ b/icu4c/source/data/brkitr/rules/line_normal_phrase_cj.txt @@ -317,7 +317,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_phrase_cj.txt b/icu4c/source/data/brkitr/rules/line_phrase_cj.txt index 41e05bf4963f..14b118789e7c 100644 --- a/icu4c/source/data/brkitr/rules/line_phrase_cj.txt +++ b/icu4c/source/data/brkitr/rules/line_phrase_cj.txt @@ -310,7 +310,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/test/intltest/rbbitst.cpp b/icu4c/source/test/intltest/rbbitst.cpp index c043a0a5d838..fd72c8e4afd6 100644 --- a/icu4c/source/test/intltest/rbbitst.cpp +++ b/icu4c/source/test/intltest/rbbitst.cpp @@ -1705,7 +1705,34 @@ class RemapRule : public SegmentationRule { resolved[i].appliedRule = this; resolved[i].indexInRemapped.reset(); } + // While replacing, we need to check that we are not creating + // surrogate pairs. Since appendReplacement performs two + // concatenations (the unreplaced segment and the replacement), we + // need to check in two places: whether the unreplaced segment + // starts with a trailing surrogate that ends up after a leading + // surrogate, and whether the replaced segment starts with a leading + // surrogate that ends up after a trailing surrogate. + // We break the pair by replacing one of the surrogates with U+FFFF, + // which has the same properties for all but line breaking, and the + // same behaviour in line breaking (lb=SG and lb=XX are both treated + // as lb=AL). + std::optional trailingLead; + if (result.length() > 0 && U16_IS_LEAD(result[result.length() - 1])) { + trailingLead = result.length() - 1; + } + matcher->appendReplacement(result, replacement_, status); + + if (trailingLead && *trailingLead + 1 < result.length() && + U16_IS_TRAIL(result[*trailingLead + 1])) { + result.setCharAt(*trailingLead, u'\uFFFF'); + } + + if (matcher->start(status) + offset > 0 && + U16_IS_LEAD(result[matcher->start(status) + offset - 1]) && + U16_IS_TRAIL(result[matcher->start(status) + offset])) { + result.setCharAt(matcher->start(status) + offset, u'\uFFFF'); + } offset = result.length() - *resolved[i].indexInRemapped; } for (; i < static_cast(resolved.size()); ++i) { @@ -1714,7 +1741,17 @@ class RemapRule : public SegmentationRule { } *resolved[i].indexInRemapped += offset; } + + std::optional trailingLead; + if (result.length() > 0 && U16_IS_LEAD(result[result.length() - 1])) { + trailingLead = result.length() - 1; + } matcher->appendTail(result); + if (trailingLead && *trailingLead + 1 < result.length() && + U16_IS_TRAIL(result[*trailingLead + 1])) { + result.setCharAt(*trailingLead, u'\uFFFF'); + } + if (resolved.back().indexInRemapped != result.length()) { std::string indices; for (const auto r : resolved) { @@ -2906,20 +2943,11 @@ RBBILineMonkey::RBBILineMonkey() : std::list> partition; - // TODO(egg): The following two workarounds for what seems to be ICU bugs; - // with UREGEX_DOTALL (but not UREGEX_MULTILINE): - // 1. /.*\u000A/ does not match CR LF; - // 2. /$/ matches ( BK | CR | LF | NL ) eot. - rules.push_back(std::make_unique(uR"(CR LF ÷)", uR"(\u000D\u000A)", u'÷', uR"()")); - rules.push_back(std::make_unique( - uR"([^ BK CR LF NL ] × [ BK CR LF NL ] eot)", - uR"([^ \p{lb=BK} \p{lb=CR} \p{lb=LF} \p{lb=NL} ])", - u'×', - uR"([ \p{lb=BK} \p{lb=CR} \p{lb=LF} \p{lb=NL} ] $)")); - rules.push_back(std::make_unique(uR"(sot ÷ contra LB2)", uR"(^)", u'÷', uR"()")); // This one could be part of the rules. - rules.push_back(std::make_unique(uR"(LB3 ÷ eot)", uR"()", u'÷', uR"($)")); + // Note that /$/ matches ( BK | CR | LF | NL ) eot, so we use (?!.) instead. + // The generated rules use the same (?!.). + rules.push_back(std::make_unique(uR"(LB3 ÷ eot)", uR"()", u'÷', uR"((?!.))")); // --- NOLI ME TANGERE --- // Generated by GenerateBreakTest.java in the Unicode tools. @@ -3015,7 +3043,7 @@ RBBILineMonkey::RBBILineMonkey() : rules.push_back(std::make_unique(uR"(× $CP)", uR"()", u'×', uR"(\p{Line_Break=CP})")); rules.push_back(std::make_unique(uR"(× $SY)", uR"()", u'×', uR"(\p{Line_Break=Break_Symbols})")); rules.push_back(std::make_unique(uR"($OP $SP* ×)", uR"(\p{Line_Break=Open_Punctuation} \p{Line_Break=Space}*)", u'×', uR"()")); - rules.push_back(std::make_unique(uR"(( $sot | $BK | $CR | $LF | $NL | $OP | $QU | $GL | $SP | $ZW ) $QU_Pi $SP* ×)", uR"(( ^ | \p{Line_Break=Mandatory_Break} | \p{Line_Break=Carriage_Return} | \p{Line_Break=Line_Feed} | \p{Line_Break=Next_Line} | \p{Line_Break=Open_Punctuation} | \p{Line_Break=Quotation} | \p{Line_Break=Glue} | \p{Line_Break=Space} | \p{Line_Break=ZWSpace} ) [\p{Line_Break=Quotation} && \p{gc=Pi}] \p{Line_Break=Space}*)", u'×', uR"()")); + rules.push_back(std::make_unique(uR"(( $BK | $CR | $LF | $NL | $OP | $QU | $GL | $SP | $ZW | $sot ) $QU_Pi $SP* ×)", uR"(( \p{Line_Break=Mandatory_Break} | \p{Line_Break=Carriage_Return} | \p{Line_Break=Line_Feed} | \p{Line_Break=Next_Line} | \p{Line_Break=Open_Punctuation} | \p{Line_Break=Quotation} | \p{Line_Break=Glue} | \p{Line_Break=Space} | \p{Line_Break=ZWSpace} | ^ ) [\p{Line_Break=Quotation} && \p{gc=Pi}] \p{Line_Break=Space}*)", u'×', uR"()")); rules.push_back(std::make_unique(uR"(× $QU_Pf ( $SP | $GL | $WJ | $CL | $QU | $CP | $EX | $IS | $SY | $BK | $CR | $LF | $NL | $ZW | $eot ))", uR"()", u'×', uR"([\p{Line_Break=Quotation} && \p{gc=Pf}] ( \p{Line_Break=Space} | \p{Line_Break=Glue} | \p{Line_Break=Word_Joiner} | \p{Line_Break=Close_Punctuation} | \p{Line_Break=Quotation} | \p{Line_Break=CP} | \p{Line_Break=Exclamation} | \p{Line_Break=Infix_Numeric} | \p{Line_Break=Break_Symbols} | \p{Line_Break=Mandatory_Break} | \p{Line_Break=Carriage_Return} | \p{Line_Break=Line_Feed} | \p{Line_Break=Next_Line} | \p{Line_Break=ZWSpace} | (?!.) ))")); rules.push_back(std::make_unique(uR"($SP ÷ $IS $NU)", uR"(\p{Line_Break=Space})", u'÷', uR"(\p{Line_Break=Infix_Numeric} \p{Line_Break=Numeric})")); rules.push_back(std::make_unique(uR"(× $IS)", uR"()", u'×', uR"(\p{Line_Break=Infix_Numeric})")); @@ -3027,10 +3055,10 @@ RBBILineMonkey::RBBILineMonkey() : rules.push_back(std::make_unique(uR"([^$EastAsian] × $QU)", uR"([^[\p{ea=F}\p{ea=W}\p{ea=H}]])", u'×', uR"(\p{Line_Break=Quotation})")); rules.push_back(std::make_unique(uR"(× $QU ( [^$EastAsian] | $eot ))", uR"()", u'×', uR"(\p{Line_Break=Quotation} ( [^[\p{ea=F}\p{ea=W}\p{ea=H}]] | (?!.) ))")); rules.push_back(std::make_unique(uR"($QU × [^$EastAsian])", uR"(\p{Line_Break=Quotation})", u'×', uR"([^[\p{ea=F}\p{ea=W}\p{ea=H}]])")); - rules.push_back(std::make_unique(uR"(( $sot | [^$EastAsian] ) $QU ×)", uR"(( ^ | [^[\p{ea=F}\p{ea=W}\p{ea=H}]] ) \p{Line_Break=Quotation})", u'×', uR"()")); + rules.push_back(std::make_unique(uR"(( [^$EastAsian] | $sot ) $QU ×)", uR"(( [^[\p{ea=F}\p{ea=W}\p{ea=H}]] | ^ ) \p{Line_Break=Quotation})", u'×', uR"()")); rules.push_back(std::make_unique(uR"(÷ $CB)", uR"()", u'÷', uR"(\p{Line_Break=Contingent_Break})")); rules.push_back(std::make_unique(uR"($CB ÷)", uR"(\p{Line_Break=Contingent_Break})", u'÷', uR"()")); - rules.push_back(std::make_unique(uR"(( $sot | $BK | $CR | $LF | $NL | $SP | $ZW | $CB | $GL ) ( $HY | $Hyphen ) × $AL)", uR"(( ^ | \p{Line_Break=Mandatory_Break} | \p{Line_Break=Carriage_Return} | \p{Line_Break=Line_Feed} | \p{Line_Break=Next_Line} | \p{Line_Break=Space} | \p{Line_Break=ZWSpace} | \p{Line_Break=Contingent_Break} | \p{Line_Break=Glue} ) ( \p{Line_Break=Hyphen} | [\u2010] ))", u'×', uR"([\p{Line_Break=Ambiguous} \p{Line_Break=Alphabetic} \p{Line_Break=Surrogate} \p{Line_Break=Unknown} [\p{Line_Break=Complex_Context}--\p{gc=Mn}--\p{gc=Mc}]])")); + rules.push_back(std::make_unique(uR"(( $BK | $CR | $LF | $NL | $SP | $ZW | $CB | $GL | $sot ) ( $HY | $Hyphen ) × $AL)", uR"(( \p{Line_Break=Mandatory_Break} | \p{Line_Break=Carriage_Return} | \p{Line_Break=Line_Feed} | \p{Line_Break=Next_Line} | \p{Line_Break=Space} | \p{Line_Break=ZWSpace} | \p{Line_Break=Contingent_Break} | \p{Line_Break=Glue} | ^ ) ( \p{Line_Break=Hyphen} | [\u2010] ))", u'×', uR"([\p{Line_Break=Ambiguous} \p{Line_Break=Alphabetic} \p{Line_Break=Surrogate} \p{Line_Break=Unknown} [\p{Line_Break=Complex_Context}--\p{gc=Mn}--\p{gc=Mc}]])")); rules.push_back(std::make_unique(uR"(× $BA)", uR"()", u'×', uR"(\p{Line_Break=Break_After})")); rules.push_back(std::make_unique(uR"(× $HY)", uR"()", u'×', uR"(\p{Line_Break=Hyphen})")); rules.push_back(std::make_unique(uR"(× $NS)", uR"()", u'×', uR"([\p{Line_Break=Nonstarter} \p{Line_Break=Conditional_Japanese_Starter}])")); @@ -3080,6 +3108,7 @@ RBBILineMonkey::RBBILineMonkey() : // --- End of generated code. --- + // TODO(egg): This could just as well be part of the rules… rules.push_back(std::make_unique(uR"(ALL ÷ / ÷ ALL)", uR"()", u'÷', @@ -3122,7 +3151,12 @@ void RBBILineMonkey::setText(const UnicodeString &s) { } for (std::size_t i = 0; i < resolved.size(); ++i) { if (resolved[i].appliedRule == nullptr) { - printf("Failed to resolve at %zu" , i); + printf("Failed to resolve at %zu between U+%04X and U+%04X ", i, s.char32At(i-1), s.char32At(i)); + if (resolved[i].indexInRemapped.has_value()) { + printf("which is remapped %d between U+%04X and U+%04X", *resolved[i].indexInRemapped, + remapped.char32At(*resolved[i].indexInRemapped - 1), + remapped.char32At(*resolved[i].indexInRemapped)); + } std::terminate(); } else { setAppliedRule(i, resolved[i].appliedRule->name().c_str()); diff --git a/icu4c/source/test/testdata/break_rules/line.txt b/icu4c/source/test/testdata/break_rules/line.txt index 9f85b7917139..e2154abf6309 100644 --- a/icu4c/source/test/testdata/break_rules/line.txt +++ b/icu4c/source/test/testdata/break_rules/line.txt @@ -176,7 +176,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4c/source/test/testdata/break_rules/line_cj.txt b/icu4c/source/test/testdata/break_rules/line_cj.txt index 7aad76ecf107..bb0a6880ea29 100644 --- a/icu4c/source/test/testdata/break_rules/line_cj.txt +++ b/icu4c/source/test/testdata/break_rules/line_cj.txt @@ -180,7 +180,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4c/source/test/testdata/break_rules/line_loose.txt b/icu4c/source/test/testdata/break_rules/line_loose.txt index 72e7563c9274..f9152060bf2d 100644 --- a/icu4c/source/test/testdata/break_rules/line_loose.txt +++ b/icu4c/source/test/testdata/break_rules/line_loose.txt @@ -181,7 +181,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4c/source/test/testdata/break_rules/line_loose_cj.txt b/icu4c/source/test/testdata/break_rules/line_loose_cj.txt index 99d01874d1fb..b04236532bbd 100644 --- a/icu4c/source/test/testdata/break_rules/line_loose_cj.txt +++ b/icu4c/source/test/testdata/break_rules/line_loose_cj.txt @@ -200,7 +200,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA BAX HY] CM* GL; diff --git a/icu4c/source/test/testdata/break_rules/line_normal.txt b/icu4c/source/test/testdata/break_rules/line_normal.txt index 211298539797..c7c518d5b68b 100644 --- a/icu4c/source/test/testdata/break_rules/line_normal.txt +++ b/icu4c/source/test/testdata/break_rules/line_normal.txt @@ -182,7 +182,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4c/source/test/testdata/break_rules/line_normal_cj.txt b/icu4c/source/test/testdata/break_rules/line_normal_cj.txt index 2061f9170848..cfa9c7968e1b 100644 --- a/icu4c/source/test/testdata/break_rules/line_normal_cj.txt +++ b/icu4c/source/test/testdata/break_rules/line_normal_cj.txt @@ -186,7 +186,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4c/source/test/testdata/rbbitst.txt b/icu4c/source/test/testdata/rbbitst.txt index 1c7fe9975699..781ce068be7b 100644 --- a/icu4c/source/test/testdata/rbbitst.txt +++ b/icu4c/source/test/testdata/rbbitst.txt @@ -2214,3 +2214,7 @@ Bangkok)• •« Complex »« chaining » • •« .618 »• # Interaction with the ICU tailoring to break before such numbers. +# A hyphen following non-breaking space that carries an intervening combining +# mark is treated as word-initial; by LB20a it has no break opportunity after +# it. A bug in ICU 76 incorrectly handled that case (ICU-22986). +• ̄-k• \ No newline at end of file diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line.brk index 8d0172d055cb3cd09d4b1c3b090c4672c7f0b662..fea6eaaf279007b84b7d3a48a606a7b31da82043 100644 GIT binary patch literal 73232 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 WjNF@cMC|4fI&`YFE7ron?0*4Dd>*?1 diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_cj.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_cj.brk index dbbbc0dfbae18cc57f37e207c81140f40c36e11f..1f8d55524244ff3c8b295a08ce2be3ab8425b180 100644 GIT binary patch literal 73264 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

    tw`X!w=j0 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 A>;M1& literal 73120 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 jN2#i=4!X9TUrn*T}ZKW^ug8wrs1BB_qisesNa9 z(hx$(Lemt&Qp!#sDWnTflduLFNT9SpA1$Sn0wu5T2#*I1r2jv2X8F%KbM85#3*z;4 zuI@Q=X8GrvZ~j@&%oV%$n{8}1V;(DF>&LFIFJX*jJ;v&LM^B#}8#-}vqQ1SiqrQ8^ z1sB&3j2x>U9+(&$TV20*Wa#MVvB4$vTSks9;~t|ECkMyIm(}+T9UUAQAFOY!hk&QX z>qn2*pBW!qU4L?7;`Hj}%Wt^hhGl0&-hi`ZgT&l*@G zYhul;g|)Ia*3LRuC+mXG61Ehs%h++Ak_C#bNzP9LRX)}?mO`s>$v3l~dRC*#c7O|`)b?5Q`60;WTy0Z>y@uikpj1t^x@#O?b zPa-6u?nKw(^@@{5PI~fM+(VG`hLE7RD^x8OEt^ClTQ;5~TL8B@wm~6b&|+OdS~hG+ zWXmSvV9SQ#us!J|NH(TIBBaswWRrme^I+pdA`y2)vXLO!tdMMh7K^s_$@ByzxarAe zf@G^ga;1+%V8(t&Bax*O#YrFG#NOJ6IoV2(Y*R>N511Coc4s8p2$CHMki_>p{i%?M ze2N}$2SKtkfJBCrrGq`7Y}uk~@vaaODI=-}G+VZv1j+6I64|otVS7PO_QCk%sys-p zR!Bs9at$A!AR3BfIR_|_VBOhGkX);f2#uBbiQ+{1(OSG;Arbz%-=Ro^uS9}R*AgUg zt^IXsq!i!UA8@S2w6#B|I5`y4o*a(pcTj>`dvcI)GN6#iTCB&hW_x1q0gog`!UE&i z0fOWxJ7$beXd64IN++&mI}Q>Ua~a1T1tfaJb|SzDY7)*xsK%ZImm&CK4+xVT_)1g9 zeh(xFB*HDIv9brGbqB+qAe>yE2#MeXV~be^+JvcN!+DTkI5EpWn^||RCrD1EM8f!d z2W1LV$3~oyoFYg@BamPkv~)Bl=vT^4vzNmcZFOuc0txyBTQ=@QI2k2K#v_n~^(2Ty zNX2U%n}|Rn{AtS;){}8Sf;uM58Ft36JFfs+`cIuh9G!|ewof`6t>Lp#IeMh?V%L_9 z&Wmpdluo(Nm8mE3qk|u zfptf&Q3pp#DiB!e*dO_i;qi$M*QKnc#y(7tyg9&$jAGW}AQF7P!}u4GyoGQg`eOU& z(M0lQg5;3^5_6sW2xER@4PL76Oj=dux5)mFt=a2okZzo9J89-u|j=6q9`(j@d-0Ik$C?v^81!A@Q zodn6d0!U;Uk`o+J$Io}(t&oVgw!Tm$xZk&7|mXqkxDFY<$w~XzP6E`H602AVED01>> zh?5U7{78+JtK}c!@6d%`DGwp+b?n0+;X@2(UcyDZ-$8pPe7m?S&WnX_w|~bO`lFD( zFo*=-c;@eS9)nP2B2wU5r{0;S?{_XErIY;Ks7+&E2AnX?i2xa2i_LzAz8ei9Nv|h} z#7$2qlDKty-Nxd&y-j0Lf*TULZvQyQ5qk2cd?hEElejksD8UWM<3vw-6q2~vC~7Nm zA`ETW)`JA0C&~LA@y?6BFHVZYUOI@xjT4F_`I~D~PXsrUe{=1V%x_ni55)cv{xp-g zMLpOhM1?lpt{{36=EU}X$K=FZkHxq7Zl&Y;Hs7YPg?gJG-dB*86GY<1iR-=sTj>;P zU%^KqN1|m5uJ}E{{!G1n!JAonTj>;P*GCvhT22s& z8z-*&Pi$khLhU~Z?}SOq2_kXh#C0c(O;2`(YO$;kQE%VOaV*^l6Wo&%J!XrW?;sL4 zPAHP(dva`?6lzb-#~??#Ws`d?^!kZ>`(|IY__!*aw4=w5k=Fhb3W+(6Wi0tVrN0Uw zNxo0%69mcm020P`bf-b`$qlzm zo+L<;YOH;1j~Z*%9Z@<-cDds&vLZ$@jC_TKhun zXA2@p-?AYRvvkBrDM{(jopqm4r6X&xC;_>WlYi~;v#NAN%=j^zU%-6N@MlQrd@c_X z@%9bp#kMu-&pRXe96@qWA<4JL4_o`FoiHfDt#s%fzo)H8o`8co=2;cn*#3*`uN{#* zO*nZ*A^B3w`bpfrN0i{k$uk7WfI=cQHtk61NMa=M`yPLrNP;Jc1_&p~cVODaCzIQO zDQh)jUrt;)Sc{|T&a=*?^JT)xbCX8$6=x*R5hO`V$KDrX>A2M$+#g%4iswXt6Z8m= zPreGSe*@p&^^Bl|X7 z|A~EvpThfRehTmFyx;j6aKaBi^7lL6O@u_g-}#paB;Qj={*`^7{Q&lE{g5O1H+Yxv zBY2nbJo{gKkKex==K;UZk$jivNw9RHIl=kP-&pz`+`a6kC$77f#Yic<>th&@umtZi z!sA%FdpWp|+RllsFGeJ8oKPgEK#rJsiGByN7g2Y_x;^@Z_n(Y7b3*q~2a%-b1d+IL zLXjlj(QS^X&HZd+5u7C5(JfdOR}sf_Nn^+PhP#B*q!#};LQfEj98pKl0dfC{Fm>!F z5uCJf&wT4AKPE_mrIS=oUJg59#7So?9XCC3-EVK|iDU%#T1;-gy_OW*`Ja>%+#w`5 zK_qURVA{Vc#xt;(XAu6kah~9(>;-uG8GQeb@A`AYSDzx#XAu6c@BfR4aKDUjLmB33 zdGekAHa)qK=S%G9My`|3M(NJ~Fp{*h3`F9lClpEYGYB?L3Uvkn`4l}Mo`%pS?yZUr zg|!&XV)!<2o4L!~cYs@$wi27ECqYiq*J8~{+TU<+J(poCotyod80N%m?IjiFYB@cZ z5j-K1o)bjkrm+;sEg;7nDWyk(65NpB2@yTtxiy3Yc?|B474sdvk|Ve-#0e2uYK(=E z*xD1@*dEWSxN(AKRWv8J2RK2DIr!4?iJSw99GJDej@Yae}9-bltfdnFHBC&H~Yhw|K8z+cFb8=4vCy3MR0U3*HW8aXF z6PacP7sM3CwLxE zbCT>lpvg(_^!Mb>18Po!NYZnHNZdHVlZl#>hd_?m??j(Wj2p8R>SSUVN!pngB5~uy z^^Bw*pXjp1^^-!Kk$gB*I+~OJQ2PqvcGmq7d(n{-*VCGsli$o~&EUCFd)={(+1}!; zC&|x^(o-|GkZj0yyg zxZ?N6KBaGmHddRrPnr`%l8%#K`M>x0c7P%J_4k17*8wCiG4YWj>X-aq&wB|@;Yq(z zWqXO$LAEmRjB855zeV|Wf~|``;dwye+pT|-Lm1CYg@mA65Kc;XRbYbC&-a_MKOE)VorZ^2~J2LrooAq zkw_wbqg!#}Wq}jRulsTdZb&jFk`$-EZKd-8=h7jkzrA9~i5IsDD)%Wx?5yJw+&IB; zJ??A~C*mKKNMz}FrT8K1C-4g!-~zv(?)&i&zMY@`2486HeHZ?gmdoe__bzUO*53E+ z_V42Kw>X8)!TgR~uoj0nF@9AZHCFEWu>Y$3hn@B0QKhkvj8`U0$1AtjVsBbZ-9ZU% zdQxU0VUJ5BEZ>=HTirnkPDmha*`6RLIV+MUyb3kni8&+bReDu!NFZ&~h*QL-3$^Dz zUz|?@m1jPE#N>p1RB;m5o?xxV|AQb5UCH?ikif7O!~a1*W7}&%_xNEg#&e_U*Cf2@ zAtd5gALQs!o@x3JZ|#L2`85e|21s!FH3>-D)RUPZBs^oPWy^aS!keWy5ixC?2w!;x zPP~~43A86(bqGnss35i$qXehA18EzaB-Rsq%Z7U5goNvf zFAQx@{z{dOXir?v14f@rtO%Vr(xIHp&BKY-SQ{tv zoH?0GIC(}P$#;U)HXB6=Zk&)4tloSpk|(?cYBq{zX)ULEy*h898xly{)RQkOB=K`V z>;ZqXr!~_c(K~g`U%PtNxpZ95joLW*N@66z^TqVs=yNGbCz_MwNP_2!2@-EnA|(E4 zO>c4dj3k%9>yB6NHF%9)lh@4PeNo{{vH;Au^-0nbQ6Oyjhs zw=@Y7wK5!WTGLymN+;!MO-S3UJ6}tJgdr!`o)r27YmxB_8z%xtuDGNqCn#BpBLnFOX=B#W2kO4|KOdUYI{aPxl|_ZUsh)xFo#Xo{AF@jm}2z zFp!{s@>$011`ft>XSf*0=G$9t`xR)E;MVWFl5ldTLLz5gBHz(^62-}@5^^HqnrBt+ zBuJ9&qn3ISh2%8~N!l^ns|k|eu2f9RUU#C9;I34uvFM*fPnx)(y9tuuUQiwcE@tVl z*x&rey`V{uNXhzs4?z;#fhoh8NaBCrelmMO&02gP;w1Hd-2N`Sqt={E?fAq* zGPUCq@#`l-Q>J!&VsbLIqXHAj)Q$>FBvacLn@Fa%FE)`(ZC`96nc5yuwy{``e;nv{ zWG_HR1!drjs}{nDebmBUxL+L!A~E}7-2=wGk^G750aLg3n6@@+6LVr&dt@);@^FWP zFt)M1@HOWHL3)K-wmfHF=Qaf4_5?Gm+fC7L(dXM36i9o*n2?a#I1BFC%dJd$n!gX1(zeG{A0E~s&qtDTj}_M{Tr4J z{%;7;qF}!>J&43V=_8T&^I|v?1hv@rBPWS)=Rf%3NJ*SQ;z-aABc<4rM8?klNF>(r ziLE^WB#x!ydIrH<$VI zM{xg%+>^olH6_@aF^l1^qOD`^SAKNY2kbuq-!!{EuJI+UCF7IeP8j=M3){*tAW6xI z|GS{TLaDz41x8B2oiJ+Oja+BbdvbmgzY8kLM(N5FTFmxD?fOt}-=a0v{%*7vN{6AI zq<%N5cYS~W5BDBUZWT1V?=k7S(QB2)B9f$>*jGW36SrDSIk_$mC;3-F52(@+3YUCk z_&UN#@|`fYT3o1|Fb5?k-p0Vbf+xH~a)$#yb8Xvya@ZSiES-ad6SWh@x$bOHrIU7F z!6t&_h~z{e5v46#w*31Fjw&Q+_2dXal9UsB-9b*=>JH`PSRPLD*PTIUPL2^y)Setw zI%(V3Z3;%#ZP6{>O2_s3%2_kXhgwDLwe8+k8co>i{rx`k(?~H()$<5G56%x^MC!dXu zkk&paC-%`Ja^hAxl#|nWILSYHe7Q3xrwJ#?=YY1lQ>Zy$7)jc?gGk&;ht5Wm&jD?m z6lx9_Mv|5jMB>H?osA}+1KKz#)EqF3BrPY1#Ela=8%;h3v~g0XIbaw`T22s&8z*!& zs^);s{mw8TaqD;J9B>TeOs?MKl8K^RHex`RmEN{5b5l8*{(oD^zQ5Jr-g6GY<12_2s#uf;Y_3RR24NYZkG zNZdG~?Md=lY~!R*wK$9t%M^y%5!^7)k&HI)lWOACes@EbfS$YAsm3ZP$azWKs5^p!GDQ|CM3icpF{`~dJ-kX*Av2tL=q+z8YL+NG!}omRh!Ca zBoRWGT?kiuNJ5B>DdJf%LM%uqu?l#ISl=gUc6e|QG6zuuC&WYuiC25j6VlqlHs)~4 z1}TA_h*})2_NcLj@f)QOv3|c}HU&lzht!@Et6Mfq0Fm$_#)k^=gjO(F^hw4EW{1=r zE8@K`BGfPUdL{Q|LH_OKlfI7C#9SBZejEO zp=eRj!J_-w`Jzu3{W`NUvn})b%rlw)$aZB1vTw=$eewL_tKs_)e7{~izofckXUQ8% zzFb;a+E;p4=@-h%$~KkVT=wy@7t7a_-&FpW<-eSE;k1cqADQ+-uA80DjpgpkJ)Zlf zOp~3jn2+{~HQGhmDsHNHsN%B~zp7kY`SQvSvGbKbWaq19SM^ujTlLwhf1f^o`n8$m z(;uAv+>DtscFuU!jL)$1GmAysnH!`G|Nhj>SIzv?%%9G>VAhCmne}G8&-(DJ@8i9? z+7IWmQ@yGBHPxS*oteFU_HDC2GW&-$ou+@yiJCXa=bC3~ekJYf{2Y)oXE!_V)y}zp z&R1)zYnRoI@XtfFU#~qickbLv=bnYi(aM8kp!hhj| z3%|DTTMPeX;qwc>vGAW3{@}l#3dzKxhDF!Pa`^xK9@OGRZ(8)XCMS!&hfj-J7aw2z z4!D1*zN)^jeyskn^1I95SN^&3?@cS=pHg*in^xG*CKFARz2Z|*uF@@2ByCZ5@54dY zlBZ$pFf3flYlFV{T=YVeYqVR%gvH%YA=UAmG1%j2*&r26^Z`e2eVfZ}RaJ*rn;g*Jbya&;};gN<9;JxSt zeD+o}e7xbWx%)SSzjtB74;p@fE?!q-dC^m76Q7DP?%M9XzUYOFDSK3-WR!h79~Pc?o;#s+z-ya()M;k7q@r|~C^zx3m-s`zEm z3r*AfrzPIK@HD>&e9J!3)Y-JEX;afaE!nhrUEb@>XKBZjn~pb)O@FxQj;8yXpl+C- zrpKB-38P0o7HoQ^>023**QHI*H@&FCHCJeR*e3GkwNKm7ya4UZP(t2C*?;!lNW(U- zZr&ooR=t?{sj$%y`f0|_=4+aVns1!`aPytb_caGlH-B*ckEHI)IL)7swxsuF7&imj zuf~OM{#MAhulf0zFZ1pTxf5RPz7?;v`w1Ty(+_#8f+eM6H5=n@!D7QY;oDMKaYH<> zT8gk$d^9Tj45RFI4ERrD@Eu9LpQ_F2o zp3rWTLMtFY*;&#?@45`CpPkoO{VerO{*<}3X+C}svA3$~QhtA3W?IW1dP}^ElgpX5 zq2;|Tf2PBG?b@zw-WzS)Wjqne>uUL&4j*mvx@=N>868DGjgE<~v`kw5uH|2&!p<6; z|D!1PD7TiMx4hWOT3*zj*0Ppgwbr(_wbp`9Nifdrhg(;*u5azqKrH!3$Kiqm-`|0-EgiHIK?RTK9{Z9Bk(0*I{+uGm3KaaPqZrk7f zq{u;=-^R2*+jdd=KVn*1UTa^=uiKw*=Ll*?+F$CZY`vpnq4tlm6}=Ee zardh1>>N+1L?;)t)l^khR8;Wbb8^{St`h9ELh4+&RSB#66=nJIOd%0Yrgu)@4uVbb zTw{i<5yo`N(BzP6-<#H8L2uaHNkj+4N_$yav=GhI(M_;@vBa{UmD=RBe zUyP*6Gv(!R+QVfS;k8w1V0C46H3U=WRI*?xmuXe|7EGL5b2%-*jKS@ZvUDg7LfEuV z3Y#G$5Gw{)Af(J4G&M0 z5k};hi!syJQNfF(FB)0!_hWK@9aY zD-c)($!C#;h7t@hL>@kbQdhkN#8UQrsRjI<5+^w|AO~dUee^TTF_>8=Wf_@uXxW8y zByAFgN5&i=6b^w~xkQt1n##JArf1!{9$`>$g&*5@>M;s7%e%{b`B}Fv2Ol)z>dP~4 zG5~ke$@lcE%gLBI3CYYShR>ILEtp(wZB1=$wg&pr^70x!9Fr88;-o0-(Q}!q*;TV; zDCv{n&PzvKvc3f60MCZqYRyS*wZ1?GM761@NdUtq&Scqcmt||-*J)-177-nTpbc-_ ziVk3e6ZaAUr49+-9xY9T&X>=cq=8(law>R;GZ zyMT9eG#w<$MuqzNkm|;@CUD7S7p}vtmFs#UdY1r<^71Uy78p814r(%5`2xW#j}(7& zpjh583UVt=)N^^ch853^Yy>rs`0&&hV^J5`XzKKFf*@UWDnT314LSzJ1)p`n$!1%- zm^L6uV-TqYpQ&idD&kp`&d376`(hat8rynhve^dQaoV7ailSV=8yth|&}S73En$6C z$;DbsA&reRf#@eQhO|RS%u#3zAEY{3qI3v_` zgKJyR2gg3tt+SIncP$~0aSuzufPZI00}-(-E>4smNWmHy^g>__=(9ZRhe@MBZy8Ux zh^urn?<%0_2=Mizii_FOMm_QDYIn4CLhd2|c*VztrD)-NpacGCfPP9Cx)a=&!!wWF z00}fStXQ#pIf{rj3PZqqX^#6K6=<2p4Rnu)2FqH10ujX{#4FiNzKc8v{T&!-mPQ)xIPu|l=?gTcron=6kPjKzxyM955=HfQdfxloXBnKKt# zF*Lbs6$FF^4_igQSkb*4Clv69rnQv^gpj_0F)H^eFRz*|K7qudkab!OXnT5NCXqfi zjbX~7b{ej;^MWNyIy<{NJG++1kG8MuLQiQ#v(29}{Mx+|D`>RAPH*MP?(R+q<7`%T zf&dObg@}aQD^^0HrBBEskAr9w-LH}2Q_u&vBSpkG%B-fm`?W~M%7&|Qx`CAx1b0+2 zV@PHAB(g$eUZZ7TY;kz2Bby%SA@5wN@xcsGDSgx2Yispu3f0o35Fo0TxXNhZ5vv)B zhUM?4LX!z8iQc7@KtVzv>BH}4q}as>KcbvXB)pTf7DN9J21*ZaIb%A4C>k30EXY_~ z(Hh2maNPXAIQ<6luwmG8Mr-naVLu5i9tG2Hr!WYj|IL~(?x;@gP|{sI^Zu)&&SgV#x|d2 zZy0%pj9k(Ip*uQqeupiy#>?PRc!DB;FL%b$kp8|^wH4BxcRN`SzIq(qpec~{8tFaKY zN*P3PSt`GN#9HJ>8R?66UaqiMto(gXxM2eD+C`^=0#xpOwc!jY$+_CVb`2p7{CS1) zpHy1)^;{)X5>O+^lBTaive12KC{5K9Q9X42m28d)R=@%Pb5&JUvuDFR8K=r*#thCF z$KPmEH5)AGuS*SmRUJ_5`=DgHF!Nctat#Lc4Yo0=p}`q8ZGfR6B2L(h$*BAe<>22T zC9v_UW&#Tiv#7(M9}fmM{>PuepXLO&5ct8k+@OC|6;dnKUIfYfdYNGiXS7~MpF3r) zkpN;05!|{qV1NP=1UZq0cw9!{i6C@VDxOxz*kUCLabo+*U6(EuH@L1?0Ri!EIjp9k ztC=Bu;NQ;9m!aXY^aYltxB!rWMtg9ZaP&RU6NBhrf#6F!@q>nY_z1ZJTo9Vyaq*j` zR$)f`uvo_73#+iBgAA_if(L;HA+8WXU~$D?F6Ky#JPEj5I#0w0#S0C?3Lk#uC5bk4 z=LQN8<%1IzB@e{Y<2F&cwDd)Ifhm`}+&A)B+@-6$o4$aS=ZarCp_~MKUI2n%?JYeG zu$Ns159lti;gdGtsUrLSxf}z7XSmVe{a8c8(USv1BWoHOUVdhDV({3Z;h~Aav4P?7 zL!%?ZXV*0MY+1X1b>Gm);QFz_f$P`yoH{ae;>_ro@zn>w?@H=-{rJGx0Qcyl9>b?k z4jdVr7&^*5`>7|7b*O)A@W{aUAP=xRD!}fEfw2knUf)B!Ij%!J#{o6^Zr;3h|8-}& zS6r|HgRYMVx_>Jjj=ndOQv<=(1{p zbSurn);>&i>pmiK>pt$dhdS;-$G(lk5v$Olje~>7&~G~xy?yY;i9;BG`|Sq8uRF7H z#fppYx^g{UFTH|aH{f+6w{P5lav%#P2ir$S#<7~9HZ29;t1--8g2Tw*4ys8zP7jU* zm92jViQGRrJ`rH4pQ;*E<3NC&H2s~>$|&vGMH`o0gC|7Y*aFq$C{{%zWH+tvy`!g2 z4-ejW2&)_L#zSl(D0iP38yh__Fv02EO*6Us^uST!PBl=pBD>F?Ix;%UtI$4LeEWvR zKo*8+z+<{OZQ_ibc4d=jo#SVwHOOrdiwf@&y2%UPapI!&AT@>Uwt)tEsYS^v;7d_ zIoQ0rzj^(Y&Aq#zYC#PG;g|}f*t2~P4`Bkk7PXm#D0D1yD4pH?oy$eB!GmIl`)vhxS$G0T*BXw1 z7pKhORa=n`of?#k2!$3bCZJ*28YnDb;aGHN#DXe=g?0dX1fXnFpC2DARB|sk7~I06 z;1k^mgx-D{uwMoQcM@>J)g&N13W?}W0`9(s1cXNs5Z!lxegbY_67s1Yy1=mu6wg=d z%h$9Ue&3K~FMN7pi^SjcD~@q^X`Y(5b}2qhfwaSfQ4 zBa||hcpqj>R9I14jj9GpchlhLao&QddNO%oyf`K=CN_&!4qakJ@vD_Pm=k-_spCW> z97&!v$uyxO5^L@q7}+>FJUn^>4(>=h%bPybAZ#sUlP@&LY}rM}#QTEn&{9FHExWN1 zGX!JP&)Y8U$?GR{dX_-@N%<`Wfd@dMFBs$QH$_YB)snHJMN%M9(r%*=P8M3)AxGz+ zQgm=IP`jazg2_*}dR*U)ZO#R{Z3J@6Hi);B*lJ@SquuxIh&mvEi{81{#{d=-Xe7|8 zyG{@e4HC3Q2bOcyGg_kkMktVYAdwWFG-o`}u7#xWrUJVNJ2>7Tnl)m%DP=!)_RxXA z=m2yEdVNqB-rE3IDP(HIMtHhkorG%y&hp3&q9GFxtI$ zJx2lh6z#7&mq>q?9tPAVQdUg25E&kFuQk^!E6kClDY2z(bn=swl(MO^<;*B&o*hs( zC{!re?Ylcf?P@1Zu%?0Guu%Xd@Smu@z=WBPh04-r@Si;hhA8JC_X@HbM2`w$9Ep33b@Dt#N2Kt{f=gyrucYAkv zF8cd-r1$QuXTCY-+%wCaxli2v-F7iw2ul=+O;a~Dln5cRmJkhnlPAwijUPQW-O$mu zv|(j;&zgqOiNg)YN2kZ8)-_x+F@9+B@YqESTPF^6$%M)2V`EdNx*7(@4~67bLthnWtTe?nD;jYQ4qbm-nYPyb1pE%wCwSVLx#2~Eo zuY&K*@EH=~Z+|Mp_pT74e2x%5gz$!M2&<)Ah??DSZGb!wALOh%Amv{8^us3?lxs%C z7m19>!e6l{5v8I`l#5w_yh2opDlr?{I#*mE=0VDQh^>b73q_4sAZj6|PJR}`cfD97 z76Y9nq5(pUqDeH17SSr&M7!t^OT{wL34a%fI61Ykn9Qho~`OqaU&WM`Co zLQDeqgsx0}uan>S#WAf1DjE}IYIX9uF*ym2=Tgb1A}2gEJSaO8Q+5WxGW7}JXdTz! zD#c|G(6XbH4LXD2t2g|pPvo@hbTVm`4r`x@>GBBrG!Ke~>(j;r`lNImab3>tyDMCn zOk1GuyHe3BZNa(#TYyy3*n%q>+U3Heaw^$j zA8gu8e_Jr@i%HQ6mmTKX#W3x5VNy2p8nFlT=~@^+T_?v+ickKS_A*Q~R=Hk|pRh)b zN%b$LKEc=&Gum#SgNbxp#Ru_8rE`6{fnlONy1(O?6a|F|!}}Pf{SGFj<9eKVqcf(< z*SG8!BS0tlICDS4bilzh8fu>ohW2+zB@Lzn4AUV8lb280KA|Z7i1aT95aNgn` zj~|zOQkXC&&JmO&9ryOZDqVV8jh_@Iwf+>| z-yxMWeej)tN%t);@nFK1c;|PjZ_zqVEvEV1OC=`Z$S&^u?j;P|PTQ6RokD>ndg+{MwY5 zUc)fG&V>oN;HTr^cKr1W6LB({>@Jp>U&mzkhKQKL_34c%F};Cdy4wd6LRU6Ztwo1p zdQ$>S#7+9Xn_;>q0w(P5!ZE!$0VZ=ycMrpKuMZ|aeKIk5$K&^<#B?vibbkU&-tqWb zQewKFVS2y^6Ux}sr~I;etBnauhW9O)gPbY52NzNM% zChgt^Ui}<_tPrLmpVV^%zcC%=QLbLRU3uZ^<&#eA)Lu4kc^kv@4i}$PA-C+jHnR@0 z;s?jRf9T;8^>^(ueHnZcnxOvf9SqY$E==Z_&b!tVG%k23p@;*SDkN9nrd}vnBt6|=y}U~8K(EUFe&6pb~tZA z7p_kqV3>$TzOf4BqVM-RnEnJJ9&usv=ToWpAZUK@+96U&Gai4$!Gsv&JvaXlH4DDE zJ{9J_eD9}eYHknCt4{Gouk6!9tf`uL^59eR3?e0tQwr;iH! zQ#wx1TRsXpja>rvPot88Ghi}x%)NXHBNEZ>bOnLZJw zAS_5vJt*L&hhbtOeidpT22rE$elx)Qe{XAS^2v_&t0b3Qn*Az4I$qfQD&9RbN%%yVlJhCe9vV}}&Hb5$-9z(9 z$7Z_MeIFD5%XuEGp5=ckV65_K@#m>*<|mns$J^Hvq)*$K&7^xOc#W0P)wlr1DtuoL zrqfsj*P^w{x9`x*8)e_2nw#qyxX&_zUOpw!apF^Q9p`+CxBn?fc7@&l^NCZ{frvz_&L_MJnmpJ zbzF#ed;C7@gDDQ59%q=IaA6Yi+(ukXpYz3}ILX%z-F(7aPcTfMcQC1EuUvMtUVyd$ zUCzP4)OJVnnx-liQnS_bUj%-0R*`?XX8l+E!-N*W6M|R3SaoI&% zi~b7JC!!E!GbvSnqs{y>)2FZI!K9v1huea`NQvpI4ATJzQg(bgsW3gs`1F*6=`Taq#KQMQBb79KdWvB> zebK)kOzyLjY4&Odjp+)pS6f?$Z^n`xjtl(y;J->KyKgdm`c^?OeLE$lZ!t{K_Sxr~ zOOfo7_jkC@zSt4oxQkDiV2;OWOee%&%M#y#@AJRU{%IGcpmBj-v;VHonPsG+?bF|g zzZKsTe<%K4o>~6B_y_R=`1?okPw@TE@cE%Uv-~ge%<{j=^TAI8pXBjz`AqSdh?w*< z#UJ@#`Z2@w6Y;G0H`sUh?-J8b;aS62S_L42Y) z=XV0ezH~++xjv;iBSGU#@1Cr}o{=~aQFh^TbHbFIPif9=sPQ3IBi1*ADkqWFaS3(S42(-M=gpOp~@an3m&34E_|z`R<>%8c8K#?EnBwTuDcHM4@17vp zCBN^|oC7lTNpZAL=YTXl_t~U4e8Ts15T9NsWtW^!h+^ispz~7y$2j-&Yw;Th{Re!W zH)4Nl`1NTgeqQQ#cAo$A=7onUx)k@B&s)xTbewo--gg*7^WY$TD(u-LFQz1ODZ-Ro zpVFL{3gS~?&r6|P==mL<;nFVO^E;grZ2`F@^3rIB^m?Wp0T;EFsbiGS)Ti4VeWG(^ z$!vkB)b<&`$TQ_^2zL56kqh3J;v~JWp_AyO0!--n3C%_$8={wFd-E^ zZ;3yC!n1CAei!wuo0{M0^>LCy;m*2gsd_Pm*{7g+3!T49E;~Gbr}=c3OLmAhd>%~g zG3`dZDD3$=H>Pk~5X7gKrPQZ1X99yT72-^wmR-~{fl9}fCUV&o;!L2TEQA|VGT9NP z` zo)6Z1y4Oda^4)jdwdg{e57vBgV@k#+!jzm(cxGAi>HY+KIzMNYHJ{v=lJSYoQ77jU zo}<=$ih7PZ{JwjuZJ)5MN#?hf>Fr^C``_{Gc)2@AF)~DLbv@g+7=6&VtD9T`6Uk=3N0neEK7a zN!W99;$W-8$l$ruAKQ8GT>;v?yC8fbOtE#`%GmEgem4N36$m&VY-KqntC;@O9KkBa zcf`VX8OGDM^p&cd5L<7RAfLe30G~#iLaWLlmO*T%ECpwlo!FJi2iGj?@7}{PNe1Q{ zXJRJ4uJSNqg4hQ5G{Og66xmTu;d-Zn8W#_#2Kh1j{%ykvjM(pq2 z$M_WI+^gSv9^UJcT{xfkx{6*eAWX^ml;+(NLAKxnj8DYDeEOvMEQEgd1jf4Ghmnj= zgef_nI3^SA@6)erCceMmk%;<4@8}59C!~^Q{KVeTVU;RORvFkF{(fKcd~oP{LnM_H zn4rADC#zgx^7&m71CxcL^uTwSNGfSCm7ADizBeRDb{|eDJNDiXE2sEmRfNh;?>qF_ zTPvxg;S=^|w1dI-y&+a5{;56~@?sxc3B51I!h1vP^isOYSo^&pklp~FMmvW*k08^R zL2Re=VIM5%L(ED$AH6qZCj1Ubklpd+lkwX-sN?#)6zX`;Z|{68r9M6C=r~kpRXO@J zJ4~OfIidF*Qc0svRVF6!357{Sc}GXkeTP(1U;-4%J|Umx24Z^5y1}r8(Oj#HYfZ?S9;m9k-d@^X6e^mI)K*Q=Bu)k28IG!i6dP zym=6xKIfxP*V}sIewOdnC(Opro4YZoIcGdR5vJsP;+W!{fe)ISf5C@OL349IKJhc~ zZcK_#%0B6LDun41Vd8v>bB-D@6+5#2qN7jY?+Q@QfK)+lp9*^h-i;}oPeE&9gef_n z___QqJA6{MfH+~w4r9Xij~DiAw-=M|xFC-mCrrutl;*s7(0y0f^X6am$Sw(=2vc%C z@iXvGM#7YDJpOf{l4d;4&YN5H9!z06Zk|n|eE3~&En=7`CC=Elp7nRp_>^y)NqkB! zJI<%YdH57_7E@~(iOxj9lvF-H*WT>(}@Ag0HxMq_SH?=J|Nn>Sg_ zX)pl_V~!x=oqa;Gh zmcw6{wF17o;nRcX%`N%6-PS5RZw}>+Gw{~xXqb#Od!IA#*2PSAvCqH*3iG~uIvOVX zH;vIgou79F6dCV-8h2sBz6w{r)R>Oeea+uWIX~}IFfn=0+#ss3-`i033G)d!V~WpS zUn*rML<58x;S>KiuS`sL#pV-K369SZ(x17}Z|)KTPo|K4a=-i3{QY3{?$e;(wn%@z z#pKf~98791MSKX>CramhdZkNtm?vn?N#*(ZyH|jQYfeQww{iY|^UB2J-qVh)2*2;B zot#hU_t~46-22BBXHD5*+zVvFO)A-?S{#X7+ktsX(o-E`+J{|Y+>0w)T4UiNr zJNJ1hq(%G0=-0OJ8TB(Ed@|SUX@3EXpR6_Bai;jO#AMHdt+m!A)}^A=S|`Vu>tR3L zW$-M2gLOH+*T}le+Nj@aWL;su*QmtkTV~4m$&&n{-;{~XC*S!U;}iU5L$heHpWj7$ zSLHLXTSja7Oc~Rem}bhDj^5lw0-PyhI+IT`W&C7fnknNa6Vpr?tC*N(%2>t3G*iYZ zCZ?G(E-*38oIcp@T;TFcS0AiW+~aZYGobVL?k+bbbNpnE3&PI<(fh=bua6@N?JkeS zr-0`OVxt_Z#G6Z*V_!s}-Bk`IwGV^Rl&)n_gkUeHerSYxduF z$oD_d`jguKbpC$V&E(TAhfjKbhjbP1vG@m0N6=y9v!Ppne>#^@l zSraoc&6KfS@^=|2))9@)RzZSwC9{x zro_|-nCMQ%y^#GJlRE3A?32aMm92Bq`MI(I!~}U8;1lOu*=CzwKk#doWE^73x-f0A zF*?!G?=zKd_qh)2UA5DCgH5p`SrmCI0vL;hnRK-VtULPGW3Zs1?kh( z7LLl2>(frV?*c?K$eDbKcjhKY#|wJq#=?;_>A3qG&|}taLv|mB73yjcB)e;@J*i|j z%yj%(2h(+7I-ch|0#Zq%PuDU``W#T$*f-C9I%}T9Bt!#fXo7dRKR}U0-l!w z&4JTXYHx_rr?7Em5TED_S8_h3Il~o%si0@LVxE@@l3hX1OZi|*B0IvATz2dXSIm9U zL3}FczGxpzN%%yVlJkk})wbg8iw@#bLH9-bU`oO#!jzm(Y_GP}5XnB}8>=+2aY2*p zGK0qjD`dK{77ZxOvC4iACRsqOVTfpBl^Yo*q7aOU($zPvKka9jqVXx;ScUkMTy~sK zBYF4~ZLD%2C7(tZpW^L7#<9xz*@Ikctox3;_=Hjp-$R3QbN61O{l@{-Ji%lxqtueEfMTE8lWIMem}G0Gi7hB$)}mJhsLzy z54mJ#K5zN2+*@n%Y3A(farV~6JTHagC!f8w{Jd2By|u=9DO~G`cZMryy?~$LioK5& zP?Q_vrhfAa3hO0srHn3AtQrP-4e#HT{+$$sYa|`dw`Py~zj4QI z1ALO~FVK6kfPi(-g9&26na`*(9KL7t5W|G|@r-Ho=jI0;9fyK?@0zpcAk(0PR9eByi8jwn7^?)`L+Sx5C=BYQtx&|afs z7S0osV>-h49LWSCx{_~c-cH%-j@?k0wbD8#w%UcfL#<5Rw8 zWyGiCvg3Thr#JMD4z&-1^C{YWcOoU9jx#@ndh)>D&iSy}X9zI3Wr<+sq=_KP*yuFY?cD%5AA*U3dEcgD*$E;I^ z9jAB42ifsy>om|wF1snlr+9lIgXS%T-3#f(`-=7(8FJus(3b7ZG zEC_sCUQ9{&M3|EE3HN6@4t9!!_buFJ2Jxw|`&GP{lJJQzCFc|0LlbYmN)Vq4yI;kN zDG8qlQ*u6yz-qzFn+KaZ9&dgZB)h`S@4T3j$c`{2mmQyT#+%;-@u{%$J1?drd?HNA z`NZd(&ipRb*!LJ4KgA#W^7-8hW7+Y5cLi9tFig}-#Fbo^>??Y>$0}Y-N%%yVlJkj=pW@kqAU+k=7I-lw;S*s> z&L?i4;@N^AJ{8s$crhj66Jbiur?d8g*b=yIv;BCX-&iyvQhAFqMcLw#EV|ON@>$tz zaWg9$WKK%fAvQ#ziKPjT)R5pcJt)Ct`)0PvXehYq2s~FF<}xsAttLLvVO9Yr6X%5>~-OooZs42m{7-E zj$@Lx08n`-(F@pg>kLY&mS~g&>9{{7rQ?3G1KhlI*buP3nv(nh5O&|q_Q&K)3El|E zWydJFWT*I)fKmV^H^&_@#gkp|eJ6A;CGC^ZOM&$jMlYrA7GI7_T!^U_*hN3N;y^`@ z566Qs**zy%QQmWk$||280q+)JTRM3MLm#Z`4&sw-$0b_Kty*XI=GXcf$LQ$Vf`Mmx3Om#z}xmYw+zzRFl{}HNHv|&DyfGJ99vs zE5#=&SBMwGFY)rfU%?rjV=B&in0(gX6)i5hvFOd>T+!!>ewSI5*`9fQ=E=-|WIMB? z*|%r^rns*7I`}*QpYIgcmCP%-y5x-|UoWjJ9V~rK=~v3i$~KqXUiPW7=gZfZ-&X!u z`EO>eo;5w|W3!&itrX{SQ@ML`kLJFs>J;ZH>d;@YUdJe3#cdT2RD7Z0x0M?zZ?621 zI9K^2ajt59)lk*lRbQz3_t|x`ug|QQec$Y-=FFXQ^_-W_`Mfwcx0uS#?N>DH>u2Y_ zeC`u-e||yF1rro=!Q1e9!G|ySSG>-fXXmrIGjH>}SI&E4erEor`FGC$*!&+=FEi7t zk5<1?g{z;e{;l$ha~A@g3x~xytLDNtU--?Mc{N=%6Y}qYn(x${Sg>Hhr3=nLc=3Yw zFL=#@AJ}P>w*61b{$J!k?ZN!0YwxT5n!1mOG!9T0EV;Gf#? zQ;csE@R{SzQM#zHf#Mq5-D!T|(k~P}hlm^3`lU7ws93Ah@%0c_O24FH=-Rkv_Ji>E zc;k`A>Bc)6-(cN`@s00j{1dzuJ%?edyYW+ve<9xF#u%%!sl4d3=%c@i zDH+>gy}szVrrM^~ri+@^H*Ia&+ca*yx#>*Pt7kvh^ya2_H9ZPLc3Hw&+4R|_zf`4x z-dgM4U|ColO+RS*S<`RqvTG}TQ}kT(EIV|ObvK0SiXgS@)6L78*EVl%-lHj-KKP~3 z*PCJG$C{guG*8Wbu=%CU_cX)3Vg5CLr1>*2dX!_q<|muKm!Y;UZ+^DwBE$?wybN}N_nfE&-|QxJcka=xw>U<%XrJJvmb1ES<5{w zF4QfL)cr*1zADr5Y2}N0ZGmw!p#5f8{+91~QU_a}oqM@;k0+k-H8{26Rl#YL0%Q7d zYpq*Sx>SoX?j|laUO}m?l@+&y^HozJU&Y7$^3O43uS>wM(yjqrUfa5e?ifsIU2fg) zw#+fZ*XPS$3pZWZ-@K<_9<#h=uSS~0*SaAe4w?Re)4tCDUB`2|L#=m$Ji%_1f)!AI*$b49U$qS8eWSK%-Zyw^^ibx-&2{*P zh^@6%m&)sFGqYOX3cq!{COVy2{jKk7{ZpOa>d=1ev)&ZMyNpG-tj^Xi>iqsbt22m- zO=D@%&;3hcESE{^U$_2?U*08q>VD!E?-$qltJde+MCy%ysSmb2Oj_Rd!M0DeeF^e^r|pMr zzo?mLFQ)kR>h|XLmF<_c_qFe8KhS=%{SG_+CAIr%7uN1?zq|b%Q0jB-kF-AD{%OPv z*Du58Ta*tdeIJpw{}jXRH+G1QIUNlh-5s_)Q?2M2Qa*96<3QV;9Va{Pq?nGEb-WaP z9WR5=y&ZRUJk;?n`S)o1y7qk?k5dcUZ5z|^jrNN>{vPYn^x6hnf7kJBheS{_(ea;4 zE8AYWbdgT?^A$bk;@!nl#rG6HTKr_@K;}U4v-qw4O3F&wls|KzIz`sa!$Vl3$compb*7_L=!gcb6V6JyUvL=0NEq@R4{+pDoLjRc8*A zT@0VA;B!;iYs)@R_SLchm%P-<6;)luyO$15&<;OG1!9&%OQWelwSl-Q5ROV(? z&CXT8`rZZe95-i9E|)8ZPmrssm>rZPM{2OW6^h_c?QD$wNv&bf>B6NvNCYufBInqez91bH1 zla4_Vlg!F1D`jPsaF>Eg+l6#_qof9<%S)_A9%{2BW7e;WLK3UrQ69UbOxH!V4@kI* z8br}+pm3$+4^lPw4IfQN`y>h7Y=@!^A4|D1J6ZC1l+ciZL59)8fTwn+w}4WPKVNOG z^hA}jmKu;6H{se)C%TW4eL<{sD4G zxWX=NM-3Q)&C2dFUwiudbMS|bzHNHuMP-n2y83~E{+ueAQ;^JdV*Y&9*MiH{)>hZn zW~-quEibQ@!!gAolbj-jJ$f!vHNR@U%B4~wT%~lJudGeMiGZ--5A@~~Z?(Qa1L(G? zu8si1W}M08V84>BdF|JnAuLoJv!D+z(u)z`C`u+#Mx{fPI-sdh?tD$CPw5s#bc<8E z&~|`$aX6mJg_N(FAA>S%O!VeP{qx4^7)bUnrnC6@I8j?4VqK)xxW2O4CH=UIwST~; zcX7ceFVDi=0z+qLL3KtepDSBHkmL8y6v{U&g1lAEFI--(VTJQX89@ysJU>sxQanZ( zO>?As#vcb zz=o+h*cFS|?12krlaA$KQ+t-;8^G+c5!ozk2+X!-+A^8;>TJhSpj=Z|RRf)M4OX&j z*|Ka2t&~(Rs9XU5Fkz^v%XKcn)Hzl2J3Bkkr(CuYsUm+al2N*Hl|x>AENun3%8KO` zu=b){C3@gXUR5MqHQfLos}5FhWSG9~Bv{jl=z^xWfyI}(Q*i9V+uTDlY65#8gQx==0ofDGH z)$!=-g4RR(@f(B9J?N4AzzF=;0PUJEcNfI3g0L*z3>7ptuU@@s6_W6G4hC0pPfn&F zE6_7bI_Mq|4a!>oxe8Jc%LO=B0tMa5<0%_lpH4A-9s>RmSj0a?$A;zzZl@+-v(ku& z;)UDZ&ITisY_8mAFcwb6RUk8KR!v<^9S9P>YU1XoltV@PGBMDjvmc}J_vXmO;~QKm;F zsH;?J444`0r7D#t+O@V;Kc;XjU9_Sy7u{a;t%`X^tY$8rS3aNeOePd1epOUlf`m*e zMPAK9p^FiAK{cC*cx81pLjMmAq=%QBF&#k^&CPNaWGt>|4U;Lk&{>3;$ZFM6hlB2YUd@>v)Q!F-N|BLtk4BbgT$k^)!pWDY|T62BB&BrQ|Tm5tI&BZ8M)8tl$T zn$e7$dvyxaVy{G*1U>$R8T}MeK5}$|6v{1xEB&h!4~zA3_kfaid`_Wv)!4z4#(0MQ9Ff zr)?4}`oO}Esyk;cCBRAxm@+3R2Mb%0Dtl@H_Cq%b`aa`nlq?GAxWI!PFlT)%^J|PsXV-n=wN)ma#Y5RLuturfaETs&fxG+_yog zdST|XcI_3I)plrO97BUMY;J(T5V0sUimIr*f*kBC)C4~HtvP{$!zSuHm?pEqMgGe$ zr1O^G76Ln)r0Y(vszTP%+6ysRe)k&Ah(>QO4|l0nBLkQ-NJ#G{mjf2CEXWh(SVAv@ zM_Kr+ltQajXNVY)=ne;CuCI$cX=|U^NY6%?4pWe!9B)(8*Hz3znuN0ic0S zCrBSf+6kD5S#&m6_MR^MLnjk#gfarY5Sra_$%|&KgBkI|Vwr?bUh-pv%C7ygn2kmP zr7WSB+-ZQ(t!YxK187?WhPml^pSMA^eI1K z%H^)KoeI-c#j2~B3TS1knYL_E<*>vi zRtXi@G|nb@{$+ ztUP2nJU%@>IWc;CWZUS;(TTBBVVdT~;IlQfh$0m)@^$j$!&XNh9ho@Ag&ny;4G6CBLC@D|@=p-_s3{2m04Yu-Ir= z!047Vcy&XQr>2>>mSZ)TahF|L@9G;)LzSS;E4zD#uc?Uhg6aVXUZs^wf0ksqxVXu=^)(8ynp)a64VEwXa)l$6U8g4~-w1zGh=wvSHT1U3XP>;u8HL9Xop zAHKn|fWxBD#C>qtzkDBN!#EJ8H2za(Hee};=^Y$8e)<%IdIzBsZW-R(a@}>9wA_ba z?~W0~b7RZ!P|K#PTKaZ@{Qxro#IY8rv3JLAnIkAe@8HP5&cVT*z+pE5AlWwvT?&}& zmMw!VTZdbQ_ksw)cJFK1IRutmF?l~IHuSXE*@A@z3jr1sYyjL;aChMiW;Y4&3~pL2 zwF#SN;H4BWB`WboGu3Viw(Yi_?(W+q87K2bP1H_>MnjvS)G~L{jS$)Cj>ND-4H!KH z+#}Z6RGc_j+zCOsOB7yBlL|wULlQ-9Rzbo?*@KjZhnB4%@j<}hj!fGI@k)qAFX1h#D+v}u5cQ}2TagTD|Y zo?<+M(Kp014ylX~&ocI3$1*~YC}KRzIJ}o-gdkuT9)(UYAk#i3!{tD5KTxy@W7&NsX{EuMGIqSk7^sxlZzLiahMo>+)mgYP zmP#;iheLk_lfsowaMMb(J3ZP)0)tFDBrPUdZ_H%af7_3!T?8cQtFN&!fCmX06}0KD z6o`XS0*kbNg;YPo8tpT30mc21sK}}%$6dC~Lrt0s>?(r6Nuy}q6)Q|C`>^AOjs!*v zpf@lA0Hu+=4)7`lO^w)SZy0Uh<;rfOv*o;94m0xo>u>CUfyr4|2Oz1F;;K&3Kdo<* zL;^bHpRPL@-}EFs4XBPUt&r})H$QMdYp*FUY*Bzo398%Z>{C*TX|jAncQI!T>VVj-ew79fFK8fm&H{7JLdw#m5R`GYRmK7`ENkBd0v+19bSW@%o6Y@gV7<5P zfeKc_XBD=VLUx-lux+=D-YqjAHHg7{cFAp+K&53OaL3`JPaY`gk_(GaoH6oX2{|6c z#`F%Kh2_$-`+o42*X>^_+XnMvYN8WuGXWCL0{dk1S+S)XCD1(sk`u&F4#Et9{$C@x zfqjXor3BRz3%x4KW&@D3P~a4B4d~%|gaol`>xzB*`1H&fGPuSIVEx@g2Iv-`>w;U% wp@u{O!S>}aDBT9VUg2q*1K)U10g)PI^pi>G-|n+)Ao&6*UF&g?{r$H4zcX;4VgLXD literal 80768 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 diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose_phrase_cj.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose_phrase_cj.brk index bebfe7285a2f0182dc6a901317f0ef49b8ecb254..14aa5b32f8d0ad4d1946d6cb3c959777f51c9e4a 100644 GIT binary patch delta 12778 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 literal 72976 zcmeHw31A&pdG3tv)#fY7i!95FY-_n%y~$2u6FWw>h1bZo;w^R@TbAu>TSS(OB$F6B z#Dt}32oOR-L!dN;my)nLDUw%&2Va+na(W8H=BLtz;~T9 z*O}+c2VcF@;50f-PS$C5TAWs=&1rW!oCVH8`0j8PIg6boPN%cfSq8Z-fqIHS_{v4$ zxK!c*890{#4(>`-afTxWVU7b6I1cn74s;v``a1CoToA`{A3u0Lhw%e(IKU4Fc;PrJ zL=x1gT%GeWpulnP*sM&{amYyNSZ#*c6+=I&BlY8o1o|QL6tS!#{bjWehu&{he|b6d+ZBd> zixh17?P`LfD;5skU&8zC8p)3a#`3uRwu|6c8^D3Y*2#X$$1#CJjAN`qXAV5-oNkH3 zfe~t*VI1Qna2&&2IDV`pI9`zm2d75IkM$Z3Y(Y3b1P=a09IqfaHb@*BVSJ+FdOZC= z3O4$&f#BFAacuT*aKt#jC>%mAVf@%a_+c8?gZ$V;a9k;Ih5h_DCFj{J5H}KM;$KV-W)F4;AsK} zhV~L1QRDhGavc;suJ5<%w{%>;R`TOO#Q1SAVtzpiHsi;&gdcqphv>IzeX5Ti=6UW= zOdO7HecDHG^gD;O^#>hKk4U*hjblfFg3bE0A8@GESkA`})F9klP(3{cF~{M9^BmTx zT%B_QD45r$YQ2tSbUn=xehkFI!TEud_`U&s+|@a+jKqPtg6nmR9UwTaONhf^`xm6c zU7a&%iQ_tg<75a9tbxi!@dMLJogrr!KIp4+PKDsWG&+v42qKr01jnmFa0Kc8B1P4#o$1ysdV*0B92Wl2~qt2+;U&g?f{IAZUjHpFlugBe2*06o0SQpa$t=%|A z_qV5gaw+%tr0YlYy#MNeTyUR_PM3>E)_dSQcbe$O^%BPoY+M)lbsS>e7io0-I0F>; zxX#n#&U4oj9Iuf$Y{zw^U^BnG25_kH^lShJw#vV6;Nz(}|KKg>`-XEsL5!zK_6=tV zjvIYAu!dm272`UupUUO68V*bkmrJnU-bmzflf;p4-*DWpuS5zqa=D4{r< z;J7UYj_ODpZ%Ked?=QCz9B&Q55!4UGkKnrSZLx3!$Fa8(9JeRL5nLC(-4e&`1jijd z9DLq4%`aTObX%s3j=RL7- z@DeDOKjmKM-2}&beK>Tv==*(q{}O&K^=A@C-1(NDRxYvin11tG~=gHCQ^*@(5 zcv;n7f_f^bHWl z3*xZhhwXb)T|YQq#{1sXV=sHG(*wl+Q5Kp?;=%%E3Sqfb+&ZEk!S~3f_YFEf^z%Y| zk8C3s+xN&OJuS?8LT$Ejoo-f)iN7!vCy1Gx_-v;@SR8Nr~HhOAn zXJC>`58$Bd5A!*{SbyMpjM^Cl?H!Wx198~!gW`y9?_gSw6~^8nh$AUK5QhyvZ0#;g z`cW9W3%~tG__0vMtx@Bcc)zdCKdAi}ABE^R_E$iG_uIJV z4%{y16J%Wfq{N}GPaP+|J9CM-UDI3RdUholmvY$mxp~g!uNAQ9G@XL;@T;h*XyXKdVk?^$!{l(c1lH}Y0e|D z_@U0%u^{Eg-&peF5yFqX0UR8n|J(uhQNmFig|V0N<48V^Ar4(G{QM)oT&UgFMad7* zZz(_WpBH{s%7vGVvilSq#d-fCk;|ibaOAgNf6NlcqXfsb5=TD!F&x*!>@JXkja;bx z*yBbV7o5+@^*Y{fFs;`=?|i`u$K!+_Uz9k$6mk9$Wlx6`Z20j-f}>C35PF()9dsxr zj%a(j-yaVDy%SrzKGXVRJa&DeAH(&c*mA*pCt>~N%a(F^g6PLr#*O2vmN>pbaKyE@ zG|#sv7n}Zq_Ljv`F!AgyzXtig?#abJ-<|+|(EXesj_aVf_Lkp>B^Pmi`eevGEu_Ht z@s#sT=UdMIbiU2*Y5lG9ch1w!cbxCS_tVbbvwK?qi`~=uCcEG84d6!!gN*NAo{5D+ zynp$J5FFo=IKJ=v!1*DZum2;%@lWi1!#_JeV(%ONMY}Kd1BT-nq91;_nCJbk8|D|3 zi;aHR+QIU5P|)7tm4L&nAISJPcCdbXTr)pR^DW}A;fJj~u2>i1eM035WsmE(3r^0D zK}&wv+64=Kpf2ckTlRLrimMK@GSYSg1^p`mHA3r8I{Px;$^fC`BAHO}ngy95nnEH!peR@vnX)?K-g?Uc#<3=Ap z5Ml8ARP0|keqEpIoWk5I@Z&J+sfizm!)E-jz29KMag!wuyx*YYa$d?soNII5)AQ3P zxx5Z2B#G&{R@1BL|w;Vs!)7MLWG_d6Gd2SI)6a2vQ zQ+m%L9u9mjX3`JDVZ#rKBmR94{ai}lH@wl3AN0OQTpa#$7`0AD95(!*IO5+sxlbxL z)sOMqJCP(EKMr$$G0k&`!-gMt|3&qeTY!o_&mqEOMw}Hh97tj zNAcs<5Pl#^eLQuXsPS|>_iz+H{5X>H198~!1MdSVe%uy=AJvik7|(qm#ScG@4x?Gf^);Wc_KliS2%LQ@R$i?;^pNSvu0UY_~InF`cM}^1NeLQ3O&XC^8Q%- z!271A{Vh_k;Rn5M`YVa!*Uf87$>Rz{~UCH^29aarIs-KQF{I96#`h<2oxWxp?k|jjg?>Oe_$S?m1r8_QeN$6^K?)W) z9CF{(O&M`qaMN=C5^-P5Ep|(6a6rwvMN>7D8O62k}$q&(Qsh+BP z7T9mOqvyDP2^5m8gZMoQyg$c#F7y|-G=PKOa2Ml;!0`YZ*LfPbH}94K1&e$0P_w3| zZg~I)Z?ldg@^>cONs=GDWcYgzo+iFw9D|w#4&+BBfFndMk^L4aSo9aDS>Ql)arMJI zj-h^7;DDMn9BxH`ADnkWE_vaEqmi&`fm4jZ{p9P#f*nfUS7K7QEUj|#_85xA#iUXLLTogZ=U1KHlw zGV$Zn0e%Q=)b~+TKQITqr}ZhI61G0|-&-^D198~!gW~v%#3A0R<2Xj&1M%ONGVLoL z_VFWpUm4^Fy)Wj+k$hi?ICOsSew+VZ65=QpB8+)ojGt?ZLUg|U8%uuB`(lsyAVne*zkkmxF~Um^#^aY7}wQ3Et7tHR`P?F3?EMgFZmP4Q+iJ;h$Cdag}sZpzaS19 zeo!2b=HZ8$=S=)4%zd#Sj->oR95(!*_tqW{@FN@tuF1mJr=JH3HtSPzU(Brv;NY4R z)KkO%L*q`CIC#mJdI~k`>yNnnFt5juA2xEK{Fsu5A4*S6{FrLVk12#7cngoubNTM^ znf8@P!G<5?9-lkSh~t7=E%%jppU`lx(Vgzr*x-Pgb^Ulk;t=C$cz?lh?4`W7mIQ~g z`_zB8=gXFIvAsWM;>TBG;_%r8W;CsH?i1)?ZCcL-i&cgd*P)@tI=4NBz5a+ld_txBI zpuqcWqI+vlv)*665eoCWURr=4_-gz$7`V_bidDY(ck9}?i+5@q~bU?Nq+c$UrPV~ zl2AWPze|f0Z047n07sF4?3|Z4#6F5AiS-9RPZs*Y(i5QV{kTo)2cP%D zaJ*E%H?HIG+tVSAD7h5Uu209|w`0qPqmaKhuHy*Wk0FxZ&+m<^(Zg}jx+m;B2=(-( z|9x#fi@>>dg8S+)-?}YP_to82x6N&LvTg@ke=NZFgziFj5xysM7pwc~Zku;sy+j*N zCvv_O>yO0z2>qRj?}21(=9g#SR|J%XOys<;o_KI zKc|iB?vj99xbBGlqTbIL^wjMH3Ur@s9zQs3Zg;UnKc{n-=E0HweZw+K97_QQKS_c9 z;$GszA#BtIKa~CY3Tb;z?AP5(fkFcNb@wt(2WrOOd_{--)@MiWF6V#Z+`(PW?daiI zCeuoV4`P`eJv?E4@k(YzD%(c^J+_Zxbe&F-2C@G^&K((`3HlOx8p02le@x>C&MzV7 z+U#C|&G3!7Y?n;~S6l&Jx@*9aG zYFx*2eiJ{Cf{k31y*BbguE*RfKz~j4>*9Swh<-2%7C4}s;0JaSw6^BwF!}7YP5eL# z7C4}04Trnhh~t9$a;YC^H*V68E_aO$4yZZ&e;h*Y{C=Iz4@dALubs3(EKR# zvDS#=g1b)22_aXC6~1X$9jolgSo#%+Mgl?3q5t$6CBE3J8JwujWXDOxW#~j zuRj`?dWG9v(Dy+2zA{B{Y!v)}Q!_q(a9tJie*Se3?uTsFK^qBU{`bB7n%{KC`7y%T0P{vyaU;k^^hZXDNz zLHl*n`olDSlmSO=f9#Jnv7J`jKqjC-!vim3icnf8OtrIJiW^*B?AheB=7# zN;2;&`@(2`nCE@uhmBk)Kep!KhtgBidC)dXevtpSDS;gujOzuqV=LCq3n%hDvX0|y zs9a2T24a89^=-U%TRM)3e1BUkx(_@j^8KyOkBK}_)^SYadt@EQEj~R(kww`DVLG*A zv$xyQaZIG$mX2d0&-ry66Zu|U$8mdN{V3e;py@a!^1Zq~j{SkyZMpI7wQ;@;vD;Gi z+R5y;pk{GChWqS9IKs~P6%HrS?>Ixv<$oaazK&xe=Y1W=M9%xdrUB=QiJbR!eoW+i ztK*o+`BujB1P+vXJCHCt1GD`{;eWr7OGT*2#69)#L)jTbpG%p~ z=`NS!N3wG|WoH1KaC?DD)cI-tbGoY}4$j%Q=XAYNPZ394ewfeckRM6()cZY0&F%tm z?8w89{O5E#E%~v7@FTw6g{j{n1si@4y9;-h;77pzfV zl--4Gf9aBPN!DLh6CBF^RN&xRFWxug?=Sl#j%59X{6Ec_9g4tVn&%95TQ2g$Mn5P& zt`YiSc)y>&zwEc<$2CMQ(*8r@2-ECeFZ_N^*VFj>7n58HvwsQVNGcb^VIvp1kBYy4G4Z1?`ZeP#UpoQWTW+0O-W zB;^OFk`KQQS{J{<^W!6}`N!ieN)@GxOVa2{%gQIE)5Ymbx*}bfu9`e$YVow{={405 zH={URR#TfUomo>;Ts(Ply10B+WkpTp?9$Rg;qW&}&=pT?qwd$+T&dF1#poYjTdZg} zlpjcAygcPN93dAl@MUt5EeE+kC1qfqSBk%5${ZMR;s0JCJ1~ zV4#AB&_eXi(tsY_B@Q*TLqE%lr9f^>iSPt$*2JiB-= zeC~$N)5Wt(s!Ogad0WXhN-IlyN^dRwa#>l~#zEJVo%GH&xs{EL9vGS+R#j5F5 zy;ZkYeWB{#CeNOHO=`*HyCy$1W$Kixro3^==bejFi+S0p>je$(`PkGqPJMjpFQzS> zHpFA5y$7GuE=>C|KC7#}d>((QH&*{q_2bi1)7MQuKmFs=e_GR_r`H^>d7B8=e68lU z!tY$10d!{UbS}EJGu|=dTea1-i))A2-`%xO*Pfg?bLQnU&p>$I%n#1Ib>E*mZ|*^!KKHJ<-=6!-+<%_??A-6n{lVOy{CB93oS4@z?;0V8|KFc}EuQzz zd4H?(WZsW3G{0s3vH9U-)(>K`n>t^9-KUo8L8q!RX5Dxa;B3j4QFM-%3+ zcswjt#HEUaFYM`F@W+-s0c(dr9$Q}PPsMQ2b78UJaTQ~Rc&~==)cT)eJQ&SgY?$KD zQ98Gwp2sz``qRR~rC%s|4iPu32up3)AY$DG(zldzrSwZ8hCdtjOuh&H9&I?*FxK$e zhPS$RVSK}T8$OKBqUSK|b~ZfR@KqN79iHx9+VGQxUtx^9ps~E@G4%1jiV+su=Dwxq zxyD(I&5a8iS2b>K+}AkZzN7I>;~!7Hr|}()?`wRhvWn+-mo+}t_)Sq7=&f+?G|R$m zYy4s3zc>EcE4!lN*G11YP4Yqu-P<8Fy9iRt9%<@mTG6zzX^*0;``iWYTlBE-W6e#+ znnoty({yvw9Zk?T^uMMDn?4JxN46Gh`dZU7Dc;saP0u#Hpz>ualt1X>ZFAcutKEKcbEwditFrsD1KArU-;;eq_KvI%b@n5(eW&L<#*eZU-{g(n|POUc`kQB^A}bAaG$%tM8%`gUi6Fbk{C;6 z()@SL{}PsWT5k5w!s5f?nxAiep~Y!_LH)IqHUGAywxzYD7E((5Wv1WLvZ7^OOE3Go zrsYt}Db(MV^DVD$xwYj@UOZ1_-z@c>mJe_(Z~17;!!2Ke{7<+1sO6WnL#@R;zO|;c zsdZWF6|LQ^J6aF5o@#xq7yr6h`)AFWb)fb3*7riG&$WJ}`GwX;5HmcVfX}yiKA`k{ zMB4gu47VO^bK0h~)wgxFdE=RAMO&}%ITzawwVZD|)pnl8w7sG2X7sha0X}!Ooo~Ch z?S1U;q1KhH``aGnEok+|n6@WdFKhcA)}`pR^fdpj?b$YlpmwP3#rDdUo7?BA^e|u1 zb3u+Ji)kAX9I$-u!W9bdLHyf~Q%?)}or~$q(!0~6sYB_vrazi~Ed8DIuZnAnmly9U z9x1+~_@Uyjr4FSI6+esL;;*Evq(%5she{SIzu#A~S;UkaDLGT}cIV6VujE1J%Oy{h z{FBIKdY1gMw5C+nQ`)WPE8SIkwDe5rU8zH*AAt|UTl#ESs;nk;sO&QMTnV4+%HCY| zp|Y=({cCxqd_nm_iXwTayhlf1<1Zgf2?wv@N=ijQJ>dX1Q&E|jR5dwM0q1+us->GU zC6mdN!^h;RDkhtfSbSA_dWKb0qN?-zYN{$LDk@m^8JTn@QwjcBPIV?cs<_ww8)9dUA&2_Jd6juF><>aHmJ5Xm!YHFPSF94NU>wWil0l2&u{#NT(n_{41AeW|FHD2^sD`Hl4aFjlpomZ%yXn+=_H4dgic4Jh)H_om6fcrO6aAa z(q17|UMs0Usqze~mWQ{Qk$M5Lkb!hLJtFh+U0BkrKCS!ZN7A?%1KK#$UfS6gI8*>st& zJzZTH_(R9PJ$m{>WMFZs`Za61GNNQgK+@ZZ`SVp@3ocVzTT@$`u7SC~6WYUpeX^(=8fUxE_dNYEzN?)J>yxY{&#DL*3PUo`OFJ!Af zyA)?Q7G4~)pbsC+ixJ>>6ieb6g%0u5HHsR~ov#VA$LZ$8bamr&k?jES;&OakE~0$Z z^aPZ_*e#eF^)DE!VjwxZn9367qeMM@Nc3P@i$U`6vr41x+sbbgwOrD%*8G*$h$K@hR37Qc_R z1|$9C{9z?HF>I?C-3Lrk7A~FV& zA=1ws8kVKd6Vz8(U8F}R(%48V2oLEcgdcKZivnwSKdZwjirC;dfDIFMkS7-L*aHvD z#vI8*w)P|?G=SMzBhu*_cs8Z7sZ=xgT7dG5nN>6JgO#+lwx&z?Nl6XtrkR5bnYnW@ zbxPIrx!i{#bYK?>4*Ao@!m4r>6kj1DEgZO@tE_0}9{!EzFc63Th*NY8K2ekR6uTTP zT5dhGxNxs&iyNLBVq5(wxb~rO9UUaRU?B-c1r~vW^p1uGLSk`LnXojVf<4fmguogw zWl1m%t44>(q8yLm-y%+b%8Ys>z*j+87MrD<46){_c=UBZ>!JPljlqUR=wbZ82>ho2 zdNpD04v1d@VOF{UDrjiv>|C-0NrXFz!I!)!!%~nH=$XVEOpk~LWv%{v1$hw58JsVH z2mQ(uC~K}yrRcr@f$#_{5}u-BBXgMBsR($i)FR?|q1$`eU}cidl!q+FqRIFQq$W+8 zF>}UD5F~ufn2Dnpx=gwXGQxm|qoOBPj4#Ix1^h$T(!w%APS3#_l_iyzS54-BzRJRo zbr>CJdvd2&k-Ri5q0^#%ny;f{>B5B_9m_g87AzEh%D-#@CJM)gZ5B$g?`2R7`e>-b zNpBfAByH`W^fEpcBp?x!_mV3C(jq00kSBr_D3uO& z*t|$#-DVfM!gq}!hRZ@qF#qye+Sg9gVJ0#Lw7zx3Cj)Y?boqfuIzn3Fxp3jaWy>zRY{A0i97qiu<-nhOu(4fC-1zK(iQF6T z7j`VnU}0}+7t=tdqkV<8luy(^k-05%SqG9~l|em%Hau}r&;hANw}52#XTwxjb-=$o zGaswRUs?}~*)a484O!6+x!c<_-h?fh#$@m^2!ROT!=h0dBHi=Ku|mYNX(z3=kvyzc zkw_z@f=C}i5O?|I+HlEorRIBwFKknU!=dNYm;{GDaPTAQ&ge%8aMA)pnM}&S!4{)R z-de!;p_&A9pY}G26@_#>;6V;(V@54bt{fse6-6qHct$iKBYiB!3&Df?ATuwInD8?{ zld0!WIbs<0v1J})22nK{v)02vFDm2DOoKp#bGU~Gqvl_p0=~i2;qk)Dh9MLV;fE-w zRh_DZJp;Zk_aw<=hw1n_MLI}V4B|d*_|K5TKdf10?&<=Os;TPEYrP2cwhza+C|lZ1Z3+ywP75RlryzH za}7=n(piV{Lb9&N~7}9A=(1gIt#_0OftE!N-{OpA@nSHO)oEDAV zRW#foT8#`KP9wp*SNI&TfMh|Q2uBiD5qLZc-IelCrzp)&q7WyJuPk=aBL0By&Q8dP z|CYdM8pi4k!T|epbgV|lN~te6nqmZi20E3%d_2-iz(mZVviY(v>cBsAEWty_BH#<5 zc@r0VDAr2Mh#wBi7<}&KevA;=m7nv0qd|zBJPRDIc*n&IiPk0#mr-Yxc%YcjFfUJG z-%OI|!+7REfJh&rP?RhatB?7(bgA@tevT=VdAa9Am_J3Vc*`9HVi2TiL$Vlp27d4dScaWp8Fr5KkBnjRy0s*k;p$s^3{Ye0rcJB& zUwe94=h9Bhx-KN^y4mD42^xo4$N5)R~V=-1M zWuKR)e+241ksBRgg6ZBttL+~d8R$Qr>)VkVJ3Ydvtf$!5uS3%7w~}J(x3b8+H1dWc zgZ(EZnvE3k#=+B!vzuu2rrhC?-1U7uxiKN7eT3+yGpA1E7_Lo};hUBrgiV*w+?QbF z=2xuVuWRP!qq*VZBmJjNpq6F3w_uiSq}=AA(cCG}?Zbl%<7TR6n}?1K+|ak}^vT=^ z*V8Su4O@D!)-8Jo$t`P-H(5v;10z5xFFa#r2-`4(- z>!7ayhW#Lz7Ra>~;KMicAaGa|nz$bx2NvzeY#0Z^WFy$fnblYdV%GNb4xS!`(AplD zF0wl}X7}#Jq(vbF*KX@WJO{Hod$a4V%y#d9egfSAh+{2KM@rjhKXec5e0VU);j z+nw#*k?q~?H3e|=thZL+sp{-D= z!=H2zA{Y20F)XP8gL{E%oMj#r8OMst5R`kFz^iET!jL3MqNw#MxX@ANAf27P9ZR^_ zARxKJ(zZan5FSUeU=>5a#3@>M^%i7@stqK=bD;;t1Z-Hm3WUWy42#N*SWsn9Xa`_; z2bOK@@ydgTQtpNbjkgfw{KR+yp}Uu6>=hXyo@89Vmt=$>r-<<+ z+LQ|8uTpM*OUzX#E)!C5DD#X}CdnOAS+=`>Xv6T};PCahQX}Im8~RX#aI_FZKGz_9 zWakqTn+vwVNCl-f@5Dh&BaA~o8@pH{>z^>`88YoB@>>K14**4vFqYk~lNQ>mDC0zn zOo2+txQ#>@v(VE9EjkCCqMd<(-VJjU>|~b7;JRfv<}6iXBQQrFgV;!kqc&#J#(mF^ zsC@(&>8o~o7{G%BwF+9))Ct64K!VZez!Ii<+DNot%LNn<#G=BgW*qm8YXNF(sK6=0 z42}(mdXHG5Q`wJ`Jxn05Isl!4SsxUJ%{IWR1T+<5t-VpSftSlVwMmxpb`fkN53D-a z2J_lE*t~M7bH&BUFg(6{9YX>76rQdom(X;Z83xoQlvc#F5SkxauQXSe6}HGQl$h$) zCi!tvN;p)RTBgaFH3!rUgbIS)wzHl0t~L?{2NakO2L(_9FGTePcE4;z#Hxf*aIL>!y|;Sw2T1Uv6@ z+4bw-v$Y-QXdza2?{s>NW@}bJs-K(Zw=YaBXsCgs}`?p*{L$KwRTGTpf zYqhqv){c+*xO%Nt#p{e-rw&@RYPDL&>x?>A$8lzy@zFcZwO*}Oo&R5JugAalUi<95 za%y_#&N}4m_59bj{{LUk{jUSN`@5}dCSx8eVjIS8tS@1VWj)5~yGKu*9UD4+V!Xbs zyS;uz=OwG^2S$$84-bqFj;*QRGct5!^yuJ{`mG~Jmhptq@e_k%r_I9IXzh4 zQV$tVo~|D~R)6O7;F|gq0w$a#WD81RGvKNwprlb}}Z z>e%H#K_C&aO)8NhQPIk?iu0sMg(uU4(lL=_Ck>3LCkR4otcFy{u7H4)4#uz1iH5IE z`Rje3mX1nN`l4fm&qT5|fu2;y>dBR<^h9bbB3VoN&bj~+vlr{W^CIZQt1Z14DY*6G zbp**(iI9lC6Wxo~E1ooPmM8DUR}my#AtXp{gX+a%WRpnb$i}N=^Wag(x)l-zBi4q% z$i~#jCd%N*hWT(j=^{w3PK88JqvOd&0|~al#uJG|JQ2y&1j#0aWHXFdbhJ;VCrH6f zPc{)GTNIM5J`#Z$=N*kiN+*gZ+XzqWqkWhsTL_YC6cRZDrbW`@jN}@EWP1W6@$=4( zR7gZS8Q0kD1j)_-5}8v<2WLPzvPJje-VhQ=BWeaTN4A{=$+ZC_a%9`Z`an;1!}?@T z9wd7e5;2}!$JZx_h9U{C3a%wc_9-MnV`Y1ycp}qiFTP$O5$Sr~p-4ok$&-Bq$$o`I zYOG$f9Z)N!xY2$;d$D6L-cOJmR7h@!8Bh9S<{hNqHl7?LNDe6^VV;=diG2nfNQ{I9 z*0F~OlEdtXu|A<=>`^71xRGrTD7dX-4+9dtVmlV#3F;N@MX1IehnN%ahch77s$Cr$ z0t#{KSiQE#Ql`cpBRqLYA|!$*NJ;E6&?j6SyD<+E%okqUW9&-^lHrs{7~k(89pUQO zNoOR(1j$GQ60CztNAm>JO4%qo1%K$PV=s+Bf@#5#jYkpbj1VMa5lF&%5=0`X;&&Z8 z9f3ro(~*siv6y2Fkf4qUH_pcWzHBz zK!SCId$Ant1p+Fa+YBU_Zj(;97r&fH=e$CaZu&v#UXipLL`D?=J%Zh z$z2JMRL3HDLn(^9;Hp68!Dk)2-w)RNPu+|C z2zbczd%DZGk05zVfG4uF*>{3S@LdMue~9D(!V@tA+E+@Z#=eChd20ZPJheb1bcb%6 z0pIGpLw_ql@?Zc7@+91M;>OrNjo^vkEL}aCeMgM34-zDAi$H>O;-w>M!tXlv_Jl}8 z8I;aDgqOXIAbDp1i76fPtN`Ed=o!!_1&=!RkV2AtE*2-l?<7dx6+j~EkUYUN>iD(& zyA={qR`(q$9Z6X~-=&be2O{4aKoZT9{~B|WgB0A>Z0}V_5MA=OZ|_r$p(EQw-@YMP zI1ilj?P zNA8QU-NAJ%_Fz*_Fb^xhTUtR!d~YxV#QzZ+glA0--_{B6EXPYU%mAA6Np72t`Vc5&80X1;jqAh{ZlPfcI=%zbf~Cuubn zdE%zAt`-h9=@iPsA#7`rmM4hBjVG?Q7Pd88p=>R-t6nT;z_dI;ByK!$wfeB>NujJh zg7zoTYqq%k4kB^miL3pIjVFb&KlyW|C(>dH^+cbaPog^0BXfahJ8OZ)J5l@ao{u8PU)!2*9 zJo!t)lYJp1qQc;*1@1DWqeu#6yA?!|eq=)=rgX&lNfPO}T9M(%7G>d3C@ZqhDCx-Y zgi0s>Dd=aFo`{n1_OVjJc&79jq9>2#L6YC{|8ver9wSH&DkS+V>ul0N3T}ErE$cpS zMRI|CLG3c|hKOyK@i_aUBa+V(o_t9m`EtxjPMozNQgGwRmk5$W3W?O%v}?A3#7N?; z4gZ)(g7>t2(>mNCif8uXde#HKn{R_8`{jqTi?}r@8_lcearDI>8eBH7tK$~GVJ#n=e7HhV! z)yIv1L|WD%r<1R!sm<_95=kd+H;PEyctVj32asT^%srsqWyp0b-qzHvaMsH~Bz8Tq ztxrxm^TgGTTJi*S!n9|bh#j@&E#r3CW;mT6yupf= zFv8Wbp8|zo-)Z5AbT=yUo0c#?AxMH&?n(9J6xig5`^6|7x4z?Qn3z;17E)00Bk+lP^)-DMyWH$8E+{I~I>P?rCwyFxm62SK~I z_d7Zl_F{Ak;jbP&;Pk3Mgz-Dc`<3gx}N!njdaJ>y-n~QI8))Tx9q1X23 z6i?*77`YjIn=jV(`b-J)$hY~o0tGqmq`wWp3GuHm5?kM~tz!|1Ti?NZ8JZ`_?q$gR zj%b0Y*>&tTgD04-HI~lB;gex{FC&P=uCX?rAQCs8P$cJpj_Ad~H`nIvZ`^s=kRSy& zBzQwaOXn2|i9EL#5}+%kIO$C6hKQ&Qzk^89O9zp-@dWRxXr3gyt0H@`XaUvO+X0E_ z#cA!7=v|d$NO0$6(-TDE#uJJp`K=lAbj#dj6zbMYQY68X9KE7OByK!$y}x5y6}(pI ziO`}XBb%@-$NM|l1#c4B`;Kh}L?muJK_t5GB)drzH=f+#%oDsxq+Jk+ohP=wgGk(X zf=Dz^?gTpKidtec$5_VVc=Gy$Jdu?36Yn%>7etbtCy2z2Cx}Gz86 z8)up)K_uyUf_LBCc!GD|G*6PHu#TX=dd*0RNY@%?_V z-hb-3Sm)FGV)Mk0-om>NT4av)rk?y#y)TYCEx(`rUq_x$B+2gsYMwkl_W^@QOr9jO z=zhRiPh4*%+ExXB{F{lUbhIwku|EZ#$g={B*BWcz7mL*+y_p!iBbi=0h{UZIQzUN- z^c~q+bEPD1u-bU?_JlkUlY>*k))H3{MA<18>}{sEyN90I1eV0~9 zeKNnL#$w-jZz7)HtzO%{7%8~%gx>1?twQn~^hElrXnF>WyI+hH+>rcM^=)cxW=NS=W5*rg-wPogZQkb)ae{s1x&H*`@t zq5H)icfmK;o(E-S`Dvx%iQh2Ve~@M138THA%56b;8jSXS9E|q9uhV~u`^8y6@WOJD zJTZQw8~cv5`mp~-H}J$!Iv-FP3)Of4I&J@K;kzQZXv=?RpSBO6NS5s8H5yVYy! zJ4nF^3Dj*M@rtcTE_fwszY}u{&nxxH+>k)srW5y6%^2#>e}gq21xn8heZ=Gm`>5hc z+!%|!9)DF{IJ#2$I8aEtQW7_v@n)jv$Iy4Y@(>d7y8?3cC~wU?%tw2XMt-lrn*tP^ zey;%PHuWSILL%C2B8mO253fS;M3hWyYmtx(%Kr))V{4 zhI-w#y@qa_;HCxm)K_o(8Dd0R70-$5iM zPedB#koXm5Bf zw&}@d6;DJ-+Ze0)h`#WRvoMl~xfoVS_VEOfxbfsOWZro!4^Q+AXyZwt?!JYQq~!@B zapMWSh4=XoPok07*RhWS1-Er9x%=i#3n3Aj71mhOqFdy_?>cX~LLy=lYb?}ltdv+% zp4iuH$P+i|P@c@l!xOEsHl9>F^JE6$N%EVCw%urfZYFv&6;Fb9BrkY1YB!2^BrUf! zy;)wZn{=RVQ%{~yNaPqB-FI+gdwy@>r9q;tQq5oN`3khfO=Df}1KN1b8kp%CJ5+vU2L`eKwc;1}w-8W8wOUIk*&GYKK`Q8G&`{ph5>b(Z|G|2wgamnl<4K`!CKegL z;czT~1m}+MjkDtri@)K3C&R(j;}B4w`(g-kC*IP={U0JGlCVWL5((Ot3nW@&MNJd` zrF|1g(2g4Gu=7M9peyRz^6&)9ME`FlFE?bv*m)(Le0J2f-x)>PZxm+ZB?u=O?csNP-raSXVkdK?}^dzJnBl zdLk?wUPqAJ33N=G94v=Ut{%loDNZ^QvA{I-3t#9|v`F)cXSqdl9}*mS=tuSXNc-Wt#o^Q_>H@eAtW*57-eE#Hqp zqEA8b-6+h(UR!v5!hQf0#QLP&>+lw{CT|H}pDe|@`Q9>bxz~xk*th#}CX&gW0p%Er9r-7Lc}MncbIlgE1${n#!y$;ooQw4g7M8CQ24e>UFH$wp`R{BEhqcnPXu-T zMiS~akzASwN&dGgmpLQ36p)m1XwY}ORRJW@x?l1{TmG+BHv7c#-&+k7Qd$0cmkUZz zH~y9|I_$;2rbxUi#7CZ=cvpxq7M^7)tyKCTmft~uCt9WQvakn~G;j|n;&2Zre4R2C z%KVzVjpvXi?Mv!O1W#aIvW+Kb;}>N!jQ29!#uIuk4npzP zSdm=t)~dH}XytBu`*x+b&J79FZAvG(mAj26g|Ko*p1er%#JdVK*=G4K->O9D38&yB z9VjVzf?Wn})cGkWMB0(~CpnQCixixYK-~rsZ@m@C1+Po#2_muS$p)|64GGjOtnHB_ zlkH5N6e*tMvn{u1Y@uw+y{oNAE_fT2bUqX#olV|mN9kNm^hE74Jh{t=7-M5Cb&-OT z#(L!c5HYOW<5!PXOBk;dkcjn316Mnn{Yl6w73wzi1outmyNuxPv*rD@aPJz0MCiW_ z3GE&DzIYo!qAma9d1AGM;XHAZ4&_Nt9-ic1vu$_gNe}Quj3}@w2;1BH_iN;u&EFTp z4IMl!=Z=y4JKhx6`#XlceIyd=`ouP#020T(<7)YDv8*eIhF6H<3*4J9HDt_478n~7v{-{zZ0CiiW=IkLTA?AcOSx#L_MVbA6%D|auYJ)2?Wjyv?^ z_V%_tphA+?t^n#Tf5EH@OeB-LDlm~u?y5kZ>ftChx%O-(PbPORHjzy3Tx=ql+!@eB zGPyILiDYtTKoiO2&Vc5*eR2y2+xf{#=iMl^a0nwwdwzmQ+;->`Npf2Y8&4)?Yk{LH zcU~AtTAm;hH=dx?hqAQ@T75`MhzMJY_o*~uYk^iDDQzuw`IJ_vQwv<51np1k77n)c z3EH2e zXOG&}0vO`;ft2IU+48@U+zk}mY`6N9#v+oWJh7iWB2Ut3tpB^9hW!a5*^`GS`OhBr zI`d=?;Yo7)6I(Av3T`|h_9xzTk|*9(0sE5+-achlfR->etB>ow{f`t$H4zn&aYNYd&_KhYCq9h8SBc0EC!xakSy z$v_^SOQW!~eFSc8KAQCr?r501k?UZahnV6lD==t#Ng^{G?2_kXh30h1km*UN}jVFbA za~*z%o|Y$w#EmEP9eVON*EXIM>dkc+Nm`yD5;vao!mjv*vIjIZHu-+XCY?gXGhujzfzkwnIMw z6x?>`$H{1)lqdGpBl5&eI+Q0vd3ch4_4pEJo(vJ5B;Nzt`c9$tfMFzQ`wk*;lMdaD zCf@_vcv7f6U>HeSo*)u8p3vQB@;#u9CxzMrhLNP@2_kXh3Ehn*-viosQm8#(7)e^5 zAQCs8(A}uo13J$;gMh^Ct_s})-UxIiHt!58Bx1*q{B-L^GR7w5iGAKdp14Ve^5kS5 zp5&i*Mx1$alJF$?s=(HF3biT-BT3tL5Q&>~==vo2s=&sRLahqINYe5Ik+|`Mu1}Kp zVjE8i)r-SO(((k6xbcLJC&_!UjVFcb#bG3Ad4fpXcydx5Fk=C;^NAwQ?te8b1Exp zD(9A#77PhAh|rP&`NRgBe!_rCotQPWK_U}otU$t~bin48OGmXHqyx2- z!F}>l{Bd02z`PCrF9;S7A zBYL8cfU+?NOsqLlW8Ha@RP9-`+RNrZGkJ5Mwa|BXv-y`|td8P7WGv@6hIoEh$B7Qe zvSFTJri3Df>y;)FAp$JVMT|tKqeyt)0YCvF)BG|aB0l*fM3~T%2qaQZ2u~!EFk@j* zl0@()q4{q@%QjU;BZ(lw>_oWQLluH(jEHB%5V0VkjFqrcN+;YLP6(tki}zwhR(PU$ z;&;GkjSc9DKc0km;!hc7FE*qT(pb(DJt!eM+`jPUV4y;T&^aIE7--{Sni(O$8z75b+U^U zbJ1V1R>w$R#Vr*NR6JhsyUKNyFRlCtyIA=XcCl(^Rd3bZRgYKw>(seZ_h*(*y>IF_ zrcIxA?X*`<`vSW-y;zi;zERTfpN~y{_4Ln8|HX_;W{ilK8E?bqjE~Ov7kpM%`}utC zRBx_+P4(wyW@c`fd4A@{Xa1z7!%VL^Uh_s7u6eTNchb);&H_5K`q)LUcGkVKzFAvc zyR3GEe;%m)cJ0a8vu9s1`z(YP%zk+G9kYMvr->Z@p}yxd{>N?Gf41!ZMGnk4oFDa^ z`{sO2_T{-%b1$#_#@v^w@W?+11Db%*L6s{6tG1@mtZ>GSWK|E>Ao zoBvPqpPv7n`F}tE$Nw2BBqtU$EZ8sQ@c;WWsKpEJU+~u^PZs&qW5|6=)%rj+ncsd~0fDePyni6+Wl@wup28J8)NzNn}7(O_)JmtpNN zEMm)RgQ*xUdL}A1I<8{e67Sa#om&5MjEC2)7aOJpbCk|+s26b!t--XYaOvYk&miK4 z)lsPpn`ErFSotmyTq*sMj1kXHj)o86v*;NNdz}rB zHhh)Ge@CQymp1&k;aQCF7B`j`J%&E(>BpKE9a}Uu^}$82Ty)PO=o{u|(S=2y zfz=~l3od$c(f2ZeAuWic4rg`XZ0ttDSW&go@6V2PSrfI9l zTlHM#7s5w#=+Lxlo33vfYPxyqgH5+L-P066-So)ZpGn=9Wtu)MeMz59uxi)l`J9 z;?JV;Pcvk%OL%SGD$wQC&GSW%!Ib8u-u=OmIc0c%zWj5b)5U$NzXAK0rM1^F;6l#*bXnGd$CZrRY%%Rl>D4z-*@{cSnl@~W0Q zTK>e37peT4r#{&7excU*6!9_t%q7q zwZ7bsf5n^wbLP!C*m`&CJD}9(TOVnDuJzN18J=H;zi)|rKK}W&3=c9_1@~Cd{#PF>Pa#1CGz# zxIz&& zNFOTiF%h`<%ZD@4!JE30QW?-sILXabROY5sP0dxn`QD6b<)%%`<#OflXLD5*Q*B8+ zzA8I2$15t))dhVuRh1PL6+HW_TsD`h1b?ldIvXBU!t4Hxw0wFdk%%ZWIVW%j!KMh; zn0af2Gov!JI%Kt<;N;Dn6AH$^ya4%1YE1 zqpI>ud3l`na2iH_?Nu6BU0GcX*%UfeEqKahUDdt^E9c%^P7^RoaDOB%olAodKAn=n zXAlXLiUAhLDO(3^0yhmAneqEcFsEp=suY8wbSR^Yz#Iu2XTBlRd_@$5fTubTrontv zqtk(gW|2=&M(7fmOg3xhInr=+io;04q+?LTB(w6$N?utd^ioi1zmP6(l+>Vfd5+b{ zBihW#nDy(TkVNVigDj-`C3(6os(m~QDQXZ!uYn?vl0PV_!EgA}gtU*7(9Kp9efU@^ zkXdEP=aE7~3I-WM4+Ejv)ocN!ls{i>fpn+JNlOjL0or+keuFs%v*|>Zkxhq@T~J4+ zO~CQO*aC#YA#g9JX!4uZvOcBjTED(aI3!%*m-eH&48dmkbeXR`>(}StgHC+=^vs9M zz~glFU0v&QvSdy|GTVvy^HpC9E>~MyQ(K#@fw{E2yoN8wB#TUPk`&J9xlGl}s+lsE zOiA$M(otVopMr{ju;I6QbCS1OU!Vb^+tkz~fZ;RF4?EvxOa(qHArhL`R6qLaXE}R?nFC435 zAUV32&JyLLM16fo_260)_{wJIuSe6!^<5FOO8`cBc@}yLES;eRH5sjZfozr_#UGt1 zmTy=Dc`IF1xV&7$isy|S1T~QO{4^Cy(HJ>s>iThmAY*kcK_71oMh3|R!&-21*w!(o z516Deh}wc-N}6&N@hnK^q(JbwP!@&3wqChxwgD|h8FtV*FLtgouN zSdU4hv5{5~9WqNuKjg#~h1T#vR!38mvEgw58z$=@Pb}iI2OgM>JCcWN?MX^x0JHN( zWV1E!T$E|bWSYU(0+eUXu9^jt^(?HUwY4={B2G$bU^mSjWXR2*kEzqDX3iHr450&4 zQEtv&0Tt|l!6XFMfGNwvX;?KnOqS(D zjQEyu=2K-fBLTh+sPpGWDKAmFv zLIk2Cut;=@j*ZP>Z>J{Uv(ku2;)QPSXM>eVHdh|87>g$pD3F;lW!CIjvq6yXHETAG zV(4<&D#!=}9*&B>STVjFHx%#>T}unk2swQRYgC?8US2g-d;*n4A?vU@(DwAstRj7B zTEe77{WM=k$0bXababrf=vcf&ezbq(Voa1y4BI@E;omEu81&Idhm+n4a2+cnlaocR z=l}v7ezN>LS3=$^u7pU-lu$yR2r($Se@BuB7AJLpJ84##Pc}8>)9*#HR5sj|(=Dtd zA$X#a8A~c7C6N~j^ByfTjN9Q8YC0 zU666OqBV@C60MCr3Ol9wb>$@pukH z5*$AlTp}%#&E<{KOcMkzz0B^Ok2Iqhx!~y(rlmfKG6{zKb29oZB!A_of+Ccg15fc! zri5suikLZ}*UUKTNNLIEk|j%4tXQ>b@sia7NDUn2z(+m!KrSb4e0IP@?vL(EI+oJ(4y&aZ%6#saCg`WDjP;R9JPuzdSP^uP0dA z49nRt@(B&Oyd844x99u`TQ-f$;0g$V2;h%Lqcmi??^R=kjOWu%R&OIkSg#_HMn(sb zK7=4{%^G94tTV4)4}|@^n8KakG+?9Pq~aVT2>d?duyt!t z2wJ5KMsZrIy?()3wUH198#2XwE=StK@HM* zhw?+JuKIee5~>R55#&hI*C8o%9~x3q{X}#R-F`)zV}cW~0Ki;TRn^RyuusOVGTAXh zG?wuVZK`I12h+9GFje&d#eE-?te5Y6)?!xQ;TWR^8r)&i0T>1%5{1KFa@oezm|9BYEX-m+Az|Y3%2GgsmkhS9MMKGCvUuifa8ogK2aEEL) zGJrUP1oy5BIA8(Ef;^FqBwR`0i7a$iDngyIv^a@EoH)Mn*riLw1HL;uAtU}<4yS1t zYc>c2{I8?qMd)}b{RKx;oB+^3rxUnOMEVJsh*@;DK=!2__(8`Le1tp#z7U!}aq)*{ zt-_4>;joOu7hd7V2$@~`1s?<&gxD#vz~PF2T+EReZ4z)fbzX@NiVF?%iWL6MC5b+a z=MDsj^dSmG$usf#xKBuzN?+s`m~y$Rd?&-=DP!f+Oa-*ORs5?10hlj=o#|DN^ z_m7SYpIzJ3wRPQrH9bQkgB!*M2X0)~b@K4g@iU`mPOmu#Y1h!S8&4064e*2>nlOCo z#K7Uf@u4F;v6m+DQvJPSgNFxB5AqCsQ5pKi2gb%Rc|#XT=D7O1jsa>+-Lhrffft`y z(RoQHX5A2xb;IDX(J@}p28w_Cz{t^o@zJrf{hTJRYef`+(eV?Q*iET-kB*EFjT|2w z8Q0~zw~_LY<>=7((CEm(aR0V}Qv)M|rw99a!vy$l;G4LlL}FL!-!wRQ6w`K4(mMuk9`DBt zJgpBH{^Bz$J1^zRBt&{gPmc$<(o0nfx^E!EwSdE{?OGUKe05nWdgu{fm!ZC0bd=dOcwBUnt^+F$xk4IB~iR0YLw(s%ac z;n88_xk`Tsap+Faqjw>XyNQb(?M#&+Gi>mRm8`&Evg8N5=Pz z44ghabbMs+D9;VCgCj>_)Wi!X%h1)+ziDSr&raZQkN}YE z?twA2Y2&`8Ej>+J`&%MoyK$`)R?4cVb<1IdV7=s__78xwZ3X?n~`=7H5avYa}RHHdmD}qy+gOQK%`&;kZWJO%&8P|G*I~s)(UJX5kv?} zIN)O%Fqb1p871C>O%okf^j4#*fzsVFIC_kaV5*-?oER6!#L2`q(aJ-YQc?WX${lQp zz3S9uA}Wq#p0&y}xg#oT>K+)`G&(#ydK0eh$T-V~KGYx_E##0dG{_v;#l*ztf*mkY zL8+~MIEWd9ap>n`7ff)+h>0&y6SU^F_ooU5KO5*;vd0mXxfsPL*e#{=V9h#DU%aEh>l;{&4EBbJ*~ z4&Y=D69}vhKxbgq2ZiCY4e%-jO^w)SZyasl<%&*YlBK*|3R}>FYj0?SdF>o*e1+77 z;>yV|I<0#HM*=z(ovtUC$aI%k22>}KR?O58nIAZywbzsvw#YJ^*y=VW`Uz4>Ib7LV zX2_a12UHFO3&P#e*DiWk8;ODg4$OxG11N$YqB;Y+X1*%oRl-QvWv*qp#_-aR>)=%| z8ePv7V+&vG1kixm`@I}IZT@l>;PnW-+abpQ@Q9JIgJgnDcSI^xJ`3+kDP$gF$!OUZA}K{#Ih6M99aFfo;2a^lqL32|*0z z^Gj~S1W}qN0uvOwBJw~<(aoWhU_XhFtT6Im3BH8Hc69ZfgR{GH2Y&dL*B@->&4O*L zXq}4o+YbrnfOEX%q!_RbTd{XjJ90v>l7cWppuu}MH*g9tHBdke#lmDrviSh`W)a)W z>EW>f2eE7G@&gCxZc5GafhisaZF81~ksM|l=sJoL5`@~fFNHPaHkhaiOV?bZCWi<} bvSwQ#WeuCofJC9w7v1fILo~5J;gd6^ald&jv_=QXYj6-~h29!6evX!D6jW ztyODnJGDAar{0eBjgF32ryXqTtJP|&*BNzg$H&Y#qhs$l*Ltm;s`vlb+UxP}z1Kc_ zubdk1+*ya5y`KO2*8l(Ox&L)=?)YA-Gt+Tgr^s15dR={q<2Y&8aq4?UPM#heJa&A% zzOARdereamm(>ppAE_T27|)HasK0u6@bJiy+@ktT!-p5Mgpu*%xzVx3^}U0KbHih~ z`j&dgcw(%6RRZiBxy@RxzV zKU7!bq?|N-ik%Xt)G2eyohg8~!l`tsoT<>l>COzN8e~-iX|tSKXSOp3^37#`7r}R( zGtZgtEC64<)8I5ZO-|Nnc3PZPr_E`1I^eU=S;U^5&SGbY)8$<3EQNf_pr#^F0Og{P zTq2Q_L4ivF33sKcI75`nNd_3_oGM*q32YBKDKOASd zNP=3Gt8*>~3LFWK&B{cIL`F-`WsE09GCY|cl#Y%hJ!xQcJwXskV-=)I=M@kT(!ux@ zDpB**Nq@cPQ__)1QeRXI_vuJh#?X`MNIkhCk)8;RMIG}?>zNF+R6%{vqcPt|#{ zn;?lA?f1%+QuJuQ&$1WO(f(S=ll>9n$$^M@2PxQ%C)X05^h+e77prxwKAxCoz=N@o zIKFjkKS46!9MaY&bc{VLr4u!>9RUh<>(~K6qE>7U@Rn@CrF9!GSJ6eo%8BENHAY;ZI7{o1j%&?kvMF>gLJs7 zbB3&uTt|?c2tk5%Q0XY1U|Oj&?2N!4`s$pMAxJRIKeDkXBApWi$!kK81ogy^gj2=u zI%hNl2~VdZ8y#aY$7=uy>KJ!p&Y0JC#=)2TQ)f{|)uONM*j`m2wZr*tvAW>uNjR7RsGXE}vkFo0fgtwmWGR^=6F~%m_W!y-R zob@5WI)c4ejP@J>mCoxmB$#fJPOulBCDOS`BFVSQIA++5A_Y6?+(dYCP9lj~vqkab z4KaDb`Kix<=LnLUC6XwO6?zgToi|D(N%zG!6Y1O%3yFVyqR%^TvPN&l_0q-1PKDx$5_XSLh{y_NI1vz@7oBH z+hZW9jzsddL`d|$b2~xu_7EgNJyARft{&eJ6G?DndpkjLM?xgQ)#E#@k=#L$-04HY zR|TedhfA4`_U|G{lAI~s2}qQ?3%u$)7JDmqsIlTa*1swcdGJ~1-0cPHy{GEMUIaYE z`90lb+(nSwura~D6E()(7s3<965r}k?>l^qeK$e!o)9ERCt5nZCj72*-WwAM zFN4zg6Yh21Ly)}BheVf-epZ0*cfwD%{!}7~KNs_p;r9_F_xq4|a3xRhj5>O4|7Q{j zFRS`an8phF_`F{tc>qH1_aO=A$$yJD$w3NsYqs}GB#0~i+qVZXJ9Bhoo9Np&B#Auv z^H@CjKm<>af*nu(Jd!8j(kTNZ4;og~$P+sxmjNfz$P&hrhXOqLpo1TOFa98VU(C}= zSq|>6b3OzVJ_!5AdM}p0%fM9BSe^?{a=5R{d*W{NA%;RA!MA()=baBjE;T1f0^q5W z?+5F>Xw`RAzVLZx1(8nt_kbpiy#jb5_JCNoLK4=C^?8TB2lOLJt|y4ZPERP3s55Fc z#^M>ZNn;E3M)D(4V?WAHEy8&cby|)T?0E7Kq9>~*lBhi(YAf=DJ36uz>fLBuBxdO# z5<8yQzNOXmg!5+NZ)rUyv&ULJK>QzLq3I+pEMTS(mRpZoOY|i8=GycwL+6Qp_K0t; z?WAM-=GvsOg?e)xe21QtCy2z3C${gM+ zWyzC|6OE1kHs7Qtg?gKhy^602@WfBKDC;0SU$k|QSPh7$qR)N$zBtH}q#BDnvC~*v z3kQ>QdI1StpG3Vu5bG0Mvr!9&pshtxo*)uCo=_z5Z7ob|wnEuj1d$}=2_muMiLKR# zNlyx8_2IWa3172C?ROA~9ZziSPfR>1l>N!4p+#zB6Ltma{Dj)G@$ra`Y<~$9crT8B zYQe38K21jZ&qyTtI@WRG+vNOrACmYsIiDd&KI=o`Fze+cNIn-p!a3)EH>#g*@f@Ee zNd8J95pSBX7c1%L7E_`IDxHUYNKAXcAdN=Q95>g2W>%%rFi1mf<6WLzwSxLKNlYdp3ps@AkNRI3J^@w*Ql`EXhu-|$) zIZuYHd17n5EO>%Cp<9tn#Clor)?wDrdN`RM<-~2Kla=GShe+BVt=lsDvNn#Z~yOJ`u`5e_luA? zq@kad$G37f>B(zZyU?zHyZF0NYULh8l604WNbK~4B8hKrZ{o>miA3ui^qy{ zdkj%~dyL^D8(RJ=7xh*}<-%T!ZUOw&qX(Qi-Qr>Vj`LQ<&y(c6Sn(w3?-fv<#J_`J zTAxhp4nnbH+>Ib*eclPT1?6jdb!x$j7vc_r1mXmdnEH-s9eYMR_u3p3v|t{a|(4E!jHtPu_m4%61(xl_Fjew$xYTs@LqFOgJ-pf$Vk0iNt5Q&|15Q*YRyc;5-7xNZSjeVo!NdrqZ&48UORqzDQ zW9bc%cu4T=n@LX)i5*WUlK6L3^wTYUm+>ZRp3u80agq2>a@2|%k=XHsB8h)%=0U0E zR8J;$Yeo`v{7B4w$20>X5<8yY{T^W#-a%gA?JDK`NRsmek=XGB zktm+r5uzv2i=k=RMc_GY4qC+`I$ab`fyN8EXZ z-%NbZgn5EUlJVsKc)wZq9@YXxi0?*!-qf z3vgOk@5N?iD!wn~W$-;9_jSqC7ocu^RS^HSroIQnc5qkc{3#&e(uuz>4!f-x7m0rl zsNNtTl4Q~mzm;lxZ`7o*eZoWAOy<(wg?gNWqRL^e*j-63Kr+PZT!8{MUVzbfRwcA_Y4nFUnqw zJb6hXiL%}L4e-SD3#CZG4#`Ud3Es)gud!(LVUi9~utP#`_5M~O`CWu`g#AgF#S~Jo zL-JdY3BMPM(s@WC@ucGd%Rr^YXz#tbh8Xx2XfLglKUqF@s~1vXwD(fk*&|DX@x+UR z(cbfQc~5?;Hw_5>uv{olv|q-?z9Zh|n|~SmL)OxHNNOxpm6gf6JXadgAvNKq2W$iQf>x`+%G;(0AOj01|$iUyLW> zuF415XwTEguLQW|K*8!)0-$bPPo@Nr@OJA+_(*8@Eq6B~dBRJY-m36a@eL!JJ4GTv zo>T;ogq&JL_F|-9)pww7jVH17#5}U0o>(D)x-}$jWq>DCI(aSs-726!cV1C96LslS z>PVdUx2sIMjK7pf8dxE;=i`$3BCK~ zM`GrQ>Fg1a*ztrSxd3$N&WpD^I2W7r2_muM$)jX0emuaFa3tn+>=%K8-8z=seRHP4YcoZzh^{qXoK| z=vGUf`0q%bcW27oDBh7Y+}3n!+*x+gfx2})c|szI-UH&u_VV7sOM*mMrRu+8^dz*! zPGfEF1Dbg9wb)4f_eSY`z^^8dPB>5EBk|uGB}m-bSV+8Ec<$`r-8V*oNynYz&UG(x z>)d&G_syN}E^zDN)8IC;XA|CibF+90&z*~R-=L&+3(swig+!bThup$*TcmUn-ok^r z^}h3sSV)j3IGz;xW@3@{%LzFj5}Z4N_9x<(6YyjhXFKI4_CI&%NP-sKSc~a*hQ%2* zM>28Savh1^jvDJQ^MoUyJb68Em7W#wT={?N3&t{k-2|s&$qePPQ{N!eW z#BYI#Sd-}qT3{yClSZt@xs@RC+dZ-@@TE)V<@+snT~BU@7U?^$FeESEZ@KG8{5F1w zBuYAkwKmj|_$}-5At~%{x$8)R_H2m7G{$0@f3!z?Hl?x2e#>2rCXRzvM!KHpX9d5H z-!11immYw&JR5;Ty}9<@(z>m|^@;O+pupEBZEm~U;bh%~Y<;o_&)M8gcd@$!tWP@J zE_FBGZTIfxmuO?`U|b|H$iF2 z=scO+xmZUsxpT3OWO8Rf9m(X*fI5=NodI7F%~=WPki%^=-v97jsG7a`g!cj z@f!|)B>G&eX27U3>Ys`kF!5-Qbt|_rHct#Ee$Ew)o_;r9P!F><)OQ(Jw{jaL5`J&g z|9{~Ly8`q7+_5=;BH(EgbmHs|;)y(AFZv!eK)H4}#8< zZ9XJ|TS1LA{ck3H0iFmN`J{t&E4N!BiMrK`_9rGi*<+0a>*fxnGr9jagg}CLUMG1X z^d$UUhS}~BDcGGAU`e%Ro7}Sk9m(X*#oB1^UL24P*CEk&^8N;ofrPDMbvo0 zsWXcys9Q&}EDw_WZ&fa_MzRc$@KYh^JMN`EB*MC1@I+buFPAp^#PZ+03@9YB{C7P{ zP&fX9FFNeSzB>r+<@_VgPu$D-9Rzrm$+S}8gIIP40iI};%F4nXP|(0VAdka6Aoq2N zR4DT+a-PZ{P1={xlMtT3ykr_raNZH;vHDvTyq94&p3r+4FG@YhXIpN1`-T+kkSN=7 z5Q_T>Ba-v(3ioz{>r+`zk4&4@XF6ox9#rIz2>BHb^8J z%^DkNsf!e>G}hffkSHtn=+&dq62>h7Bz%3+z|_vPKB1O%_?9+JkZck>fpb7Uo^UM| ztAhM1rDQuV(MJ%;CW0g`PmGo@j3;)|p**=V4^Q&1*?OgPczaFK5!~QUx@i6;fJHVi?MlqZP9jwi(KQL{FT9#71xf*L?# zw<;jkhVB-iL-#v;{M6^2=-X9WB@$jT{tQU|@2c25F|P`cCw9`IJn^5$`p>BIuL^?a zv2o9owvm-md>cPp70hc;YF&}>27J>xh z#c0n*wkT`Ex5h+*RH?g-Aer1Z2s%$D_iet8 zD7A11B1w9Ff=KLk=oCqOTMH9UCT43PSGH~tNm8C55<8xt)rYjTaD7%E!V*HP?ZF~q zhJ$YqE_WW3X~fn7tv(<%iLJ#|9;Hj=sRgc2d`KcJ98BvIv_DD46Yn=Lq3%*|?*vHv z_9xQXMeKK!CCtn58<<=+QdcI?qmL)b*24Deky~_vo`6*-{dMW`BZ6cIM$p{~)|Db$Cl~5{QZuJCxzPY1d$}=2_muM3Eg?g{Z5{hl6m#W@6y@q(CL2XD70u| zJM?2f!ET3sl#KRqd178YB2Vn3LwRyM4^Q&19tW*?a-8ra{vOcOcM7!!3?fO|cMyr4 zbm(q0{vOc8lS1tQgGiF{1d-VBgziS;?*UCbDbyY?h$Jab5Q!a6=x#Lr9?-;-LhS*A zNRsjdk=XHs?ndPv(0blE0!ZwvQt2M>)j(%r^Uie=3EwfqKizsY8Drz}#60gHPwb>a zc`}rTC;8`{6V^N#B0Pz|Dlqk(LahpdNRsv)L}Di$x;}}&DlqY+P^*Fy!As*u;}U_2M9sq&z_+c08fuN&H@H;z^-;aS%yTo*)uCo(#dDjK3|qjt|c4oB!W4 zT7<2)C{>g$E=i*+Ei0drP8X*$>56n^x@zjQ>BTduXVz3h+^phsSxs%abaqWmadG9; zsp;bKIh7SPm2*o=3x)(*Kxm18cw!56KWTBLN=z4{e}c`iBjQk=Adv|(mLqY5bifvx zNk_IGqyx2-!EYaw;?Lr82Zn97O61O=l zI}n-0da)$SJ>f*W4j8VnK0WcqlK@Y=DMRnYnsfph%Xp#&B}9iC7bYDHRPYdb!KE<; z{%kas5#U6`@CZXxjf}=Y368zFh%FdQOT=r7=%JLh_KUez4#f5l1_BYYJ%R@__hrHbEFuBv=Z<;R^1l|OYZRL!jFtGc7=OI80i zb?(%?sU=hIp8CwR>C>*7_NHlHbS_LU=4Gd^6EwW%W7FR>{qgC)m~rupVIDK%z4)AQ ze#XDxv%1>L=kcd{L-ik3KRz=xbM4G?Ge0%+r!^gVdd;z#cZhJ!Q#HR4e&@n0pfhWS zbHS~h^{!dps;#bFTszD@_tt)=_QdSjvtKd$G=%5R{?P2(X8*`b<2n9Qea~t9&)c^D zYT5sb9GG(`Kk7Mm&-uFO%X6#dUS9dk+}FzRr{+F)QRhX+F8aVlKd7s(J6Lyr-4Eu? zpLc+#&%1lxx92@O@1N#9H}AXiemL(Z{}n1EC+0WI-z((s|NGOg#q;l(|2H~M=KmN& z3tAQ&UGM-rzg}Ne-&;Rg|B3S3%Rf~9wk{%V5WDWVVXZj>AZ$|9@o(7 zPYVl|eyQkrMBK1EEVW_1h;V5EewBcyOc*E-(-tOLw@eS{5 z_y|6Wp2x7;)$nk`*I4{_dAfT^!%rH1jWO=R#`2=a(8oU&qb#<~eOuAJuLiKbJNkL(W&<}-Q09% z6Z8%J)AWg^&%^4Gtp%H&YI-)s+uGUmT+>S`U$#Q|gFfCiw{6P0>_zC$f`r^l)BoVU zljhB?$Zq0!t6oa|g8OI=6`FQcc29ONd&AWGvbSXK%=%DgKRWkkLia_P>?6V#_nC!t zGobxeRQ~L5_ zG+z}J?yLB8SpI36>{SW4yL%bv^77_+yvJZlbEkWce`HP=-kUG~9O!gWpXz5|AJbX8 zMKzncX`z-*z>KaDb4S87r{*|i6ftH z%DUzcHh)Ita@&+&`P_G!cn3ck$LewyHh)>=5BIqXO;kJ@?M1%`FNv{KCe44_{Lf)| zXXNJoEG#}OuK8EZFSR($FR4#US@UmNYFk=cY9Xb>UuNcgEz4Whw)C;j-j;(cCsBV} z&b7R;<+heLd+|J#eY4d2T0X$Fyyasp54U^;@_(o0$1T6C9d0e=@vSwjO|45?uW0RQ z-QIez^{Pn6_KmZbo0*E%0|&+qt&;+a6$_PqwaT z-PiUgZ$Ya!#l->IQ6uk-?@;!G<|h?EOjvb_VmZnkEOqx{&jI}@nyw3i${y^EdFHi zQ>lZggT>F`xA>Hlm9z+d>R`zt<@ftaHi?*$!zHIn-swC^KP8`Vo-BE$o{V4n~yrs{TrOIkj2g@#nzboPIy0W*HeYotaW&c{9 zDPLH=h@wayD(}@1*!atbQo_NTx{^{6P)|6?%~Vuorc_PMRKWS(jB4qoP0M65eKl2;6%`dM`>aellc@xMEvGsg9#!0H|BbXfdODGiC_OpD zar?n02-oO&Yq-;+QnWf`wU0>HBrQ^y1 z!OF@?)EBL)@>F?wl=d(hT7Kn~8dzOfT@BeJI$14v%0*q(o(C&u-b_Xj&`U6XC@qys zf#5!slE9}C@s)}I=F2Hs2WPgqlmy9F&tyQCewUHBm|$Q z+83t5d{o2Jfres{M^Hql5~)-=ZRR=Buym5cNJ6KhQN$#@^2$n9StayRP-(A_DzBAP zpj3H=Rm;QM%*g2VtD=xZ>gR(jqq3d3=rkgt?T;Y}WqPjJ~rrC6vuRUwlWZ;92 ze|z-whseOG3ogj_`Vs+kEWgBe^f zH|k$7R>eSacrleF%twiO`jF_sw8r<9PS0C|rjcv9LuMBrjPmj{^cGk;LkntBO8I=* z3_*%NJX0j!un6*2xUg_}xq=nV8!-qfAkq10Dwd)#V$f9e;|4**s#^R$)*6iTlkhT8uVGCyU4!NQOv1cW79a zLQha%Wp$Arok(LNtsp$4mk@r)i7g7O;r*-*rzm2B;{Y~H)IpwD#A6RUFdK6u582w2 zl+XZXXN^dwYv9?G%BE7y;A;WOvu0P#g2{RoR?^zqnl9ldB{i^{W)3oB=FP*@X;m}l zaUX`zfvG4s~gedx%JTE z!o8*~Zg_5pZS|+%+K0wR=NQyXlUr_TCxO5ggc4Bm)x0QDaZ=+OkobDM?{0NRv%wM9>j76=S$#0zw!ji zn(I?3x-UQ=JOYb^r>NM-9OiZ^0v;>1h&W#8_FgtvnWQu2A&aqSGQI+-DN|<6o;4c; z3172j<0ytMldgh{FyP^+=!q5M%W*>i|IoFxu#Aw?bFfBbN#*5LQ~AeNSs1boqXTVE z?(`~>m!>6jTGUVTb#z?3Xi-PU(vFUWi^NCymo3CZ;rOu4LMisW6pBF~4Rtu_Ed|%H zEHpV@+734>pjCi5s6CFp+zs z`=X9T87%Bg?Q+cTXun)r$|q`|$lR8>tOLog%Ag)W8=kl*=zvtCTS&6|vtcT%I^bWP znUB@uFRh2gY#924hFsnbx!c<_-h?fh#$@mc2!ROTk42+2M7rmdV}*!k(@t7#BY9Y@ zB9TT)1(804Aa2D9ZMbB)QVYDp7q%(F;m~txOoBrnIQS8DXY`{4IB9{QOeSUEV2e>D zZ!KW_P)&llPkS51ib6Ub@E`}YF{2hIR}PV#iXs(8JR_Qrkv#93*i3 z9^Os;TPEYrP2cwhza+C|lZ1Z3+ywP75RlryzH za}7=n(piV{Lb9&N~7}9A=(1gIt#_0OftE!N-{OpA@nSEcOIV~E! zSI}^WXf-l`IE@7JuJSox0m*_q5soBWLE!N$bXUqlU7|EUi9(z>zOvZPPX2)Jt}e)k z|CYdM8pi4k!T|g0=y)YMR!V)r(G(*9G|;I8=HroG0w!V>mCcvEvjacqSb~R;MZgzA z^Cm9#P^^`h5kDN3G5Fle{TLy#D?jH0M}rW%cosNZ@s5ib60J=fE~CyW@jx-5VP2lX zzL_M^hw;pT0FgdKp(t4qfW z`>s8;wCmz7%(^xt>)PDWkx^FBT8e+m!0?fQ@sZKf{fs87YiSsPk@4f0*h8uJj0}$t z4j;=6kE`-Mn@M@da%6CPaAbI3sDJao$${bASgxNnjDzn1zUkcV85)5MeW!*GkDnUA zax3<;wjIIRDI2}41EWy?@!Z%T6Hw1~TK&N2=-|MyT>tjm_^DAKwlcepwqe~`7P*BK zTepQp?xvA993C1t;elG2-9RP2Vdxa&@J1TFF?VP*cYS|vZd^!f4O8x6|xg(gim6G0?yJ5T^ zGqAKB!0>BNE$h0t2fw>fpSJ>3T|c&t43A;AK<(*-)ZLipYEqxpkZqtbdg*N^bHgFZ zbr^{BZ6iebM#jc{TM(|;VQtP*LD>QFP^$|@*aBF(`Be{I~`@V=Z^7CvI+Xj zVeFI0ksY+-_l%r4Ih4DhANw6Jj^)@uVDC6JIy!P}V4U%D2kkFAP7WOA@l*x*aI)j{ zi9;hptPky?^4m2y3TofKeh~UFR=JBJ=gF9G4ek2ZjEo-X-#h}sWo_9_d(+j!*A0(c z&oqDUHKYxDuaQXi`ba_;D_S=&Hr_opI4}(Aa`ML9z^e6U`STj@x$!LKx?#L;@bLK6 z!vkYugU5z*M_6u%%?%%cQ6JMpw>jGa<$H#)R1b^hLEWfXIdZNDNDA zz~DaM8fTeDMaHq>G6dx=7kCv-UKo-jNffnS1s6KX9Hg_OuVV=p8w4bGSlVWY7sBI6 z7OrFnm^eiXui1?3P_=<%crNsyn1Bt7aT4MlhDGH@ET}RlwEZw80LwP?dgZ}GDfd8x z##;z-equa<(9=gV_KA!TPcp9CO)^4|Q^a_ZamOB#5rRA;#%}}t1l+($Xr~M;gvf=U zc%E9XUfHIlok7h-ZQanz8r|N8<3r!z*%pZ8YyfiY3m03JLXP?>KVYoDloCROu!I3V zssJ-Nf|OC>z1TF~VR>)Wx*90mjk%GdYy^}2Wa7k_I3`XevWZ3>+LQ|8uTpM*OUzX# zE)!C5DD#X}CdnOAS+-|jc>T!G(8%?;x+CK(8~RX#aI_FZKGz_9WakqTn+vwWNCl-f z?Z81yBaA~o8@pH{>z^>`88Yo7^6LbG`+=fI7|ZU{Nek^&lyRa(ra+}++(sgdS?Fnl z7M+1k(ayj??}j-Fc0o&JaP3kYb1qh6BQQrFgV;!kqc&#J#(mF^sC@(&>8q~xFn|XM zY8AAosS}99fCQt_{v}NHw2^3^mJ2BEk41%5%{cBG*8>!z7L%E$dYSXLEz?lR5ZD|KOT8P!% zw+$luwx5CJG$TxjkPs*5giIVlEg!&dBC-;SK%tfV0H5NPn#j2k%o>l(*6X7upL zfPvV)Y018QbSEWec;EC61GYZH!zd0j4Rjqz2?;{&TRLI=xEUs?!qU~(r|}^I60sOq Z$4BmUTS9j8j2DoycqN|jg8Pu?{x9zbb*BIT diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_normal_phrase_cj.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_normal_phrase_cj.brk index 7cbc69987714c53bcc657256718752b40801061b..208baf36649f058bcc42cdbb10fb1fbb7939c5c2 100644 GIT binary patch delta 12045 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 literal 78272 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 diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java index 56a4801bea29..2fd9bf9e7e62 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java @@ -1276,7 +1276,6 @@ int next(int startPos) { fLF.contains(fText.codePointAt(breakObliviousPrevPosX2)) || fNL.contains(fText.codePointAt(breakObliviousPrevPosX2)) || fSP.contains(fText.codePointAt(breakObliviousPrevPosX2)) || - fGL.contains(fText.codePointAt(breakObliviousPrevPosX2)) || fZW.contains(fText.codePointAt(breakObliviousPrevPosX2))) { setAppliedRule(pos, "LB 20a"); continue; @@ -1285,7 +1284,8 @@ int next(int startPos) { fCM.contains(fText.codePointAt(breakObliviousPrevPosX2))) { breakObliviousPrevPosX2 = moveIndex32(fText, breakObliviousPrevPosX2, -1); } - if (fCB.contains(fText.codePointAt(breakObliviousPrevPosX2))) { + if (fCB.contains(fText.codePointAt(breakObliviousPrevPosX2)) || + fGL.contains(fText.codePointAt(breakObliviousPrevPosX2))) { setAppliedRule(pos, "LB 20a"); continue; } diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line.txt index 9f85b7917139..e2154abf6309 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line.txt @@ -176,7 +176,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_cj.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_cj.txt index 7aad76ecf107..bb0a6880ea29 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_cj.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_cj.txt @@ -180,7 +180,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose.txt index 72e7563c9274..f9152060bf2d 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose.txt @@ -181,7 +181,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose_cj.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose_cj.txt index 99d01874d1fb..b04236532bbd 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose_cj.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose_cj.txt @@ -200,7 +200,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA BAX HY] CM* GL; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal.txt index 211298539797..c7c518d5b68b 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal.txt @@ -182,7 +182,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal_cj.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal_cj.txt index 2061f9170848..cfa9c7968e1b 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal_cj.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal_cj.txt @@ -186,7 +186,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/rbbitst.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/rbbitst.txt index 1c7fe9975699..781ce068be7b 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/rbbitst.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/rbbitst.txt @@ -2214,3 +2214,7 @@ Bangkok)• •« Complex »« chaining » • •« .618 »• # Interaction with the ICU tailoring to break before such numbers. +# A hyphen following non-breaking space that carries an intervening combining +# mark is treated as word-initial; by LB20a it has no break opportunity after +# it. A bug in ICU 76 incorrectly handled that case (ICU-22986). +• ̄-k• \ No newline at end of file From 7d60bb844e8718dc342197a06a5c0c90fe7ca77e Mon Sep 17 00:00:00 2001 From: Robin Leroy Date: Tue, 10 Dec 2024 18:04:54 +0100 Subject: [PATCH 17/24] ICU-22986 GL takes CM --- icu4c/source/data/brkitr/rules/line.txt | 2 +- icu4c/source/data/brkitr/rules/line_cj.txt | 2 +- icu4c/source/data/brkitr/rules/line_loose.txt | 2 +- .../data/brkitr/rules/line_loose_cj.txt | 2 +- .../brkitr/rules/line_loose_phrase_cj.txt | 2 +- .../source/data/brkitr/rules/line_normal.txt | 2 +- .../data/brkitr/rules/line_normal_cj.txt | 2 +- .../brkitr/rules/line_normal_phrase_cj.txt | 2 +- .../data/brkitr/rules/line_phrase_cj.txt | 2 +- icu4c/source/test/intltest/rbbitst.cpp | 66 +++++++++++++----- .../source/test/testdata/break_rules/line.txt | 2 +- .../test/testdata/break_rules/line_cj.txt | 2 +- .../test/testdata/break_rules/line_loose.txt | 2 +- .../testdata/break_rules/line_loose_cj.txt | 2 +- .../test/testdata/break_rules/line_normal.txt | 2 +- .../testdata/break_rules/line_normal_cj.txt | 2 +- icu4c/source/test/testdata/rbbitst.txt | 4 ++ .../ibm/icu/impl/data/icudata/brkitr/line.brk | Bin 73088 -> 73232 bytes .../icu/impl/data/icudata/brkitr/line_cj.brk | Bin 73120 -> 73264 bytes .../impl/data/icudata/brkitr/line_loose.brk | Bin 75232 -> 75392 bytes .../data/icudata/brkitr/line_loose_cj.brk | Bin 80768 -> 80928 bytes .../icudata/brkitr/line_loose_phrase_cj.brk | Bin 86176 -> 86336 bytes .../impl/data/icudata/brkitr/line_normal.brk | Bin 72976 -> 73120 bytes .../data/icudata/brkitr/line_normal_cj.brk | Bin 74080 -> 74224 bytes .../icudata/brkitr/line_normal_phrase_cj.brk | Bin 79264 -> 79424 bytes .../data/icudata/brkitr/line_phrase_cj.brk | Bin 78272 -> 78416 bytes .../ibm/icu/dev/test/rbbi/RBBITestMonkey.java | 4 +- .../icu/dev/test/rbbi/break_rules/line.txt | 2 +- .../icu/dev/test/rbbi/break_rules/line_cj.txt | 2 +- .../dev/test/rbbi/break_rules/line_loose.txt | 2 +- .../test/rbbi/break_rules/line_loose_cj.txt | 2 +- .../dev/test/rbbi/break_rules/line_normal.txt | 2 +- .../test/rbbi/break_rules/line_normal_cj.txt | 2 +- .../com/ibm/icu/dev/test/rbbi/rbbitst.txt | 4 ++ 34 files changed, 81 insertions(+), 39 deletions(-) diff --git a/icu4c/source/data/brkitr/rules/line.txt b/icu4c/source/data/brkitr/rules/line.txt index 9f3e44984eae..e43e70b36311 100644 --- a/icu4c/source/data/brkitr/rules/line.txt +++ b/icu4c/source/data/brkitr/rules/line.txt @@ -297,7 +297,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_cj.txt b/icu4c/source/data/brkitr/rules/line_cj.txt index fc615f55db21..793163898e00 100644 --- a/icu4c/source/data/brkitr/rules/line_cj.txt +++ b/icu4c/source/data/brkitr/rules/line_cj.txt @@ -298,7 +298,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_loose.txt b/icu4c/source/data/brkitr/rules/line_loose.txt index 2bb9be5845f8..9ff4e17eb3a5 100644 --- a/icu4c/source/data/brkitr/rules/line_loose.txt +++ b/icu4c/source/data/brkitr/rules/line_loose.txt @@ -306,7 +306,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_loose_cj.txt b/icu4c/source/data/brkitr/rules/line_loose_cj.txt index 15715a225123..428d225f16d9 100644 --- a/icu4c/source/data/brkitr/rules/line_loose_cj.txt +++ b/icu4c/source/data/brkitr/rules/line_loose_cj.txt @@ -318,7 +318,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_loose_phrase_cj.txt b/icu4c/source/data/brkitr/rules/line_loose_phrase_cj.txt index 87ab33b48a1c..2edf4b3bc33a 100644 --- a/icu4c/source/data/brkitr/rules/line_loose_phrase_cj.txt +++ b/icu4c/source/data/brkitr/rules/line_loose_phrase_cj.txt @@ -331,7 +331,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_normal.txt b/icu4c/source/data/brkitr/rules/line_normal.txt index c41280c28d1c..bf6dee8c05cd 100644 --- a/icu4c/source/data/brkitr/rules/line_normal.txt +++ b/icu4c/source/data/brkitr/rules/line_normal.txt @@ -299,7 +299,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_normal_cj.txt b/icu4c/source/data/brkitr/rules/line_normal_cj.txt index 31dd65854cb1..f596454621d0 100644 --- a/icu4c/source/data/brkitr/rules/line_normal_cj.txt +++ b/icu4c/source/data/brkitr/rules/line_normal_cj.txt @@ -304,7 +304,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_normal_phrase_cj.txt b/icu4c/source/data/brkitr/rules/line_normal_phrase_cj.txt index 85d771fcdbf9..e0bbd00025f9 100644 --- a/icu4c/source/data/brkitr/rules/line_normal_phrase_cj.txt +++ b/icu4c/source/data/brkitr/rules/line_normal_phrase_cj.txt @@ -317,7 +317,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_phrase_cj.txt b/icu4c/source/data/brkitr/rules/line_phrase_cj.txt index 41e05bf4963f..14b118789e7c 100644 --- a/icu4c/source/data/brkitr/rules/line_phrase_cj.txt +++ b/icu4c/source/data/brkitr/rules/line_phrase_cj.txt @@ -310,7 +310,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/test/intltest/rbbitst.cpp b/icu4c/source/test/intltest/rbbitst.cpp index c043a0a5d838..fd72c8e4afd6 100644 --- a/icu4c/source/test/intltest/rbbitst.cpp +++ b/icu4c/source/test/intltest/rbbitst.cpp @@ -1705,7 +1705,34 @@ class RemapRule : public SegmentationRule { resolved[i].appliedRule = this; resolved[i].indexInRemapped.reset(); } + // While replacing, we need to check that we are not creating + // surrogate pairs. Since appendReplacement performs two + // concatenations (the unreplaced segment and the replacement), we + // need to check in two places: whether the unreplaced segment + // starts with a trailing surrogate that ends up after a leading + // surrogate, and whether the replaced segment starts with a leading + // surrogate that ends up after a trailing surrogate. + // We break the pair by replacing one of the surrogates with U+FFFF, + // which has the same properties for all but line breaking, and the + // same behaviour in line breaking (lb=SG and lb=XX are both treated + // as lb=AL). + std::optional trailingLead; + if (result.length() > 0 && U16_IS_LEAD(result[result.length() - 1])) { + trailingLead = result.length() - 1; + } + matcher->appendReplacement(result, replacement_, status); + + if (trailingLead && *trailingLead + 1 < result.length() && + U16_IS_TRAIL(result[*trailingLead + 1])) { + result.setCharAt(*trailingLead, u'\uFFFF'); + } + + if (matcher->start(status) + offset > 0 && + U16_IS_LEAD(result[matcher->start(status) + offset - 1]) && + U16_IS_TRAIL(result[matcher->start(status) + offset])) { + result.setCharAt(matcher->start(status) + offset, u'\uFFFF'); + } offset = result.length() - *resolved[i].indexInRemapped; } for (; i < static_cast(resolved.size()); ++i) { @@ -1714,7 +1741,17 @@ class RemapRule : public SegmentationRule { } *resolved[i].indexInRemapped += offset; } + + std::optional trailingLead; + if (result.length() > 0 && U16_IS_LEAD(result[result.length() - 1])) { + trailingLead = result.length() - 1; + } matcher->appendTail(result); + if (trailingLead && *trailingLead + 1 < result.length() && + U16_IS_TRAIL(result[*trailingLead + 1])) { + result.setCharAt(*trailingLead, u'\uFFFF'); + } + if (resolved.back().indexInRemapped != result.length()) { std::string indices; for (const auto r : resolved) { @@ -2906,20 +2943,11 @@ RBBILineMonkey::RBBILineMonkey() : std::list> partition; - // TODO(egg): The following two workarounds for what seems to be ICU bugs; - // with UREGEX_DOTALL (but not UREGEX_MULTILINE): - // 1. /.*\u000A/ does not match CR LF; - // 2. /$/ matches ( BK | CR | LF | NL ) eot. - rules.push_back(std::make_unique(uR"(CR LF ÷)", uR"(\u000D\u000A)", u'÷', uR"()")); - rules.push_back(std::make_unique( - uR"([^ BK CR LF NL ] × [ BK CR LF NL ] eot)", - uR"([^ \p{lb=BK} \p{lb=CR} \p{lb=LF} \p{lb=NL} ])", - u'×', - uR"([ \p{lb=BK} \p{lb=CR} \p{lb=LF} \p{lb=NL} ] $)")); - rules.push_back(std::make_unique(uR"(sot ÷ contra LB2)", uR"(^)", u'÷', uR"()")); // This one could be part of the rules. - rules.push_back(std::make_unique(uR"(LB3 ÷ eot)", uR"()", u'÷', uR"($)")); + // Note that /$/ matches ( BK | CR | LF | NL ) eot, so we use (?!.) instead. + // The generated rules use the same (?!.). + rules.push_back(std::make_unique(uR"(LB3 ÷ eot)", uR"()", u'÷', uR"((?!.))")); // --- NOLI ME TANGERE --- // Generated by GenerateBreakTest.java in the Unicode tools. @@ -3015,7 +3043,7 @@ RBBILineMonkey::RBBILineMonkey() : rules.push_back(std::make_unique(uR"(× $CP)", uR"()", u'×', uR"(\p{Line_Break=CP})")); rules.push_back(std::make_unique(uR"(× $SY)", uR"()", u'×', uR"(\p{Line_Break=Break_Symbols})")); rules.push_back(std::make_unique(uR"($OP $SP* ×)", uR"(\p{Line_Break=Open_Punctuation} \p{Line_Break=Space}*)", u'×', uR"()")); - rules.push_back(std::make_unique(uR"(( $sot | $BK | $CR | $LF | $NL | $OP | $QU | $GL | $SP | $ZW ) $QU_Pi $SP* ×)", uR"(( ^ | \p{Line_Break=Mandatory_Break} | \p{Line_Break=Carriage_Return} | \p{Line_Break=Line_Feed} | \p{Line_Break=Next_Line} | \p{Line_Break=Open_Punctuation} | \p{Line_Break=Quotation} | \p{Line_Break=Glue} | \p{Line_Break=Space} | \p{Line_Break=ZWSpace} ) [\p{Line_Break=Quotation} && \p{gc=Pi}] \p{Line_Break=Space}*)", u'×', uR"()")); + rules.push_back(std::make_unique(uR"(( $BK | $CR | $LF | $NL | $OP | $QU | $GL | $SP | $ZW | $sot ) $QU_Pi $SP* ×)", uR"(( \p{Line_Break=Mandatory_Break} | \p{Line_Break=Carriage_Return} | \p{Line_Break=Line_Feed} | \p{Line_Break=Next_Line} | \p{Line_Break=Open_Punctuation} | \p{Line_Break=Quotation} | \p{Line_Break=Glue} | \p{Line_Break=Space} | \p{Line_Break=ZWSpace} | ^ ) [\p{Line_Break=Quotation} && \p{gc=Pi}] \p{Line_Break=Space}*)", u'×', uR"()")); rules.push_back(std::make_unique(uR"(× $QU_Pf ( $SP | $GL | $WJ | $CL | $QU | $CP | $EX | $IS | $SY | $BK | $CR | $LF | $NL | $ZW | $eot ))", uR"()", u'×', uR"([\p{Line_Break=Quotation} && \p{gc=Pf}] ( \p{Line_Break=Space} | \p{Line_Break=Glue} | \p{Line_Break=Word_Joiner} | \p{Line_Break=Close_Punctuation} | \p{Line_Break=Quotation} | \p{Line_Break=CP} | \p{Line_Break=Exclamation} | \p{Line_Break=Infix_Numeric} | \p{Line_Break=Break_Symbols} | \p{Line_Break=Mandatory_Break} | \p{Line_Break=Carriage_Return} | \p{Line_Break=Line_Feed} | \p{Line_Break=Next_Line} | \p{Line_Break=ZWSpace} | (?!.) ))")); rules.push_back(std::make_unique(uR"($SP ÷ $IS $NU)", uR"(\p{Line_Break=Space})", u'÷', uR"(\p{Line_Break=Infix_Numeric} \p{Line_Break=Numeric})")); rules.push_back(std::make_unique(uR"(× $IS)", uR"()", u'×', uR"(\p{Line_Break=Infix_Numeric})")); @@ -3027,10 +3055,10 @@ RBBILineMonkey::RBBILineMonkey() : rules.push_back(std::make_unique(uR"([^$EastAsian] × $QU)", uR"([^[\p{ea=F}\p{ea=W}\p{ea=H}]])", u'×', uR"(\p{Line_Break=Quotation})")); rules.push_back(std::make_unique(uR"(× $QU ( [^$EastAsian] | $eot ))", uR"()", u'×', uR"(\p{Line_Break=Quotation} ( [^[\p{ea=F}\p{ea=W}\p{ea=H}]] | (?!.) ))")); rules.push_back(std::make_unique(uR"($QU × [^$EastAsian])", uR"(\p{Line_Break=Quotation})", u'×', uR"([^[\p{ea=F}\p{ea=W}\p{ea=H}]])")); - rules.push_back(std::make_unique(uR"(( $sot | [^$EastAsian] ) $QU ×)", uR"(( ^ | [^[\p{ea=F}\p{ea=W}\p{ea=H}]] ) \p{Line_Break=Quotation})", u'×', uR"()")); + rules.push_back(std::make_unique(uR"(( [^$EastAsian] | $sot ) $QU ×)", uR"(( [^[\p{ea=F}\p{ea=W}\p{ea=H}]] | ^ ) \p{Line_Break=Quotation})", u'×', uR"()")); rules.push_back(std::make_unique(uR"(÷ $CB)", uR"()", u'÷', uR"(\p{Line_Break=Contingent_Break})")); rules.push_back(std::make_unique(uR"($CB ÷)", uR"(\p{Line_Break=Contingent_Break})", u'÷', uR"()")); - rules.push_back(std::make_unique(uR"(( $sot | $BK | $CR | $LF | $NL | $SP | $ZW | $CB | $GL ) ( $HY | $Hyphen ) × $AL)", uR"(( ^ | \p{Line_Break=Mandatory_Break} | \p{Line_Break=Carriage_Return} | \p{Line_Break=Line_Feed} | \p{Line_Break=Next_Line} | \p{Line_Break=Space} | \p{Line_Break=ZWSpace} | \p{Line_Break=Contingent_Break} | \p{Line_Break=Glue} ) ( \p{Line_Break=Hyphen} | [\u2010] ))", u'×', uR"([\p{Line_Break=Ambiguous} \p{Line_Break=Alphabetic} \p{Line_Break=Surrogate} \p{Line_Break=Unknown} [\p{Line_Break=Complex_Context}--\p{gc=Mn}--\p{gc=Mc}]])")); + rules.push_back(std::make_unique(uR"(( $BK | $CR | $LF | $NL | $SP | $ZW | $CB | $GL | $sot ) ( $HY | $Hyphen ) × $AL)", uR"(( \p{Line_Break=Mandatory_Break} | \p{Line_Break=Carriage_Return} | \p{Line_Break=Line_Feed} | \p{Line_Break=Next_Line} | \p{Line_Break=Space} | \p{Line_Break=ZWSpace} | \p{Line_Break=Contingent_Break} | \p{Line_Break=Glue} | ^ ) ( \p{Line_Break=Hyphen} | [\u2010] ))", u'×', uR"([\p{Line_Break=Ambiguous} \p{Line_Break=Alphabetic} \p{Line_Break=Surrogate} \p{Line_Break=Unknown} [\p{Line_Break=Complex_Context}--\p{gc=Mn}--\p{gc=Mc}]])")); rules.push_back(std::make_unique(uR"(× $BA)", uR"()", u'×', uR"(\p{Line_Break=Break_After})")); rules.push_back(std::make_unique(uR"(× $HY)", uR"()", u'×', uR"(\p{Line_Break=Hyphen})")); rules.push_back(std::make_unique(uR"(× $NS)", uR"()", u'×', uR"([\p{Line_Break=Nonstarter} \p{Line_Break=Conditional_Japanese_Starter}])")); @@ -3080,6 +3108,7 @@ RBBILineMonkey::RBBILineMonkey() : // --- End of generated code. --- + // TODO(egg): This could just as well be part of the rules… rules.push_back(std::make_unique(uR"(ALL ÷ / ÷ ALL)", uR"()", u'÷', @@ -3122,7 +3151,12 @@ void RBBILineMonkey::setText(const UnicodeString &s) { } for (std::size_t i = 0; i < resolved.size(); ++i) { if (resolved[i].appliedRule == nullptr) { - printf("Failed to resolve at %zu" , i); + printf("Failed to resolve at %zu between U+%04X and U+%04X ", i, s.char32At(i-1), s.char32At(i)); + if (resolved[i].indexInRemapped.has_value()) { + printf("which is remapped %d between U+%04X and U+%04X", *resolved[i].indexInRemapped, + remapped.char32At(*resolved[i].indexInRemapped - 1), + remapped.char32At(*resolved[i].indexInRemapped)); + } std::terminate(); } else { setAppliedRule(i, resolved[i].appliedRule->name().c_str()); diff --git a/icu4c/source/test/testdata/break_rules/line.txt b/icu4c/source/test/testdata/break_rules/line.txt index 9f85b7917139..e2154abf6309 100644 --- a/icu4c/source/test/testdata/break_rules/line.txt +++ b/icu4c/source/test/testdata/break_rules/line.txt @@ -176,7 +176,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4c/source/test/testdata/break_rules/line_cj.txt b/icu4c/source/test/testdata/break_rules/line_cj.txt index 7aad76ecf107..bb0a6880ea29 100644 --- a/icu4c/source/test/testdata/break_rules/line_cj.txt +++ b/icu4c/source/test/testdata/break_rules/line_cj.txt @@ -180,7 +180,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4c/source/test/testdata/break_rules/line_loose.txt b/icu4c/source/test/testdata/break_rules/line_loose.txt index 72e7563c9274..f9152060bf2d 100644 --- a/icu4c/source/test/testdata/break_rules/line_loose.txt +++ b/icu4c/source/test/testdata/break_rules/line_loose.txt @@ -181,7 +181,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4c/source/test/testdata/break_rules/line_loose_cj.txt b/icu4c/source/test/testdata/break_rules/line_loose_cj.txt index 99d01874d1fb..b04236532bbd 100644 --- a/icu4c/source/test/testdata/break_rules/line_loose_cj.txt +++ b/icu4c/source/test/testdata/break_rules/line_loose_cj.txt @@ -200,7 +200,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA BAX HY] CM* GL; diff --git a/icu4c/source/test/testdata/break_rules/line_normal.txt b/icu4c/source/test/testdata/break_rules/line_normal.txt index 211298539797..c7c518d5b68b 100644 --- a/icu4c/source/test/testdata/break_rules/line_normal.txt +++ b/icu4c/source/test/testdata/break_rules/line_normal.txt @@ -182,7 +182,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4c/source/test/testdata/break_rules/line_normal_cj.txt b/icu4c/source/test/testdata/break_rules/line_normal_cj.txt index 2061f9170848..cfa9c7968e1b 100644 --- a/icu4c/source/test/testdata/break_rules/line_normal_cj.txt +++ b/icu4c/source/test/testdata/break_rules/line_normal_cj.txt @@ -186,7 +186,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4c/source/test/testdata/rbbitst.txt b/icu4c/source/test/testdata/rbbitst.txt index 1c7fe9975699..781ce068be7b 100644 --- a/icu4c/source/test/testdata/rbbitst.txt +++ b/icu4c/source/test/testdata/rbbitst.txt @@ -2214,3 +2214,7 @@ Bangkok)• •« Complex »« chaining » • •« .618 »• # Interaction with the ICU tailoring to break before such numbers. +# A hyphen following non-breaking space that carries an intervening combining +# mark is treated as word-initial; by LB20a it has no break opportunity after +# it. A bug in ICU 76 incorrectly handled that case (ICU-22986). +• ̄-k• \ No newline at end of file diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line.brk index 8d0172d055cb3cd09d4b1c3b090c4672c7f0b662..fea6eaaf279007b84b7d3a48a606a7b31da82043 100644 GIT binary patch literal 73232 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 WjNF@cMC|4fI&`YFE7ron?0*4Dd>*?1 diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_cj.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_cj.brk index dbbbc0dfbae18cc57f37e207c81140f40c36e11f..1f8d55524244ff3c8b295a08ce2be3ab8425b180 100644 GIT binary patch literal 73264 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
      tw`X!w=j0 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 A>;M1& literal 73120 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 jN2#i=4!X9TUrn*T}ZKW^ug8wrs1BB_qisesNa9 z(hx$(Lemt&Qp!#sDWnTflduLFNT9SpA1$Sn0wu5T2#*I1r2jv2X8F%KbM85#3*z;4 zuI@Q=X8GrvZ~j@&%oV%$n{8}1V;(DF>&LFIFJX*jJ;v&LM^B#}8#-}vqQ1SiqrQ8^ z1sB&3j2x>U9+(&$TV20*Wa#MVvB4$vTSks9;~t|ECkMyIm(}+T9UUAQAFOY!hk&QX z>qn2*pBW!qU4L?7;`Hj}%Wt^hhGl0&-hi`ZgT&l*@G zYhul;g|)Ia*3LRuC+mXG61Ehs%h++Ak_C#bNzP9LRX)}?mO`s>$v3l~dRC*#c7O|`)b?5Q`60;WTy0Z>y@uikpj1t^x@#O?b zPa-6u?nKw(^@@{5PI~fM+(VG`hLE7RD^x8OEt^ClTQ;5~TL8B@wm~6b&|+OdS~hG+ zWXmSvV9SQ#us!J|NH(TIBBaswWRrme^I+pdA`y2)vXLO!tdMMh7K^s_$@ByzxarAe zf@G^ga;1+%V8(t&Bax*O#YrFG#NOJ6IoV2(Y*R>N511Coc4s8p2$CHMki_>p{i%?M ze2N}$2SKtkfJBCrrGq`7Y}uk~@vaaODI=-}G+VZv1j+6I64|otVS7PO_QCk%sys-p zR!Bs9at$A!AR3BfIR_|_VBOhGkX);f2#uBbiQ+{1(OSG;Arbz%-=Ro^uS9}R*AgUg zt^IXsq!i!UA8@S2w6#B|I5`y4o*a(pcTj>`dvcI)GN6#iTCB&hW_x1q0gog`!UE&i z0fOWxJ7$beXd64IN++&mI}Q>Ua~a1T1tfaJb|SzDY7)*xsK%ZImm&CK4+xVT_)1g9 zeh(xFB*HDIv9brGbqB+qAe>yE2#MeXV~be^+JvcN!+DTkI5EpWn^||RCrD1EM8f!d z2W1LV$3~oyoFYg@BamPkv~)Bl=vT^4vzNmcZFOuc0txyBTQ=@QI2k2K#v_n~^(2Ty zNX2U%n}|Rn{AtS;){}8Sf;uM58Ft36JFfs+`cIuh9G!|ewof`6t>Lp#IeMh?V%L_9 z&Wmpdluo(Nm8mE3qk|u zfptf&Q3pp#DiB!e*dO_i;qi$M*QKnc#y(7tyg9&$jAGW}AQF7P!}u4GyoGQg`eOU& z(M0lQg5;3^5_6sW2xER@4PL76Oj=dux5)mFt=a2okZzo9J89-u|j=6q9`(j@d-0Ik$C?v^81!A@Q zodn6d0!U;Uk`o+J$Io}(t&oVgw!Tm$xZk&7|mXqkxDFY<$w~XzP6E`H602AVED01>> zh?5U7{78+JtK}c!@6d%`DGwp+b?n0+;X@2(UcyDZ-$8pPe7m?S&WnX_w|~bO`lFD( zFo*=-c;@eS9)nP2B2wU5r{0;S?{_XErIY;Ks7+&E2AnX?i2xa2i_LzAz8ei9Nv|h} z#7$2qlDKty-Nxd&y-j0Lf*TULZvQyQ5qk2cd?hEElejksD8UWM<3vw-6q2~vC~7Nm zA`ETW)`JA0C&~LA@y?6BFHVZYUOI@xjT4F_`I~D~PXsrUe{=1V%x_ni55)cv{xp-g zMLpOhM1?lpt{{36=EU}X$K=FZkHxq7Zl&Y;Hs7YPg?gJG-dB*86GY<1iR-=sTj>;P zU%^KqN1|m5uJ}E{{!G1n!JAonTj>;P*GCvhT22s& z8z-*&Pi$khLhU~Z?}SOq2_kXh#C0c(O;2`(YO$;kQE%VOaV*^l6Wo&%J!XrW?;sL4 zPAHP(dva`?6lzb-#~??#Ws`d?^!kZ>`(|IY__!*aw4=w5k=Fhb3W+(6Wi0tVrN0Uw zNxo0%69mcm020P`bf-b`$qlzm zo+L<;YOH;1j~Z*%9Z@<-cDds&vLZ$@jC_TKhun zXA2@p-?AYRvvkBrDM{(jopqm4r6X&xC;_>WlYi~;v#NAN%=j^zU%-6N@MlQrd@c_X z@%9bp#kMu-&pRXe96@qWA<4JL4_o`FoiHfDt#s%fzo)H8o`8co=2;cn*#3*`uN{#* zO*nZ*A^B3w`bpfrN0i{k$uk7WfI=cQHtk61NMa=M`yPLrNP;Jc1_&p~cVODaCzIQO zDQh)jUrt;)Sc{|T&a=*?^JT)xbCX8$6=x*R5hO`V$KDrX>A2M$+#g%4iswXt6Z8m= zPreGSe*@p&^^Bl|X7 z|A~EvpThfRehTmFyx;j6aKaBi^7lL6O@u_g-}#paB;Qj={*`^7{Q&lE{g5O1H+Yxv zBY2nbJo{gKkKex==K;UZk$jivNw9RHIl=kP-&pz`+`a6kC$77f#Yic<>th&@umtZi z!sA%FdpWp|+RllsFGeJ8oKPgEK#rJsiGByN7g2Y_x;^@Z_n(Y7b3*q~2a%-b1d+IL zLXjlj(QS^X&HZd+5u7C5(JfdOR}sf_Nn^+PhP#B*q!#};LQfEj98pKl0dfC{Fm>!F z5uCJf&wT4AKPE_mrIS=oUJg59#7So?9XCC3-EVK|iDU%#T1;-gy_OW*`Ja>%+#w`5 zK_qURVA{Vc#xt;(XAu6kah~9(>;-uG8GQeb@A`AYSDzx#XAu6c@BfR4aKDUjLmB33 zdGekAHa)qK=S%G9My`|3M(NJ~Fp{*h3`F9lClpEYGYB?L3Uvkn`4l}Mo`%pS?yZUr zg|!&XV)!<2o4L!~cYs@$wi27ECqYiq*J8~{+TU<+J(poCotyod80N%m?IjiFYB@cZ z5j-K1o)bjkrm+;sEg;7nDWyk(65NpB2@yTtxiy3Yc?|B474sdvk|Ve-#0e2uYK(=E z*xD1@*dEWSxN(AKRWv8J2RK2DIr!4?iJSw99GJDej@Yae}9-bltfdnFHBC&H~Yhw|K8z+cFb8=4vCy3MR0U3*HW8aXF z6PacP7sM3CwLxE zbCT>lpvg(_^!Mb>18Po!NYZnHNZdHVlZl#>hd_?m??j(Wj2p8R>SSUVN!pngB5~uy z^^Bw*pXjp1^^-!Kk$gB*I+~OJQ2PqvcGmq7d(n{-*VCGsli$o~&EUCFd)={(+1}!; zC&|x^(o-|GkZj0yyg zxZ?N6KBaGmHddRrPnr`%l8%#K`M>x0c7P%J_4k17*8wCiG4YWj>X-aq&wB|@;Yq(z zWqXO$LAEmRjB855zeV|Wf~|``;dwye+pT|-Lm1CYg@mA65Kc;XRbYbC&-a_MKOE)VorZ^2~J2LrooAq zkw_wbqg!#}Wq}jRulsTdZb&jFk`$-EZKd-8=h7jkzrA9~i5IsDD)%Wx?5yJw+&IB; zJ??A~C*mKKNMz}FrT8K1C-4g!-~zv(?)&i&zMY@`2486HeHZ?gmdoe__bzUO*53E+ z_V42Kw>X8)!TgR~uoj0nF@9AZHCFEWu>Y$3hn@B0QKhkvj8`U0$1AtjVsBbZ-9ZU% zdQxU0VUJ5BEZ>=HTirnkPDmha*`6RLIV+MUyb3kni8&+bReDu!NFZ&~h*QL-3$^Dz zUz|?@m1jPE#N>p1RB;m5o?xxV|AQb5UCH?ikif7O!~a1*W7}&%_xNEg#&e_U*Cf2@ zAtd5gALQs!o@x3JZ|#L2`85e|21s!FH3>-D)RUPZBs^oPWy^aS!keWy5ixC?2w!;x zPP~~43A86(bqGnss35i$qXehA18EzaB-Rsq%Z7U5goNvf zFAQx@{z{dOXir?v14f@rtO%Vr(xIHp&BKY-SQ{tv zoH?0GIC(}P$#;U)HXB6=Zk&)4tloSpk|(?cYBq{zX)ULEy*h898xly{)RQkOB=K`V z>;ZqXr!~_c(K~g`U%PtNxpZ95joLW*N@66z^TqVs=yNGbCz_MwNP_2!2@-EnA|(E4 zO>c4dj3k%9>yB6NHF%9)lh@4PeNo{{vH;Au^-0nbQ6Oyjhs zw=@Y7wK5!WTGLymN+;!MO-S3UJ6}tJgdr!`o)r27YmxB_8z%xtuDGNqCn#BpBLnFOX=B#W2kO4|KOdUYI{aPxl|_ZUsh)xFo#Xo{AF@jm}2z zFp!{s@>$011`ft>XSf*0=G$9t`xR)E;MVWFl5ldTLLz5gBHz(^62-}@5^^HqnrBt+ zBuJ9&qn3ISh2%8~N!l^ns|k|eu2f9RUU#C9;I34uvFM*fPnx)(y9tuuUQiwcE@tVl z*x&rey`V{uNXhzs4?z;#fhoh8NaBCrelmMO&02gP;w1Hd-2N`Sqt={E?fAq* zGPUCq@#`l-Q>J!&VsbLIqXHAj)Q$>FBvacLn@Fa%FE)`(ZC`96nc5yuwy{``e;nv{ zWG_HR1!drjs}{nDebmBUxL+L!A~E}7-2=wGk^G750aLg3n6@@+6LVr&dt@);@^FWP zFt)M1@HOWHL3)K-wmfHF=Qaf4_5?Gm+fC7L(dXM36i9o*n2?a#I1BFC%dJd$n!gX1(zeG{A0E~s&qtDTj}_M{Tr4J z{%;7;qF}!>J&43V=_8T&^I|v?1hv@rBPWS)=Rf%3NJ*SQ;z-aABc<4rM8?klNF>(r ziLE^WB#x!ydIrH<$VI zM{xg%+>^olH6_@aF^l1^qOD`^SAKNY2kbuq-!!{EuJI+UCF7IeP8j=M3){*tAW6xI z|GS{TLaDz41x8B2oiJ+Oja+BbdvbmgzY8kLM(N5FTFmxD?fOt}-=a0v{%*7vN{6AI zq<%N5cYS~W5BDBUZWT1V?=k7S(QB2)B9f$>*jGW36SrDSIk_$mC;3-F52(@+3YUCk z_&UN#@|`fYT3o1|Fb5?k-p0Vbf+xH~a)$#yb8Xvya@ZSiES-ad6SWh@x$bOHrIU7F z!6t&_h~z{e5v46#w*31Fjw&Q+_2dXal9UsB-9b*=>JH`PSRPLD*PTIUPL2^y)Setw zI%(V3Z3;%#ZP6{>O2_s3%2_kXhgwDLwe8+k8co>i{rx`k(?~H()$<5G56%x^MC!dXu zkk&paC-%`Ja^hAxl#|nWILSYHe7Q3xrwJ#?=YY1lQ>Zy$7)jc?gGk&;ht5Wm&jD?m z6lx9_Mv|5jMB>H?osA}+1KKz#)EqF3BrPY1#Ela=8%;h3v~g0XIbaw`T22s&8z*!& zs^);s{mw8TaqD;J9B>TeOs?MKl8K^RHex`RmEN{5b5l8*{(oD^zQ5Jr-g6GY<12_2s#uf;Y_3RR24NYZkG zNZdG~?Md=lY~!R*wK$9t%M^y%5!^7)k&HI)lWOACes@EbfS$YAsm3ZP$azWKs5^p!GDQ|CM3icpF{`~dJ-kX*Av2tL=q+z8YL+NG!}omRh!Ca zBoRWGT?kiuNJ5B>DdJf%LM%uqu?l#ISl=gUc6e|QG6zuuC&WYuiC25j6VlqlHs)~4 z1}TA_h*})2_NcLj@f)QOv3|c}HU&lzht!@Et6Mfq0Fm$_#)k^=gjO(F^hw4EW{1=r zE8@K`BGfPUdL{Q|LH_OKlfI7C#9SBZejEO zp=eRj!J_-w`Jzu3{W`NUvn})b%rlw)$aZB1vTw=$eewL_tKs_)e7{~izofckXUQ8% zzFb;a+E;p4=@-h%$~KkVT=wy@7t7a_-&FpW<-eSE;k1cqADQ+-uA80DjpgpkJ)Zlf zOp~3jn2+{~HQGhmDsHNHsN%B~zp7kY`SQvSvGbKbWaq19SM^ujTlLwhf1f^o`n8$m z(;uAv+>DtscFuU!jL)$1GmAysnH!`G|Nhj>SIzv?%%9G>VAhCmne}G8&-(DJ@8i9? z+7IWmQ@yGBHPxS*oteFU_HDC2GW&-$ou+@yiJCXa=bC3~ekJYf{2Y)oXE!_V)y}zp z&R1)zYnRoI@XtfFU#~qickbLv=bnYi(aM8kp!hhj| z3%|DTTMPeX;qwc>vGAW3{@}l#3dzKxhDF!Pa`^xK9@OGRZ(8)XCMS!&hfj-J7aw2z z4!D1*zN)^jeyskn^1I95SN^&3?@cS=pHg*in^xG*CKFARz2Z|*uF@@2ByCZ5@54dY zlBZ$pFf3flYlFV{T=YVeYqVR%gvH%YA=UAmG1%j2*&r26^Z`e2eVfZ}RaJ*rn;g*Jbya&;};gN<9;JxSt zeD+o}e7xbWx%)SSzjtB74;p@fE?!q-dC^m76Q7DP?%M9XzUYOFDSK3-WR!h79~Pc?o;#s+z-ya()M;k7q@r|~C^zx3m-s`zEm z3r*AfrzPIK@HD>&e9J!3)Y-JEX;afaE!nhrUEb@>XKBZjn~pb)O@FxQj;8yXpl+C- zrpKB-38P0o7HoQ^>023**QHI*H@&FCHCJeR*e3GkwNKm7ya4UZP(t2C*?;!lNW(U- zZr&ooR=t?{sj$%y`f0|_=4+aVns1!`aPytb_caGlH-B*ckEHI)IL)7swxsuF7&imj zuf~OM{#MAhulf0zFZ1pTxf5RPz7?;v`w1Ty(+_#8f+eM6H5=n@!D7QY;oDMKaYH<> zT8gk$d^9Tj45RFI4ERrD@Eu9LpQ_F2o zp3rWTLMtFY*;&#?@45`CpPkoO{VerO{*<}3X+C}svA3$~QhtA3W?IW1dP}^ElgpX5 zq2;|Tf2PBG?b@zw-WzS)Wjqne>uUL&4j*mvx@=N>868DGjgE<~v`kw5uH|2&!p<6; z|D!1PD7TiMx4hWOT3*zj*0Ppgwbr(_wbp`9Nifdrhg(;*u5azqKrH!3$Kiqm-`|0-EgiHIK?RTK9{Z9Bk(0*I{+uGm3KaaPqZrk7f zq{u;=-^R2*+jdd=KVn*1UTa^=uiKw*=Ll*?+F$CZY`vpnq4tlm6}=Ee zardh1>>N+1L?;)t)l^khR8;Wbb8^{St`h9ELh4+&RSB#66=nJIOd%0Yrgu)@4uVbb zTw{i<5yo`N(BzP6-<#H8L2uaHNkj+4N_$yav=GhI(M_;@vBa{UmD=RBe zUyP*6Gv(!R+QVfS;k8w1V0C46H3U=WRI*?xmuXe|7EGL5b2%-*jKS@ZvUDg7LfEuV z3Y#G$5Gw{)Af(J4G&M0 z5k};hi!syJQNfF(FB)0!_hWK@9aY zD-c)($!C#;h7t@hL>@kbQdhkN#8UQrsRjI<5+^w|AO~dUee^TTF_>8=Wf_@uXxW8y zByAFgN5&i=6b^w~xkQt1n##JArf1!{9$`>$g&*5@>M;s7%e%{b`B}Fv2Ol)z>dP~4 zG5~ke$@lcE%gLBI3CYYShR>ILEtp(wZB1=$wg&pr^70x!9Fr88;-o0-(Q}!q*;TV; zDCv{n&PzvKvc3f60MCZqYRyS*wZ1?GM761@NdUtq&Scqcmt||-*J)-177-nTpbc-_ ziVk3e6ZaAUr49+-9xY9T&X>=cq=8(law>R;GZ zyMT9eG#w<$MuqzNkm|;@CUD7S7p}vtmFs#UdY1r<^71Uy78p814r(%5`2xW#j}(7& zpjh583UVt=)N^^ch853^Yy>rs`0&&hV^J5`XzKKFf*@UWDnT314LSzJ1)p`n$!1%- zm^L6uV-TqYpQ&idD&kp`&d376`(hat8rynhve^dQaoV7ailSV=8yth|&}S73En$6C z$;DbsA&reRf#@eQhO|RS%u#3zAEY{3qI3v_` zgKJyR2gg3tt+SIncP$~0aSuzufPZI00}-(-E>4smNWmHy^g>__=(9ZRhe@MBZy8Ux zh^urn?<%0_2=Mizii_FOMm_QDYIn4CLhd2|c*VztrD)-NpacGCfPP9Cx)a=&!!wWF z00}fStXQ#pIf{rj3PZqqX^#6K6=<2p4Rnu)2FqH10ujX{#4FiNzKc8v{T&!-mPQ)xIPu|l=?gTcron=6kPjKzxyM955=HfQdfxloXBnKKt# zF*Lbs6$FF^4_igQSkb*4Clv69rnQv^gpj_0F)H^eFRz*|K7qudkab!OXnT5NCXqfi zjbX~7b{ej;^MWNyIy<{NJG++1kG8MuLQiQ#v(29}{Mx+|D`>RAPH*MP?(R+q<7`%T zf&dObg@}aQD^^0HrBBEskAr9w-LH}2Q_u&vBSpkG%B-fm`?W~M%7&|Qx`CAx1b0+2 zV@PHAB(g$eUZZ7TY;kz2Bby%SA@5wN@xcsGDSgx2Yispu3f0o35Fo0TxXNhZ5vv)B zhUM?4LX!z8iQc7@KtVzv>BH}4q}as>KcbvXB)pTf7DN9J21*ZaIb%A4C>k30EXY_~ z(Hh2maNPXAIQ<6luwmG8Mr-naVLu5i9tG2Hr!WYj|IL~(?x;@gP|{sI^Zu)&&SgV#x|d2 zZy0%pj9k(Ip*uQqeupiy#>?PRc!DB;FL%b$kp8|^wH4BxcRN`SzIq(qpec~{8tFaKY zN*P3PSt`GN#9HJ>8R?66UaqiMto(gXxM2eD+C`^=0#xpOwc!jY$+_CVb`2p7{CS1) zpHy1)^;{)X5>O+^lBTaive12KC{5K9Q9X42m28d)R=@%Pb5&JUvuDFR8K=r*#thCF z$KPmEH5)AGuS*SmRUJ_5`=DgHF!Nctat#Lc4Yo0=p}`q8ZGfR6B2L(h$*BAe<>22T zC9v_UW&#Tiv#7(M9}fmM{>PuepXLO&5ct8k+@OC|6;dnKUIfYfdYNGiXS7~MpF3r) zkpN;05!|{qV1NP=1UZq0cw9!{i6C@VDxOxz*kUCLabo+*U6(EuH@L1?0Ri!EIjp9k ztC=Bu;NQ;9m!aXY^aYltxB!rWMtg9ZaP&RU6NBhrf#6F!@q>nY_z1ZJTo9Vyaq*j` zR$)f`uvo_73#+iBgAA_if(L;HA+8WXU~$D?F6Ky#JPEj5I#0w0#S0C?3Lk#uC5bk4 z=LQN8<%1IzB@e{Y<2F&cwDd)Ifhm`}+&A)B+@-6$o4$aS=ZarCp_~MKUI2n%?JYeG zu$Ns159lti;gdGtsUrLSxf}z7XSmVe{a8c8(USv1BWoHOUVdhDV({3Z;h~Aav4P?7 zL!%?ZXV*0MY+1X1b>Gm);QFz_f$P`yoH{ae;>_ro@zn>w?@H=-{rJGx0Qcyl9>b?k z4jdVr7&^*5`>7|7b*O)A@W{aUAP=xRD!}fEfw2knUf)B!Ij%!J#{o6^Zr;3h|8-}& zS6r|HgRYMVx_>Jjj=ndOQv<=(1{p zbSurn);>&i>pmiK>pt$dhdS;-$G(lk5v$Olje~>7&~G~xy?yY;i9;BG`|Sq8uRF7H z#fppYx^g{UFTH|aH{f+6w{P5lav%#P2ir$S#<7~9HZ29;t1--8g2Tw*4ys8zP7jU* zm92jViQGRrJ`rH4pQ;*E<3NC&H2s~>$|&vGMH`o0gC|7Y*aFq$C{{%zWH+tvy`!g2 z4-ejW2&)_L#zSl(D0iP38yh__Fv02EO*6Us^uST!PBl=pBD>F?Ix;%UtI$4LeEWvR zKo*8+z+<{OZQ_ibc4d=jo#SVwHOOrdiwf@&y2%UPapI!&AT@>Uwt)tEsYS^v;7d_ zIoQ0rzj^(Y&Aq#zYC#PG;g|}f*t2~P4`Bkk7PXm#D0D1yD4pH?oy$eB!GmIl`)vhxS$G0T*BXw1 z7pKhORa=n`of?#k2!$3bCZJ*28YnDb;aGHN#DXe=g?0dX1fXnFpC2DARB|sk7~I06 z;1k^mgx-D{uwMoQcM@>J)g&N13W?}W0`9(s1cXNs5Z!lxegbY_67s1Yy1=mu6wg=d z%h$9Ue&3K~FMN7pi^SjcD~@q^X`Y(5b}2qhfwaSfQ4 zBa||hcpqj>R9I14jj9GpchlhLao&QddNO%oyf`K=CN_&!4qakJ@vD_Pm=k-_spCW> z97&!v$uyxO5^L@q7}+>FJUn^>4(>=h%bPybAZ#sUlP@&LY}rM}#QTEn&{9FHExWN1 zGX!JP&)Y8U$?GR{dX_-@N%<`Wfd@dMFBs$QH$_YB)snHJMN%M9(r%*=P8M3)AxGz+ zQgm=IP`jazg2_*}dR*U)ZO#R{Z3J@6Hi);B*lJ@SquuxIh&mvEi{81{#{d=-Xe7|8 zyG{@e4HC3Q2bOcyGg_kkMktVYAdwWFG-o`}u7#xWrUJVNJ2>7Tnl)m%DP=!)_RxXA z=m2yEdVNqB-rE3IDP(HIMtHhkorG%y&hp3&q9GFxtI$ zJx2lh6z#7&mq>q?9tPAVQdUg25E&kFuQk^!E6kClDY2z(bn=swl(MO^<;*B&o*hs( zC{!re?Ylcf?P@1Zu%?0Guu%Xd@Smu@z=WBPh04-r@Si;hhA8JC_X@HbM2`w$9Ep33b@Dt#N2Kt{f=gyrucYAkv zF8cd-r1$QuXTCY-+%wCaxli2v-F7iw2ul=+O;a~Dln5cRmJkhnlPAwijUPQW-O$mu zv|(j;&zgqOiNg)YN2kZ8)-_x+F@9+B@YqESTPF^6$%M)2V`EdNx*7(@4~67bLthnWtTe?nD;jYQ4qbm-nYPyb1pE%wCwSVLx#2~Eo zuY&K*@EH=~Z+|Mp_pT74e2x%5gz$!M2&<)Ah??DSZGb!wALOh%Amv{8^us3?lxs%C z7m19>!e6l{5v8I`l#5w_yh2opDlr?{I#*mE=0VDQh^>b73q_4sAZj6|PJR}`cfD97 z76Y9nq5(pUqDeH17SSr&M7!t^OT{wL34a%fI61Ykn9Qho~`OqaU&WM`Co zLQDeqgsx0}uan>S#WAf1DjE}IYIX9uF*ym2=Tgb1A}2gEJSaO8Q+5WxGW7}JXdTz! zD#c|G(6XbH4LXD2t2g|pPvo@hbTVm`4r`x@>GBBrG!Ke~>(j;r`lNImab3>tyDMCn zOk1GuyHe3BZNa(#TYyy3*n%q>+U3Heaw^$j zA8gu8e_Jr@i%HQ6mmTKX#W3x5VNy2p8nFlT=~@^+T_?v+ickKS_A*Q~R=Hk|pRh)b zN%b$LKEc=&Gum#SgNbxp#Ru_8rE`6{fnlONy1(O?6a|F|!}}Pf{SGFj<9eKVqcf(< z*SG8!BS0tlICDS4bilzh8fu>ohW2+zB@Lzn4AUV8lb280KA|Z7i1aT95aNgn` zj~|zOQkXC&&JmO&9ryOZDqVV8jh_@Iwf+>| z-yxMWeej)tN%t);@nFK1c;|PjZ_zqVEvEV1OC=`Z$S&^u?j;P|PTQ6RokD>ndg+{MwY5 zUc)fG&V>oN;HTr^cKr1W6LB({>@Jp>U&mzkhKQKL_34c%F};Cdy4wd6LRU6Ztwo1p zdQ$>S#7+9Xn_;>q0w(P5!ZE!$0VZ=ycMrpKuMZ|aeKIk5$K&^<#B?vibbkU&-tqWb zQewKFVS2y^6Ux}sr~I;etBnauhW9O)gPbY52NzNM% zChgt^Ui}<_tPrLmpVV^%zcC%=QLbLRU3uZ^<&#eA)Lu4kc^kv@4i}$PA-C+jHnR@0 z;s?jRf9T;8^>^(ueHnZcnxOvf9SqY$E==Z_&b!tVG%k23p@;*SDkN9nrd}vnBt6|=y}U~8K(EUFe&6pb~tZA z7p_kqV3>$TzOf4BqVM-RnEnJJ9&usv=ToWpAZUK@+96U&Gai4$!Gsv&JvaXlH4DDE zJ{9J_eD9}eYHknCt4{Gouk6!9tf`uL^59eR3?e0tQwr;iH! zQ#wx1TRsXpja>rvPot88Ghi}x%)NXHBNEZ>bOnLZJw zAS_5vJt*L&hhbtOeidpT22rE$elx)Qe{XAS^2v_&t0b3Qn*Az4I$qfQD&9RbN%%yVlJhCe9vV}}&Hb5$-9z(9 z$7Z_MeIFD5%XuEGp5=ckV65_K@#m>*<|mns$J^Hvq)*$K&7^xOc#W0P)wlr1DtuoL zrqfsj*P^w{x9`x*8)e_2nw#qyxX&_zUOpw!apF^Q9p`+CxBn?fc7@&l^NCZ{frvz_&L_MJnmpJ zbzF#ed;C7@gDDQ59%q=IaA6Yi+(ukXpYz3}ILX%z-F(7aPcTfMcQC1EuUvMtUVyd$ zUCzP4)OJVnnx-liQnS_bUj%-0R*`?XX8l+E!-N*W6M|R3SaoI&% zi~b7JC!!E!GbvSnqs{y>)2FZI!K9v1huea`NQvpI4ATJzQg(bgsW3gs`1F*6=`Taq#KQMQBb79KdWvB> zebK)kOzyLjY4&Odjp+)pS6f?$Z^n`xjtl(y;J->KyKgdm`c^?OeLE$lZ!t{K_Sxr~ zOOfo7_jkC@zSt4oxQkDiV2;OWOee%&%M#y#@AJRU{%IGcpmBj-v;VHonPsG+?bF|g zzZKsTe<%K4o>~6B_y_R=`1?okPw@TE@cE%Uv-~ge%<{j=^TAI8pXBjz`AqSdh?w*< z#UJ@#`Z2@w6Y;G0H`sUh?-J8b;aS62S_L42Y) z=XV0ezH~++xjv;iBSGU#@1Cr}o{=~aQFh^TbHbFIPif9=sPQ3IBi1*ADkqWFaS3(S42(-M=gpOp~@an3m&34E_|z`R<>%8c8K#?EnBwTuDcHM4@17vp zCBN^|oC7lTNpZAL=YTXl_t~U4e8Ts15T9NsWtW^!h+^ispz~7y$2j-&Yw;Th{Re!W zH)4Nl`1NTgeqQQ#cAo$A=7onUx)k@B&s)xTbewo--gg*7^WY$TD(u-LFQz1ODZ-Ro zpVFL{3gS~?&r6|P==mL<;nFVO^E;grZ2`F@^3rIB^m?Wp0T;EFsbiGS)Ti4VeWG(^ z$!vkB)b<&`$TQ_^2zL56kqh3J;v~JWp_AyO0!--n3C%_$8={wFd-E^ zZ;3yC!n1CAei!wuo0{M0^>LCy;m*2gsd_Pm*{7g+3!T49E;~Gbr}=c3OLmAhd>%~g zG3`dZDD3$=H>Pk~5X7gKrPQZ1X99yT72-^wmR-~{fl9}fCUV&o;!L2TEQA|VGT9NP z` zo)6Z1y4Oda^4)jdwdg{e57vBgV@k#+!jzm(cxGAi>HY+KIzMNYHJ{v=lJSYoQ77jU zo}<=$ih7PZ{JwjuZJ)5MN#?hf>Fr^C``_{Gc)2@AF)~DLbv@g+7=6&VtD9T`6Uk=3N0neEK7a zN!W99;$W-8$l$ruAKQ8GT>;v?yC8fbOtE#`%GmEgem4N36$m&VY-KqntC;@O9KkBa zcf`VX8OGDM^p&cd5L<7RAfLe30G~#iLaWLlmO*T%ECpwlo!FJi2iGj?@7}{PNe1Q{ zXJRJ4uJSNqg4hQ5G{Og66xmTu;d-Zn8W#_#2Kh1j{%ykvjM(pq2 z$M_WI+^gSv9^UJcT{xfkx{6*eAWX^ml;+(NLAKxnj8DYDeEOvMEQEgd1jf4Ghmnj= zgef_nI3^SA@6)erCceMmk%;<4@8}59C!~^Q{KVeTVU;RORvFkF{(fKcd~oP{LnM_H zn4rADC#zgx^7&m71CxcL^uTwSNGfSCm7ADizBeRDb{|eDJNDiXE2sEmRfNh;?>qF_ zTPvxg;S=^|w1dI-y&+a5{;56~@?sxc3B51I!h1vP^isOYSo^&pklp~FMmvW*k08^R zL2Re=VIM5%L(ED$AH6qZCj1Ubklpd+lkwX-sN?#)6zX`;Z|{68r9M6C=r~kpRXO@J zJ4~OfIidF*Qc0svRVF6!357{Sc}GXkeTP(1U;-4%J|Umx24Z^5y1}r8(Oj#HYfZ?S9;m9k-d@^X6e^mI)K*Q=Bu)k28IG!i6dP zym=6xKIfxP*V}sIewOdnC(Opro4YZoIcGdR5vJsP;+W!{fe)ISf5C@OL349IKJhc~ zZcK_#%0B6LDun41Vd8v>bB-D@6+5#2qN7jY?+Q@QfK)+lp9*^h-i;}oPeE&9gef_n z___QqJA6{MfH+~w4r9Xij~DiAw-=M|xFC-mCrrutl;*s7(0y0f^X6am$Sw(=2vc%C z@iXvGM#7YDJpOf{l4d;4&YN5H9!z06Zk|n|eE3~&En=7`CC=Elp7nRp_>^y)NqkB! zJI<%YdH57_7E@~(iOxj9lvF-H*WT>(}@Ag0HxMq_SH?=J|Nn>Sg_ zX)pl_V~!x=oqa;Gh zmcw6{wF17o;nRcX%`N%6-PS5RZw}>+Gw{~xXqb#Od!IA#*2PSAvCqH*3iG~uIvOVX zH;vIgou79F6dCV-8h2sBz6w{r)R>Oeea+uWIX~}IFfn=0+#ss3-`i033G)d!V~WpS zUn*rML<58x;S>KiuS`sL#pV-K369SZ(x17}Z|)KTPo|K4a=-i3{QY3{?$e;(wn%@z z#pKf~98791MSKX>CramhdZkNtm?vn?N#*(ZyH|jQYfeQww{iY|^UB2J-qVh)2*2;B zot#hU_t~46-22BBXHD5*+zVvFO)A-?S{#X7+ktsX(o-E`+J{|Y+>0w)T4UiNr zJNJ1hq(%G0=-0OJ8TB(Ed@|SUX@3EXpR6_Bai;jO#AMHdt+m!A)}^A=S|`Vu>tR3L zW$-M2gLOH+*T}le+Nj@aWL;su*QmtkTV~4m$&&n{-;{~XC*S!U;}iU5L$heHpWj7$ zSLHLXTSja7Oc~Rem}bhDj^5lw0-PyhI+IT`W&C7fnknNa6Vpr?tC*N(%2>t3G*iYZ zCZ?G(E-*38oIcp@T;TFcS0AiW+~aZYGobVL?k+bbbNpnE3&PI<(fh=bua6@N?JkeS zr-0`OVxt_Z#G6Z*V_!s}-Bk`IwGV^Rl&)n_gkUeHerSYxduF z$oD_d`jguKbpC$V&E(TAhfjKbhjbP1vG@m0N6=y9v!Ppne>#^@l zSraoc&6KfS@^=|2))9@)RzZSwC9{x zro_|-nCMQ%y^#GJlRE3A?32aMm92Bq`MI(I!~}U8;1lOu*=CzwKk#doWE^73x-f0A zF*?!G?=zKd_qh)2UA5DCgH5p`SrmCI0vL;hnRK-VtULPGW3Zs1?kh( z7LLl2>(frV?*c?K$eDbKcjhKY#|wJq#=?;_>A3qG&|}taLv|mB73yjcB)e;@J*i|j z%yj%(2h(+7I-ch|0#Zq%PuDU``W#T$*f-C9I%}T9Bt!#fXo7dRKR}U0-l!w z&4JTXYHx_rr?7Em5TED_S8_h3Il~o%si0@LVxE@@l3hX1OZi|*B0IvATz2dXSIm9U zL3}FczGxpzN%%yVlJkk})wbg8iw@#bLH9-bU`oO#!jzm(Y_GP}5XnB}8>=+2aY2*p zGK0qjD`dK{77ZxOvC4iACRsqOVTfpBl^Yo*q7aOU($zPvKka9jqVXx;ScUkMTy~sK zBYF4~ZLD%2C7(tZpW^L7#<9xz*@Ikctox3;_=Hjp-$R3QbN61O{l@{-Ji%lxqtueEfMTE8lWIMem}G0Gi7hB$)}mJhsLzy z54mJ#K5zN2+*@n%Y3A(farV~6JTHagC!f8w{Jd2By|u=9DO~G`cZMryy?~$LioK5& zP?Q_vrhfAa3hO0srHn3AtQrP-4e#HT{+$$sYa|`dw`Py~zj4QI z1ALO~FVK6kfPi(-g9&26na`*(9KL7t5W|G|@r-Ho=jI0;9fyK?@0zpcAk(0PR9eByi8jwn7^?)`L+Sx5C=BYQtx&|afs z7S0osV>-h49LWSCx{_~c-cH%-j@?k0wbD8#w%UcfL#<5Rw8 zWyGiCvg3Thr#JMD4z&-1^C{YWcOoU9jx#@ndh)>D&iSy}X9zI3Wr<+sq=_KP*yuFY?cD%5AA*U3dEcgD*$E;I^ z9jAB42ifsy>om|wF1snlr+9lIgXS%T-3#f(`-=7(8FJus(3b7ZG zEC_sCUQ9{&M3|EE3HN6@4t9!!_buFJ2Jxw|`&GP{lJJQzCFc|0LlbYmN)Vq4yI;kN zDG8qlQ*u6yz-qzFn+KaZ9&dgZB)h`S@4T3j$c`{2mmQyT#+%;-@u{%$J1?drd?HNA z`NZd(&ipRb*!LJ4KgA#W^7-8hW7+Y5cLi9tFig}-#Fbo^>??Y>$0}Y-N%%yVlJkj=pW@kqAU+k=7I-lw;S*s> z&L?i4;@N^AJ{8s$crhj66Jbiur?d8g*b=yIv;BCX-&iyvQhAFqMcLw#EV|ON@>$tz zaWg9$WKK%fAvQ#ziKPjT)R5pcJt)Ct`)0PvXehYq2s~FF<}xsAttLLvVO9Yr6X%5>~-OooZs42m{7-E zj$@Lx08n`-(F@pg>kLY&mS~g&>9{{7rQ?3G1KhlI*buP3nv(nh5O&|q_Q&K)3El|E zWydJFWT*I)fKmV^H^&_@#gkp|eJ6A;CGC^ZOM&$jMlYrA7GI7_T!^U_*hN3N;y^`@ z566Qs**zy%QQmWk$||280q+)JTRM3MLm#Z`4&sw-$0b_Kty*XI=GXcf$LQ$Vf`Mmx3Om#z}xmYw+zzRFl{}HNHv|&DyfGJ99vs zE5#=&SBMwGFY)rfU%?rjV=B&in0(gX6)i5hvFOd>T+!!>ewSI5*`9fQ=E=-|WIMB? z*|%r^rns*7I`}*QpYIgcmCP%-y5x-|UoWjJ9V~rK=~v3i$~KqXUiPW7=gZfZ-&X!u z`EO>eo;5w|W3!&itrX{SQ@ML`kLJFs>J;ZH>d;@YUdJe3#cdT2RD7Z0x0M?zZ?621 zI9K^2ajt59)lk*lRbQz3_t|x`ug|QQec$Y-=FFXQ^_-W_`Mfwcx0uS#?N>DH>u2Y_ zeC`u-e||yF1rro=!Q1e9!G|ySSG>-fXXmrIGjH>}SI&E4erEor`FGC$*!&+=FEi7t zk5<1?g{z;e{;l$ha~A@g3x~xytLDNtU--?Mc{N=%6Y}qYn(x${Sg>Hhr3=nLc=3Yw zFL=#@AJ}P>w*61b{$J!k?ZN!0YwxT5n!1mOG!9T0EV;Gf#? zQ;csE@R{SzQM#zHf#Mq5-D!T|(k~P}hlm^3`lU7ws93Ah@%0c_O24FH=-Rkv_Ji>E zc;k`A>Bc)6-(cN`@s00j{1dzuJ%?edyYW+ve<9xF#u%%!sl4d3=%c@i zDH+>gy}szVrrM^~ri+@^H*Ia&+ca*yx#>*Pt7kvh^ya2_H9ZPLc3Hw&+4R|_zf`4x z-dgM4U|ColO+RS*S<`RqvTG}TQ}kT(EIV|ObvK0SiXgS@)6L78*EVl%-lHj-KKP~3 z*PCJG$C{guG*8Wbu=%CU_cX)3Vg5CLr1>*2dX!_q<|muKm!Y;UZ+^DwBE$?wybN}N_nfE&-|QxJcka=xw>U<%XrJJvmb1ES<5{w zF4QfL)cr*1zADr5Y2}N0ZGmw!p#5f8{+91~QU_a}oqM@;k0+k-H8{26Rl#YL0%Q7d zYpq*Sx>SoX?j|laUO}m?l@+&y^HozJU&Y7$^3O43uS>wM(yjqrUfa5e?ifsIU2fg) zw#+fZ*XPS$3pZWZ-@K<_9<#h=uSS~0*SaAe4w?Re)4tCDUB`2|L#=m$Ji%_1f)!AI*$b49U$qS8eWSK%-Zyw^^ibx-&2{*P zh^@6%m&)sFGqYOX3cq!{COVy2{jKk7{ZpOa>d=1ev)&ZMyNpG-tj^Xi>iqsbt22m- zO=D@%&;3hcESE{^U$_2?U*08q>VD!E?-$qltJde+MCy%ysSmb2Oj_Rd!M0DeeF^e^r|pMr zzo?mLFQ)kR>h|XLmF<_c_qFe8KhS=%{SG_+CAIr%7uN1?zq|b%Q0jB-kF-AD{%OPv z*Du58Ta*tdeIJpw{}jXRH+G1QIUNlh-5s_)Q?2M2Qa*96<3QV;9Va{Pq?nGEb-WaP z9WR5=y&ZRUJk;?n`S)o1y7qk?k5dcUZ5z|^jrNN>{vPYn^x6hnf7kJBheS{_(ea;4 zE8AYWbdgT?^A$bk;@!nl#rG6HTKr_@K;}U4v-qw4O3F&wls|KzIz`sa!$Vl3$compb*7_L=!gcb6V6JyUvL=0NEq@R4{+pDoLjRc8*A zT@0VA;B!;iYs)@R_SLchm%P-<6;)luyO$15&<;OG1!9&%OQWelwSl-Q5ROV(? z&CXT8`rZZe95-i9E|)8ZPmrssm>rZPM{2OW6^h_c?QD$wNv&bf>B6NvNCYufBInqez91bH1 zla4_Vlg!F1D`jPsaF>Eg+l6#_qof9<%S)_A9%{2BW7e;WLK3UrQ69UbOxH!V4@kI* z8br}+pm3$+4^lPw4IfQN`y>h7Y=@!^A4|D1J6ZC1l+ciZL59)8fTwn+w}4WPKVNOG z^hA}jmKu;6H{se)C%TW4eL<{sD4G zxWX=NM-3Q)&C2dFUwiudbMS|bzHNHuMP-n2y83~E{+ueAQ;^JdV*Y&9*MiH{)>hZn zW~-quEibQ@!!gAolbj-jJ$f!vHNR@U%B4~wT%~lJudGeMiGZ--5A@~~Z?(Qa1L(G? zu8si1W}M08V84>BdF|JnAuLoJv!D+z(u)z`C`u+#Mx{fPI-sdh?tD$CPw5s#bc<8E z&~|`$aX6mJg_N(FAA>S%O!VeP{qx4^7)bUnrnC6@I8j?4VqK)xxW2O4CH=UIwST~; zcX7ceFVDi=0z+qLL3KtepDSBHkmL8y6v{U&g1lAEFI--(VTJQX89@ysJU>sxQanZ( zO>?As#vcb zz=o+h*cFS|?12krlaA$KQ+t-;8^G+c5!ozk2+X!-+A^8;>TJhSpj=Z|RRf)M4OX&j z*|Ka2t&~(Rs9XU5Fkz^v%XKcn)Hzl2J3Bkkr(CuYsUm+al2N*Hl|x>AENun3%8KO` zu=b){C3@gXUR5MqHQfLos}5FhWSG9~Bv{jl=z^xWfyI}(Q*i9V+uTDlY65#8gQx==0ofDGH z)$!=-g4RR(@f(B9J?N4AzzF=;0PUJEcNfI3g0L*z3>7ptuU@@s6_W6G4hC0pPfn&F zE6_7bI_Mq|4a!>oxe8Jc%LO=B0tMa5<0%_lpH4A-9s>RmSj0a?$A;zzZl@+-v(ku& z;)UDZ&ITisY_8mAFcwb6RUk8KR!v<^9S9P>YU1XoltV@PGBMDjvmc}J_vXmO;~QKm;F zsH;?J444`0r7D#t+O@V;Kc;XjU9_Sy7u{a;t%`X^tY$8rS3aNeOePd1epOUlf`m*e zMPAK9p^FiAK{cC*cx81pLjMmAq=%QBF&#k^&CPNaWGt>|4U;Lk&{>3;$ZFM6hlB2YUd@>v)Q!F-N|BLtk4BbgT$k^)!pWDY|T62BB&BrQ|Tm5tI&BZ8M)8tl$T zn$e7$dvyxaVy{G*1U>$R8T}MeK5}$|6v{1xEB&h!4~zA3_kfaid`_Wv)!4z4#(0MQ9Ff zr)?4}`oO}Esyk;cCBRAxm@+3R2Mb%0Dtl@H_Cq%b`aa`nlq?GAxWI!PFlT)%^J|PsXV-n=wN)ma#Y5RLuturfaETs&fxG+_yog zdST|XcI_3I)plrO97BUMY;J(T5V0sUimIr*f*kBC)C4~HtvP{$!zSuHm?pEqMgGe$ zr1O^G76Ln)r0Y(vszTP%+6ysRe)k&Ah(>QO4|l0nBLkQ-NJ#G{mjf2CEXWh(SVAv@ zM_Kr+ltQajXNVY)=ne;CuCI$cX=|U^NY6%?4pWe!9B)(8*Hz3znuN0ic0S zCrBSf+6kD5S#&m6_MR^MLnjk#gfarY5Sra_$%|&KgBkI|Vwr?bUh-pv%C7ygn2kmP zr7WSB+-ZQ(t!YxK187?WhPml^pSMA^eI1K z%H^)KoeI-c#j2~B3TS1knYL_E<*>vi zRtXi@G|nb@{$+ ztUP2nJU%@>IWc;CWZUS;(TTBBVVdT~;IlQfh$0m)@^$j$!&XNh9ho@Ag&ny;4G6CBLC@D|@=p-_s3{2m04Yu-Ir= z!047Vcy&XQr>2>>mSZ)TahF|L@9G;)LzSS;E4zD#uc?Uhg6aVXUZs^wf0ksqxVXu=^)(8ynp)a64VEwXa)l$6U8g4~-w1zGh=wvSHT1U3XP>;u8HL9Xop zAHKn|fWxBD#C>qtzkDBN!#EJ8H2za(Hee};=^Y$8e)<%IdIzBsZW-R(a@}>9wA_ba z?~W0~b7RZ!P|K#PTKaZ@{Qxro#IY8rv3JLAnIkAe@8HP5&cVT*z+pE5AlWwvT?&}& zmMw!VTZdbQ_ksw)cJFK1IRutmF?l~IHuSXE*@A@z3jr1sYyjL;aChMiW;Y4&3~pL2 zwF#SN;H4BWB`WboGu3Viw(Yi_?(W+q87K2bP1H_>MnjvS)G~L{jS$)Cj>ND-4H!KH z+#}Z6RGc_j+zCOsOB7yBlL|wULlQ-9Rzbo?*@KjZhnB4%@j<}hj!fGI@k)qAFX1h#D+v}u5cQ}2TagTD|Y zo?<+M(Kp014ylX~&ocI3$1*~YC}KRzIJ}o-gdkuT9)(UYAk#i3!{tD5KTxy@W7&NsX{EuMGIqSk7^sxlZzLiahMo>+)mgYP zmP#;iheLk_lfsowaMMb(J3ZP)0)tFDBrPUdZ_H%af7_3!T?8cQtFN&!fCmX06}0KD z6o`XS0*kbNg;YPo8tpT30mc21sK}}%$6dC~Lrt0s>?(r6Nuy}q6)Q|C`>^AOjs!*v zpf@lA0Hu+=4)7`lO^w)SZy0Uh<;rfOv*o;94m0xo>u>CUfyr4|2Oz1F;;K&3Kdo<* zL;^bHpRPL@-}EFs4XBPUt&r})H$QMdYp*FUY*Bzo398%Z>{C*TX|jAncQI!T>VVj-ew79fFK8fm&H{7JLdw#m5R`GYRmK7`ENkBd0v+19bSW@%o6Y@gV7<5P zfeKc_XBD=VLUx-lux+=D-YqjAHHg7{cFAp+K&53OaL3`JPaY`gk_(GaoH6oX2{|6c z#`F%Kh2_$-`+o42*X>^_+XnMvYN8WuGXWCL0{dk1S+S)XCD1(sk`u&F4#Et9{$C@x zfqjXor3BRz3%x4KW&@D3P~a4B4d~%|gaol`>xzB*`1H&fGPuSIVEx@g2Iv-`>w;U% wp@u{O!S>}aDBT9VUg2q*1K)U10g)PI^pi>G-|n+)Ao&6*UF&g?{r$H4zcX;4VgLXD literal 80768 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 diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose_phrase_cj.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose_phrase_cj.brk index bebfe7285a2f0182dc6a901317f0ef49b8ecb254..14aa5b32f8d0ad4d1946d6cb3c959777f51c9e4a 100644 GIT binary patch delta 12778 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 literal 72976 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 Z$4BmUTS9j8j2DoycqN|jg8Pu?{x9zbb*BIT diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_normal_phrase_cj.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_normal_phrase_cj.brk index 7cbc69987714c53bcc657256718752b40801061b..208baf36649f058bcc42cdbb10fb1fbb7939c5c2 100644 GIT binary patch delta 12045 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 literal 78272 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 diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java index 994433250beb..8d3ead20fb61 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java @@ -1276,7 +1276,6 @@ int next(int startPos) { fLF.contains(fText.codePointAt(breakObliviousPrevPosX2)) || fNL.contains(fText.codePointAt(breakObliviousPrevPosX2)) || fSP.contains(fText.codePointAt(breakObliviousPrevPosX2)) || - fGL.contains(fText.codePointAt(breakObliviousPrevPosX2)) || fZW.contains(fText.codePointAt(breakObliviousPrevPosX2))) { setAppliedRule(pos, "LB 20a"); continue; @@ -1285,7 +1284,8 @@ int next(int startPos) { fCM.contains(fText.codePointAt(breakObliviousPrevPosX2))) { breakObliviousPrevPosX2 = moveIndex32(fText, breakObliviousPrevPosX2, -1); } - if (fCB.contains(fText.codePointAt(breakObliviousPrevPosX2))) { + if (fCB.contains(fText.codePointAt(breakObliviousPrevPosX2)) || + fGL.contains(fText.codePointAt(breakObliviousPrevPosX2))) { setAppliedRule(pos, "LB 20a"); continue; } diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line.txt index 9f85b7917139..e2154abf6309 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line.txt @@ -176,7 +176,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_cj.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_cj.txt index 7aad76ecf107..bb0a6880ea29 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_cj.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_cj.txt @@ -180,7 +180,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose.txt index 72e7563c9274..f9152060bf2d 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose.txt @@ -181,7 +181,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose_cj.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose_cj.txt index 99d01874d1fb..b04236532bbd 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose_cj.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose_cj.txt @@ -200,7 +200,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA BAX HY] CM* GL; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal.txt index 211298539797..c7c518d5b68b 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal.txt @@ -182,7 +182,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal_cj.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal_cj.txt index 2061f9170848..cfa9c7968e1b 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal_cj.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal_cj.txt @@ -186,7 +186,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/rbbitst.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/rbbitst.txt index 1c7fe9975699..781ce068be7b 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/rbbitst.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/rbbitst.txt @@ -2214,3 +2214,7 @@ Bangkok)• •« Complex »« chaining » • •« .618 »• # Interaction with the ICU tailoring to break before such numbers. +# A hyphen following non-breaking space that carries an intervening combining +# mark is treated as word-initial; by LB20a it has no break opportunity after +# it. A bug in ICU 76 incorrectly handled that case (ICU-22986). +• ̄-k• \ No newline at end of file From 65bf72a8f23c0df1b417e1ab3b705e01d3808a9b Mon Sep 17 00:00:00 2001 From: Robin Leroy Date: Mon, 23 Dec 2024 17:47:04 +0100 Subject: [PATCH 18/24] Il-Milione --- .../com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java | 4 ++-- tools/currency/.project | 11 +++++++++++ tools/multi/proj/icu4jscan/.project | 11 +++++++++++ tools/release/java/.project | 14 +++++++++++--- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java index 031935a0b237..97a40bbc10d4 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java @@ -1412,8 +1412,8 @@ void RunMonkey(BreakIterator bi, RBBIMonkeyKind mk, String name, int seed, int // If test is running in an infinite loop, display a periodic tic so // we can tell that it is making progress. System.out.print(monkeys[m_rand() % monkeys.length]); - if (loopCount % 1000_000_000 == 0) { - System.out.println("\nTested " + loopCount / 1000_000_000 + " million random strings with " + errorCount + " errors"); + if (loopCount % 1_000_000 == 0) { + System.out.println("\nTested " + loopCount / 1_000_000 + " million random strings with " + errorCount + " errors"); } } // Save current random number seed, so that we can recreate the random numbers diff --git a/tools/currency/.project b/tools/currency/.project index 0a1131c0823c..f05ab5079056 100644 --- a/tools/currency/.project +++ b/tools/currency/.project @@ -14,4 +14,15 @@ org.eclipse.jdt.core.javanature + + + 1734972420072 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + diff --git a/tools/multi/proj/icu4jscan/.project b/tools/multi/proj/icu4jscan/.project index 400a6c17d751..19cbde33db70 100644 --- a/tools/multi/proj/icu4jscan/.project +++ b/tools/multi/proj/icu4jscan/.project @@ -14,4 +14,15 @@ org.eclipse.jdt.core.javanature + + + 1734972420125 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + diff --git a/tools/release/java/.project b/tools/release/java/.project index dd7be81d3bee..a2cf180a42e8 100644 --- a/tools/release/java/.project +++ b/tools/release/java/.project @@ -1,7 +1,4 @@ - toolsj @@ -23,4 +20,15 @@ org.eclipse.m2e.core.maven2Nature org.eclipse.jdt.core.javanature + + + 1734972420090 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + From cbb4376433a854a87d51226535c924bcea59292c Mon Sep 17 00:00:00 2001 From: Robin Leroy Date: Mon, 23 Dec 2024 17:50:43 +0100 Subject: [PATCH 19/24] Cats can have normal a regex replacement --- .../test/java/com/ibm/icu/dev/test/rbbi/RemapRule.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RemapRule.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RemapRule.java index e4bc8e79913b..6c84f6052b93 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RemapRule.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RemapRule.java @@ -9,11 +9,10 @@ /** * A segmentation rule expressed as in UAXes #14 and #29. * - * A remap rule performs normal a regex replacement applied to the remapped - * string. - * This replacement may use capturing groups. Any positions in the original - * string that correspond - * to positions within the replaced text are resolved to NO_BREAK by this rule. + * The application of a remap rule is a normal regex replacement on the remapped + * string. This replacement may use capturing groups. Any positions in the + * original string that correspond to positions within the replaced text are + * resolved to NO_BREAK by this rule. */ public class RemapRule extends SegmentationRule { RemapRule(String name, String pattern, String replacement) { From 6c99853ec9cc6f2bd367847f894893af2ffa7844 Mon Sep 17 00:00:00 2001 From: Robin Leroy Date: Mon, 23 Dec 2024 20:31:30 +0100 Subject: [PATCH 20/24] Revert .project files --- tools/currency/.project | 11 ----------- tools/multi/proj/icu4jscan/.project | 11 ----------- tools/release/java/.project | 14 +++----------- 3 files changed, 3 insertions(+), 33 deletions(-) diff --git a/tools/currency/.project b/tools/currency/.project index f05ab5079056..0a1131c0823c 100644 --- a/tools/currency/.project +++ b/tools/currency/.project @@ -14,15 +14,4 @@ org.eclipse.jdt.core.javanature - - - 1734972420072 - - 30 - - org.eclipse.core.resources.regexFilterMatcher - node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ - - - diff --git a/tools/multi/proj/icu4jscan/.project b/tools/multi/proj/icu4jscan/.project index 19cbde33db70..400a6c17d751 100644 --- a/tools/multi/proj/icu4jscan/.project +++ b/tools/multi/proj/icu4jscan/.project @@ -14,15 +14,4 @@ org.eclipse.jdt.core.javanature - - - 1734972420125 - - 30 - - org.eclipse.core.resources.regexFilterMatcher - node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ - - - diff --git a/tools/release/java/.project b/tools/release/java/.project index a2cf180a42e8..dd7be81d3bee 100644 --- a/tools/release/java/.project +++ b/tools/release/java/.project @@ -1,4 +1,7 @@ + toolsj @@ -20,15 +23,4 @@ org.eclipse.m2e.core.maven2Nature org.eclipse.jdt.core.javanature - - - 1734972420090 - - 30 - - org.eclipse.core.resources.regexFilterMatcher - node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ - - - From 550372a23b51830ace69cc20ea28cc35c96fb8d4 Mon Sep 17 00:00:00 2001 From: Robin Leroy Date: Tue, 21 Jan 2025 16:06:46 +0100 Subject: [PATCH 21/24] Try something --- .../test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java index 97a40bbc10d4..14aa1b86ff5a 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java @@ -1433,6 +1433,12 @@ void RunMonkey(BreakIterator bi, RBBIMonkeyKind mk, String name, int seed, int if (c < 0) { // TODO: deal with sets containing strings. errln("c < 0"); } + // Do not emit surrogates on Java 8, as the behaviour of regular expressions that + // match surrogates differs there. + if (System.getProperty("java.version").startsWith("1.") && + Character.isSurrogate((char)c)) { + continue; + } // Do not assemble a supplementary character from randomly generated separate surrogates. // (It could be a dictionary character) if (c < 0x10000 && Character.isLowSurrogate((char)c) && testText.length() > 0 && From ed70b825df2ddcaab8d53c7e593170381b5e17de Mon Sep 17 00:00:00 2001 From: Robin Leroy Date: Tue, 21 Jan 2025 16:20:44 +0100 Subject: [PATCH 22/24] Trace --- .../src/test/java/com/ibm/icu/dev/test/rbbi/RegexRule.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RegexRule.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RegexRule.java index cbe59071f08b..8695f0f5ac37 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RegexRule.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RegexRule.java @@ -74,7 +74,9 @@ void apply(StringBuilder remapped, BreakContext[] resolved) { .findFirst(); if (!position.isPresent()) { throw new IllegalArgumentException(("Rule " + name() + - " found a break at a position which does not correspond to an index in " + + " matched at position " + afterSearch.start() + + " in " + remapped + + " which does not correspond to an index in " + "the original string")); } if (position.get().appliedRule == null && From 164c3276fb24074f32d06e80e10b1400237d7f7b Mon Sep 17 00:00:00 2001 From: Robin Leroy Date: Tue, 21 Jan 2025 17:15:20 +0100 Subject: [PATCH 23/24] Try another thing? --- .../test/java/com/ibm/icu/dev/test/rbbi/SegmentationRule.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/SegmentationRule.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/SegmentationRule.java index e7abdbe7e301..0b352f6d1c07 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/SegmentationRule.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/SegmentationRule.java @@ -57,6 +57,9 @@ protected String expandUnicodeSets(String regex) { if (regex.charAt(i) == '[' || regex.charAt(i) == '\\') { ParsePosition pp = new ParsePosition(i); final UnicodeSet set = new UnicodeSet(regex, pp, null); + if (System.getProperty("java.version").startsWith("1.")) { + set.removeAll(new UnicodeSet("[\\uD800-\\uDFFF]")); + } // Escape everything. We could use _generatePattern, but then we would have to // convert \U escapes to sequences of \‌u escapes, and to escape # ourselves. result.append('['); From 3718cf930ecf5ec4b73cc4bcbf9da2b3f1fb7a15 Mon Sep 17 00:00:00 2001 From: Robin Leroy Date: Tue, 21 Jan 2025 18:07:24 +0100 Subject: [PATCH 24/24] comment --- .../test/java/com/ibm/icu/dev/test/rbbi/SegmentationRule.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/SegmentationRule.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/SegmentationRule.java index 0b352f6d1c07..c9f31933f114 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/SegmentationRule.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/SegmentationRule.java @@ -57,6 +57,8 @@ protected String expandUnicodeSets(String regex) { if (regex.charAt(i) == '[' || regex.charAt(i) == '\\') { ParsePosition pp = new ParsePosition(i); final UnicodeSet set = new UnicodeSet(regex, pp, null); + // Regular expressions that match unpaired surrogates apparently behave + // differently in Java 8. Let’s not go there. if (System.getProperty("java.version").startsWith("1.")) { set.removeAll(new UnicodeSet("[\\uD800-\\uDFFF]")); }