summaryrefslogtreecommitdiffstats
path: root/intl/icu_capi/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'intl/icu_capi/cpp')
-rw-r--r--intl/icu_capi/cpp/README.md17
-rw-r--r--intl/icu_capi/cpp/docs/.gitignore1
-rw-r--r--intl/icu_capi/cpp/docs/Makefile25
-rw-r--r--intl/icu_capi/cpp/docs/make.bat41
-rw-r--r--intl/icu_capi/cpp/docs/source/bidi_ffi.rst194
-rw-r--r--intl/icu_capi/cpp/docs/source/calendar_ffi.rst157
-rw-r--r--intl/icu_capi/cpp/docs/source/casemap_ffi.rst238
-rw-r--r--intl/icu_capi/cpp/docs/source/collator_ffi.rst147
-rw-r--r--intl/icu_capi/cpp/docs/source/collections_sets_ffi.rst143
-rw-r--r--intl/icu_capi/cpp/docs/source/common_ffi.rst13
-rw-r--r--intl/icu_capi/cpp/docs/source/conf.py60
-rw-r--r--intl/icu_capi/cpp/docs/source/data_struct_ffi.rst18
-rw-r--r--intl/icu_capi/cpp/docs/source/date_ffi.rst264
-rw-r--r--intl/icu_capi/cpp/docs/source/datetime_ffi.rst351
-rw-r--r--intl/icu_capi/cpp/docs/source/datetime_formatter_ffi.rst278
-rw-r--r--intl/icu_capi/cpp/docs/source/decimal_ffi.rst50
-rw-r--r--intl/icu_capi/cpp/docs/source/displaynames_ffi.rst107
-rw-r--r--intl/icu_capi/cpp/docs/source/errors_ffi.rst136
-rw-r--r--intl/icu_capi/cpp/docs/source/fallbacker_ffi.rst117
-rw-r--r--intl/icu_capi/cpp/docs/source/fixed_decimal_ffi.rst287
-rw-r--r--intl/icu_capi/cpp/docs/source/iana_bcp47_mapper_ffi.rst42
-rw-r--r--intl/icu_capi/cpp/docs/source/index.rst54
-rw-r--r--intl/icu_capi/cpp/docs/source/list_ffi.rst76
-rw-r--r--intl/icu_capi/cpp/docs/source/locale_directionality_ffi.rst47
-rw-r--r--intl/icu_capi/cpp/docs/source/locale_ffi.rst179
-rw-r--r--intl/icu_capi/cpp/docs/source/locid_transform_ffi.rst76
-rw-r--r--intl/icu_capi/cpp/docs/source/logging_ffi.rst21
-rw-r--r--intl/icu_capi/cpp/docs/source/metazone_calculator_ffi.rst16
-rw-r--r--intl/icu_capi/cpp/docs/source/normalizer_ffi.rst94
-rw-r--r--intl/icu_capi/cpp/docs/source/normalizer_properties_ffi.rst87
-rw-r--r--intl/icu_capi/cpp/docs/source/pluralrules_ffi.rst96
-rw-r--r--intl/icu_capi/cpp/docs/source/properties_iter_ffi.rst27
-rw-r--r--intl/icu_capi/cpp/docs/source/properties_maps_ffi.rst169
-rw-r--r--intl/icu_capi/cpp/docs/source/properties_names_ffi.rst102
-rw-r--r--intl/icu_capi/cpp/docs/source/properties_sets_ffi.rst384
-rw-r--r--intl/icu_capi/cpp/docs/source/properties_unisets_ffi.rst62
-rw-r--r--intl/icu_capi/cpp/docs/source/provider_ffi.rst84
-rw-r--r--intl/icu_capi/cpp/docs/source/script_ffi.rst111
-rw-r--r--intl/icu_capi/cpp/docs/source/segmenter_grapheme_ffi.rst79
-rw-r--r--intl/icu_capi/cpp/docs/source/segmenter_line_ffi.rst155
-rw-r--r--intl/icu_capi/cpp/docs/source/segmenter_sentence_ffi.rst79
-rw-r--r--intl/icu_capi/cpp/docs/source/segmenter_word_ffi.rst150
-rw-r--r--intl/icu_capi/cpp/docs/source/time_ffi.rst51
-rw-r--r--intl/icu_capi/cpp/docs/source/timezone_ffi.rst279
-rw-r--r--intl/icu_capi/cpp/docs/source/timezone_formatter_ffi.rst137
-rw-r--r--intl/icu_capi/cpp/docs/source/week_ffi.rst55
-rw-r--r--intl/icu_capi/cpp/docs/source/zoned_formatter_ffi.rst94
-rw-r--r--intl/icu_capi/cpp/examples/bidi/.gitignore2
-rw-r--r--intl/icu_capi/cpp/examples/bidi/Makefile28
-rw-r--r--intl/icu_capi/cpp/examples/bidi/test.cpp93
-rw-r--r--intl/icu_capi/cpp/examples/casemapping/.gitignore2
-rw-r--r--intl/icu_capi/cpp/examples/casemapping/Makefile28
-rw-r--r--intl/icu_capi/cpp/examples/casemapping/test.cpp109
-rw-r--r--intl/icu_capi/cpp/examples/collator/.gitignore2
-rw-r--r--intl/icu_capi/cpp/examples/collator/Makefile28
-rw-r--r--intl/icu_capi/cpp/examples/collator/test.cpp67
-rw-r--r--intl/icu_capi/cpp/examples/datetime/.gitignore2
-rw-r--r--intl/icu_capi/cpp/examples/datetime/Makefile28
-rw-r--r--intl/icu_capi/cpp/examples/datetime/test.cpp116
-rw-r--r--intl/icu_capi/cpp/examples/fixeddecimal/.gitignore2
-rw-r--r--intl/icu_capi/cpp/examples/fixeddecimal/Makefile28
-rw-r--r--intl/icu_capi/cpp/examples/fixeddecimal/test.cpp127
-rw-r--r--intl/icu_capi/cpp/examples/fixeddecimal_wasm/.gitignore9
-rw-r--r--intl/icu_capi/cpp/examples/fixeddecimal_wasm/Makefile53
-rw-r--r--intl/icu_capi/cpp/examples/fixeddecimal_wasm/README7
-rw-r--r--intl/icu_capi/cpp/examples/fixeddecimal_wasm/node-test.js6
-rw-r--r--intl/icu_capi/cpp/examples/fixeddecimal_wasm/package.json6
-rw-r--r--intl/icu_capi/cpp/examples/fixeddecimal_wasm/test.cpp70
-rw-r--r--intl/icu_capi/cpp/examples/locale/.gitignore2
-rw-r--r--intl/icu_capi/cpp/examples/locale/Makefile28
-rw-r--r--intl/icu_capi/cpp/examples/locale/test.cpp107
-rw-r--r--intl/icu_capi/cpp/examples/pluralrules/.gitignore1
-rw-r--r--intl/icu_capi/cpp/examples/pluralrules/Makefile28
-rw-r--r--intl/icu_capi/cpp/examples/pluralrules/test.cpp38
-rw-r--r--intl/icu_capi/cpp/examples/properties/.gitignore2
-rw-r--r--intl/icu_capi/cpp/examples/properties/Makefile28
-rw-r--r--intl/icu_capi/cpp/examples/properties/test.cpp251
-rw-r--r--intl/icu_capi/cpp/examples/segmenter/.gitignore2
-rw-r--r--intl/icu_capi/cpp/examples/segmenter/Makefile28
-rw-r--r--intl/icu_capi/cpp/examples/segmenter/test.cpp160
-rw-r--r--intl/icu_capi/cpp/include/CodePointRangeIterator.h30
-rw-r--r--intl/icu_capi/cpp/include/CodePointRangeIterator.hpp54
-rw-r--r--intl/icu_capi/cpp/include/CodePointRangeIteratorResult.h32
-rw-r--r--intl/icu_capi/cpp/include/CodePointRangeIteratorResult.hpp33
-rw-r--r--intl/icu_capi/cpp/include/ICU4XAnyCalendarKind.h55
-rw-r--r--intl/icu_capi/cpp/include/ICU4XAnyCalendarKind.hpp117
-rw-r--r--intl/icu_capi/cpp/include/ICU4XBcp47ToIanaMapper.h34
-rw-r--r--intl/icu_capi/cpp/include/ICU4XBcp47ToIanaMapper.hpp98
-rw-r--r--intl/icu_capi/cpp/include/ICU4XBidi.h45
-rw-r--r--intl/icu_capi/cpp/include/ICU4XBidi.hpp142
-rw-r--r--intl/icu_capi/cpp/include/ICU4XBidiDirection.h32
-rw-r--r--intl/icu_capi/cpp/include/ICU4XBidiDirection.hpp21
-rw-r--r--intl/icu_capi/cpp/include/ICU4XBidiInfo.h36
-rw-r--r--intl/icu_capi/cpp/include/ICU4XBidiInfo.hpp89
-rw-r--r--intl/icu_capi/cpp/include/ICU4XBidiParagraph.h43
-rw-r--r--intl/icu_capi/cpp/include/ICU4XBidiParagraph.hpp150
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCalendar.h37
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCalendar.hpp91
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCanonicalCombiningClassMap.h35
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCanonicalCombiningClassMap.hpp83
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCanonicalComposition.h33
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCanonicalComposition.hpp76
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCanonicalDecomposition.h34
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCanonicalDecomposition.hpp78
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCaseMapCloser.h36
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCaseMapCloser.hpp87
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCaseMapper.h57
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCaseMapper.hpp352
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCodePointMapData16.h43
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCodePointMapData16.hpp123
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCodePointMapData8.h61
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCodePointMapData8.hpp259
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCodePointSetBuilder.h64
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCodePointSetBuilder.hpp233
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCodePointSetData.h172
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCodePointSetData.hpp1109
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCollator.h40
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCollator.hpp105
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCollatorAlternateHandling.h32
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCollatorAlternateHandling.hpp25
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCollatorBackwardSecondLevel.h32
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCollatorBackwardSecondLevel.hpp25
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCollatorCaseFirst.h33
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCollatorCaseFirst.hpp26
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCollatorCaseLevel.h32
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCollatorCaseLevel.hpp25
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCollatorMaxVariable.h34
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCollatorMaxVariable.hpp27
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCollatorNumeric.h32
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCollatorNumeric.hpp25
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCollatorOptionsV1.h50
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCollatorOptionsV1.hpp38
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCollatorStrength.h35
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCollatorStrength.hpp28
-rw-r--r--intl/icu_capi/cpp/include/ICU4XComposingNormalizer.h38
-rw-r--r--intl/icu_capi/cpp/include/ICU4XComposingNormalizer.hpp131
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCustomTimeZone.h84
-rw-r--r--intl/icu_capi/cpp/include/ICU4XCustomTimeZone.hpp547
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDataProvider.h48
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDataProvider.hpp196
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDataStruct.h30
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDataStruct.hpp63
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDate.h66
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDate.hpp303
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDateFormatter.h46
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDateFormatter.hpp231
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDateLength.h33
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDateLength.hpp26
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDateTime.h82
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDateTime.hpp373
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDateTimeFormatter.h41
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDateTimeFormatter.hpp150
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDecomposed.h31
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDecomposed.hpp30
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDecomposingNormalizer.h38
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDecomposingNormalizer.hpp131
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDisplayNamesFallback.h31
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDisplayNamesFallback.hpp24
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDisplayNamesOptionsV1.h38
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDisplayNamesOptionsV1.hpp43
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDisplayNamesStyle.h34
-rw-r--r--intl/icu_capi/cpp/include/ICU4XDisplayNamesStyle.hpp27
-rw-r--r--intl/icu_capi/cpp/include/ICU4XError.h84
-rw-r--r--intl/icu_capi/cpp/include/ICU4XError.hpp104
-rw-r--r--intl/icu_capi/cpp/include/ICU4XFixedDecimal.h101
-rw-r--r--intl/icu_capi/cpp/include/ICU4XFixedDecimal.hpp426
-rw-r--r--intl/icu_capi/cpp/include/ICU4XFixedDecimalFormatter.h40
-rw-r--r--intl/icu_capi/cpp/include/ICU4XFixedDecimalFormatter.hpp126
-rw-r--r--intl/icu_capi/cpp/include/ICU4XFixedDecimalGroupingStrategy.h33
-rw-r--r--intl/icu_capi/cpp/include/ICU4XFixedDecimalGroupingStrategy.hpp26
-rw-r--r--intl/icu_capi/cpp/include/ICU4XFixedDecimalSign.h32
-rw-r--r--intl/icu_capi/cpp/include/ICU4XFixedDecimalSign.hpp39
-rw-r--r--intl/icu_capi/cpp/include/ICU4XFixedDecimalSignDisplay.h34
-rw-r--r--intl/icu_capi/cpp/include/ICU4XFixedDecimalSignDisplay.hpp29
-rw-r--r--intl/icu_capi/cpp/include/ICU4XGeneralCategoryNameToMaskMapper.h35
-rw-r--r--intl/icu_capi/cpp/include/ICU4XGeneralCategoryNameToMaskMapper.hpp83
-rw-r--r--intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorLatin1.h29
-rw-r--r--intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorLatin1.hpp51
-rw-r--r--intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorUtf16.h29
-rw-r--r--intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorUtf16.hpp51
-rw-r--r--intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorUtf8.h29
-rw-r--r--intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorUtf8.hpp51
-rw-r--r--intl/icu_capi/cpp/include/ICU4XGraphemeClusterSegmenter.h40
-rw-r--r--intl/icu_capi/cpp/include/ICU4XGraphemeClusterSegmenter.hpp106
-rw-r--r--intl/icu_capi/cpp/include/ICU4XGregorianDateFormatter.h40
-rw-r--r--intl/icu_capi/cpp/include/ICU4XGregorianDateFormatter.hpp145
-rw-r--r--intl/icu_capi/cpp/include/ICU4XGregorianDateTimeFormatter.h38
-rw-r--r--intl/icu_capi/cpp/include/ICU4XGregorianDateTimeFormatter.hpp107
-rw-r--r--intl/icu_capi/cpp/include/ICU4XGregorianZonedDateTimeFormatter.h42
-rw-r--r--intl/icu_capi/cpp/include/ICU4XGregorianZonedDateTimeFormatter.hpp134
-rw-r--r--intl/icu_capi/cpp/include/ICU4XIanaToBcp47Mapper.h31
-rw-r--r--intl/icu_capi/cpp/include/ICU4XIanaToBcp47Mapper.hpp65
-rw-r--r--intl/icu_capi/cpp/include/ICU4XIsoDate.h61
-rw-r--r--intl/icu_capi/cpp/include/ICU4XIsoDate.hpp209
-rw-r--r--intl/icu_capi/cpp/include/ICU4XIsoDateTime.h79
-rw-r--r--intl/icu_capi/cpp/include/ICU4XIsoDateTime.hpp296
-rw-r--r--intl/icu_capi/cpp/include/ICU4XIsoTimeZoneFormat.h33
-rw-r--r--intl/icu_capi/cpp/include/ICU4XIsoTimeZoneFormat.hpp26
-rw-r--r--intl/icu_capi/cpp/include/ICU4XIsoTimeZoneMinuteDisplay.h31
-rw-r--r--intl/icu_capi/cpp/include/ICU4XIsoTimeZoneMinuteDisplay.hpp24
-rw-r--r--intl/icu_capi/cpp/include/ICU4XIsoTimeZoneOptions.h38
-rw-r--r--intl/icu_capi/cpp/include/ICU4XIsoTimeZoneOptions.hpp26
-rw-r--r--intl/icu_capi/cpp/include/ICU4XIsoTimeZoneSecondDisplay.h31
-rw-r--r--intl/icu_capi/cpp/include/ICU4XIsoTimeZoneSecondDisplay.hpp24
-rw-r--r--intl/icu_capi/cpp/include/ICU4XIsoWeekday.h36
-rw-r--r--intl/icu_capi/cpp/include/ICU4XIsoWeekday.hpp25
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLanguageDisplay.h31
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLanguageDisplay.hpp24
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLeadingAdjustment.h32
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLeadingAdjustment.hpp25
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLineBreakIteratorLatin1.h29
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLineBreakIteratorLatin1.hpp53
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLineBreakIteratorUtf16.h29
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLineBreakIteratorUtf16.hpp53
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLineBreakIteratorUtf8.h29
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLineBreakIteratorUtf8.hpp53
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLineBreakOptionsV1.h36
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLineBreakOptionsV1.hpp29
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLineBreakStrictness.h33
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLineBreakStrictness.hpp26
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLineBreakWordOption.h32
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLineBreakWordOption.hpp25
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLineSegmenter.h51
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLineSegmenter.hpp201
-rw-r--r--intl/icu_capi/cpp/include/ICU4XList.h35
-rw-r--r--intl/icu_capi/cpp/include/ICU4XList.hpp77
-rw-r--r--intl/icu_capi/cpp/include/ICU4XListFormatter.h41
-rw-r--r--intl/icu_capi/cpp/include/ICU4XListFormatter.hpp133
-rw-r--r--intl/icu_capi/cpp/include/ICU4XListLength.h32
-rw-r--r--intl/icu_capi/cpp/include/ICU4XListLength.hpp25
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocale.h64
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocale.hpp438
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleCanonicalizer.h37
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleCanonicalizer.hpp93
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleDirection.h32
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleDirection.hpp25
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleDirectionality.h42
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleDirectionality.hpp107
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleDisplayNamesFormatter.h36
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleDisplayNamesFormatter.hpp103
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleExpander.h39
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleExpander.hpp103
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleFallbackConfig.h36
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleFallbackConfig.hpp43
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleFallbackIterator.h32
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleFallbackIterator.hpp64
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleFallbackPriority.h32
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleFallbackPriority.hpp27
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleFallbackSupplement.h31
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleFallbackSupplement.hpp26
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleFallbacker.h37
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleFallbacker.hpp97
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleFallbackerWithConfig.h31
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLocaleFallbackerWithConfig.hpp60
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLogger.h31
-rw-r--r--intl/icu_capi/cpp/include/ICU4XLogger.hpp60
-rw-r--r--intl/icu_capi/cpp/include/ICU4XMetazoneCalculator.h31
-rw-r--r--intl/icu_capi/cpp/include/ICU4XMetazoneCalculator.hpp65
-rw-r--r--intl/icu_capi/cpp/include/ICU4XOrdering.h32
-rw-r--r--intl/icu_capi/cpp/include/ICU4XOrdering.hpp25
-rw-r--r--intl/icu_capi/cpp/include/ICU4XPluralCategories.h35
-rw-r--r--intl/icu_capi/cpp/include/ICU4XPluralCategories.hpp30
-rw-r--r--intl/icu_capi/cpp/include/ICU4XPluralCategory.h37
-rw-r--r--intl/icu_capi/cpp/include/ICU4XPluralCategory.hpp30
-rw-r--r--intl/icu_capi/cpp/include/ICU4XPluralOperands.h30
-rw-r--r--intl/icu_capi/cpp/include/ICU4XPluralOperands.hpp61
-rw-r--r--intl/icu_capi/cpp/include/ICU4XPluralRules.h41
-rw-r--r--intl/icu_capi/cpp/include/ICU4XPluralRules.hpp108
-rw-r--r--intl/icu_capi/cpp/include/ICU4XPropertyValueNameToEnumMapper.h51
-rw-r--r--intl/icu_capi/cpp/include/ICU4XPropertyValueNameToEnumMapper.hpp207
-rw-r--r--intl/icu_capi/cpp/include/ICU4XRegionDisplayNames.h35
-rw-r--r--intl/icu_capi/cpp/include/ICU4XRegionDisplayNames.hpp104
-rw-r--r--intl/icu_capi/cpp/include/ICU4XReorderedIndexMap.h33
-rw-r--r--intl/icu_capi/cpp/include/ICU4XReorderedIndexMap.hpp74
-rw-r--r--intl/icu_capi/cpp/include/ICU4XRoundingIncrement.h33
-rw-r--r--intl/icu_capi/cpp/include/ICU4XRoundingIncrement.hpp28
-rw-r--r--intl/icu_capi/cpp/include/ICU4XScriptExtensionsSet.h34
-rw-r--r--intl/icu_capi/cpp/include/ICU4XScriptExtensionsSet.hpp79
-rw-r--r--intl/icu_capi/cpp/include/ICU4XScriptWithExtensions.h41
-rw-r--r--intl/icu_capi/cpp/include/ICU4XScriptWithExtensions.hpp109
-rw-r--r--intl/icu_capi/cpp/include/ICU4XScriptWithExtensionsBorrowed.h37
-rw-r--r--intl/icu_capi/cpp/include/ICU4XScriptWithExtensionsBorrowed.hpp89
-rw-r--r--intl/icu_capi/cpp/include/ICU4XSegmenterWordType.h32
-rw-r--r--intl/icu_capi/cpp/include/ICU4XSegmenterWordType.hpp25
-rw-r--r--intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorLatin1.h29
-rw-r--r--intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorLatin1.hpp51
-rw-r--r--intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorUtf16.h29
-rw-r--r--intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorUtf16.hpp51
-rw-r--r--intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorUtf8.h29
-rw-r--r--intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorUtf8.hpp51
-rw-r--r--intl/icu_capi/cpp/include/ICU4XSentenceSegmenter.h40
-rw-r--r--intl/icu_capi/cpp/include/ICU4XSentenceSegmenter.hpp105
-rw-r--r--intl/icu_capi/cpp/include/ICU4XTime.h40
-rw-r--r--intl/icu_capi/cpp/include/ICU4XTime.hpp118
-rw-r--r--intl/icu_capi/cpp/include/ICU4XTimeFormatter.h43
-rw-r--r--intl/icu_capi/cpp/include/ICU4XTimeFormatter.hpp183
-rw-r--r--intl/icu_capi/cpp/include/ICU4XTimeLength.h33
-rw-r--r--intl/icu_capi/cpp/include/ICU4XTimeLength.hpp26
-rw-r--r--intl/icu_capi/cpp/include/ICU4XTimeZoneFormatter.h53
-rw-r--r--intl/icu_capi/cpp/include/ICU4XTimeZoneFormatter.hpp256
-rw-r--r--intl/icu_capi/cpp/include/ICU4XTitlecaseMapper.h36
-rw-r--r--intl/icu_capi/cpp/include/ICU4XTitlecaseMapper.hpp108
-rw-r--r--intl/icu_capi/cpp/include/ICU4XTitlecaseOptionsV1.h36
-rw-r--r--intl/icu_capi/cpp/include/ICU4XTitlecaseOptionsV1.hpp38
-rw-r--r--intl/icu_capi/cpp/include/ICU4XTrailingCase.h31
-rw-r--r--intl/icu_capi/cpp/include/ICU4XTrailingCase.hpp24
-rw-r--r--intl/icu_capi/cpp/include/ICU4XTransformResult.h31
-rw-r--r--intl/icu_capi/cpp/include/ICU4XTransformResult.hpp26
-rw-r--r--intl/icu_capi/cpp/include/ICU4XUnicodeSetData.h48
-rw-r--r--intl/icu_capi/cpp/include/ICU4XUnicodeSetData.hpp170
-rw-r--r--intl/icu_capi/cpp/include/ICU4XWeekCalculator.h39
-rw-r--r--intl/icu_capi/cpp/include/ICU4XWeekCalculator.hpp95
-rw-r--r--intl/icu_capi/cpp/include/ICU4XWeekOf.h33
-rw-r--r--intl/icu_capi/cpp/include/ICU4XWeekOf.hpp27
-rw-r--r--intl/icu_capi/cpp/include/ICU4XWeekRelativeUnit.h32
-rw-r--r--intl/icu_capi/cpp/include/ICU4XWeekRelativeUnit.hpp25
-rw-r--r--intl/icu_capi/cpp/include/ICU4XWordBreakIteratorLatin1.h34
-rw-r--r--intl/icu_capi/cpp/include/ICU4XWordBreakIteratorLatin1.hpp72
-rw-r--r--intl/icu_capi/cpp/include/ICU4XWordBreakIteratorUtf16.h34
-rw-r--r--intl/icu_capi/cpp/include/ICU4XWordBreakIteratorUtf16.hpp72
-rw-r--r--intl/icu_capi/cpp/include/ICU4XWordBreakIteratorUtf8.h34
-rw-r--r--intl/icu_capi/cpp/include/ICU4XWordBreakIteratorUtf8.hpp72
-rw-r--r--intl/icu_capi/cpp/include/ICU4XWordSegmenter.h44
-rw-r--r--intl/icu_capi/cpp/include/ICU4XWordSegmenter.hpp148
-rw-r--r--intl/icu_capi/cpp/include/ICU4XZonedDateTimeFormatter.h45
-rw-r--r--intl/icu_capi/cpp/include/ICU4XZonedDateTimeFormatter.hpp173
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_ICU4XAnyCalendarKind_void.h24
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_ICU4XPluralCategory_void.h24
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_ICU4XWeekOf_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_bool_ICU4XError.h25
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XBcp47ToIanaMapper_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XBidi_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCalendar_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCanonicalCombiningClassMap_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCanonicalComposition_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCanonicalDecomposition_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCaseMapCloser_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCaseMapper_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCodePointMapData16_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCodePointMapData8_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCodePointSetData_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCollator_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XComposingNormalizer_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCustomTimeZone_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDataProvider_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDataStruct_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDateFormatter_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDateTimeFormatter_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDateTime_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDate_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDecomposingNormalizer_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XFixedDecimalFormatter_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XFixedDecimal_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XGeneralCategoryNameToMaskMapper_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XGraphemeClusterSegmenter_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XGregorianDateFormatter_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XGregorianDateTimeFormatter_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XGregorianZonedDateTimeFormatter_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XIanaToBcp47Mapper_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XIsoDateTime_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XIsoDate_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLineSegmenter_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XListFormatter_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleCanonicalizer_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleDirectionality_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleDisplayNamesFormatter_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleExpander_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleFallbackerWithConfig_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleFallbacker_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocale_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XMetazoneCalculator_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XPluralOperands_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XPluralRules_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XPropertyValueNameToEnumMapper_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XRegionDisplayNames_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XScriptWithExtensions_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XSentenceSegmenter_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XTimeFormatter_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XTimeZoneFormatter_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XTime_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XTitlecaseMapper_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XUnicodeSetData_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XWeekCalculator_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XWordSegmenter_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_box_ICU4XZonedDateTimeFormatter_ICU4XError.h26
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_int32_t_ICU4XError.h25
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_uint16_t_void.h23
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_void_ICU4XError.h24
-rw-r--r--intl/icu_capi/cpp/include/diplomat_result_void_void.h20
-rw-r--r--intl/icu_capi/cpp/include/diplomat_runtime.h70
-rw-r--r--intl/icu_capi/cpp/include/diplomat_runtime.hpp175
391 files changed, 26616 insertions, 0 deletions
diff --git a/intl/icu_capi/cpp/README.md b/intl/icu_capi/cpp/README.md
new file mode 100644
index 0000000000..6eda457ddd
--- /dev/null
+++ b/intl/icu_capi/cpp/README.md
@@ -0,0 +1,17 @@
+# C++ FFI for ICU4X
+
+This folder contains the C++ FFI for ICU4X. To re-generate the bindings run:
+
+```sh
+cargo make diplomat-gen-cpp
+```
+
+Or re-generate all of the bindings:
+
+```sh
+cargo make diplomat-gen
+```
+
+## More Information
+
+For more information on development, authorship, contributing etc. please visit [`ICU4X home page`](https://github.com/unicode-org/icu4x).
diff --git a/intl/icu_capi/cpp/docs/.gitignore b/intl/icu_capi/cpp/docs/.gitignore
new file mode 100644
index 0000000000..c795b054e5
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/.gitignore
@@ -0,0 +1 @@
+build \ No newline at end of file
diff --git a/intl/icu_capi/cpp/docs/Makefile b/intl/icu_capi/cpp/docs/Makefile
new file mode 100644
index 0000000000..7916981874
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/Makefile
@@ -0,0 +1,25 @@
+# This file is part of ICU4X. For terms of use, please see the file
+# called LICENSE at the top level of the ICU4X source tree
+# (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+# This file was autogenerated by `sphinx-quickstart`
+
+# Minimal makefile for Sphinx documentation
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS ?=
+SPHINXBUILD ?= sphinx-build
+SOURCEDIR = source
+BUILDDIR = build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/intl/icu_capi/cpp/docs/make.bat b/intl/icu_capi/cpp/docs/make.bat
new file mode 100644
index 0000000000..dccc519d6d
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/make.bat
@@ -0,0 +1,41 @@
+REM This file is part of ICU4X. For terms of use, please see the file
+REM called LICENSE at the top level of the ICU4X source tree
+REM (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+REM This file was autogenerated by `sphinx-quickstart`
+
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=source
+set BUILDDIR=build
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.http://sphinx-doc.org/
+ exit /b 1
+)
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd
diff --git a/intl/icu_capi/cpp/docs/source/bidi_ffi.rst b/intl/icu_capi/cpp/docs/source/bidi_ffi.rst
new file mode 100644
index 0000000000..90164c4daa
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/bidi_ffi.rst
@@ -0,0 +1,194 @@
+``bidi::ffi``
+=============
+
+.. cpp:class:: ICU4XBidi
+
+ An ICU4X Bidi object, containing loaded bidi data
+
+ See the `Rust documentation for BidiClassAdapter <https://docs.rs/icu/latest/icu/properties/bidi/struct.BidiClassAdapter.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XBidi, ICU4XError> create(const ICU4XDataProvider& provider)
+
+ Creates a new :cpp:class:`ICU4XBidi` from locale data.
+
+ See the `Rust documentation for new <https://docs.rs/icu/latest/icu/properties/bidi/struct.BidiClassAdapter.html#method.new>`__ for more information.
+
+
+ .. cpp:function:: ICU4XBidiInfo for_text(const std::string_view text, uint8_t default_level) const
+
+ Use the data loaded in this object to process a string and calculate bidi information
+
+ Takes in a Level for the default level, if it is an invalid value it will default to LTR
+
+ See the `Rust documentation for new_with_data_source <https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.BidiInfo.html#method.new_with_data_source>`__ for more information.
+
+ Lifetimes: ``text`` must live at least as long as the output.
+
+
+ .. cpp:function:: ICU4XReorderedIndexMap reorder_visual(const diplomat::span<const uint8_t> levels) const
+
+ Utility function for producing reorderings given a list of levels
+
+ Produces a map saying which visual index maps to which source index.
+
+ The levels array must not have values greater than 126 (this is the Bidi maximum explicit depth plus one). Failure to follow this invariant may lead to incorrect results, but is still safe.
+
+ See the `Rust documentation for reorder_visual <https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.BidiInfo.html#method.reorder_visual>`__ for more information.
+
+
+ .. cpp:function:: static bool level_is_rtl(uint8_t level)
+
+ Check if a Level returned by level_at is an RTL level.
+
+ Invalid levels (numbers greater than 125) will be assumed LTR
+
+ See the `Rust documentation for is_rtl <https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.Level.html#method.is_rtl>`__ for more information.
+
+
+ .. cpp:function:: static bool level_is_ltr(uint8_t level)
+
+ Check if a Level returned by level_at is an LTR level.
+
+ Invalid levels (numbers greater than 125) will be assumed LTR
+
+ See the `Rust documentation for is_ltr <https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.Level.html#method.is_ltr>`__ for more information.
+
+
+ .. cpp:function:: static uint8_t level_rtl()
+
+ Get a basic RTL Level value
+
+ See the `Rust documentation for rtl <https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.Level.html#method.rtl>`__ for more information.
+
+
+ .. cpp:function:: static uint8_t level_ltr()
+
+ Get a simple LTR Level value
+
+ See the `Rust documentation for ltr <https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.Level.html#method.ltr>`__ for more information.
+
+
+.. cpp:enum-struct:: ICU4XBidiDirection
+
+ .. cpp:enumerator:: Ltr
+
+ .. cpp:enumerator:: Rtl
+
+ .. cpp:enumerator:: Mixed
+
+.. cpp:class:: ICU4XBidiInfo
+
+ An object containing bidi information for a given string, produced by ``for_text()`` on ``ICU4XBidi``
+
+ See the `Rust documentation for BidiInfo <https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.BidiInfo.html>`__ for more information.
+
+
+ .. cpp:function:: size_t paragraph_count() const
+
+ The number of paragraphs contained here
+
+
+ .. cpp:function:: std::optional<ICU4XBidiParagraph> paragraph_at(size_t n) const
+
+ Get the nth paragraph, returning ``None`` if out of bounds
+
+ Lifetimes: ``this`` must live at least as long as the output.
+
+
+ .. cpp:function:: size_t size() const
+
+ The number of bytes in this full text
+
+
+ .. cpp:function:: uint8_t level_at(size_t pos) const
+
+ Get the BIDI level at a particular byte index in the full text. This integer is conceptually a ``unicode_bidi::Level``, and can be further inspected using the static methods on ICU4XBidi.
+
+ Returns 0 (equivalent to ``Level::ltr()``) on error
+
+
+.. cpp:class:: ICU4XBidiParagraph
+
+ Bidi information for a single processed paragraph
+
+
+ .. cpp:function:: diplomat::result<std::monostate, ICU4XError> set_paragraph_in_text(size_t n)
+
+ Given a paragraph index ``n`` within the surrounding text, this sets this object to the paragraph at that index. Returns ``ICU4XError::OutOfBoundsError`` when out of bounds.
+
+ This is equivalent to calling ``paragraph_at()`` on ``ICU4XBidiInfo`` but doesn't create a new object
+
+
+ .. cpp:function:: ICU4XBidiDirection direction() const
+
+ The primary direction of this paragraph
+
+ See the `Rust documentation for level_at <https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.Paragraph.html#method.level_at>`__ for more information.
+
+
+ .. cpp:function:: size_t size() const
+
+ The number of bytes in this paragraph
+
+ See the `Rust documentation for len <https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.ParagraphInfo.html#method.len>`__ for more information.
+
+
+ .. cpp:function:: size_t range_start() const
+
+ The start index of this paragraph within the source text
+
+
+ .. cpp:function:: size_t range_end() const
+
+ The end index of this paragraph within the source text
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> reorder_line_to_writeable(size_t range_start, size_t range_end, W& out) const
+
+ Reorder a line based on display order. The ranges are specified relative to the source text and must be contained within this paragraph's range.
+
+ See the `Rust documentation for level_at <https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.Paragraph.html#method.level_at>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> reorder_line(size_t range_start, size_t range_end) const
+
+ Reorder a line based on display order. The ranges are specified relative to the source text and must be contained within this paragraph's range.
+
+ See the `Rust documentation for level_at <https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.Paragraph.html#method.level_at>`__ for more information.
+
+
+ .. cpp:function:: uint8_t level_at(size_t pos) const
+
+ Get the BIDI level at a particular byte index in this paragraph. This integer is conceptually a ``unicode_bidi::Level``, and can be further inspected using the static methods on ICU4XBidi.
+
+ Returns 0 (equivalent to ``Level::ltr()``) on error
+
+ See the `Rust documentation for level_at <https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.Paragraph.html#method.level_at>`__ for more information.
+
+
+.. cpp:class:: ICU4XReorderedIndexMap
+
+ Thin wrapper around a vector that maps visual indices to source indices
+
+ ``map[visualIndex] = sourceIndex``
+
+ Produced by ``reorder_visual()`` on :cpp:class:`ICU4XBidi`.
+
+
+ .. cpp:function:: const diplomat::span<const size_t> as_slice() const
+
+ Get this as a slice/array of indices
+
+ Lifetimes: ``this`` must live at least as long as the output.
+
+
+ .. cpp:function:: size_t len() const
+
+ The length of this map
+
+
+ .. cpp:function:: size_t get(size_t index) const
+
+ Get element at ``index``. Returns 0 when out of bounds (note that 0 is also a valid in-bounds value, please use ``len()`` to avoid out-of-bounds)
+
diff --git a/intl/icu_capi/cpp/docs/source/calendar_ffi.rst b/intl/icu_capi/cpp/docs/source/calendar_ffi.rst
new file mode 100644
index 0000000000..fdae690d0d
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/calendar_ffi.rst
@@ -0,0 +1,157 @@
+``calendar::ffi``
+=================
+
+.. cpp:enum-struct:: ICU4XAnyCalendarKind
+
+ The various calendar types currently supported by :cpp:class:`ICU4XCalendar`
+
+ See the `Rust documentation for AnyCalendarKind <https://docs.rs/icu/latest/icu/calendar/enum.AnyCalendarKind.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Iso
+
+ The kind of an Iso calendar
+
+
+ .. cpp:enumerator:: Gregorian
+
+ The kind of a Gregorian calendar
+
+
+ .. cpp:enumerator:: Buddhist
+
+ The kind of a Buddhist calendar
+
+
+ .. cpp:enumerator:: Japanese
+
+ The kind of a Japanese calendar with modern eras
+
+
+ .. cpp:enumerator:: JapaneseExtended
+
+ The kind of a Japanese calendar with modern and historic eras
+
+
+ .. cpp:enumerator:: Ethiopian
+
+ The kind of an Ethiopian calendar, with Amete Mihret era
+
+
+ .. cpp:enumerator:: EthiopianAmeteAlem
+
+ The kind of an Ethiopian calendar, with Amete Alem era
+
+
+ .. cpp:enumerator:: Indian
+
+ The kind of a Indian calendar
+
+
+ .. cpp:enumerator:: Coptic
+
+ The kind of a Coptic calendar
+
+
+ .. cpp:enumerator:: Dangi
+
+ The kind of a Dangi calendar
+
+
+ .. cpp:enumerator:: Chinese
+
+ The kind of a Chinese calendar
+
+
+ .. cpp:enumerator:: Hebrew
+
+ The kind of a Hebrew calendar
+
+
+ .. cpp:enumerator:: IslamicCivil
+
+ The kind of a Islamic civil calendar
+
+
+ .. cpp:enumerator:: IslamicObservational
+
+ The kind of a Islamic observational calendar
+
+
+ .. cpp:enumerator:: IslamicTabular
+
+ The kind of a Islamic tabular calendar
+
+
+ .. cpp:enumerator:: IslamicUmmAlQura
+
+ The kind of a Islamic Umm al-Qura calendar
+
+
+ .. cpp:enumerator:: Persian
+
+ The kind of a Persian calendar
+
+
+ .. cpp:enumerator:: Roc
+
+ The kind of a Roc calendar
+
+
+ .. cpp:function:: static diplomat::result<ICU4XAnyCalendarKind, std::monostate> get_for_locale(const ICU4XLocale& locale)
+
+ Read the calendar type off of the -u-ca- extension on a locale.
+
+ Errors if there is no calendar on the locale or if the locale's calendar is not known or supported.
+
+ See the `Rust documentation for get_for_locale <https://docs.rs/icu/latest/icu/calendar/enum.AnyCalendarKind.html#method.get_for_locale>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XAnyCalendarKind, std::monostate> get_for_bcp47(const std::string_view s)
+
+ Obtain the calendar type given a BCP-47 -u-ca- extension string.
+
+ Errors if the calendar is not known or supported.
+
+ See the `Rust documentation for get_for_bcp47_value <https://docs.rs/icu/latest/icu/calendar/enum.AnyCalendarKind.html#method.get_for_bcp47_value>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> bcp47_to_writeable(W& write)
+
+ Obtain the string suitable for use in the -u-ca- extension in a BCP47 locale.
+
+ See the `Rust documentation for as_bcp47_string <https://docs.rs/icu/latest/icu/calendar/enum.AnyCalendarKind.html#method.as_bcp47_string>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> bcp47()
+
+ Obtain the string suitable for use in the -u-ca- extension in a BCP47 locale.
+
+ See the `Rust documentation for as_bcp47_string <https://docs.rs/icu/latest/icu/calendar/enum.AnyCalendarKind.html#method.as_bcp47_string>`__ for more information.
+
+
+.. cpp:class:: ICU4XCalendar
+
+ See the `Rust documentation for AnyCalendar <https://docs.rs/icu/latest/icu/calendar/enum.AnyCalendar.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCalendar, ICU4XError> create_for_locale(const ICU4XDataProvider& provider, const ICU4XLocale& locale)
+
+ Creates a new :cpp:class:`ICU4XCalendar` from the specified date and time.
+
+ See the `Rust documentation for new_for_locale <https://docs.rs/icu/latest/icu/calendar/enum.AnyCalendar.html#method.new_for_locale>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCalendar, ICU4XError> create_for_kind(const ICU4XDataProvider& provider, ICU4XAnyCalendarKind kind)
+
+ Creates a new :cpp:class:`ICU4XCalendar` from the specified date and time.
+
+ See the `Rust documentation for new <https://docs.rs/icu/latest/icu/calendar/enum.AnyCalendar.html#method.new>`__ for more information.
+
+
+ .. cpp:function:: ICU4XAnyCalendarKind kind() const
+
+ Returns the kind of this calendar
+
+ See the `Rust documentation for kind <https://docs.rs/icu/latest/icu/calendar/enum.AnyCalendar.html#method.kind>`__ for more information.
+
diff --git a/intl/icu_capi/cpp/docs/source/casemap_ffi.rst b/intl/icu_capi/cpp/docs/source/casemap_ffi.rst
new file mode 100644
index 0000000000..051eb1038b
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/casemap_ffi.rst
@@ -0,0 +1,238 @@
+``casemap::ffi``
+================
+
+.. cpp:class:: ICU4XCaseMapCloser
+
+ See the `Rust documentation for CaseMapCloser <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapCloser.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCaseMapCloser, ICU4XError> create(const ICU4XDataProvider& provider)
+
+ Construct a new ICU4XCaseMapper instance
+
+ See the `Rust documentation for new <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapCloser.html#method.new>`__ for more information.
+
+
+ .. cpp:function:: void add_case_closure_to(char32_t c, ICU4XCodePointSetBuilder& builder) const
+
+ Adds all simple case mappings and the full case folding for ``c`` to ``builder``. Also adds special case closure mappings.
+
+ See the `Rust documentation for add_case_closure_to <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapCloser.html#method.add_case_closure_to>`__ for more information.
+
+
+ .. cpp:function:: bool add_string_case_closure_to(const std::string_view s, ICU4XCodePointSetBuilder& builder) const
+
+ Finds all characters and strings which may casemap to ``s`` as their full case folding string and adds them to the set.
+
+ Returns true if the string was found
+
+ See the `Rust documentation for add_string_case_closure_to <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapCloser.html#method.add_string_case_closure_to>`__ for more information.
+
+
+.. cpp:class:: ICU4XCaseMapper
+
+ See the `Rust documentation for CaseMapper <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCaseMapper, ICU4XError> create(const ICU4XDataProvider& provider)
+
+ Construct a new ICU4XCaseMapper instance
+
+ See the `Rust documentation for new <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.new>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> lowercase_to_writeable(const std::string_view s, const ICU4XLocale& locale, W& write) const
+
+ Returns the full lowercase mapping of the given string
+
+ See the `Rust documentation for lowercase <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.lowercase>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> lowercase(const std::string_view s, const ICU4XLocale& locale) const
+
+ Returns the full lowercase mapping of the given string
+
+ See the `Rust documentation for lowercase <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.lowercase>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> uppercase_to_writeable(const std::string_view s, const ICU4XLocale& locale, W& write) const
+
+ Returns the full uppercase mapping of the given string
+
+ See the `Rust documentation for uppercase <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.uppercase>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> uppercase(const std::string_view s, const ICU4XLocale& locale) const
+
+ Returns the full uppercase mapping of the given string
+
+ See the `Rust documentation for uppercase <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.uppercase>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> titlecase_segment_with_only_case_data_v1_to_writeable(const std::string_view s, const ICU4XLocale& locale, ICU4XTitlecaseOptionsV1 options, W& write) const
+
+ Returns the full titlecase mapping of the given string, performing head adjustment without loading additional data. (if head adjustment is enabled in the options)
+
+ The ``v1`` refers to the version of the options struct, which may change as we add more options
+
+ See the `Rust documentation for titlecase_segment_with_only_case_data <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.titlecase_segment_with_only_case_data>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> titlecase_segment_with_only_case_data_v1(const std::string_view s, const ICU4XLocale& locale, ICU4XTitlecaseOptionsV1 options) const
+
+ Returns the full titlecase mapping of the given string, performing head adjustment without loading additional data. (if head adjustment is enabled in the options)
+
+ The ``v1`` refers to the version of the options struct, which may change as we add more options
+
+ See the `Rust documentation for titlecase_segment_with_only_case_data <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.titlecase_segment_with_only_case_data>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> fold_to_writeable(const std::string_view s, W& write) const
+
+ Case-folds the characters in the given string
+
+ See the `Rust documentation for fold <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.fold>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> fold(const std::string_view s) const
+
+ Case-folds the characters in the given string
+
+ See the `Rust documentation for fold <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.fold>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> fold_turkic_to_writeable(const std::string_view s, W& write) const
+
+ Case-folds the characters in the given string using Turkic (T) mappings for dotted/dotless I.
+
+ See the `Rust documentation for fold_turkic <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.fold_turkic>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> fold_turkic(const std::string_view s) const
+
+ Case-folds the characters in the given string using Turkic (T) mappings for dotted/dotless I.
+
+ See the `Rust documentation for fold_turkic <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.fold_turkic>`__ for more information.
+
+
+ .. cpp:function:: void add_case_closure_to(char32_t c, ICU4XCodePointSetBuilder& builder) const
+
+ Adds all simple case mappings and the full case folding for ``c`` to ``builder``. Also adds special case closure mappings.
+
+ In other words, this adds all characters that this casemaps to, as well as all characters that may casemap to this one.
+
+ Note that since ICU4XCodePointSetBuilder does not contain strings, this will ignore string mappings.
+
+ Identical to the similarly named method on ``ICU4XCaseMapCloser``, use that if you plan on using string case closure mappings too.
+
+ See the `Rust documentation for add_case_closure_to <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.add_case_closure_to>`__ for more information.
+
+
+ .. cpp:function:: char32_t simple_lowercase(char32_t ch) const
+
+ Returns the simple lowercase mapping of the given character.
+
+ This function only implements simple and common mappings. Full mappings, which can map one char to a string, are not included. For full mappings, use ``ICU4XCaseMapper::lowercase``.
+
+ See the `Rust documentation for simple_lowercase <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.simple_lowercase>`__ for more information.
+
+
+ .. cpp:function:: char32_t simple_uppercase(char32_t ch) const
+
+ Returns the simple uppercase mapping of the given character.
+
+ This function only implements simple and common mappings. Full mappings, which can map one char to a string, are not included. For full mappings, use ``ICU4XCaseMapper::uppercase``.
+
+ See the `Rust documentation for simple_uppercase <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.simple_uppercase>`__ for more information.
+
+
+ .. cpp:function:: char32_t simple_titlecase(char32_t ch) const
+
+ Returns the simple titlecase mapping of the given character.
+
+ This function only implements simple and common mappings. Full mappings, which can map one char to a string, are not included. For full mappings, use ``ICU4XCaseMapper::titlecase_segment``.
+
+ See the `Rust documentation for simple_titlecase <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.simple_titlecase>`__ for more information.
+
+
+ .. cpp:function:: char32_t simple_fold(char32_t ch) const
+
+ Returns the simple casefolding of the given character.
+
+ This function only implements simple folding. For full folding, use ``ICU4XCaseMapper::fold``.
+
+ See the `Rust documentation for simple_fold <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.simple_fold>`__ for more information.
+
+
+ .. cpp:function:: char32_t simple_fold_turkic(char32_t ch) const
+
+ Returns the simple casefolding of the given character in the Turkic locale
+
+ This function only implements simple folding. For full folding, use ``ICU4XCaseMapper::fold_turkic``.
+
+ See the `Rust documentation for simple_fold_turkic <https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.simple_fold_turkic>`__ for more information.
+
+
+.. cpp:enum-struct:: ICU4XLeadingAdjustment
+
+ See the `Rust documentation for LeadingAdjustment <https://docs.rs/icu/latest/icu/casemap/titlecase/enum.LeadingAdjustment.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Auto
+
+ .. cpp:enumerator:: None
+
+ .. cpp:enumerator:: ToCased
+
+.. cpp:class:: ICU4XTitlecaseMapper
+
+ See the `Rust documentation for TitlecaseMapper <https://docs.rs/icu/latest/icu/casemap/struct.TitlecaseMapper.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XTitlecaseMapper, ICU4XError> create(const ICU4XDataProvider& provider)
+
+ Construct a new ``ICU4XTitlecaseMapper`` instance
+
+ See the `Rust documentation for new <https://docs.rs/icu/latest/icu/casemap/struct.TitlecaseMapper.html#method.new>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> titlecase_segment_v1_to_writeable(const std::string_view s, const ICU4XLocale& locale, ICU4XTitlecaseOptionsV1 options, W& write) const
+
+ Returns the full titlecase mapping of the given string
+
+ The ``v1`` refers to the version of the options struct, which may change as we add more options
+
+ See the `Rust documentation for titlecase_segment <https://docs.rs/icu/latest/icu/casemap/struct.TitlecaseMapper.html#method.titlecase_segment>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> titlecase_segment_v1(const std::string_view s, const ICU4XLocale& locale, ICU4XTitlecaseOptionsV1 options) const
+
+ Returns the full titlecase mapping of the given string
+
+ The ``v1`` refers to the version of the options struct, which may change as we add more options
+
+ See the `Rust documentation for titlecase_segment <https://docs.rs/icu/latest/icu/casemap/struct.TitlecaseMapper.html#method.titlecase_segment>`__ for more information.
+
+
+.. cpp:struct:: ICU4XTitlecaseOptionsV1
+
+ See the `Rust documentation for TitlecaseOptions <https://docs.rs/icu/latest/icu/casemap/titlecase/struct.TitlecaseOptions.html>`__ for more information.
+
+
+ .. cpp:member:: ICU4XLeadingAdjustment leading_adjustment
+
+ .. cpp:member:: ICU4XTrailingCase trailing_case
+
+ .. cpp:function:: static ICU4XTitlecaseOptionsV1 default_options()
+
+ See the `Rust documentation for default <https://docs.rs/icu/latest/icu/casemap/titlecase/struct.TitlecaseOptions.html#method.default>`__ for more information.
+
+
+.. cpp:enum-struct:: ICU4XTrailingCase
+
+ See the `Rust documentation for TrailingCase <https://docs.rs/icu/latest/icu/casemap/titlecase/enum.TrailingCase.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Lower
+
+ .. cpp:enumerator:: Unchanged
diff --git a/intl/icu_capi/cpp/docs/source/collator_ffi.rst b/intl/icu_capi/cpp/docs/source/collator_ffi.rst
new file mode 100644
index 0000000000..ce3c24f07b
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/collator_ffi.rst
@@ -0,0 +1,147 @@
+``collator::ffi``
+=================
+
+.. cpp:class:: ICU4XCollator
+
+ See the `Rust documentation for Collator <https://docs.rs/icu/latest/icu/collator/struct.Collator.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCollator, ICU4XError> create_v1(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XCollatorOptionsV1 options)
+
+ Construct a new Collator instance.
+
+ See the `Rust documentation for try_new <https://docs.rs/icu/latest/icu/collator/struct.Collator.html#method.try_new>`__ for more information.
+
+
+ .. cpp:function:: ICU4XOrdering compare(const std::string_view left, const std::string_view right) const
+
+ Compare potentially ill-formed UTF-8 strings.
+
+ Ill-formed input is compared as if errors had been replaced with REPLACEMENT CHARACTERs according to the WHATWG Encoding Standard.
+
+ See the `Rust documentation for compare_utf8 <https://docs.rs/icu/latest/icu/collator/struct.Collator.html#method.compare_utf8>`__ for more information.
+
+
+ .. cpp:function:: ICU4XOrdering compare_valid_utf8(const std::string_view left, const std::string_view right) const
+
+ Compare guaranteed well-formed UTF-8 strings.
+
+ Note: In C++, passing ill-formed UTF-8 strings is undefined behavior (and may be memory-unsafe to do so, too).
+
+ See the `Rust documentation for compare <https://docs.rs/icu/latest/icu/collator/struct.Collator.html#method.compare>`__ for more information.
+
+
+ .. cpp:function:: ICU4XOrdering compare_utf16(const diplomat::span<const uint16_t> left, const diplomat::span<const uint16_t> right) const
+
+ Compare potentially ill-formed UTF-16 strings, with unpaired surrogates compared as REPLACEMENT CHARACTER.
+
+ See the `Rust documentation for compare_utf16 <https://docs.rs/icu/latest/icu/collator/struct.Collator.html#method.compare_utf16>`__ for more information.
+
+
+.. cpp:enum-struct:: ICU4XCollatorAlternateHandling
+
+ See the `Rust documentation for AlternateHandling <https://docs.rs/icu/latest/icu/collator/enum.AlternateHandling.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Auto
+
+ .. cpp:enumerator:: NonIgnorable
+
+ .. cpp:enumerator:: Shifted
+
+.. cpp:enum-struct:: ICU4XCollatorBackwardSecondLevel
+
+ See the `Rust documentation for BackwardSecondLevel <https://docs.rs/icu/latest/icu/collator/enum.BackwardSecondLevel.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Auto
+
+ .. cpp:enumerator:: Off
+
+ .. cpp:enumerator:: On
+
+.. cpp:enum-struct:: ICU4XCollatorCaseFirst
+
+ See the `Rust documentation for CaseFirst <https://docs.rs/icu/latest/icu/collator/enum.CaseFirst.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Auto
+
+ .. cpp:enumerator:: Off
+
+ .. cpp:enumerator:: LowerFirst
+
+ .. cpp:enumerator:: UpperFirst
+
+.. cpp:enum-struct:: ICU4XCollatorCaseLevel
+
+ See the `Rust documentation for CaseLevel <https://docs.rs/icu/latest/icu/collator/enum.CaseLevel.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Auto
+
+ .. cpp:enumerator:: Off
+
+ .. cpp:enumerator:: On
+
+.. cpp:enum-struct:: ICU4XCollatorMaxVariable
+
+ See the `Rust documentation for MaxVariable <https://docs.rs/icu/latest/icu/collator/enum.MaxVariable.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Auto
+
+ .. cpp:enumerator:: Space
+
+ .. cpp:enumerator:: Punctuation
+
+ .. cpp:enumerator:: Symbol
+
+ .. cpp:enumerator:: Currency
+
+.. cpp:enum-struct:: ICU4XCollatorNumeric
+
+ See the `Rust documentation for Numeric <https://docs.rs/icu/latest/icu/collator/enum.Numeric.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Auto
+
+ .. cpp:enumerator:: Off
+
+ .. cpp:enumerator:: On
+
+.. cpp:struct:: ICU4XCollatorOptionsV1
+
+ See the `Rust documentation for CollatorOptions <https://docs.rs/icu/latest/icu/collator/struct.CollatorOptions.html>`__ for more information.
+
+
+ .. cpp:member:: ICU4XCollatorStrength strength
+
+ .. cpp:member:: ICU4XCollatorAlternateHandling alternate_handling
+
+ .. cpp:member:: ICU4XCollatorCaseFirst case_first
+
+ .. cpp:member:: ICU4XCollatorMaxVariable max_variable
+
+ .. cpp:member:: ICU4XCollatorCaseLevel case_level
+
+ .. cpp:member:: ICU4XCollatorNumeric numeric
+
+ .. cpp:member:: ICU4XCollatorBackwardSecondLevel backward_second_level
+
+.. cpp:enum-struct:: ICU4XCollatorStrength
+
+ See the `Rust documentation for Strength <https://docs.rs/icu/latest/icu/collator/enum.Strength.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Auto
+
+ .. cpp:enumerator:: Primary
+
+ .. cpp:enumerator:: Secondary
+
+ .. cpp:enumerator:: Tertiary
+
+ .. cpp:enumerator:: Quaternary
+
+ .. cpp:enumerator:: Identical
diff --git a/intl/icu_capi/cpp/docs/source/collections_sets_ffi.rst b/intl/icu_capi/cpp/docs/source/collections_sets_ffi.rst
new file mode 100644
index 0000000000..cdf1e1c046
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/collections_sets_ffi.rst
@@ -0,0 +1,143 @@
+``collections_sets::ffi``
+=========================
+
+.. cpp:class:: ICU4XCodePointSetBuilder
+
+ See the `Rust documentation for CodePointInversionListBuilder <https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html>`__ for more information.
+
+
+ .. cpp:function:: static ICU4XCodePointSetBuilder create()
+
+ Make a new set builder containing nothing
+
+ See the `Rust documentation for new <https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.new>`__ for more information.
+
+
+ .. cpp:function:: ICU4XCodePointSetData build()
+
+ Build this into a set
+
+ This object is repopulated with an empty builder
+
+ See the `Rust documentation for build <https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.build>`__ for more information.
+
+
+ .. cpp:function:: void complement()
+
+ Complements this set
+
+ (Elements in this set are removed and vice versa)
+
+ See the `Rust documentation for complement <https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.complement>`__ for more information.
+
+
+ .. cpp:function:: bool is_empty() const
+
+ Returns whether this set is empty
+
+ See the `Rust documentation for is_empty <https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.is_empty>`__ for more information.
+
+
+ .. cpp:function:: void add_char(char32_t ch)
+
+ Add a single character to the set
+
+ See the `Rust documentation for add_char <https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.add_char>`__ for more information.
+
+
+ .. cpp:function:: void add_u32(uint32_t ch)
+
+ Add a single u32 value to the set
+
+ See the `Rust documentation for add_u32 <https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.add_u32>`__ for more information.
+
+
+ .. cpp:function:: void add_inclusive_range(char32_t start, char32_t end)
+
+ Add an inclusive range of characters to the set
+
+ See the `Rust documentation for add_range <https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.add_range>`__ for more information.
+
+
+ .. cpp:function:: void add_inclusive_range_u32(uint32_t start, uint32_t end)
+
+ Add an inclusive range of u32s to the set
+
+ See the `Rust documentation for add_range_u32 <https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.add_range_u32>`__ for more information.
+
+
+ .. cpp:function:: void add_set(const ICU4XCodePointSetData& data)
+
+ Add all elements that belong to the provided set to the set
+
+ See the `Rust documentation for add_set <https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.add_set>`__ for more information.
+
+
+ .. cpp:function:: void remove_char(char32_t ch)
+
+ Remove a single character to the set
+
+ See the `Rust documentation for remove_char <https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.remove_char>`__ for more information.
+
+
+ .. cpp:function:: void remove_inclusive_range(char32_t start, char32_t end)
+
+ Remove an inclusive range of characters from the set
+
+ See the `Rust documentation for remove_range <https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.remove_range>`__ for more information.
+
+
+ .. cpp:function:: void remove_set(const ICU4XCodePointSetData& data)
+
+ Remove all elements that belong to the provided set from the set
+
+ See the `Rust documentation for remove_set <https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.remove_set>`__ for more information.
+
+
+ .. cpp:function:: void retain_char(char32_t ch)
+
+ Removes all elements from the set except a single character
+
+ See the `Rust documentation for retain_char <https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.retain_char>`__ for more information.
+
+
+ .. cpp:function:: void retain_inclusive_range(char32_t start, char32_t end)
+
+ Removes all elements from the set except an inclusive range of characters f
+
+ See the `Rust documentation for retain_range <https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.retain_range>`__ for more information.
+
+
+ .. cpp:function:: void retain_set(const ICU4XCodePointSetData& data)
+
+ Removes all elements from the set except all elements in the provided set
+
+ See the `Rust documentation for retain_set <https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.retain_set>`__ for more information.
+
+
+ .. cpp:function:: void complement_char(char32_t ch)
+
+ Complement a single character to the set
+
+ (Characters which are in this set are removed and vice versa)
+
+ See the `Rust documentation for complement_char <https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.complement_char>`__ for more information.
+
+
+ .. cpp:function:: void complement_inclusive_range(char32_t start, char32_t end)
+
+ Complement an inclusive range of characters from the set
+
+ (Characters which are in this set are removed and vice versa)
+
+ See the `Rust documentation for complement_range <https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.complement_range>`__ for more information.
+
+
+ .. cpp:function:: void complement_set(const ICU4XCodePointSetData& data)
+
+ Complement all elements that belong to the provided set from the set
+
+ (Characters which are in this set are removed and vice versa)
+
+ See the `Rust documentation for complement_set <https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.complement_set>`__ for more information.
+
diff --git a/intl/icu_capi/cpp/docs/source/common_ffi.rst b/intl/icu_capi/cpp/docs/source/common_ffi.rst
new file mode 100644
index 0000000000..738c3c9219
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/common_ffi.rst
@@ -0,0 +1,13 @@
+``common::ffi``
+===============
+
+.. cpp:enum-struct:: ICU4XOrdering
+
+ See the `Rust documentation for Ordering <https://docs.rs/core/latest/core/cmp/enum.Ordering.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Less
+
+ .. cpp:enumerator:: Equal
+
+ .. cpp:enumerator:: Greater
diff --git a/intl/icu_capi/cpp/docs/source/conf.py b/intl/icu_capi/cpp/docs/source/conf.py
new file mode 100644
index 0000000000..e74a0a03a2
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/conf.py
@@ -0,0 +1,60 @@
+# This file is part of ICU4X. For terms of use, please see the file
+# called LICENSE at the top level of the ICU4X source tree
+# (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+# Configuration file for the Sphinx documentation builder.
+#
+# This file only contains a selection of the most common options. For a full
+# list see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Path setup --------------------------------------------------------------
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+# import os
+# import sys
+# sys.path.insert(0, os.path.abspath('.'))
+
+
+# -- Project information -----------------------------------------------------
+
+project = 'ICU4X'
+copyright = '2022, The ICU4X Developers'
+author = 'The ICU4X Developers'
+
+
+# -- General configuration ---------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = []
+
+
+# -- Options for HTML output -------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+#
+html_theme = 'sphinx_rtd_theme'
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = []
+
+html_theme_options = {
+ 'navigation_depth': 4,
+} \ No newline at end of file
diff --git a/intl/icu_capi/cpp/docs/source/data_struct_ffi.rst b/intl/icu_capi/cpp/docs/source/data_struct_ffi.rst
new file mode 100644
index 0000000000..2ba8663bd3
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/data_struct_ffi.rst
@@ -0,0 +1,18 @@
+``data_struct::ffi``
+====================
+
+.. cpp:class:: ICU4XDataStruct
+
+ A generic data struct to be used by ICU4X
+
+ This can be used to construct a StructDataProvider.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XDataStruct, ICU4XError> create_decimal_symbols_v1(const std::string_view plus_sign_prefix, const std::string_view plus_sign_suffix, const std::string_view minus_sign_prefix, const std::string_view minus_sign_suffix, const std::string_view decimal_separator, const std::string_view grouping_separator, uint8_t primary_group_size, uint8_t secondary_group_size, uint8_t min_group_size, const diplomat::span<const char32_t> digits)
+
+ Construct a new DecimalSymbolsV1 data struct.
+
+ C++ users: All string arguments must be valid UTF8
+
+ See the `Rust documentation for DecimalSymbolsV1 <https://docs.rs/icu/latest/icu/decimal/provider/struct.DecimalSymbolsV1.html>`__ for more information.
+
diff --git a/intl/icu_capi/cpp/docs/source/date_ffi.rst b/intl/icu_capi/cpp/docs/source/date_ffi.rst
new file mode 100644
index 0000000000..0e7a5bfe32
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/date_ffi.rst
@@ -0,0 +1,264 @@
+``date::ffi``
+=============
+
+.. cpp:class:: ICU4XDate
+
+ An ICU4X Date object capable of containing a date and time for any calendar.
+
+ See the `Rust documentation for Date <https://docs.rs/icu/latest/icu/calendar/struct.Date.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XDate, ICU4XError> create_from_iso_in_calendar(int32_t year, uint8_t month, uint8_t day, const ICU4XCalendar& calendar)
+
+ Creates a new :cpp:class:`ICU4XDate` representing the ISO date and time given but in a given calendar
+
+ See the `Rust documentation for new_from_iso <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.new_from_iso>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XDate, ICU4XError> create_from_codes_in_calendar(const std::string_view era_code, int32_t year, const std::string_view month_code, uint8_t day, const ICU4XCalendar& calendar)
+
+ Creates a new :cpp:class:`ICU4XDate` from the given codes, which are interpreted in the given calendar system
+
+ See the `Rust documentation for try_new_from_codes <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.try_new_from_codes>`__ for more information.
+
+
+ .. cpp:function:: ICU4XDate to_calendar(const ICU4XCalendar& calendar) const
+
+ Convert this date to one in a different calendar
+
+ See the `Rust documentation for to_calendar <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.to_calendar>`__ for more information.
+
+
+ .. cpp:function:: ICU4XIsoDate to_iso() const
+
+ Converts this date to ISO
+
+ See the `Rust documentation for to_iso <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.to_iso>`__ for more information.
+
+
+ .. cpp:function:: uint32_t day_of_month() const
+
+ Returns the 1-indexed day in the month for this date
+
+ See the `Rust documentation for day_of_month <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.day_of_month>`__ for more information.
+
+
+ .. cpp:function:: ICU4XIsoWeekday day_of_week() const
+
+ Returns the day in the week for this day
+
+ See the `Rust documentation for day_of_week <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.day_of_week>`__ for more information.
+
+
+ .. cpp:function:: uint32_t week_of_month(ICU4XIsoWeekday first_weekday) const
+
+ Returns the week number in this month, 1-indexed, based on what is considered the first day of the week (often a locale preference).
+
+ ``first_weekday`` can be obtained via ``first_weekday()`` on :cpp:class:`ICU4XWeekCalculator`
+
+ See the `Rust documentation for week_of_month <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.week_of_month>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<ICU4XWeekOf, ICU4XError> week_of_year(const ICU4XWeekCalculator& calculator) const
+
+ Returns the week number in this year, using week data
+
+ See the `Rust documentation for week_of_year <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.week_of_year>`__ for more information.
+
+
+ .. cpp:function:: uint32_t ordinal_month() const
+
+ Returns 1-indexed number of the month of this date in its year
+
+ Note that for lunar calendars this may not lead to the same month having the same ordinal month across years; use month_code if you care about month identity.
+
+ See the `Rust documentation for month <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.month>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> month_code_to_writeable(W& write) const
+
+ Returns the month code for this date. Typically something like "M01", "M02", but can be more complicated for lunar calendars.
+
+ See the `Rust documentation for month <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.month>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> month_code() const
+
+ Returns the month code for this date. Typically something like "M01", "M02", but can be more complicated for lunar calendars.
+
+ See the `Rust documentation for month <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.month>`__ for more information.
+
+
+ .. cpp:function:: int32_t year_in_era() const
+
+ Returns the year number in the current era for this date
+
+ See the `Rust documentation for year <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.year>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> era_to_writeable(W& write) const
+
+ Returns the era for this date,
+
+ See the `Rust documentation for year <https://docs.rs/icu/latest/icu/struct.Date.html#method.year>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/types/struct.Era.html>`__
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> era() const
+
+ Returns the era for this date,
+
+ See the `Rust documentation for year <https://docs.rs/icu/latest/icu/struct.Date.html#method.year>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/types/struct.Era.html>`__
+
+
+ .. cpp:function:: uint8_t months_in_year() const
+
+ Returns the number of months in the year represented by this date
+
+ See the `Rust documentation for months_in_year <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.months_in_year>`__ for more information.
+
+
+ .. cpp:function:: uint8_t days_in_month() const
+
+ Returns the number of days in the month represented by this date
+
+ See the `Rust documentation for days_in_month <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.days_in_month>`__ for more information.
+
+
+ .. cpp:function:: uint16_t days_in_year() const
+
+ Returns the number of days in the year represented by this date
+
+ See the `Rust documentation for days_in_year <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.days_in_year>`__ for more information.
+
+
+ .. cpp:function:: ICU4XCalendar calendar() const
+
+ Returns the :cpp:class:`ICU4XCalendar` object backing this date
+
+ See the `Rust documentation for calendar <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.calendar>`__ for more information.
+
+
+.. cpp:class:: ICU4XIsoDate
+
+ An ICU4X Date object capable of containing a ISO-8601 date
+
+ See the `Rust documentation for Date <https://docs.rs/icu/latest/icu/calendar/struct.Date.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XIsoDate, ICU4XError> create(int32_t year, uint8_t month, uint8_t day)
+
+ Creates a new :cpp:class:`ICU4XIsoDate` from the specified date and time.
+
+ See the `Rust documentation for try_new_iso_date <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.try_new_iso_date>`__ for more information.
+
+
+ .. cpp:function:: static ICU4XIsoDate create_for_unix_epoch()
+
+ Creates a new :cpp:class:`ICU4XIsoDate` representing January 1, 1970.
+
+ See the `Rust documentation for unix_epoch <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.unix_epoch>`__ for more information.
+
+
+ .. cpp:function:: ICU4XDate to_calendar(const ICU4XCalendar& calendar) const
+
+ Convert this date to one in a different calendar
+
+ See the `Rust documentation for to_calendar <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.to_calendar>`__ for more information.
+
+
+ .. cpp:function:: ICU4XDate to_any() const
+
+ See the `Rust documentation for to_any <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.to_any>`__ for more information.
+
+
+ .. cpp:function:: uint32_t day_of_month() const
+
+ Returns the 1-indexed day in the month for this date
+
+ See the `Rust documentation for day_of_month <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.day_of_month>`__ for more information.
+
+
+ .. cpp:function:: ICU4XIsoWeekday day_of_week() const
+
+ Returns the day in the week for this day
+
+ See the `Rust documentation for day_of_week <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.day_of_week>`__ for more information.
+
+
+ .. cpp:function:: uint32_t week_of_month(ICU4XIsoWeekday first_weekday) const
+
+ Returns the week number in this month, 1-indexed, based on what is considered the first day of the week (often a locale preference).
+
+ ``first_weekday`` can be obtained via ``first_weekday()`` on :cpp:class:`ICU4XWeekCalculator`
+
+ See the `Rust documentation for week_of_month <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.week_of_month>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<ICU4XWeekOf, ICU4XError> week_of_year(const ICU4XWeekCalculator& calculator) const
+
+ Returns the week number in this year, using week data
+
+ See the `Rust documentation for week_of_year <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.week_of_year>`__ for more information.
+
+
+ .. cpp:function:: uint32_t month() const
+
+ Returns 1-indexed number of the month of this date in its year
+
+ See the `Rust documentation for month <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.month>`__ for more information.
+
+
+ .. cpp:function:: int32_t year() const
+
+ Returns the year number for this date
+
+ See the `Rust documentation for year <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.year>`__ for more information.
+
+
+ .. cpp:function:: bool is_in_leap_year() const
+
+ Returns if the year is a leap year for this date
+
+ See the `Rust documentation for is_in_leap_year <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.is_in_leap_year>`__ for more information.
+
+
+ .. cpp:function:: uint8_t months_in_year() const
+
+ Returns the number of months in the year represented by this date
+
+ See the `Rust documentation for months_in_year <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.months_in_year>`__ for more information.
+
+
+ .. cpp:function:: uint8_t days_in_month() const
+
+ Returns the number of days in the month represented by this date
+
+ See the `Rust documentation for days_in_month <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.days_in_month>`__ for more information.
+
+
+ .. cpp:function:: uint16_t days_in_year() const
+
+ Returns the number of days in the year represented by this date
+
+ See the `Rust documentation for days_in_year <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.days_in_year>`__ for more information.
+
+
+.. cpp:enum-struct:: ICU4XIsoWeekday
+
+ .. cpp:enumerator:: Monday
+
+ .. cpp:enumerator:: Tuesday
+
+ .. cpp:enumerator:: Wednesday
+
+ .. cpp:enumerator:: Thursday
+
+ .. cpp:enumerator:: Friday
+
+ .. cpp:enumerator:: Saturday
+
+ .. cpp:enumerator:: Sunday
diff --git a/intl/icu_capi/cpp/docs/source/datetime_ffi.rst b/intl/icu_capi/cpp/docs/source/datetime_ffi.rst
new file mode 100644
index 0000000000..85a04b18a1
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/datetime_ffi.rst
@@ -0,0 +1,351 @@
+``datetime::ffi``
+=================
+
+.. cpp:class:: ICU4XDateTime
+
+ An ICU4X DateTime object capable of containing a date and time for any calendar.
+
+ See the `Rust documentation for DateTime <https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XDateTime, ICU4XError> create_from_iso_in_calendar(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond, const ICU4XCalendar& calendar)
+
+ Creates a new :cpp:class:`ICU4XDateTime` representing the ISO date and time given but in a given calendar
+
+ See the `Rust documentation for new_from_iso <https://docs.rs/icu/latest/icu/struct.DateTime.html#method.new_from_iso>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XDateTime, ICU4XError> create_from_codes_in_calendar(const std::string_view era_code, int32_t year, const std::string_view month_code, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond, const ICU4XCalendar& calendar)
+
+ Creates a new :cpp:class:`ICU4XDateTime` from the given codes, which are interpreted in the given calendar system
+
+ See the `Rust documentation for try_new_from_codes <https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.try_new_from_codes>`__ for more information.
+
+
+ .. cpp:function:: static ICU4XDateTime create_from_date_and_time(const ICU4XDate& date, const ICU4XTime& time)
+
+ Creates a new :cpp:class:`ICU4XDateTime` from an :cpp:class:`ICU4XDate` and :cpp:class:`ICU4XTime` object
+
+ See the `Rust documentation for new <https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.new>`__ for more information.
+
+
+ .. cpp:function:: ICU4XDate date() const
+
+ Gets a copy of the date contained in this object
+
+ See the `Rust documentation for date <https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#structfield.date>`__ for more information.
+
+
+ .. cpp:function:: ICU4XTime time() const
+
+ Gets the time contained in this object
+
+ See the `Rust documentation for time <https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#structfield.time>`__ for more information.
+
+
+ .. cpp:function:: ICU4XIsoDateTime to_iso() const
+
+ Converts this date to ISO
+
+ See the `Rust documentation for to_iso <https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.to_iso>`__ for more information.
+
+
+ .. cpp:function:: ICU4XDateTime to_calendar(const ICU4XCalendar& calendar) const
+
+ Convert this datetime to one in a different calendar
+
+ See the `Rust documentation for to_calendar <https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.to_calendar>`__ for more information.
+
+
+ .. cpp:function:: uint8_t hour() const
+
+ Returns the hour in this time
+
+ See the `Rust documentation for hour <https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.hour>`__ for more information.
+
+
+ .. cpp:function:: uint8_t minute() const
+
+ Returns the minute in this time
+
+ See the `Rust documentation for minute <https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.minute>`__ for more information.
+
+
+ .. cpp:function:: uint8_t second() const
+
+ Returns the second in this time
+
+ See the `Rust documentation for second <https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.second>`__ for more information.
+
+
+ .. cpp:function:: uint32_t nanosecond() const
+
+ Returns the nanosecond in this time
+
+ See the `Rust documentation for nanosecond <https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.nanosecond>`__ for more information.
+
+
+ .. cpp:function:: uint32_t day_of_month() const
+
+ Returns the 1-indexed day in the month for this date
+
+ See the `Rust documentation for day_of_month <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.day_of_month>`__ for more information.
+
+
+ .. cpp:function:: ICU4XIsoWeekday day_of_week() const
+
+ Returns the day in the week for this day
+
+ See the `Rust documentation for day_of_week <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.day_of_week>`__ for more information.
+
+
+ .. cpp:function:: uint32_t week_of_month(ICU4XIsoWeekday first_weekday) const
+
+ Returns the week number in this month, 1-indexed, based on what is considered the first day of the week (often a locale preference).
+
+ ``first_weekday`` can be obtained via ``first_weekday()`` on :cpp:class:`ICU4XWeekCalculator`
+
+ See the `Rust documentation for week_of_month <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.week_of_month>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<ICU4XWeekOf, ICU4XError> week_of_year(const ICU4XWeekCalculator& calculator) const
+
+ Returns the week number in this year, using week data
+
+ See the `Rust documentation for week_of_year <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.week_of_year>`__ for more information.
+
+
+ .. cpp:function:: uint32_t ordinal_month() const
+
+ Returns 1-indexed number of the month of this date in its year
+
+ Note that for lunar calendars this may not lead to the same month having the same ordinal month across years; use month_code if you care about month identity.
+
+ See the `Rust documentation for month <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.month>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> month_code_to_writeable(W& write) const
+
+ Returns the month code for this date. Typically something like "M01", "M02", but can be more complicated for lunar calendars.
+
+ See the `Rust documentation for month <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.month>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> month_code() const
+
+ Returns the month code for this date. Typically something like "M01", "M02", but can be more complicated for lunar calendars.
+
+ See the `Rust documentation for month <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.month>`__ for more information.
+
+
+ .. cpp:function:: int32_t year_in_era() const
+
+ Returns the year number in the current era for this date
+
+ See the `Rust documentation for year <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.year>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> era_to_writeable(W& write) const
+
+ Returns the era for this date,
+
+ See the `Rust documentation for year <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.year>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> era() const
+
+ Returns the era for this date,
+
+ See the `Rust documentation for year <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.year>`__ for more information.
+
+
+ .. cpp:function:: uint8_t months_in_year() const
+
+ Returns the number of months in the year represented by this date
+
+ See the `Rust documentation for months_in_year <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.months_in_year>`__ for more information.
+
+
+ .. cpp:function:: uint8_t days_in_month() const
+
+ Returns the number of days in the month represented by this date
+
+ See the `Rust documentation for days_in_month <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.days_in_month>`__ for more information.
+
+
+ .. cpp:function:: uint16_t days_in_year() const
+
+ Returns the number of days in the year represented by this date
+
+ See the `Rust documentation for days_in_year <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.days_in_year>`__ for more information.
+
+
+ .. cpp:function:: ICU4XCalendar calendar() const
+
+ Returns the :cpp:class:`ICU4XCalendar` object backing this date
+
+ See the `Rust documentation for calendar <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.calendar>`__ for more information.
+
+
+.. cpp:class:: ICU4XIsoDateTime
+
+ An ICU4X DateTime object capable of containing a ISO-8601 date and time.
+
+ See the `Rust documentation for DateTime <https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XIsoDateTime, ICU4XError> create(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond)
+
+ Creates a new :cpp:class:`ICU4XIsoDateTime` from the specified date and time.
+
+ See the `Rust documentation for try_new_iso_datetime <https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.try_new_iso_datetime>`__ for more information.
+
+
+ .. cpp:function:: static ICU4XIsoDateTime crate_from_date_and_time(const ICU4XIsoDate& date, const ICU4XTime& time)
+
+ Creates a new :cpp:class:`ICU4XIsoDateTime` from an :cpp:class:`ICU4XIsoDate` and :cpp:class:`ICU4XTime` object
+
+ See the `Rust documentation for new <https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.new>`__ for more information.
+
+
+ .. cpp:function:: static ICU4XIsoDateTime create_from_minutes_since_local_unix_epoch(int32_t minutes)
+
+ Construct from the minutes since the local unix epoch for this date (Jan 1 1970, 00:00)
+
+ See the `Rust documentation for from_minutes_since_local_unix_epoch <https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.from_minutes_since_local_unix_epoch>`__ for more information.
+
+
+ .. cpp:function:: ICU4XIsoDate date() const
+
+ Gets the date contained in this object
+
+ See the `Rust documentation for date <https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#structfield.date>`__ for more information.
+
+
+ .. cpp:function:: ICU4XTime time() const
+
+ Gets the time contained in this object
+
+ See the `Rust documentation for time <https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#structfield.time>`__ for more information.
+
+
+ .. cpp:function:: ICU4XDateTime to_any() const
+
+ Converts this to an :cpp:class:`ICU4XDateTime` capable of being mixed with dates of other calendars
+
+ See the `Rust documentation for to_any <https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.to_any>`__ for more information.
+
+
+ .. cpp:function:: int32_t minutes_since_local_unix_epoch() const
+
+ Gets the minutes since the local unix epoch for this date (Jan 1 1970, 00:00)
+
+ See the `Rust documentation for minutes_since_local_unix_epoch <https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.minutes_since_local_unix_epoch>`__ for more information.
+
+
+ .. cpp:function:: ICU4XDateTime to_calendar(const ICU4XCalendar& calendar) const
+
+ Convert this datetime to one in a different calendar
+
+ See the `Rust documentation for to_calendar <https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.to_calendar>`__ for more information.
+
+
+ .. cpp:function:: uint8_t hour() const
+
+ Returns the hour in this time
+
+ See the `Rust documentation for hour <https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.hour>`__ for more information.
+
+
+ .. cpp:function:: uint8_t minute() const
+
+ Returns the minute in this time
+
+ See the `Rust documentation for minute <https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.minute>`__ for more information.
+
+
+ .. cpp:function:: uint8_t second() const
+
+ Returns the second in this time
+
+ See the `Rust documentation for second <https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.second>`__ for more information.
+
+
+ .. cpp:function:: uint32_t nanosecond() const
+
+ Returns the nanosecond in this time
+
+ See the `Rust documentation for nanosecond <https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.nanosecond>`__ for more information.
+
+
+ .. cpp:function:: uint32_t day_of_month() const
+
+ Returns the 1-indexed day in the month for this date
+
+ See the `Rust documentation for day_of_month <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.day_of_month>`__ for more information.
+
+
+ .. cpp:function:: ICU4XIsoWeekday day_of_week() const
+
+ Returns the day in the week for this day
+
+ See the `Rust documentation for day_of_week <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.day_of_week>`__ for more information.
+
+
+ .. cpp:function:: uint32_t week_of_month(ICU4XIsoWeekday first_weekday) const
+
+ Returns the week number in this month, 1-indexed, based on what is considered the first day of the week (often a locale preference).
+
+ ``first_weekday`` can be obtained via ``first_weekday()`` on :cpp:class:`ICU4XWeekCalculator`
+
+ See the `Rust documentation for week_of_month <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.week_of_month>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<ICU4XWeekOf, ICU4XError> week_of_year(const ICU4XWeekCalculator& calculator) const
+
+ Returns the week number in this year, using week data
+
+ See the `Rust documentation for week_of_year <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.week_of_year>`__ for more information.
+
+
+ .. cpp:function:: uint32_t month() const
+
+ Returns 1-indexed number of the month of this date in its year
+
+ See the `Rust documentation for month <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.month>`__ for more information.
+
+
+ .. cpp:function:: int32_t year() const
+
+ Returns the year number for this date
+
+ See the `Rust documentation for year <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.year>`__ for more information.
+
+
+ .. cpp:function:: bool is_in_leap_year() const
+
+ Returns whether this date is in a leap year
+
+ See the `Rust documentation for is_in_leap_year <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.is_in_leap_year>`__ for more information.
+
+
+ .. cpp:function:: uint8_t months_in_year() const
+
+ Returns the number of months in the year represented by this date
+
+ See the `Rust documentation for months_in_year <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.months_in_year>`__ for more information.
+
+
+ .. cpp:function:: uint8_t days_in_month() const
+
+ Returns the number of days in the month represented by this date
+
+ See the `Rust documentation for days_in_month <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.days_in_month>`__ for more information.
+
+
+ .. cpp:function:: uint16_t days_in_year() const
+
+ Returns the number of days in the year represented by this date
+
+ See the `Rust documentation for days_in_year <https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.days_in_year>`__ for more information.
+
diff --git a/intl/icu_capi/cpp/docs/source/datetime_formatter_ffi.rst b/intl/icu_capi/cpp/docs/source/datetime_formatter_ffi.rst
new file mode 100644
index 0000000000..7b55d90b54
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/datetime_formatter_ffi.rst
@@ -0,0 +1,278 @@
+``datetime_formatter::ffi``
+===========================
+
+.. cpp:class:: ICU4XDateFormatter
+
+ An ICU4X DateFormatter object capable of formatting a :cpp:class:`ICU4XDate` as a string, using some calendar specified at runtime in the locale.
+
+ See the `Rust documentation for DateFormatter <https://docs.rs/icu/latest/icu/datetime/struct.DateFormatter.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XDateFormatter, ICU4XError> create_with_length(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength date_length)
+
+ Creates a new :cpp:class:`ICU4XDateFormatter` from locale data.
+
+ See the `Rust documentation for try_new_with_length <https://docs.rs/icu/latest/icu/datetime/struct.DateFormatter.html#method.try_new_with_length>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> format_date_to_writeable(const ICU4XDate& value, W& write) const
+
+ Formats a :cpp:class:`ICU4XDate` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.DateFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> format_date(const ICU4XDate& value) const
+
+ Formats a :cpp:class:`ICU4XDate` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.DateFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> format_iso_date_to_writeable(const ICU4XIsoDate& value, W& write) const
+
+ Formats a :cpp:class:`ICU4XIsoDate` to a string.
+
+ Will convert to this formatter's calendar first
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.DateFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> format_iso_date(const ICU4XIsoDate& value) const
+
+ Formats a :cpp:class:`ICU4XIsoDate` to a string.
+
+ Will convert to this formatter's calendar first
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.DateFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> format_datetime_to_writeable(const ICU4XDateTime& value, W& write) const
+
+ Formats a :cpp:class:`ICU4XDateTime` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.DateFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> format_datetime(const ICU4XDateTime& value) const
+
+ Formats a :cpp:class:`ICU4XDateTime` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.DateFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> format_iso_datetime_to_writeable(const ICU4XIsoDateTime& value, W& write) const
+
+ Formats a :cpp:class:`ICU4XIsoDateTime` to a string.
+
+ Will convert to this formatter's calendar first
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.DateFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> format_iso_datetime(const ICU4XIsoDateTime& value) const
+
+ Formats a :cpp:class:`ICU4XIsoDateTime` to a string.
+
+ Will convert to this formatter's calendar first
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.DateFormatter.html#method.format>`__ for more information.
+
+
+.. cpp:enum-struct:: ICU4XDateLength
+
+ See the `Rust documentation for Date <https://docs.rs/icu/latest/icu/datetime/options/length/enum.Date.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Full
+
+ .. cpp:enumerator:: Long
+
+ .. cpp:enumerator:: Medium
+
+ .. cpp:enumerator:: Short
+
+.. cpp:class:: ICU4XDateTimeFormatter
+
+ An ICU4X DateFormatter object capable of formatting a :cpp:class:`ICU4XDateTime` as a string, using some calendar specified at runtime in the locale.
+
+ See the `Rust documentation for DateTimeFormatter <https://docs.rs/icu/latest/icu/datetime/struct.DateTimeFormatter.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XDateTimeFormatter, ICU4XError> create_with_lengths(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength date_length, ICU4XTimeLength time_length)
+
+ Creates a new :cpp:class:`ICU4XDateTimeFormatter` from locale data.
+
+ See the `Rust documentation for try_new <https://docs.rs/icu/latest/icu/datetime/struct.DateTimeFormatter.html#method.try_new>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> format_datetime_to_writeable(const ICU4XDateTime& value, W& write) const
+
+ Formats a :cpp:class:`ICU4XDateTime` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.DateTimeFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> format_datetime(const ICU4XDateTime& value) const
+
+ Formats a :cpp:class:`ICU4XDateTime` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.DateTimeFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> format_iso_datetime_to_writeable(const ICU4XIsoDateTime& value, W& write) const
+
+ Formats a :cpp:class:`ICU4XIsoDateTime` to a string.
+
+ Will convert to this formatter's calendar first
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.DateTimeFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> format_iso_datetime(const ICU4XIsoDateTime& value) const
+
+ Formats a :cpp:class:`ICU4XIsoDateTime` to a string.
+
+ Will convert to this formatter's calendar first
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.DateTimeFormatter.html#method.format>`__ for more information.
+
+
+.. cpp:class:: ICU4XGregorianDateFormatter
+
+ An ICU4X TypedDateFormatter object capable of formatting a :cpp:class:`ICU4XIsoDateTime` as a string, using the Gregorian Calendar.
+
+ See the `Rust documentation for TypedDateFormatter <https://docs.rs/icu/latest/icu/datetime/struct.TypedDateFormatter.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XGregorianDateFormatter, ICU4XError> create_with_length(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength length)
+
+ Creates a new :cpp:class:`ICU4XGregorianDateFormatter` from locale data.
+
+ See the `Rust documentation for try_new_with_length <https://docs.rs/icu/latest/icu/datetime/struct.TypedDateFormatter.html#method.try_new_with_length>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> format_iso_date_to_writeable(const ICU4XIsoDate& value, W& write) const
+
+ Formats a :cpp:class:`ICU4XIsoDate` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.TypedDateFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> format_iso_date(const ICU4XIsoDate& value) const
+
+ Formats a :cpp:class:`ICU4XIsoDate` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.TypedDateFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> format_iso_datetime_to_writeable(const ICU4XIsoDateTime& value, W& write) const
+
+ Formats a :cpp:class:`ICU4XIsoDateTime` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.TypedDateFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> format_iso_datetime(const ICU4XIsoDateTime& value) const
+
+ Formats a :cpp:class:`ICU4XIsoDateTime` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.TypedDateFormatter.html#method.format>`__ for more information.
+
+
+.. cpp:class:: ICU4XGregorianDateTimeFormatter
+
+ An ICU4X TypedDateTimeFormatter object capable of formatting a :cpp:class:`ICU4XIsoDateTime` as a string, using the Gregorian Calendar.
+
+ See the `Rust documentation for TypedDateTimeFormatter <https://docs.rs/icu/latest/icu/datetime/struct.TypedDateTimeFormatter.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XGregorianDateTimeFormatter, ICU4XError> create_with_lengths(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength date_length, ICU4XTimeLength time_length)
+
+ Creates a new :cpp:class:`ICU4XGregorianDateFormatter` from locale data.
+
+ See the `Rust documentation for try_new <https://docs.rs/icu/latest/icu/datetime/struct.TypedDateTimeFormatter.html#method.try_new>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> format_iso_datetime_to_writeable(const ICU4XIsoDateTime& value, W& write) const
+
+ Formats a :cpp:class:`ICU4XIsoDateTime` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.TypedDateTimeFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> format_iso_datetime(const ICU4XIsoDateTime& value) const
+
+ Formats a :cpp:class:`ICU4XIsoDateTime` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.TypedDateTimeFormatter.html#method.format>`__ for more information.
+
+
+.. cpp:class:: ICU4XTimeFormatter
+
+ An ICU4X TimeFormatter object capable of formatting an :cpp:class:`ICU4XTime` type (and others) as a string
+
+ See the `Rust documentation for TimeFormatter <https://docs.rs/icu/latest/icu/datetime/struct.TimeFormatter.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XTimeFormatter, ICU4XError> create_with_length(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XTimeLength length)
+
+ Creates a new :cpp:class:`ICU4XTimeFormatter` from locale data.
+
+ See the `Rust documentation for try_new_with_length <https://docs.rs/icu/latest/icu/datetime/struct.TimeFormatter.html#method.try_new_with_length>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> format_time_to_writeable(const ICU4XTime& value, W& write) const
+
+ Formats a :cpp:class:`ICU4XTime` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.TimeFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> format_time(const ICU4XTime& value) const
+
+ Formats a :cpp:class:`ICU4XTime` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.TimeFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> format_datetime_to_writeable(const ICU4XDateTime& value, W& write) const
+
+ Formats a :cpp:class:`ICU4XDateTime` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.TimeFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> format_datetime(const ICU4XDateTime& value) const
+
+ Formats a :cpp:class:`ICU4XDateTime` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.TimeFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> format_iso_datetime_to_writeable(const ICU4XIsoDateTime& value, W& write) const
+
+ Formats a :cpp:class:`ICU4XIsoDateTime` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.TimeFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> format_iso_datetime(const ICU4XIsoDateTime& value) const
+
+ Formats a :cpp:class:`ICU4XIsoDateTime` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.TimeFormatter.html#method.format>`__ for more information.
+
+
+.. cpp:enum-struct:: ICU4XTimeLength
+
+ See the `Rust documentation for Time <https://docs.rs/icu/latest/icu/datetime/options/length/enum.Time.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Full
+
+ .. cpp:enumerator:: Long
+
+ .. cpp:enumerator:: Medium
+
+ .. cpp:enumerator:: Short
diff --git a/intl/icu_capi/cpp/docs/source/decimal_ffi.rst b/intl/icu_capi/cpp/docs/source/decimal_ffi.rst
new file mode 100644
index 0000000000..bd975f8f4c
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/decimal_ffi.rst
@@ -0,0 +1,50 @@
+``decimal::ffi``
+================
+
+.. cpp:class:: ICU4XFixedDecimalFormatter
+
+ An ICU4X Fixed Decimal Format object, capable of formatting a :cpp:class:`ICU4XFixedDecimal` as a string.
+
+ See the `Rust documentation for FixedDecimalFormatter <https://docs.rs/icu/latest/icu/decimal/struct.FixedDecimalFormatter.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XFixedDecimalFormatter, ICU4XError> create_with_grouping_strategy(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XFixedDecimalGroupingStrategy grouping_strategy)
+
+ Creates a new :cpp:class:`ICU4XFixedDecimalFormatter` from locale data.
+
+ See the `Rust documentation for try_new <https://docs.rs/icu/latest/icu/decimal/struct.FixedDecimalFormatter.html#method.try_new>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XFixedDecimalFormatter, ICU4XError> create_with_decimal_symbols_v1(const ICU4XDataStruct& data_struct, ICU4XFixedDecimalGroupingStrategy grouping_strategy)
+
+ Creates a new :cpp:class:`ICU4XFixedDecimalFormatter` from preconstructed locale data in the form of an :cpp:class:`ICU4XDataStruct` constructed from ``ICU4XDataStruct::create_decimal_symbols()``.
+
+ The contents of the data struct will be consumed: if you wish to use the struct again it will have to be reconstructed. Passing a consumed struct to this method will return an error.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> format_to_writeable(const ICU4XFixedDecimal& value, W& write) const
+
+ Formats a :cpp:class:`ICU4XFixedDecimal` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/decimal/struct.FixedDecimalFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> format(const ICU4XFixedDecimal& value) const
+
+ Formats a :cpp:class:`ICU4XFixedDecimal` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/decimal/struct.FixedDecimalFormatter.html#method.format>`__ for more information.
+
+
+.. cpp:enum-struct:: ICU4XFixedDecimalGroupingStrategy
+
+ See the `Rust documentation for GroupingStrategy <https://docs.rs/icu/latest/icu/decimal/options/enum.GroupingStrategy.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Auto
+
+ .. cpp:enumerator:: Never
+
+ .. cpp:enumerator:: Always
+
+ .. cpp:enumerator:: Min2
diff --git a/intl/icu_capi/cpp/docs/source/displaynames_ffi.rst b/intl/icu_capi/cpp/docs/source/displaynames_ffi.rst
new file mode 100644
index 0000000000..070f23b643
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/displaynames_ffi.rst
@@ -0,0 +1,107 @@
+``displaynames::ffi``
+=====================
+
+.. cpp:enum-struct:: ICU4XDisplayNamesFallback
+
+ See the `Rust documentation for Fallback <https://docs.rs/icu/latest/icu/displaynames/options/enum.Fallback.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Code
+
+ .. cpp:enumerator:: None
+
+.. cpp:struct:: ICU4XDisplayNamesOptionsV1
+
+ See the `Rust documentation for DisplayNamesOptions <https://docs.rs/icu/latest/icu/displaynames/options/struct.DisplayNamesOptions.html>`__ for more information.
+
+
+ .. cpp:member:: ICU4XDisplayNamesStyle style
+
+ The optional formatting style to use for display name.
+
+
+ .. cpp:member:: ICU4XDisplayNamesFallback fallback
+
+ The fallback return when the system does not have the requested display name, defaults to "code".
+
+
+ .. cpp:member:: ICU4XLanguageDisplay language_display
+
+ The language display kind, defaults to "dialect".
+
+
+.. cpp:enum-struct:: ICU4XDisplayNamesStyle
+
+ See the `Rust documentation for Style <https://docs.rs/icu/latest/icu/displaynames/options/enum.Style.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Auto
+
+ .. cpp:enumerator:: Narrow
+
+ .. cpp:enumerator:: Short
+
+ .. cpp:enumerator:: Long
+
+ .. cpp:enumerator:: Menu
+
+.. cpp:enum-struct:: ICU4XLanguageDisplay
+
+ See the `Rust documentation for LanguageDisplay <https://docs.rs/icu/latest/icu/displaynames/options/enum.LanguageDisplay.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Dialect
+
+ .. cpp:enumerator:: Standard
+
+.. cpp:class:: ICU4XLocaleDisplayNamesFormatter
+
+ See the `Rust documentation for LocaleDisplayNamesFormatter <https://docs.rs/icu/latest/icu/displaynames/struct.LocaleDisplayNamesFormatter.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XLocaleDisplayNamesFormatter, ICU4XError> create(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDisplayNamesOptionsV1 options)
+
+ Creates a new ``LocaleDisplayNamesFormatter`` from locale data and an options bag.
+
+ See the `Rust documentation for try_new <https://docs.rs/icu/latest/icu/displaynames/struct.LocaleDisplayNamesFormatter.html#method.try_new>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> of_to_writeable(const ICU4XLocale& locale, W& write) const
+
+ Returns the locale-specific display name of a locale.
+
+ See the `Rust documentation for of <https://docs.rs/icu/latest/icu/displaynames/struct.LocaleDisplayNamesFormatter.html#method.of>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> of(const ICU4XLocale& locale) const
+
+ Returns the locale-specific display name of a locale.
+
+ See the `Rust documentation for of <https://docs.rs/icu/latest/icu/displaynames/struct.LocaleDisplayNamesFormatter.html#method.of>`__ for more information.
+
+
+.. cpp:class:: ICU4XRegionDisplayNames
+
+ See the `Rust documentation for RegionDisplayNames <https://docs.rs/icu/latest/icu/displaynames/struct.RegionDisplayNames.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XRegionDisplayNames, ICU4XError> create(const ICU4XDataProvider& provider, const ICU4XLocale& locale)
+
+ Creates a new ``RegionDisplayNames`` from locale data and an options bag.
+
+ See the `Rust documentation for try_new <https://docs.rs/icu/latest/icu/displaynames/struct.RegionDisplayNames.html#method.try_new>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> of_to_writeable(const std::string_view region, W& write) const
+
+ Returns the locale specific display name of a region. Note that the funtion returns an empty string in case the display name for a given region code is not found.
+
+ See the `Rust documentation for of <https://docs.rs/icu/latest/icu/displaynames/struct.RegionDisplayNames.html#method.of>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> of(const std::string_view region) const
+
+ Returns the locale specific display name of a region. Note that the funtion returns an empty string in case the display name for a given region code is not found.
+
+ See the `Rust documentation for of <https://docs.rs/icu/latest/icu/displaynames/struct.RegionDisplayNames.html#method.of>`__ for more information.
+
diff --git a/intl/icu_capi/cpp/docs/source/errors_ffi.rst b/intl/icu_capi/cpp/docs/source/errors_ffi.rst
new file mode 100644
index 0000000000..a4a1346b15
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/errors_ffi.rst
@@ -0,0 +1,136 @@
+``errors::ffi``
+===============
+
+.. cpp:enum-struct:: ICU4XError
+
+ A common enum for errors that ICU4X may return, organized by API
+
+ The error names are stable and can be checked against as strings in the JS API
+
+ Additional information: `1 <https://docs.rs/fixed_decimal/latest/fixed_decimal/enum.FixedDecimalError.html>`__, `2 <https://docs.rs/icu/latest/icu/calendar/enum.CalendarError.html>`__, `3 <https://docs.rs/icu/latest/icu/collator/enum.CollatorError.html>`__, `4 <https://docs.rs/icu/latest/icu/datetime/enum.DateTimeError.html>`__, `5 <https://docs.rs/icu/latest/icu/decimal/enum.DecimalError.html>`__, `6 <https://docs.rs/icu/latest/icu/list/enum.ListError.html>`__, `7 <https://docs.rs/icu/latest/icu/locid/enum.ParserError.html>`__, `8 <https://docs.rs/icu/latest/icu/locid_transform/enum.LocaleTransformError.html>`__, `9 <https://docs.rs/icu/latest/icu/normalizer/enum.NormalizerError.html>`__, `10 <https://docs.rs/icu/latest/icu/plurals/enum.PluralsError.html>`__, `11 <https://docs.rs/icu/latest/icu/properties/enum.PropertiesError.html>`__, `12 <https://docs.rs/icu/latest/icu/provider/struct.DataError.html>`__, `13 <https://docs.rs/icu/latest/icu/provider/enum.DataErrorKind.html>`__, `14 <https://docs.rs/icu/latest/icu/segmenter/enum.SegmenterError.html>`__, `15 <https://docs.rs/icu/latest/icu/timezone/enum.TimeZoneError.html>`__
+
+
+ .. cpp:enumerator:: UnknownError
+
+ The error is not currently categorized as ICU4XError. Please file a bug
+
+
+ .. cpp:enumerator:: WriteableError
+
+ An error arising from writing to a string Typically found when not enough space is allocated Most APIs that return a string may return this error
+
+
+ .. cpp:enumerator:: OutOfBoundsError
+
+ .. cpp:enumerator:: DataMissingDataKeyError
+
+ .. cpp:enumerator:: DataMissingVariantError
+
+ .. cpp:enumerator:: DataMissingLocaleError
+
+ .. cpp:enumerator:: DataNeedsVariantError
+
+ .. cpp:enumerator:: DataNeedsLocaleError
+
+ .. cpp:enumerator:: DataExtraneousLocaleError
+
+ .. cpp:enumerator:: DataFilteredResourceError
+
+ .. cpp:enumerator:: DataMismatchedTypeError
+
+ .. cpp:enumerator:: DataMissingPayloadError
+
+ .. cpp:enumerator:: DataInvalidStateError
+
+ .. cpp:enumerator:: DataCustomError
+
+ .. cpp:enumerator:: DataIoError
+
+ .. cpp:enumerator:: DataUnavailableBufferFormatError
+
+ .. cpp:enumerator:: DataMismatchedAnyBufferError
+
+ .. cpp:enumerator:: LocaleUndefinedSubtagError
+
+ The subtag being requested was not set
+
+
+ .. cpp:enumerator:: LocaleParserLanguageError
+
+ The locale or subtag string failed to parse
+
+
+ .. cpp:enumerator:: LocaleParserSubtagError
+
+ .. cpp:enumerator:: LocaleParserExtensionError
+
+ .. cpp:enumerator:: DataStructValidityError
+
+ Attempted to construct an invalid data struct
+
+
+ .. cpp:enumerator:: PropertyUnknownScriptIdError
+
+ .. cpp:enumerator:: PropertyUnknownGeneralCategoryGroupError
+
+ .. cpp:enumerator:: PropertyUnexpectedPropertyNameError
+
+ .. cpp:enumerator:: FixedDecimalLimitError
+
+ .. cpp:enumerator:: FixedDecimalSyntaxError
+
+ .. cpp:enumerator:: PluralsParserError
+
+ .. cpp:enumerator:: CalendarParseError
+
+ .. cpp:enumerator:: CalendarOverflowError
+
+ .. cpp:enumerator:: CalendarUnderflowError
+
+ .. cpp:enumerator:: CalendarOutOfRangeError
+
+ .. cpp:enumerator:: CalendarUnknownEraError
+
+ .. cpp:enumerator:: CalendarUnknownMonthCodeError
+
+ .. cpp:enumerator:: CalendarMissingInputError
+
+ .. cpp:enumerator:: CalendarUnknownKindError
+
+ .. cpp:enumerator:: CalendarMissingError
+
+ .. cpp:enumerator:: DateTimePatternError
+
+ .. cpp:enumerator:: DateTimeMissingInputFieldError
+
+ .. cpp:enumerator:: DateTimeSkeletonError
+
+ .. cpp:enumerator:: DateTimeUnsupportedFieldError
+
+ .. cpp:enumerator:: DateTimeUnsupportedOptionsError
+
+ .. cpp:enumerator:: DateTimeMissingWeekdaySymbolError
+
+ .. cpp:enumerator:: DateTimeMissingMonthSymbolError
+
+ .. cpp:enumerator:: DateTimeFixedDecimalError
+
+ .. cpp:enumerator:: DateTimeMismatchedCalendarError
+
+ .. cpp:enumerator:: TinyStrTooLargeError
+
+ .. cpp:enumerator:: TinyStrContainsNullError
+
+ .. cpp:enumerator:: TinyStrNonAsciiError
+
+ .. cpp:enumerator:: TimeZoneOffsetOutOfBoundsError
+
+ .. cpp:enumerator:: TimeZoneInvalidOffsetError
+
+ .. cpp:enumerator:: TimeZoneMissingInputError
+
+ .. cpp:enumerator:: TimeZoneInvalidIdError
+
+ .. cpp:enumerator:: NormalizerFutureExtensionError
+
+ .. cpp:enumerator:: NormalizerValidationError
diff --git a/intl/icu_capi/cpp/docs/source/fallbacker_ffi.rst b/intl/icu_capi/cpp/docs/source/fallbacker_ffi.rst
new file mode 100644
index 0000000000..a4b17b785c
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/fallbacker_ffi.rst
@@ -0,0 +1,117 @@
+``fallbacker::ffi``
+===================
+
+.. cpp:struct:: ICU4XLocaleFallbackConfig
+
+ Collection of configurations for the ICU4X fallback algorithm.
+
+ See the `Rust documentation for LocaleFallbackConfig <https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbackConfig.html>`__ for more information.
+
+
+ .. cpp:member:: ICU4XLocaleFallbackPriority priority
+
+ Choice of priority mode.
+
+
+ .. cpp:member:: std::string_view extension_key
+
+ An empty string is considered ``None``.
+
+
+ .. cpp:member:: ICU4XLocaleFallbackSupplement fallback_supplement
+
+ Fallback supplement data key to customize fallback rules.
+
+
+.. cpp:class:: ICU4XLocaleFallbackIterator
+
+ An iterator over the locale under fallback.
+
+ See the `Rust documentation for LocaleFallbackIterator <https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbackIterator.html>`__ for more information.
+
+
+ .. cpp:function:: ICU4XLocale get() const
+
+ Gets a snapshot of the current state of the locale.
+
+ See the `Rust documentation for get <https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbackIterator.html#method.get>`__ for more information.
+
+
+ .. cpp:function:: void step()
+
+ Performs one step of the fallback algorithm, mutating the locale.
+
+ See the `Rust documentation for step <https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbackIterator.html#method.step>`__ for more information.
+
+
+.. cpp:enum-struct:: ICU4XLocaleFallbackPriority
+
+ Priority mode for the ICU4X fallback algorithm.
+
+ See the `Rust documentation for LocaleFallbackPriority <https://docs.rs/icu/latest/icu/locid_transform/fallback/enum.LocaleFallbackPriority.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Language
+
+ .. cpp:enumerator:: Region
+
+ .. cpp:enumerator:: Collation
+
+.. cpp:enum-struct:: ICU4XLocaleFallbackSupplement
+
+ What additional data is required to load when performing fallback.
+
+ See the `Rust documentation for LocaleFallbackSupplement <https://docs.rs/icu/latest/icu/locid_transform/fallback/enum.LocaleFallbackSupplement.html>`__ for more information.
+
+
+ .. cpp:enumerator:: None
+
+ .. cpp:enumerator:: Collation
+
+.. cpp:class:: ICU4XLocaleFallbacker
+
+ An object that runs the ICU4X locale fallback algorithm.
+
+ See the `Rust documentation for LocaleFallbacker <https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbacker.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XLocaleFallbacker, ICU4XError> create(const ICU4XDataProvider& provider)
+
+ Creates a new ``ICU4XLocaleFallbacker`` from a data provider.
+
+ See the `Rust documentation for new <https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbacker.html#method.new>`__ for more information.
+
+
+ .. cpp:function:: static ICU4XLocaleFallbacker create_without_data()
+
+ Creates a new ``ICU4XLocaleFallbacker`` without data for limited functionality.
+
+ See the `Rust documentation for new_without_data <https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbacker.html#method.new_without_data>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<ICU4XLocaleFallbackerWithConfig, ICU4XError> for_config(ICU4XLocaleFallbackConfig config) const
+
+ Associates this ``ICU4XLocaleFallbacker`` with configuration options.
+
+ See the `Rust documentation for for_config <https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbacker.html#method.for_config>`__ for more information.
+
+ Lifetimes: ``this`` must live at least as long as the output.
+
+
+.. cpp:class:: ICU4XLocaleFallbackerWithConfig
+
+ An object that runs the ICU4X locale fallback algorithm with specific configurations.
+
+ See the `Rust documentation for LocaleFallbacker <https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbacker.html>`__ for more information.
+
+ See the `Rust documentation for LocaleFallbackerWithConfig <https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbackerWithConfig.html>`__ for more information.
+
+
+ .. cpp:function:: ICU4XLocaleFallbackIterator fallback_for_locale(const ICU4XLocale& locale) const
+
+ Creates an iterator from a locale with each step of fallback.
+
+ See the `Rust documentation for fallback_for <https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbacker.html#method.fallback_for>`__ for more information.
+
+ Lifetimes: ``this`` must live at least as long as the output.
+
diff --git a/intl/icu_capi/cpp/docs/source/fixed_decimal_ffi.rst b/intl/icu_capi/cpp/docs/source/fixed_decimal_ffi.rst
new file mode 100644
index 0000000000..7adcddfc75
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/fixed_decimal_ffi.rst
@@ -0,0 +1,287 @@
+``fixed_decimal::ffi``
+======================
+
+.. cpp:class:: ICU4XFixedDecimal
+
+ See the `Rust documentation for FixedDecimal <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html>`__ for more information.
+
+
+ .. cpp:function:: static ICU4XFixedDecimal create_from_i32(int32_t v)
+
+ Construct an :cpp:class:`ICU4XFixedDecimal` from an integer.
+
+ See the `Rust documentation for FixedDecimal <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html>`__ for more information.
+
+
+ .. cpp:function:: static ICU4XFixedDecimal create_from_u32(uint32_t v)
+
+ Construct an :cpp:class:`ICU4XFixedDecimal` from an integer.
+
+ See the `Rust documentation for FixedDecimal <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html>`__ for more information.
+
+
+ .. cpp:function:: static ICU4XFixedDecimal create_from_i64(int64_t v)
+
+ Construct an :cpp:class:`ICU4XFixedDecimal` from an integer.
+
+ See the `Rust documentation for FixedDecimal <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html>`__ for more information.
+
+
+ .. cpp:function:: static ICU4XFixedDecimal create_from_u64(uint64_t v)
+
+ Construct an :cpp:class:`ICU4XFixedDecimal` from an integer.
+
+ See the `Rust documentation for FixedDecimal <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XFixedDecimal, ICU4XError> create_from_f64_with_integer_precision(double f)
+
+ Construct an :cpp:class:`ICU4XFixedDecimal` from an integer-valued float
+
+ See the `Rust documentation for try_from_f64 <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.try_from_f64>`__ for more information.
+
+ See the `Rust documentation for FloatPrecision <https://docs.rs/fixed_decimal/latest/fixed_decimal/enum.FloatPrecision.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XFixedDecimal, ICU4XError> create_from_f64_with_lower_magnitude(double f, int16_t magnitude)
+
+ Construct an :cpp:class:`ICU4XFixedDecimal` from an float, with a given power of 10 for the lower magnitude
+
+ See the `Rust documentation for try_from_f64 <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.try_from_f64>`__ for more information.
+
+ See the `Rust documentation for FloatPrecision <https://docs.rs/fixed_decimal/latest/fixed_decimal/enum.FloatPrecision.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XFixedDecimal, ICU4XError> create_from_f64_with_significant_digits(double f, uint8_t digits)
+
+ Construct an :cpp:class:`ICU4XFixedDecimal` from an float, for a given number of significant digits
+
+ See the `Rust documentation for try_from_f64 <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.try_from_f64>`__ for more information.
+
+ See the `Rust documentation for FloatPrecision <https://docs.rs/fixed_decimal/latest/fixed_decimal/enum.FloatPrecision.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XFixedDecimal, ICU4XError> create_from_f64_with_floating_precision(double f)
+
+ Construct an :cpp:class:`ICU4XFixedDecimal` from an float, with enough digits to recover the original floating point in IEEE 754 without needing trailing zeros
+
+ See the `Rust documentation for try_from_f64 <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.try_from_f64>`__ for more information.
+
+ See the `Rust documentation for FloatPrecision <https://docs.rs/fixed_decimal/latest/fixed_decimal/enum.FloatPrecision.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XFixedDecimal, ICU4XError> create_from_string(const std::string_view v)
+
+ Construct an :cpp:class:`ICU4XFixedDecimal` from a string.
+
+ See the `Rust documentation for from_str <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.from_str>`__ for more information.
+
+
+ .. cpp:function:: uint8_t digit_at(int16_t magnitude) const
+
+ See the `Rust documentation for digit_at <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.digit_at>`__ for more information.
+
+
+ .. cpp:function:: int16_t magnitude_start() const
+
+ See the `Rust documentation for magnitude_range <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.magnitude_range>`__ for more information.
+
+
+ .. cpp:function:: int16_t magnitude_end() const
+
+ See the `Rust documentation for magnitude_range <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.magnitude_range>`__ for more information.
+
+
+ .. cpp:function:: int16_t nonzero_magnitude_start() const
+
+ See the `Rust documentation for nonzero_magnitude_start <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.nonzero_magnitude_start>`__ for more information.
+
+
+ .. cpp:function:: int16_t nonzero_magnitude_end() const
+
+ See the `Rust documentation for nonzero_magnitude_end <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.nonzero_magnitude_end>`__ for more information.
+
+
+ .. cpp:function:: bool is_zero() const
+
+ See the `Rust documentation for is_zero <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.is_zero>`__ for more information.
+
+
+ .. cpp:function:: void multiply_pow10(int16_t power)
+
+ Multiply the :cpp:class:`ICU4XFixedDecimal` by a given power of ten.
+
+ See the `Rust documentation for multiply_pow10 <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.multiply_pow10>`__ for more information.
+
+
+ .. cpp:function:: ICU4XFixedDecimalSign sign() const
+
+ See the `Rust documentation for sign <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.sign>`__ for more information.
+
+
+ .. cpp:function:: void set_sign(ICU4XFixedDecimalSign sign)
+
+ Set the sign of the :cpp:class:`ICU4XFixedDecimal`.
+
+ See the `Rust documentation for set_sign <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.set_sign>`__ for more information.
+
+
+ .. cpp:function:: void apply_sign_display(ICU4XFixedDecimalSignDisplay sign_display)
+
+ See the `Rust documentation for apply_sign_display <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.apply_sign_display>`__ for more information.
+
+
+ .. cpp:function:: void trim_start()
+
+ See the `Rust documentation for trim_start <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.trim_start>`__ for more information.
+
+
+ .. cpp:function:: void trim_end()
+
+ See the `Rust documentation for trim_end <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.trim_end>`__ for more information.
+
+
+ .. cpp:function:: void pad_start(int16_t position)
+
+ Zero-pad the :cpp:class:`ICU4XFixedDecimal` on the left to a particular position
+
+ See the `Rust documentation for pad_start <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.pad_start>`__ for more information.
+
+
+ .. cpp:function:: void pad_end(int16_t position)
+
+ Zero-pad the :cpp:class:`ICU4XFixedDecimal` on the right to a particular position
+
+ See the `Rust documentation for pad_end <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.pad_end>`__ for more information.
+
+
+ .. cpp:function:: void set_max_position(int16_t position)
+
+ Truncate the :cpp:class:`ICU4XFixedDecimal` on the left to a particular position, deleting digits if necessary. This is useful for, e.g. abbreviating years ("2022" -> "22")
+
+ See the `Rust documentation for set_max_position <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.set_max_position>`__ for more information.
+
+
+ .. cpp:function:: void trunc(int16_t position)
+
+ See the `Rust documentation for trunc <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.trunc>`__ for more information.
+
+
+ .. cpp:function:: void half_trunc(int16_t position)
+
+ See the `Rust documentation for half_trunc <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.half_trunc>`__ for more information.
+
+
+ .. cpp:function:: void expand(int16_t position)
+
+ See the `Rust documentation for expand <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.expand>`__ for more information.
+
+
+ .. cpp:function:: void half_expand(int16_t position)
+
+ See the `Rust documentation for half_expand <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.half_expand>`__ for more information.
+
+
+ .. cpp:function:: void ceil(int16_t position)
+
+ See the `Rust documentation for ceil <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.ceil>`__ for more information.
+
+
+ .. cpp:function:: void half_ceil(int16_t position)
+
+ See the `Rust documentation for half_ceil <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.half_ceil>`__ for more information.
+
+
+ .. cpp:function:: void floor(int16_t position)
+
+ See the `Rust documentation for floor <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.floor>`__ for more information.
+
+
+ .. cpp:function:: void half_floor(int16_t position)
+
+ See the `Rust documentation for half_floor <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.half_floor>`__ for more information.
+
+
+ .. cpp:function:: void half_even(int16_t position)
+
+ See the `Rust documentation for half_even <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.half_even>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::monostate, std::monostate> concatenate_end(ICU4XFixedDecimal& other)
+
+ Concatenates ``other`` to the end of ``self``.
+
+ If successful, ``other`` will be set to 0 and a successful status is returned.
+
+ If not successful, ``other`` will be unchanged and an error is returned.
+
+ See the `Rust documentation for concatenate_end <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.concatenate_end>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> void to_string_to_writeable(W& to) const
+
+ Format the :cpp:class:`ICU4XFixedDecimal` as a string.
+
+ See the `Rust documentation for write_to <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.write_to>`__ for more information.
+
+
+ .. cpp:function:: std::string to_string() const
+
+ Format the :cpp:class:`ICU4XFixedDecimal` as a string.
+
+ See the `Rust documentation for write_to <https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.write_to>`__ for more information.
+
+
+.. cpp:enum-struct:: ICU4XFixedDecimalSign
+
+ The sign of a FixedDecimal, as shown in formatting.
+
+ See the `Rust documentation for Sign <https://docs.rs/fixed_decimal/latest/fixed_decimal/enum.Sign.html>`__ for more information.
+
+
+ .. cpp:enumerator:: None
+
+ No sign (implicitly positive, e.g., 1729).
+
+
+ .. cpp:enumerator:: Negative
+
+ A negative sign, e.g., -1729.
+
+
+ .. cpp:enumerator:: Positive
+
+ An explicit positive sign, e.g., +1729.
+
+
+.. cpp:enum-struct:: ICU4XFixedDecimalSignDisplay
+
+ ECMA-402 compatible sign display preference.
+
+ See the `Rust documentation for SignDisplay <https://docs.rs/fixed_decimal/latest/fixed_decimal/enum.SignDisplay.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Auto
+
+ .. cpp:enumerator:: Never
+
+ .. cpp:enumerator:: Always
+
+ .. cpp:enumerator:: ExceptZero
+
+ .. cpp:enumerator:: Negative
+
+.. cpp:enum-struct:: ICU4XRoundingIncrement
+
+ Increment used in a rounding operation.
+
+ See the `Rust documentation for RoundingIncrement <https://docs.rs/fixed_decimal/latest/fixed_decimal/enum.RoundingIncrement.html>`__ for more information.
+
+
+ .. cpp:enumerator:: MultiplesOf1
+
+ .. cpp:enumerator:: MultiplesOf2
+
+ .. cpp:enumerator:: MultiplesOf5
+
+ .. cpp:enumerator:: MultiplesOf25
diff --git a/intl/icu_capi/cpp/docs/source/iana_bcp47_mapper_ffi.rst b/intl/icu_capi/cpp/docs/source/iana_bcp47_mapper_ffi.rst
new file mode 100644
index 0000000000..a10006a04b
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/iana_bcp47_mapper_ffi.rst
@@ -0,0 +1,42 @@
+``iana_bcp47_mapper::ffi``
+==========================
+
+.. cpp:class:: ICU4XBcp47ToIanaMapper
+
+ An object capable of mapping from a BCP-47 time zone ID to an IANA ID.
+
+ See the `Rust documentation for IanaBcp47RoundTripMapper <https://docs.rs/icu/latest/icu/timezone/struct.IanaBcp47RoundTripMapper.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XBcp47ToIanaMapper, ICU4XError> create(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for new <https://docs.rs/icu/latest/icu/timezone/struct.IanaBcp47RoundTripMapper.html#method.new>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> get_to_writeable(const std::string_view value, W& write) const
+
+ Writes out the canonical IANA time zone ID corresponding to the given BCP-47 ID.
+
+ See the `Rust documentation for bcp47_to_iana <https://docs.rs/icu/latest/icu/datetime/time_zone/struct.IanaBcp47RoundTripMapper.html#method.bcp47_to_iana>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> get(const std::string_view value) const
+
+ Writes out the canonical IANA time zone ID corresponding to the given BCP-47 ID.
+
+ See the `Rust documentation for bcp47_to_iana <https://docs.rs/icu/latest/icu/datetime/time_zone/struct.IanaBcp47RoundTripMapper.html#method.bcp47_to_iana>`__ for more information.
+
+
+.. cpp:class:: ICU4XIanaToBcp47Mapper
+
+ An object capable of mapping from an IANA time zone ID to a BCP-47 ID.
+
+ This can be used via ``try_set_iana_time_zone_id()`` on ```ICU4XCustomTimeZone`` <crate::timezone::ffi::ICU4XCustomTimeZone>`__.
+
+ See the `Rust documentation for IanaToBcp47Mapper <https://docs.rs/icu/latest/icu/timezone/struct.IanaToBcp47Mapper.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XIanaToBcp47Mapper, ICU4XError> create(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for new <https://docs.rs/icu/latest/icu/timezone/struct.IanaToBcp47Mapper.html#method.new>`__ for more information.
+
diff --git a/intl/icu_capi/cpp/docs/source/index.rst b/intl/icu_capi/cpp/docs/source/index.rst
new file mode 100644
index 0000000000..57e246325f
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/index.rst
@@ -0,0 +1,54 @@
+Documentation
+=============
+
+.. toctree::
+ :maxdepth: 3
+ :caption: Modules:
+
+ bidi_ffi
+ calendar_ffi
+ casemap_ffi
+ collator_ffi
+ collections_sets_ffi
+ common_ffi
+ data_struct_ffi
+ date_ffi
+ datetime_ffi
+ datetime_formatter_ffi
+ decimal_ffi
+ displaynames_ffi
+ errors_ffi
+ fallbacker_ffi
+ fixed_decimal_ffi
+ iana_bcp47_mapper_ffi
+ list_ffi
+ locale_ffi
+ locale_directionality_ffi
+ locid_transform_ffi
+ logging_ffi
+ metazone_calculator_ffi
+ normalizer_ffi
+ normalizer_properties_ffi
+ pluralrules_ffi
+ properties_iter_ffi
+ properties_maps_ffi
+ properties_names_ffi
+ properties_sets_ffi
+ properties_unisets_ffi
+ provider_ffi
+ script_ffi
+ segmenter_grapheme_ffi
+ segmenter_line_ffi
+ segmenter_sentence_ffi
+ segmenter_word_ffi
+ time_ffi
+ timezone_ffi
+ timezone_formatter_ffi
+ week_ffi
+ zoned_formatter_ffi
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`search`
diff --git a/intl/icu_capi/cpp/docs/source/list_ffi.rst b/intl/icu_capi/cpp/docs/source/list_ffi.rst
new file mode 100644
index 0000000000..f880a58887
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/list_ffi.rst
@@ -0,0 +1,76 @@
+``list::ffi``
+=============
+
+.. cpp:class:: ICU4XList
+
+ A list of strings
+
+
+ .. cpp:function:: static ICU4XList create()
+
+ Create a new list of strings
+
+
+ .. cpp:function:: static ICU4XList create_with_capacity(size_t capacity)
+
+ Create a new list of strings with preallocated space to hold at least ``capacity`` elements
+
+
+ .. cpp:function:: void push(const std::string_view val)
+
+ Push a string to the list
+
+ For C++ users, potentially invalid UTF8 will be handled via REPLACEMENT CHARACTERs
+
+
+ .. cpp:function:: size_t len() const
+
+ The number of elements in this list
+
+
+.. cpp:class:: ICU4XListFormatter
+
+ See the `Rust documentation for ListFormatter <https://docs.rs/icu/latest/icu/list/struct.ListFormatter.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XListFormatter, ICU4XError> create_and_with_length(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XListLength length)
+
+ Construct a new ICU4XListFormatter instance for And patterns
+
+ See the `Rust documentation for try_new_and_with_length <https://docs.rs/icu/latest/icu/list/struct.ListFormatter.html#method.try_new_and_with_length>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XListFormatter, ICU4XError> create_or_with_length(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XListLength length)
+
+ Construct a new ICU4XListFormatter instance for And patterns
+
+ See the `Rust documentation for try_new_or_with_length <https://docs.rs/icu/latest/icu/list/struct.ListFormatter.html#method.try_new_or_with_length>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XListFormatter, ICU4XError> create_unit_with_length(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XListLength length)
+
+ Construct a new ICU4XListFormatter instance for And patterns
+
+ See the `Rust documentation for try_new_unit_with_length <https://docs.rs/icu/latest/icu/list/struct.ListFormatter.html#method.try_new_unit_with_length>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> format_to_writeable(const ICU4XList& list, W& write) const
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/list/struct.ListFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> format(const ICU4XList& list) const
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/list/struct.ListFormatter.html#method.format>`__ for more information.
+
+
+.. cpp:enum-struct:: ICU4XListLength
+
+ See the `Rust documentation for ListLength <https://docs.rs/icu/latest/icu/list/enum.ListLength.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Wide
+
+ .. cpp:enumerator:: Short
+
+ .. cpp:enumerator:: Narrow
diff --git a/intl/icu_capi/cpp/docs/source/locale_directionality_ffi.rst b/intl/icu_capi/cpp/docs/source/locale_directionality_ffi.rst
new file mode 100644
index 0000000000..3a051ac481
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/locale_directionality_ffi.rst
@@ -0,0 +1,47 @@
+``locale_directionality::ffi``
+==============================
+
+.. cpp:enum-struct:: ICU4XLocaleDirection
+
+ See the `Rust documentation for Direction <https://docs.rs/icu/latest/icu/locid_transform/enum.Direction.html>`__ for more information.
+
+
+ .. cpp:enumerator:: LeftToRight
+
+ .. cpp:enumerator:: RightToLeft
+
+ .. cpp:enumerator:: Unknown
+
+.. cpp:class:: ICU4XLocaleDirectionality
+
+ See the `Rust documentation for LocaleDirectionality <https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleDirectionality.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XLocaleDirectionality, ICU4XError> create(const ICU4XDataProvider& provider)
+
+ Construct a new ICU4XLocaleDirectionality instance
+
+ See the `Rust documentation for new <https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleDirectionality.html#method.new>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XLocaleDirectionality, ICU4XError> create_with_expander(const ICU4XDataProvider& provider, const ICU4XLocaleExpander& expander)
+
+ Construct a new ICU4XLocaleDirectionality instance with a custom expander
+
+ See the `Rust documentation for new_with_expander <https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleDirectionality.html#method.new_with_expander>`__ for more information.
+
+
+ .. cpp:function:: ICU4XLocaleDirection get(const ICU4XLocale& locale) const
+
+ See the `Rust documentation for get <https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleDirectionality.html#method.get>`__ for more information.
+
+
+ .. cpp:function:: bool is_left_to_right(const ICU4XLocale& locale) const
+
+ See the `Rust documentation for is_left_to_right <https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleDirectionality.html#method.is_left_to_right>`__ for more information.
+
+
+ .. cpp:function:: bool is_right_to_left(const ICU4XLocale& locale) const
+
+ See the `Rust documentation for is_right_to_left <https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleDirectionality.html#method.is_right_to_left>`__ for more information.
+
diff --git a/intl/icu_capi/cpp/docs/source/locale_ffi.rst b/intl/icu_capi/cpp/docs/source/locale_ffi.rst
new file mode 100644
index 0000000000..f65b658972
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/locale_ffi.rst
@@ -0,0 +1,179 @@
+``locale::ffi``
+===============
+
+.. cpp:class:: ICU4XLocale
+
+ An ICU4X Locale, capable of representing strings like ``"en-US"``.
+
+ See the `Rust documentation for Locale <https://docs.rs/icu/latest/icu/locid/struct.Locale.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XLocale, ICU4XError> create_from_string(const std::string_view name)
+
+ Construct an :cpp:class:`ICU4XLocale` from an locale identifier.
+
+ This will run the complete locale parsing algorithm. If code size and performance are critical and the locale is of a known shape (such as ``aa-BB``) use ``create_und``, ``set_language``, ``set_script``, and ``set_region``.
+
+ See the `Rust documentation for try_from_bytes <https://docs.rs/icu/latest/icu/locid/struct.Locale.html#method.try_from_bytes>`__ for more information.
+
+
+ .. cpp:function:: static ICU4XLocale create_und()
+
+ Construct a default undefined :cpp:class:`ICU4XLocale` "und".
+
+ See the `Rust documentation for UND <https://docs.rs/icu/latest/icu/locid/struct.Locale.html#associatedconstant.UND>`__ for more information.
+
+
+ .. cpp:function:: ICU4XLocale clone() const
+
+ Clones the :cpp:class:`ICU4XLocale`.
+
+ See the `Rust documentation for Locale <https://docs.rs/icu/latest/icu/locid/struct.Locale.html>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> basename_to_writeable(W& write) const
+
+ Write a string representation of the ``LanguageIdentifier`` part of :cpp:class:`ICU4XLocale` to ``write``.
+
+ See the `Rust documentation for id <https://docs.rs/icu/latest/icu/locid/struct.Locale.html#structfield.id>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> basename() const
+
+ Write a string representation of the ``LanguageIdentifier`` part of :cpp:class:`ICU4XLocale` to ``write``.
+
+ See the `Rust documentation for id <https://docs.rs/icu/latest/icu/locid/struct.Locale.html#structfield.id>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> get_unicode_extension_to_writeable(const std::string_view bytes, W& write) const
+
+ Write a string representation of the unicode extension to ``write``
+
+ See the `Rust documentation for extensions <https://docs.rs/icu/latest/icu/locid/struct.Locale.html#structfield.extensions>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> get_unicode_extension(const std::string_view bytes) const
+
+ Write a string representation of the unicode extension to ``write``
+
+ See the `Rust documentation for extensions <https://docs.rs/icu/latest/icu/locid/struct.Locale.html#structfield.extensions>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> language_to_writeable(W& write) const
+
+ Write a string representation of :cpp:class:`ICU4XLocale` language to ``write``
+
+ See the `Rust documentation for id <https://docs.rs/icu/latest/icu/locid/struct.Locale.html#structfield.id>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> language() const
+
+ Write a string representation of :cpp:class:`ICU4XLocale` language to ``write``
+
+ See the `Rust documentation for id <https://docs.rs/icu/latest/icu/locid/struct.Locale.html#structfield.id>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::monostate, ICU4XError> set_language(const std::string_view bytes)
+
+ Set the language part of the :cpp:class:`ICU4XLocale`.
+
+ See the `Rust documentation for try_from_bytes <https://docs.rs/icu/latest/icu/locid/struct.Locale.html#method.try_from_bytes>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> region_to_writeable(W& write) const
+
+ Write a string representation of :cpp:class:`ICU4XLocale` region to ``write``
+
+ See the `Rust documentation for id <https://docs.rs/icu/latest/icu/locid/struct.Locale.html#structfield.id>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> region() const
+
+ Write a string representation of :cpp:class:`ICU4XLocale` region to ``write``
+
+ See the `Rust documentation for id <https://docs.rs/icu/latest/icu/locid/struct.Locale.html#structfield.id>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::monostate, ICU4XError> set_region(const std::string_view bytes)
+
+ Set the region part of the :cpp:class:`ICU4XLocale`.
+
+ See the `Rust documentation for try_from_bytes <https://docs.rs/icu/latest/icu/locid/struct.Locale.html#method.try_from_bytes>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> script_to_writeable(W& write) const
+
+ Write a string representation of :cpp:class:`ICU4XLocale` script to ``write``
+
+ See the `Rust documentation for id <https://docs.rs/icu/latest/icu/locid/struct.Locale.html#structfield.id>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> script() const
+
+ Write a string representation of :cpp:class:`ICU4XLocale` script to ``write``
+
+ See the `Rust documentation for id <https://docs.rs/icu/latest/icu/locid/struct.Locale.html#structfield.id>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::monostate, ICU4XError> set_script(const std::string_view bytes)
+
+ Set the script part of the :cpp:class:`ICU4XLocale`. Pass an empty string to remove the script.
+
+ See the `Rust documentation for try_from_bytes <https://docs.rs/icu/latest/icu/locid/struct.Locale.html#method.try_from_bytes>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> static diplomat::result<std::monostate, ICU4XError> canonicalize_to_writeable(const std::string_view bytes, W& write)
+
+ Best effort locale canonicalizer that doesn't need any data
+
+ Use ICU4XLocaleCanonicalizer for better control and functionality
+
+ See the `Rust documentation for canonicalize <https://docs.rs/icu/latest/icu/locid/struct.Locale.html#method.canonicalize>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<std::string, ICU4XError> canonicalize(const std::string_view bytes)
+
+ Best effort locale canonicalizer that doesn't need any data
+
+ Use ICU4XLocaleCanonicalizer for better control and functionality
+
+ See the `Rust documentation for canonicalize <https://docs.rs/icu/latest/icu/locid/struct.Locale.html#method.canonicalize>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> to_string_to_writeable(W& write) const
+
+ Write a string representation of :cpp:class:`ICU4XLocale` to ``write``
+
+ See the `Rust documentation for write_to <https://docs.rs/icu/latest/icu/locid/struct.Locale.html#method.write_to>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> to_string() const
+
+ Write a string representation of :cpp:class:`ICU4XLocale` to ``write``
+
+ See the `Rust documentation for write_to <https://docs.rs/icu/latest/icu/locid/struct.Locale.html#method.write_to>`__ for more information.
+
+
+ .. cpp:function:: bool normalizing_eq(const std::string_view other) const
+
+ See the `Rust documentation for normalizing_eq <https://docs.rs/icu/latest/icu/locid/struct.Locale.html#method.normalizing_eq>`__ for more information.
+
+
+ .. cpp:function:: ICU4XOrdering strict_cmp(const std::string_view other) const
+
+ See the `Rust documentation for strict_cmp <https://docs.rs/icu/latest/icu/locid/struct.Locale.html#method.strict_cmp>`__ for more information.
+
+
+ .. cpp:function:: static ICU4XLocale create_en()
+
+ Deprecated
+
+ Use `create_from_string("en").
+
+
+ .. cpp:function:: static ICU4XLocale create_bn()
+
+ Deprecated
+
+ Use `create_from_string("bn").
+
diff --git a/intl/icu_capi/cpp/docs/source/locid_transform_ffi.rst b/intl/icu_capi/cpp/docs/source/locid_transform_ffi.rst
new file mode 100644
index 0000000000..10d17a9cdf
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/locid_transform_ffi.rst
@@ -0,0 +1,76 @@
+``locid_transform::ffi``
+========================
+
+.. cpp:class:: ICU4XLocaleCanonicalizer
+
+ A locale canonicalizer.
+
+ See the `Rust documentation for LocaleCanonicalizer <https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleCanonicalizer.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XLocaleCanonicalizer, ICU4XError> create(const ICU4XDataProvider& provider)
+
+ Create a new :cpp:class:`ICU4XLocaleCanonicalizer`.
+
+ See the `Rust documentation for new <https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleCanonicalizer.html#method.new>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XLocaleCanonicalizer, ICU4XError> create_extended(const ICU4XDataProvider& provider)
+
+ Create a new :cpp:class:`ICU4XLocaleCanonicalizer` with extended data.
+
+ See the `Rust documentation for new_with_expander <https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleCanonicalizer.html#method.new_with_expander>`__ for more information.
+
+
+ .. cpp:function:: ICU4XTransformResult canonicalize(ICU4XLocale& locale) const
+
+ FFI version of ``LocaleCanonicalizer::canonicalize()``.
+
+ See the `Rust documentation for canonicalize <https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleCanonicalizer.html#method.canonicalize>`__ for more information.
+
+
+.. cpp:class:: ICU4XLocaleExpander
+
+ A locale expander.
+
+ See the `Rust documentation for LocaleExpander <https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleExpander.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XLocaleExpander, ICU4XError> create(const ICU4XDataProvider& provider)
+
+ Create a new :cpp:class:`ICU4XLocaleExpander`.
+
+ See the `Rust documentation for new <https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleExpander.html#method.new>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XLocaleExpander, ICU4XError> create_extended(const ICU4XDataProvider& provider)
+
+ Create a new :cpp:class:`ICU4XLocaleExpander` with extended data.
+
+ See the `Rust documentation for new_extended <https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleExpander.html#method.new_extended>`__ for more information.
+
+
+ .. cpp:function:: ICU4XTransformResult maximize(ICU4XLocale& locale) const
+
+ FFI version of ``LocaleExpander::maximize()``.
+
+ See the `Rust documentation for maximize <https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleExpander.html#method.maximize>`__ for more information.
+
+
+ .. cpp:function:: ICU4XTransformResult minimize(ICU4XLocale& locale) const
+
+ FFI version of ``LocaleExpander::minimize()``.
+
+ See the `Rust documentation for minimize <https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleExpander.html#method.minimize>`__ for more information.
+
+
+.. cpp:enum-struct:: ICU4XTransformResult
+
+ FFI version of ``TransformResult``.
+
+ See the `Rust documentation for TransformResult <https://docs.rs/icu/latest/icu/locid_transform/enum.TransformResult.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Modified
+
+ .. cpp:enumerator:: Unmodified
diff --git a/intl/icu_capi/cpp/docs/source/logging_ffi.rst b/intl/icu_capi/cpp/docs/source/logging_ffi.rst
new file mode 100644
index 0000000000..29c7e3d8fb
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/logging_ffi.rst
@@ -0,0 +1,21 @@
+``logging::ffi``
+================
+
+.. cpp:class:: ICU4XLogger
+
+ An object allowing control over the logging used
+
+
+ .. cpp:function:: static bool init_simple_logger()
+
+ Initialize the logger using ``simple_logger``
+
+ Requires the ``simple_logger`` Cargo feature.
+
+ Returns ``false`` if there was already a logger set.
+
+
+ .. cpp:function:: static bool init_console_logger()
+
+ Deprecated: since ICU4X 1.4, this now happens automatically if the ``log`` feature is enabled.
+
diff --git a/intl/icu_capi/cpp/docs/source/metazone_calculator_ffi.rst b/intl/icu_capi/cpp/docs/source/metazone_calculator_ffi.rst
new file mode 100644
index 0000000000..5cddfce650
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/metazone_calculator_ffi.rst
@@ -0,0 +1,16 @@
+``metazone_calculator::ffi``
+============================
+
+.. cpp:class:: ICU4XMetazoneCalculator
+
+ An object capable of computing the metazone from a timezone.
+
+ This can be used via ``maybe_calculate_metazone()`` on ```ICU4XCustomTimeZone`` <crate::timezone::ffi::ICU4XCustomTimeZone>`__.
+
+ See the `Rust documentation for MetazoneCalculator <https://docs.rs/icu/latest/icu/timezone/struct.MetazoneCalculator.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XMetazoneCalculator, ICU4XError> create(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for new <https://docs.rs/icu/latest/icu/timezone/struct.MetazoneCalculator.html#method.new>`__ for more information.
+
diff --git a/intl/icu_capi/cpp/docs/source/normalizer_ffi.rst b/intl/icu_capi/cpp/docs/source/normalizer_ffi.rst
new file mode 100644
index 0000000000..033cd4e71b
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/normalizer_ffi.rst
@@ -0,0 +1,94 @@
+``normalizer::ffi``
+===================
+
+.. cpp:class:: ICU4XComposingNormalizer
+
+ See the `Rust documentation for ComposingNormalizer <https://docs.rs/icu/latest/icu/normalizer/struct.ComposingNormalizer.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XComposingNormalizer, ICU4XError> create_nfc(const ICU4XDataProvider& provider)
+
+ Construct a new ICU4XComposingNormalizer instance for NFC
+
+ See the `Rust documentation for new_nfc <https://docs.rs/icu/latest/icu/normalizer/struct.ComposingNormalizer.html#method.new_nfc>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XComposingNormalizer, ICU4XError> create_nfkc(const ICU4XDataProvider& provider)
+
+ Construct a new ICU4XComposingNormalizer instance for NFKC
+
+ See the `Rust documentation for new_nfkc <https://docs.rs/icu/latest/icu/normalizer/struct.ComposingNormalizer.html#method.new_nfkc>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> normalize_to_writeable(const std::string_view s, W& write) const
+
+ Normalize a (potentially ill-formed) UTF8 string
+
+ Errors are mapped to REPLACEMENT CHARACTER
+
+ See the `Rust documentation for normalize_utf8 <https://docs.rs/icu/latest/icu/normalizer/struct.ComposingNormalizer.html#method.normalize_utf8>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> normalize(const std::string_view s) const
+
+ Normalize a (potentially ill-formed) UTF8 string
+
+ Errors are mapped to REPLACEMENT CHARACTER
+
+ See the `Rust documentation for normalize_utf8 <https://docs.rs/icu/latest/icu/normalizer/struct.ComposingNormalizer.html#method.normalize_utf8>`__ for more information.
+
+
+ .. cpp:function:: bool is_normalized(const std::string_view s) const
+
+ Check if a (potentially ill-formed) UTF8 string is normalized
+
+ Errors are mapped to REPLACEMENT CHARACTER
+
+ See the `Rust documentation for is_normalized_utf8 <https://docs.rs/icu/latest/icu/normalizer/struct.ComposingNormalizer.html#method.is_normalized_utf8>`__ for more information.
+
+
+.. cpp:class:: ICU4XDecomposingNormalizer
+
+ See the `Rust documentation for DecomposingNormalizer <https://docs.rs/icu/latest/icu/normalizer/struct.DecomposingNormalizer.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XDecomposingNormalizer, ICU4XError> create_nfd(const ICU4XDataProvider& provider)
+
+ Construct a new ICU4XDecomposingNormalizer instance for NFC
+
+ See the `Rust documentation for new_nfd <https://docs.rs/icu/latest/icu/normalizer/struct.DecomposingNormalizer.html#method.new_nfd>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XDecomposingNormalizer, ICU4XError> create_nfkd(const ICU4XDataProvider& provider)
+
+ Construct a new ICU4XDecomposingNormalizer instance for NFKC
+
+ See the `Rust documentation for new_nfkd <https://docs.rs/icu/latest/icu/normalizer/struct.DecomposingNormalizer.html#method.new_nfkd>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> normalize_to_writeable(const std::string_view s, W& write) const
+
+ Normalize a (potentially ill-formed) UTF8 string
+
+ Errors are mapped to REPLACEMENT CHARACTER
+
+ See the `Rust documentation for normalize_utf8 <https://docs.rs/icu/latest/icu/normalizer/struct.DecomposingNormalizer.html#method.normalize_utf8>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> normalize(const std::string_view s) const
+
+ Normalize a (potentially ill-formed) UTF8 string
+
+ Errors are mapped to REPLACEMENT CHARACTER
+
+ See the `Rust documentation for normalize_utf8 <https://docs.rs/icu/latest/icu/normalizer/struct.DecomposingNormalizer.html#method.normalize_utf8>`__ for more information.
+
+
+ .. cpp:function:: bool is_normalized(const std::string_view s) const
+
+ Check if a (potentially ill-formed) UTF8 string is normalized
+
+ Errors are mapped to REPLACEMENT CHARACTER
+
+ See the `Rust documentation for is_normalized_utf8 <https://docs.rs/icu/latest/icu/normalizer/struct.DecomposingNormalizer.html#method.is_normalized_utf8>`__ for more information.
+
diff --git a/intl/icu_capi/cpp/docs/source/normalizer_properties_ffi.rst b/intl/icu_capi/cpp/docs/source/normalizer_properties_ffi.rst
new file mode 100644
index 0000000000..57759a81ed
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/normalizer_properties_ffi.rst
@@ -0,0 +1,87 @@
+``normalizer_properties::ffi``
+==============================
+
+.. cpp:class:: ICU4XCanonicalCombiningClassMap
+
+ Lookup of the Canonical_Combining_Class Unicode property
+
+ See the `Rust documentation for CanonicalCombiningClassMap <https://docs.rs/icu/latest/icu/normalizer/properties/struct.CanonicalCombiningClassMap.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCanonicalCombiningClassMap, ICU4XError> create(const ICU4XDataProvider& provider)
+
+ Construct a new ICU4XCanonicalCombiningClassMap instance for NFC
+
+ See the `Rust documentation for new <https://docs.rs/icu/latest/icu/normalizer/properties/struct.CanonicalCombiningClassMap.html#method.new>`__ for more information.
+
+
+ .. cpp:function:: uint8_t get(char32_t ch) const
+
+ See the `Rust documentation for get <https://docs.rs/icu/latest/icu/normalizer/properties/struct.CanonicalCombiningClassMap.html#method.get>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/properties/properties/struct.CanonicalCombiningClass.html>`__
+
+
+ .. cpp:function:: uint8_t get32(uint32_t ch) const
+
+ See the `Rust documentation for get32 <https://docs.rs/icu/latest/icu/normalizer/properties/struct.CanonicalCombiningClassMap.html#method.get32>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/properties/properties/struct.CanonicalCombiningClass.html>`__
+
+
+.. cpp:class:: ICU4XCanonicalComposition
+
+ The raw canonical composition operation.
+
+ Callers should generally use ICU4XComposingNormalizer unless they specifically need raw composition operations
+
+ See the `Rust documentation for CanonicalComposition <https://docs.rs/icu/latest/icu/normalizer/properties/struct.CanonicalComposition.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCanonicalComposition, ICU4XError> create(const ICU4XDataProvider& provider)
+
+ Construct a new ICU4XCanonicalComposition instance for NFC
+
+ See the `Rust documentation for new <https://docs.rs/icu/latest/icu/normalizer/properties/struct.CanonicalComposition.html#method.new>`__ for more information.
+
+
+ .. cpp:function:: char32_t compose(char32_t starter, char32_t second) const
+
+ Performs canonical composition (including Hangul) on a pair of characters or returns NUL if these characters don’t compose. Composition exclusions are taken into account.
+
+ See the `Rust documentation for compose <https://docs.rs/icu/latest/icu/normalizer/properties/struct.CanonicalComposition.html#method.compose>`__ for more information.
+
+
+.. cpp:class:: ICU4XCanonicalDecomposition
+
+ The raw (non-recursive) canonical decomposition operation.
+
+ Callers should generally use ICU4XDecomposingNormalizer unless they specifically need raw composition operations
+
+ See the `Rust documentation for CanonicalDecomposition <https://docs.rs/icu/latest/icu/normalizer/properties/struct.CanonicalDecomposition.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCanonicalDecomposition, ICU4XError> create(const ICU4XDataProvider& provider)
+
+ Construct a new ICU4XCanonicalDecomposition instance for NFC
+
+ See the `Rust documentation for new <https://docs.rs/icu/latest/icu/normalizer/properties/struct.CanonicalDecomposition.html#method.new>`__ for more information.
+
+
+ .. cpp:function:: ICU4XDecomposed decompose(char32_t c) const
+
+ Performs non-recursive canonical decomposition (including for Hangul).
+
+ See the `Rust documentation for decompose <https://docs.rs/icu/latest/icu/normalizer/properties/struct.CanonicalDecomposition.html#method.decompose>`__ for more information.
+
+
+.. cpp:struct:: ICU4XDecomposed
+
+ The outcome of non-recursive canonical decomposition of a character. ``second`` will be NUL when the decomposition expands to a single character (which may or may not be the original one)
+
+ See the `Rust documentation for Decomposed <https://docs.rs/icu/latest/icu/normalizer/properties/enum.Decomposed.html>`__ for more information.
+
+
+ .. cpp:member:: char32_t first
+
+ .. cpp:member:: char32_t second
diff --git a/intl/icu_capi/cpp/docs/source/pluralrules_ffi.rst b/intl/icu_capi/cpp/docs/source/pluralrules_ffi.rst
new file mode 100644
index 0000000000..80a01d258a
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/pluralrules_ffi.rst
@@ -0,0 +1,96 @@
+``pluralrules::ffi``
+====================
+
+.. cpp:struct:: ICU4XPluralCategories
+
+ FFI version of ``PluralRules::categories()`` data.
+
+
+ .. cpp:member:: bool zero
+
+ .. cpp:member:: bool one
+
+ .. cpp:member:: bool two
+
+ .. cpp:member:: bool few
+
+ .. cpp:member:: bool many
+
+ .. cpp:member:: bool other
+
+.. cpp:enum-struct:: ICU4XPluralCategory
+
+ FFI version of ``PluralCategory``.
+
+ See the `Rust documentation for PluralCategory <https://docs.rs/icu/latest/icu/plurals/enum.PluralCategory.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Zero
+
+ .. cpp:enumerator:: One
+
+ .. cpp:enumerator:: Two
+
+ .. cpp:enumerator:: Few
+
+ .. cpp:enumerator:: Many
+
+ .. cpp:enumerator:: Other
+
+ .. cpp:function:: static diplomat::result<ICU4XPluralCategory, std::monostate> get_for_cldr_string(const std::string_view s)
+
+ Construct from a string in the format `specified in TR35 <https://unicode.org/reports/tr35/tr35-numbers.html#Language_Plural_Rules>`__
+
+ See the `Rust documentation for get_for_cldr_string <https://docs.rs/icu/latest/icu/plurals/enum.PluralCategory.html#method.get_for_cldr_string>`__ for more information.
+
+ See the `Rust documentation for get_for_cldr_bytes <https://docs.rs/icu/latest/icu/plurals/enum.PluralCategory.html#method.get_for_cldr_bytes>`__ for more information.
+
+
+.. cpp:class:: ICU4XPluralOperands
+
+ FFI version of ``PluralOperands``.
+
+ See the `Rust documentation for PluralOperands <https://docs.rs/icu/latest/icu/plurals/struct.PluralOperands.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XPluralOperands, ICU4XError> create_from_string(const std::string_view s)
+
+ Construct for a given string representing a number
+
+ See the `Rust documentation for from_str <https://docs.rs/icu/latest/icu/plurals/struct.PluralOperands.html#method.from_str>`__ for more information.
+
+
+.. cpp:class:: ICU4XPluralRules
+
+ FFI version of ``PluralRules``.
+
+ See the `Rust documentation for PluralRules <https://docs.rs/icu/latest/icu/plurals/struct.PluralRules.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XPluralRules, ICU4XError> create_cardinal(const ICU4XDataProvider& provider, const ICU4XLocale& locale)
+
+ Construct an :cpp:class:`ICU4XPluralRules` for the given locale, for cardinal numbers
+
+ See the `Rust documentation for try_new_cardinal <https://docs.rs/icu/latest/icu/plurals/struct.PluralRules.html#method.try_new_cardinal>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XPluralRules, ICU4XError> create_ordinal(const ICU4XDataProvider& provider, const ICU4XLocale& locale)
+
+ Construct an :cpp:class:`ICU4XPluralRules` for the given locale, for ordinal numbers
+
+ See the `Rust documentation for try_new_ordinal <https://docs.rs/icu/latest/icu/plurals/struct.PluralRules.html#method.try_new_ordinal>`__ for more information.
+
+
+ .. cpp:function:: ICU4XPluralCategory category_for(const ICU4XPluralOperands& op) const
+
+ Get the category for a given number represented as operands
+
+ See the `Rust documentation for category_for <https://docs.rs/icu/latest/icu/plurals/struct.PluralRules.html#method.category_for>`__ for more information.
+
+
+ .. cpp:function:: ICU4XPluralCategories categories() const
+
+ Get all of the categories needed in the current locale
+
+ See the `Rust documentation for categories <https://docs.rs/icu/latest/icu/plurals/struct.PluralRules.html#method.categories>`__ for more information.
+
diff --git a/intl/icu_capi/cpp/docs/source/properties_iter_ffi.rst b/intl/icu_capi/cpp/docs/source/properties_iter_ffi.rst
new file mode 100644
index 0000000000..b96d80b3c7
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/properties_iter_ffi.rst
@@ -0,0 +1,27 @@
+``properties_iter::ffi``
+========================
+
+.. cpp:class:: CodePointRangeIterator
+
+ An iterator over code point ranges, produced by ``ICU4XCodePointSetData`` or one of the ``ICU4XCodePointMapData`` types
+
+
+ .. cpp:function:: CodePointRangeIteratorResult next()
+
+ Advance the iterator by one and return the next range.
+
+ If the iterator is out of items, ``done`` will be true
+
+
+.. cpp:struct:: CodePointRangeIteratorResult
+
+ Result of a single iteration of :cpp:class:`CodePointRangeIterator`. Logically can be considered to be an ``Option<RangeInclusive<u32>>``,
+
+ ``start`` and ``end`` represent an inclusive range of code points start, end, and ``done`` will be true if the iterator has already finished. The last contentful iteration will NOT produce a range done=true, in other words ``start`` and ``end`` are useful values if and only if ``done=false``.
+
+
+ .. cpp:member:: uint32_t start
+
+ .. cpp:member:: uint32_t end
+
+ .. cpp:member:: bool done
diff --git a/intl/icu_capi/cpp/docs/source/properties_maps_ffi.rst b/intl/icu_capi/cpp/docs/source/properties_maps_ffi.rst
new file mode 100644
index 0000000000..200c95427d
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/properties_maps_ffi.rst
@@ -0,0 +1,169 @@
+``properties_maps::ffi``
+========================
+
+.. cpp:class:: ICU4XCodePointMapData16
+
+ An ICU4X Unicode Map Property object, capable of querying whether a code point (key) to obtain the Unicode property value, for a specific Unicode property.
+
+ For properties whose values fit into 16 bits.
+
+ See the `Rust documentation for properties <https://docs.rs/icu/latest/icu/properties/index.html>`__ for more information.
+
+ See the `Rust documentation for CodePointMapData <https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapData.html>`__ for more information.
+
+ See the `Rust documentation for CodePointMapDataBorrowed <https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html>`__ for more information.
+
+
+ .. cpp:function:: uint16_t get(char32_t cp) const
+
+ Gets the value for a code point.
+
+ See the `Rust documentation for get <https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html#method.get>`__ for more information.
+
+
+ .. cpp:function:: uint16_t get32(uint32_t cp) const
+
+ Gets the value for a code point (specified as a 32 bit integer, in UTF-32)
+
+
+ .. cpp:function:: CodePointRangeIterator iter_ranges_for_value(uint16_t value) const
+
+ Produces an iterator over ranges of code points that map to ``value``
+
+ See the `Rust documentation for iter_ranges_for_value <https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html#method.iter_ranges_for_value>`__ for more information.
+
+ Lifetimes: ``this`` must live at least as long as the output.
+
+
+ .. cpp:function:: CodePointRangeIterator iter_ranges_for_value_complemented(uint16_t value) const
+
+ Produces an iterator over ranges of code points that do not map to ``value``
+
+ See the `Rust documentation for iter_ranges_for_value_complemented <https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html#method.iter_ranges_for_value_complemented>`__ for more information.
+
+ Lifetimes: ``this`` must live at least as long as the output.
+
+
+ .. cpp:function:: ICU4XCodePointSetData get_set_for_value(uint16_t value) const
+
+ Gets a :cpp:class:`ICU4XCodePointSetData` representing all entries in this map that map to the given value
+
+ See the `Rust documentation for get_set_for_value <https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html#method.get_set_for_value>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointMapData16, ICU4XError> load_script(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for script <https://docs.rs/icu/latest/icu/properties/maps/fn.script.html>`__ for more information.
+
+
+.. cpp:class:: ICU4XCodePointMapData8
+
+ An ICU4X Unicode Map Property object, capable of querying whether a code point (key) to obtain the Unicode property value, for a specific Unicode property.
+
+ For properties whose values fit into 8 bits.
+
+ See the `Rust documentation for properties <https://docs.rs/icu/latest/icu/properties/index.html>`__ for more information.
+
+ See the `Rust documentation for CodePointMapData <https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapData.html>`__ for more information.
+
+ See the `Rust documentation for CodePointMapDataBorrowed <https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html>`__ for more information.
+
+
+ .. cpp:function:: uint8_t get(char32_t cp) const
+
+ Gets the value for a code point.
+
+ See the `Rust documentation for get <https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html#method.get>`__ for more information.
+
+
+ .. cpp:function:: uint8_t get32(uint32_t cp) const
+
+ Gets the value for a code point (specified as a 32 bit integer, in UTF-32)
+
+
+ .. cpp:function:: static uint32_t general_category_to_mask(uint8_t gc)
+
+ Converts a general category to its corresponding mask value
+
+ Nonexistant general categories will map to the empty mask
+
+ See the `Rust documentation for GeneralCategoryGroup <https://docs.rs/icu/latest/icu/properties/struct.GeneralCategoryGroup.html>`__ for more information.
+
+
+ .. cpp:function:: CodePointRangeIterator iter_ranges_for_value(uint8_t value) const
+
+ Produces an iterator over ranges of code points that map to ``value``
+
+ See the `Rust documentation for iter_ranges_for_value <https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html#method.iter_ranges_for_value>`__ for more information.
+
+ Lifetimes: ``this`` must live at least as long as the output.
+
+
+ .. cpp:function:: CodePointRangeIterator iter_ranges_for_value_complemented(uint8_t value) const
+
+ Produces an iterator over ranges of code points that do not map to ``value``
+
+ See the `Rust documentation for iter_ranges_for_value_complemented <https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html#method.iter_ranges_for_value_complemented>`__ for more information.
+
+ Lifetimes: ``this`` must live at least as long as the output.
+
+
+ .. cpp:function:: CodePointRangeIterator iter_ranges_for_mask(uint32_t mask) const
+
+ Given a mask value (the nth bit marks property value = n), produce an iterator over ranges of code points whose property values are contained in the mask.
+
+ The main mask property supported is that for General_Category, which can be obtained via ``general_category_to_mask()`` or by using ``ICU4XGeneralCategoryNameToMaskMapper``
+
+ Should only be used on maps for properties with values less than 32 (like Generak_Category), other maps will have unpredictable results
+
+ See the `Rust documentation for iter_ranges_for_group <https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html#method.iter_ranges_for_group>`__ for more information.
+
+ Lifetimes: ``this`` must live at least as long as the output.
+
+
+ .. cpp:function:: ICU4XCodePointSetData get_set_for_value(uint8_t value) const
+
+ Gets a :cpp:class:`ICU4XCodePointSetData` representing all entries in this map that map to the given value
+
+ See the `Rust documentation for get_set_for_value <https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html#method.get_set_for_value>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointMapData8, ICU4XError> load_general_category(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for general_category <https://docs.rs/icu/latest/icu/properties/maps/fn.general_category.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointMapData8, ICU4XError> load_bidi_class(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for bidi_class <https://docs.rs/icu/latest/icu/properties/maps/fn.bidi_class.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointMapData8, ICU4XError> load_east_asian_width(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for east_asian_width <https://docs.rs/icu/latest/icu/properties/maps/fn.east_asian_width.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointMapData8, ICU4XError> load_indic_syllabic_category(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for indic_syllabic_category <https://docs.rs/icu/latest/icu/properties/maps/fn.indic_syllabic_category.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointMapData8, ICU4XError> load_line_break(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for line_break <https://docs.rs/icu/latest/icu/properties/maps/fn.line_break.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointMapData8, ICU4XError> try_grapheme_cluster_break(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for grapheme_cluster_break <https://docs.rs/icu/latest/icu/properties/maps/fn.grapheme_cluster_break.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointMapData8, ICU4XError> load_word_break(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for word_break <https://docs.rs/icu/latest/icu/properties/maps/fn.word_break.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointMapData8, ICU4XError> load_sentence_break(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for sentence_break <https://docs.rs/icu/latest/icu/properties/maps/fn.sentence_break.html>`__ for more information.
+
diff --git a/intl/icu_capi/cpp/docs/source/properties_names_ffi.rst b/intl/icu_capi/cpp/docs/source/properties_names_ffi.rst
new file mode 100644
index 0000000000..2ae5d9e4eb
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/properties_names_ffi.rst
@@ -0,0 +1,102 @@
+``properties_names::ffi``
+=========================
+
+.. cpp:class:: ICU4XGeneralCategoryNameToMaskMapper
+
+ A type capable of looking up General Category mask values from a string name.
+
+ See the `Rust documentation for get_name_to_enum_mapper <https://docs.rs/icu/latest/icu/properties/struct.GeneralCategoryGroup.html#method.get_name_to_enum_mapper>`__ for more information.
+
+ See the `Rust documentation for PropertyValueNameToEnumMapper <https://docs.rs/icu/latest/icu/properties/names/struct.PropertyValueNameToEnumMapper.html>`__ for more information.
+
+
+ .. cpp:function:: uint32_t get_strict(const std::string_view name) const
+
+ Get the mask value matching the given name, using strict matching
+
+ Returns 0 if the name is unknown for this property
+
+
+ .. cpp:function:: uint32_t get_loose(const std::string_view name) const
+
+ Get the mask value matching the given name, using loose matching
+
+ Returns 0 if the name is unknown for this property
+
+
+ .. cpp:function:: static diplomat::result<ICU4XGeneralCategoryNameToMaskMapper, ICU4XError> load(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for get_name_to_enum_mapper <https://docs.rs/icu/latest/icu/properties/struct.GeneralCategoryGroup.html#method.get_name_to_enum_mapper>`__ for more information.
+
+
+.. cpp:class:: ICU4XPropertyValueNameToEnumMapper
+
+ A type capable of looking up a property value from a string name.
+
+ See the `Rust documentation for PropertyValueNameToEnumMapper <https://docs.rs/icu/latest/icu/properties/names/struct.PropertyValueNameToEnumMapper.html>`__ for more information.
+
+ See the `Rust documentation for PropertyValueNameToEnumMapperBorrowed <https://docs.rs/icu/latest/icu/properties/names/struct.PropertyValueNameToEnumMapperBorrowed.html>`__ for more information.
+
+
+ .. cpp:function:: int16_t get_strict(const std::string_view name) const
+
+ Get the property value matching the given name, using strict matching
+
+ Returns -1 if the name is unknown for this property
+
+ See the `Rust documentation for get_strict <https://docs.rs/icu/latest/icu/properties/names/struct.PropertyValueNameToEnumMapperBorrowed.html#method.get_strict>`__ for more information.
+
+
+ .. cpp:function:: int16_t get_loose(const std::string_view name) const
+
+ Get the property value matching the given name, using loose matching
+
+ Returns -1 if the name is unknown for this property
+
+ See the `Rust documentation for get_loose <https://docs.rs/icu/latest/icu/properties/names/struct.PropertyValueNameToEnumMapperBorrowed.html#method.get_loose>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> load_general_category(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for get_name_to_enum_mapper <https://docs.rs/icu/latest/icu/properties/struct.GeneralCategory.html#method.get_name_to_enum_mapper>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> load_bidi_class(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for name_to_enum_mapper <https://docs.rs/icu/latest/icu/properties/struct.BidiClass.html#method.name_to_enum_mapper>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> load_east_asian_width(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for name_to_enum_mapper <https://docs.rs/icu/latest/icu/properties/struct.EastAsianWidth.html#method.name_to_enum_mapper>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> load_indic_syllabic_category(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for name_to_enum_mapper <https://docs.rs/icu/latest/icu/properties/struct.IndicSyllabicCategory.html#method.name_to_enum_mapper>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> load_line_break(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for name_to_enum_mapper <https://docs.rs/icu/latest/icu/properties/struct.LineBreak.html#method.name_to_enum_mapper>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> load_grapheme_cluster_break(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for get_name_to_enum_mapper <https://docs.rs/icu/latest/icu/properties/struct.GraphemeClusterBreak.html#method.get_name_to_enum_mapper>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> load_word_break(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for name_to_enum_mapper <https://docs.rs/icu/latest/icu/properties/struct.WordBreak.html#method.name_to_enum_mapper>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> load_sentence_break(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for name_to_enum_mapper <https://docs.rs/icu/latest/icu/properties/struct.SentenceBreak.html#method.name_to_enum_mapper>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> load_script(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for name_to_enum_mapper <https://docs.rs/icu/latest/icu/properties/struct.Script.html#method.name_to_enum_mapper>`__ for more information.
+
diff --git a/intl/icu_capi/cpp/docs/source/properties_sets_ffi.rst b/intl/icu_capi/cpp/docs/source/properties_sets_ffi.rst
new file mode 100644
index 0000000000..287307a6c2
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/properties_sets_ffi.rst
@@ -0,0 +1,384 @@
+``properties_sets::ffi``
+========================
+
+.. cpp:class:: ICU4XCodePointSetData
+
+ An ICU4X Unicode Set Property object, capable of querying whether a code point is contained in a set based on a Unicode property.
+
+ See the `Rust documentation for properties <https://docs.rs/icu/latest/icu/properties/index.html>`__ for more information.
+
+ See the `Rust documentation for CodePointSetData <https://docs.rs/icu/latest/icu/properties/sets/struct.CodePointSetData.html>`__ for more information.
+
+ See the `Rust documentation for CodePointSetDataBorrowed <https://docs.rs/icu/latest/icu/properties/sets/struct.CodePointSetDataBorrowed.html>`__ for more information.
+
+
+ .. cpp:function:: bool contains(char32_t cp) const
+
+ Checks whether the code point is in the set.
+
+ See the `Rust documentation for contains <https://docs.rs/icu/latest/icu/properties/sets/struct.CodePointSetDataBorrowed.html#method.contains>`__ for more information.
+
+
+ .. cpp:function:: bool contains32(uint32_t cp) const
+
+ Checks whether the code point (specified as a 32 bit integer, in UTF-32) is in the set.
+
+
+ .. cpp:function:: CodePointRangeIterator iter_ranges() const
+
+ Produces an iterator over ranges of code points contained in this set
+
+ See the `Rust documentation for iter_ranges <https://docs.rs/icu/latest/icu/properties/sets/struct.CodePointSetDataBorrowed.html#method.iter_ranges>`__ for more information.
+
+ Lifetimes: ``this`` must live at least as long as the output.
+
+
+ .. cpp:function:: CodePointRangeIterator iter_ranges_complemented() const
+
+ Produces an iterator over ranges of code points not contained in this set
+
+ See the `Rust documentation for iter_ranges_complemented <https://docs.rs/icu/latest/icu/properties/sets/struct.CodePointSetDataBorrowed.html#method.iter_ranges_complemented>`__ for more information.
+
+ Lifetimes: ``this`` must live at least as long as the output.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_for_general_category_group(const ICU4XDataProvider& provider, uint32_t group)
+
+ which is a mask with the same format as the ``U_GC_XX_MASK`` mask in ICU4C
+
+ See the `Rust documentation for for_general_category_group <https://docs.rs/icu/latest/icu/properties/sets/fn.for_general_category_group.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_ascii_hex_digit(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for ascii_hex_digit <https://docs.rs/icu/latest/icu/properties/sets/fn.ascii_hex_digit.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_alnum(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for alnum <https://docs.rs/icu/latest/icu/properties/sets/fn.alnum.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_alphabetic(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for alphabetic <https://docs.rs/icu/latest/icu/properties/sets/fn.alphabetic.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_bidi_control(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for bidi_control <https://docs.rs/icu/latest/icu/properties/sets/fn.bidi_control.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_bidi_mirrored(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for bidi_mirrored <https://docs.rs/icu/latest/icu/properties/sets/fn.bidi_mirrored.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_blank(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for blank <https://docs.rs/icu/latest/icu/properties/sets/fn.blank.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_cased(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for cased <https://docs.rs/icu/latest/icu/properties/sets/fn.cased.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_case_ignorable(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for case_ignorable <https://docs.rs/icu/latest/icu/properties/sets/fn.case_ignorable.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_full_composition_exclusion(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for full_composition_exclusion <https://docs.rs/icu/latest/icu/properties/sets/fn.full_composition_exclusion.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_changes_when_casefolded(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for changes_when_casefolded <https://docs.rs/icu/latest/icu/properties/sets/fn.changes_when_casefolded.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_changes_when_casemapped(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for changes_when_casemapped <https://docs.rs/icu/latest/icu/properties/sets/fn.changes_when_casemapped.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_changes_when_nfkc_casefolded(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for changes_when_nfkc_casefolded <https://docs.rs/icu/latest/icu/properties/sets/fn.changes_when_nfkc_casefolded.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_changes_when_lowercased(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for changes_when_lowercased <https://docs.rs/icu/latest/icu/properties/sets/fn.changes_when_lowercased.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_changes_when_titlecased(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for changes_when_titlecased <https://docs.rs/icu/latest/icu/properties/sets/fn.changes_when_titlecased.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_changes_when_uppercased(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for changes_when_uppercased <https://docs.rs/icu/latest/icu/properties/sets/fn.changes_when_uppercased.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_dash(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for dash <https://docs.rs/icu/latest/icu/properties/sets/fn.dash.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_deprecated(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for deprecated <https://docs.rs/icu/latest/icu/properties/sets/fn.deprecated.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_default_ignorable_code_point(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for default_ignorable_code_point <https://docs.rs/icu/latest/icu/properties/sets/fn.default_ignorable_code_point.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_diacritic(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for diacritic <https://docs.rs/icu/latest/icu/properties/sets/fn.diacritic.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_emoji_modifier_base(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for emoji_modifier_base <https://docs.rs/icu/latest/icu/properties/sets/fn.emoji_modifier_base.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_emoji_component(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for emoji_component <https://docs.rs/icu/latest/icu/properties/sets/fn.emoji_component.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_emoji_modifier(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for emoji_modifier <https://docs.rs/icu/latest/icu/properties/sets/fn.emoji_modifier.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_emoji(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for emoji <https://docs.rs/icu/latest/icu/properties/sets/fn.emoji.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_emoji_presentation(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for emoji_presentation <https://docs.rs/icu/latest/icu/properties/sets/fn.emoji_presentation.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_extender(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for extender <https://docs.rs/icu/latest/icu/properties/sets/fn.extender.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_extended_pictographic(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for extended_pictographic <https://docs.rs/icu/latest/icu/properties/sets/fn.extended_pictographic.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_graph(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for graph <https://docs.rs/icu/latest/icu/properties/sets/fn.graph.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_grapheme_base(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for grapheme_base <https://docs.rs/icu/latest/icu/properties/sets/fn.grapheme_base.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_grapheme_extend(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for grapheme_extend <https://docs.rs/icu/latest/icu/properties/sets/fn.grapheme_extend.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_grapheme_link(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for grapheme_link <https://docs.rs/icu/latest/icu/properties/sets/fn.grapheme_link.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_hex_digit(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for hex_digit <https://docs.rs/icu/latest/icu/properties/sets/fn.hex_digit.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_hyphen(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for hyphen <https://docs.rs/icu/latest/icu/properties/sets/fn.hyphen.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_id_continue(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for id_continue <https://docs.rs/icu/latest/icu/properties/sets/fn.id_continue.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_ideographic(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for ideographic <https://docs.rs/icu/latest/icu/properties/sets/fn.ideographic.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_id_start(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for id_start <https://docs.rs/icu/latest/icu/properties/sets/fn.id_start.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_ids_binary_operator(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for ids_binary_operator <https://docs.rs/icu/latest/icu/properties/sets/fn.ids_binary_operator.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_ids_trinary_operator(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for ids_trinary_operator <https://docs.rs/icu/latest/icu/properties/sets/fn.ids_trinary_operator.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_join_control(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for join_control <https://docs.rs/icu/latest/icu/properties/sets/fn.join_control.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_logical_order_exception(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for logical_order_exception <https://docs.rs/icu/latest/icu/properties/sets/fn.logical_order_exception.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_lowercase(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for lowercase <https://docs.rs/icu/latest/icu/properties/sets/fn.lowercase.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_math(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for math <https://docs.rs/icu/latest/icu/properties/sets/fn.math.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_noncharacter_code_point(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for noncharacter_code_point <https://docs.rs/icu/latest/icu/properties/sets/fn.noncharacter_code_point.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_nfc_inert(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for nfc_inert <https://docs.rs/icu/latest/icu/properties/sets/fn.nfc_inert.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_nfd_inert(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for nfd_inert <https://docs.rs/icu/latest/icu/properties/sets/fn.nfd_inert.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_nfkc_inert(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for nfkc_inert <https://docs.rs/icu/latest/icu/properties/sets/fn.nfkc_inert.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_nfkd_inert(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for nfkd_inert <https://docs.rs/icu/latest/icu/properties/sets/fn.nfkd_inert.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_pattern_syntax(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for pattern_syntax <https://docs.rs/icu/latest/icu/properties/sets/fn.pattern_syntax.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_pattern_white_space(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for pattern_white_space <https://docs.rs/icu/latest/icu/properties/sets/fn.pattern_white_space.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_prepended_concatenation_mark(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for prepended_concatenation_mark <https://docs.rs/icu/latest/icu/properties/sets/fn.prepended_concatenation_mark.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_print(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for print <https://docs.rs/icu/latest/icu/properties/sets/fn.print.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_quotation_mark(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for quotation_mark <https://docs.rs/icu/latest/icu/properties/sets/fn.quotation_mark.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_radical(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for radical <https://docs.rs/icu/latest/icu/properties/sets/fn.radical.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_regional_indicator(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for regional_indicator <https://docs.rs/icu/latest/icu/properties/sets/fn.regional_indicator.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_soft_dotted(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for soft_dotted <https://docs.rs/icu/latest/icu/properties/sets/fn.soft_dotted.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_segment_starter(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for segment_starter <https://docs.rs/icu/latest/icu/properties/sets/fn.segment_starter.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_case_sensitive(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for case_sensitive <https://docs.rs/icu/latest/icu/properties/sets/fn.case_sensitive.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_sentence_terminal(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for sentence_terminal <https://docs.rs/icu/latest/icu/properties/sets/fn.sentence_terminal.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_terminal_punctuation(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for terminal_punctuation <https://docs.rs/icu/latest/icu/properties/sets/fn.terminal_punctuation.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_unified_ideograph(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for unified_ideograph <https://docs.rs/icu/latest/icu/properties/sets/fn.unified_ideograph.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_uppercase(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for uppercase <https://docs.rs/icu/latest/icu/properties/sets/fn.uppercase.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_variation_selector(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for variation_selector <https://docs.rs/icu/latest/icu/properties/sets/fn.variation_selector.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_white_space(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for white_space <https://docs.rs/icu/latest/icu/properties/sets/fn.white_space.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_xdigit(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for xdigit <https://docs.rs/icu/latest/icu/properties/sets/fn.xdigit.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_xid_continue(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for xid_continue <https://docs.rs/icu/latest/icu/properties/sets/fn.xid_continue.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_xid_start(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for xid_start <https://docs.rs/icu/latest/icu/properties/sets/fn.xid_start.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_for_ecma262(const ICU4XDataProvider& provider, const std::string_view property_name)
+
+ Loads data for a property specified as a string as long as it is one of the `ECMA-262 binary properties <https://tc39.es/ecma262/#table-binary-unicode-properties>`__ (not including Any, ASCII, and Assigned pseudoproperties).
+
+ Returns ``ICU4XError::PropertyUnexpectedPropertyNameError`` in case the string does not match any property in the list
+
+ See the `Rust documentation for for_ecma262 <https://docs.rs/icu/latest/icu/properties/sets/fn.for_ecma262.html>`__ for more information.
+
diff --git a/intl/icu_capi/cpp/docs/source/properties_unisets_ffi.rst b/intl/icu_capi/cpp/docs/source/properties_unisets_ffi.rst
new file mode 100644
index 0000000000..fcbde264a2
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/properties_unisets_ffi.rst
@@ -0,0 +1,62 @@
+``properties_unisets::ffi``
+===========================
+
+.. cpp:class:: ICU4XUnicodeSetData
+
+ An ICU4X Unicode Set Property object, capable of querying whether a code point is contained in a set based on a Unicode property.
+
+ See the `Rust documentation for properties <https://docs.rs/icu/latest/icu/properties/index.html>`__ for more information.
+
+ See the `Rust documentation for UnicodeSetData <https://docs.rs/icu/latest/icu/properties/sets/struct.UnicodeSetData.html>`__ for more information.
+
+ See the `Rust documentation for UnicodeSetDataBorrowed <https://docs.rs/icu/latest/icu/properties/sets/struct.UnicodeSetDataBorrowed.html>`__ for more information.
+
+
+ .. cpp:function:: bool contains(const std::string_view s) const
+
+ Checks whether the string is in the set.
+
+ See the `Rust documentation for contains <https://docs.rs/icu/latest/icu/properties/sets/struct.UnicodeSetDataBorrowed.html#method.contains>`__ for more information.
+
+
+ .. cpp:function:: bool contains_char(char32_t cp) const
+
+ Checks whether the code point is in the set.
+
+ See the `Rust documentation for contains_char <https://docs.rs/icu/latest/icu/properties/sets/struct.UnicodeSetDataBorrowed.html#method.contains_char>`__ for more information.
+
+
+ .. cpp:function:: bool contains32(uint32_t cp) const
+
+ Checks whether the code point (specified as a 32 bit integer, in UTF-32) is in the set.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XUnicodeSetData, ICU4XError> load_basic_emoji(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for basic_emoji <https://docs.rs/icu/latest/icu/properties/sets/fn.basic_emoji.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XUnicodeSetData, ICU4XError> load_exemplars_main(const ICU4XDataProvider& provider, const ICU4XLocale& locale)
+
+ See the `Rust documentation for exemplars_main <https://docs.rs/icu/latest/icu/properties/exemplar_chars/fn.exemplars_main.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XUnicodeSetData, ICU4XError> load_exemplars_auxiliary(const ICU4XDataProvider& provider, const ICU4XLocale& locale)
+
+ See the `Rust documentation for exemplars_auxiliary <https://docs.rs/icu/latest/icu/properties/exemplar_chars/fn.exemplars_auxiliary.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XUnicodeSetData, ICU4XError> load_exemplars_punctuation(const ICU4XDataProvider& provider, const ICU4XLocale& locale)
+
+ See the `Rust documentation for exemplars_punctuation <https://docs.rs/icu/latest/icu/properties/exemplar_chars/fn.exemplars_punctuation.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XUnicodeSetData, ICU4XError> load_exemplars_numbers(const ICU4XDataProvider& provider, const ICU4XLocale& locale)
+
+ See the `Rust documentation for exemplars_numbers <https://docs.rs/icu/latest/icu/properties/exemplar_chars/fn.exemplars_numbers.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XUnicodeSetData, ICU4XError> load_exemplars_index(const ICU4XDataProvider& provider, const ICU4XLocale& locale)
+
+ See the `Rust documentation for exemplars_index <https://docs.rs/icu/latest/icu/properties/exemplar_chars/fn.exemplars_index.html>`__ for more information.
+
diff --git a/intl/icu_capi/cpp/docs/source/provider_ffi.rst b/intl/icu_capi/cpp/docs/source/provider_ffi.rst
new file mode 100644
index 0000000000..fcd53586cd
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/provider_ffi.rst
@@ -0,0 +1,84 @@
+``provider::ffi``
+=================
+
+.. cpp:class:: ICU4XDataProvider
+
+ An ICU4X data provider, capable of loading ICU4X data keys from some source.
+
+ See the `Rust documentation for icu_provider <https://docs.rs/icu_provider/latest/icu_provider/index.html>`__ for more information.
+
+
+ .. cpp:function:: static ICU4XDataProvider create_compiled()
+
+ Constructs an :cpp:class:`ICU4XDataProvider` that uses compiled data.
+
+ Requires the ``compiled_data`` feature.
+
+ This provider cannot be modified or combined with other providers, so ``enable_fallback``, ``enabled_fallback_with``, ``fork_by_locale``, and ``fork_by_key`` will return ``Err``s.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XDataProvider, ICU4XError> create_fs(const std::string_view path)
+
+ Constructs an ``FsDataProvider`` and returns it as an :cpp:class:`ICU4XDataProvider`. Requires the ``provider_fs`` Cargo feature. Not supported in WASM.
+
+ See the `Rust documentation for FsDataProvider <https://docs.rs/icu_provider_fs/latest/icu_provider_fs/struct.FsDataProvider.html>`__ for more information.
+
+
+ .. cpp:function:: static ICU4XDataProvider create_test()
+
+ Deprecated
+
+ Use ``create_compiled()``.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XDataProvider, ICU4XError> create_from_byte_slice(const diplomat::span<const uint8_t> blob)
+
+ Constructs a ``BlobDataProvider`` and returns it as an :cpp:class:`ICU4XDataProvider`.
+
+ See the `Rust documentation for BlobDataProvider <https://docs.rs/icu_provider_blob/latest/icu_provider_blob/struct.BlobDataProvider.html>`__ for more information.
+
+ Lifetimes: ``blob`` must live for the duration of the program.
+
+
+ .. cpp:function:: static ICU4XDataProvider create_empty()
+
+ Constructs an empty :cpp:class:`ICU4XDataProvider`.
+
+ See the `Rust documentation for EmptyDataProvider <https://docs.rs/icu_provider_adapters/latest/icu_provider_adapters/empty/struct.EmptyDataProvider.html>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::monostate, ICU4XError> fork_by_key(ICU4XDataProvider& other)
+
+ Creates a provider that tries the current provider and then, if the current provider doesn't support the data key, another provider ``other``.
+
+ This takes ownership of the ``other`` provider, leaving an empty provider in its place.
+
+ The providers must be the same type (Any or Buffer). This condition is satisfied if both providers originate from the same constructor, such as ``create_from_byte_slice`` or ``create_fs``. If the condition is not upheld, a runtime error occurs.
+
+ See the `Rust documentation for ForkByKeyProvider <https://docs.rs/icu_provider_adapters/latest/icu_provider_adapters/fork/type.ForkByKeyProvider.html>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::monostate, ICU4XError> fork_by_locale(ICU4XDataProvider& other)
+
+ Same as ``fork_by_key`` but forks by locale instead of key.
+
+ See the `Rust documentation for MissingLocalePredicate <https://docs.rs/icu_provider_adapters/latest/icu_provider_adapters/fork/predicates/struct.MissingLocalePredicate.html>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::monostate, ICU4XError> enable_locale_fallback()
+
+ Enables locale fallbacking for data requests made to this provider.
+
+ Note that the test provider (from ``create_test``) already has fallbacking enabled.
+
+ See the `Rust documentation for try_new <https://docs.rs/icu_provider_adapters/latest/icu_provider_adapters/fallback/struct.LocaleFallbackProvider.html#method.try_new>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu_provider_adapters/latest/icu_provider_adapters/fallback/struct.LocaleFallbackProvider.html>`__
+
+
+ .. cpp:function:: diplomat::result<std::monostate, ICU4XError> enable_locale_fallback_with(const ICU4XLocaleFallbacker& fallbacker)
+
+ See the `Rust documentation for new_with_fallbacker <https://docs.rs/icu_provider_adapters/latest/icu_provider_adapters/fallback/struct.LocaleFallbackProvider.html#method.new_with_fallbacker>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu_provider_adapters/latest/icu_provider_adapters/fallback/struct.LocaleFallbackProvider.html>`__
+
diff --git a/intl/icu_capi/cpp/docs/source/script_ffi.rst b/intl/icu_capi/cpp/docs/source/script_ffi.rst
new file mode 100644
index 0000000000..a6c06879e2
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/script_ffi.rst
@@ -0,0 +1,111 @@
+``script::ffi``
+===============
+
+.. cpp:class:: ICU4XScriptExtensionsSet
+
+ An object that represents the Script_Extensions property for a single character
+
+ See the `Rust documentation for ScriptExtensionsSet <https://docs.rs/icu/latest/icu/properties/script/struct.ScriptExtensionsSet.html>`__ for more information.
+
+
+ .. cpp:function:: bool contains(uint16_t script) const
+
+ Check if the Script_Extensions property of the given code point covers the given script
+
+ See the `Rust documentation for contains <https://docs.rs/icu/latest/icu/properties/script/struct.ScriptExtensionsSet.html#method.contains>`__ for more information.
+
+
+ .. cpp:function:: size_t count() const
+
+ Get the number of scripts contained in here
+
+ See the `Rust documentation for iter <https://docs.rs/icu/latest/icu/properties/script/struct.ScriptExtensionsSet.html#method.iter>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<uint16_t, std::monostate> script_at(size_t index) const
+
+ Get script at index, returning an error if out of bounds
+
+ See the `Rust documentation for iter <https://docs.rs/icu/latest/icu/properties/script/struct.ScriptExtensionsSet.html#method.iter>`__ for more information.
+
+
+.. cpp:class:: ICU4XScriptWithExtensions
+
+ An ICU4X ScriptWithExtensions map object, capable of holding a map of codepoints to scriptextensions values
+
+ See the `Rust documentation for ScriptWithExtensions <https://docs.rs/icu/latest/icu/properties/script/struct.ScriptWithExtensions.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XScriptWithExtensions, ICU4XError> create(const ICU4XDataProvider& provider)
+
+ See the `Rust documentation for script_with_extensions <https://docs.rs/icu/latest/icu/properties/script/fn.script_with_extensions.html>`__ for more information.
+
+
+ .. cpp:function:: uint16_t get_script_val(uint32_t code_point) const
+
+ Get the Script property value for a code point
+
+ See the `Rust documentation for get_script_val <https://docs.rs/icu/latest/icu/properties/script/struct.ScriptWithExtensionsBorrowed.html#method.get_script_val>`__ for more information.
+
+
+ .. cpp:function:: bool has_script(uint32_t code_point, uint16_t script) const
+
+ Check if the Script_Extensions property of the given code point covers the given script
+
+ See the `Rust documentation for has_script <https://docs.rs/icu/latest/icu/properties/script/struct.ScriptWithExtensionsBorrowed.html#method.has_script>`__ for more information.
+
+
+ .. cpp:function:: ICU4XScriptWithExtensionsBorrowed as_borrowed() const
+
+ Borrow this object for a slightly faster variant with more operations
+
+ See the `Rust documentation for as_borrowed <https://docs.rs/icu/latest/icu/properties/script/struct.ScriptWithExtensions.html#method.as_borrowed>`__ for more information.
+
+ Lifetimes: ``this`` must live at least as long as the output.
+
+
+ .. cpp:function:: CodePointRangeIterator iter_ranges_for_script(uint16_t script) const
+
+ Get a list of ranges of code points that contain this script in their Script_Extensions values
+
+ See the `Rust documentation for get_script_extensions_ranges <https://docs.rs/icu/latest/icu/properties/script/struct.ScriptWithExtensionsBorrowed.html#method.get_script_extensions_ranges>`__ for more information.
+
+ Lifetimes: ``this`` must live at least as long as the output.
+
+
+.. cpp:class:: ICU4XScriptWithExtensionsBorrowed
+
+ A slightly faster ICU4XScriptWithExtensions object
+
+ See the `Rust documentation for ScriptWithExtensionsBorrowed <https://docs.rs/icu/latest/icu/properties/script/struct.ScriptWithExtensionsBorrowed.html>`__ for more information.
+
+
+ .. cpp:function:: uint16_t get_script_val(uint32_t code_point) const
+
+ Get the Script property value for a code point
+
+ See the `Rust documentation for get_script_val <https://docs.rs/icu/latest/icu/properties/script/struct.ScriptWithExtensionsBorrowed.html#method.get_script_val>`__ for more information.
+
+
+ .. cpp:function:: ICU4XScriptExtensionsSet get_script_extensions_val(uint32_t code_point) const
+
+ Get the Script property value for a code point
+
+ See the `Rust documentation for get_script_extensions_val <https://docs.rs/icu/latest/icu/properties/script/struct.ScriptWithExtensionsBorrowed.html#method.get_script_extensions_val>`__ for more information.
+
+ Lifetimes: ``this`` must live at least as long as the output.
+
+
+ .. cpp:function:: bool has_script(uint32_t code_point, uint16_t script) const
+
+ Check if the Script_Extensions property of the given code point covers the given script
+
+ See the `Rust documentation for has_script <https://docs.rs/icu/latest/icu/properties/script/struct.ScriptWithExtensionsBorrowed.html#method.has_script>`__ for more information.
+
+
+ .. cpp:function:: ICU4XCodePointSetData get_script_extensions_set(uint16_t script) const
+
+ Build the CodePointSetData corresponding to a codepoints matching a particular script in their Script_Extensions
+
+ See the `Rust documentation for get_script_extensions_set <https://docs.rs/icu/latest/icu/properties/script/struct.ScriptWithExtensionsBorrowed.html#method.get_script_extensions_set>`__ for more information.
+
diff --git a/intl/icu_capi/cpp/docs/source/segmenter_grapheme_ffi.rst b/intl/icu_capi/cpp/docs/source/segmenter_grapheme_ffi.rst
new file mode 100644
index 0000000000..7af2c10fcd
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/segmenter_grapheme_ffi.rst
@@ -0,0 +1,79 @@
+``segmenter_grapheme::ffi``
+===========================
+
+.. cpp:class:: ICU4XGraphemeClusterBreakIteratorLatin1
+
+ See the `Rust documentation for GraphemeClusterBreakIterator <https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterBreakIterator.html>`__ for more information.
+
+
+ .. cpp:function:: int32_t next()
+
+ Finds the next breakpoint. Returns -1 if at the end of the string or if the index is out of range of a 32-bit signed integer.
+
+ See the `Rust documentation for next <https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterBreakIterator.html#method.next>`__ for more information.
+
+
+.. cpp:class:: ICU4XGraphemeClusterBreakIteratorUtf16
+
+ See the `Rust documentation for GraphemeClusterBreakIterator <https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterBreakIterator.html>`__ for more information.
+
+
+ .. cpp:function:: int32_t next()
+
+ Finds the next breakpoint. Returns -1 if at the end of the string or if the index is out of range of a 32-bit signed integer.
+
+ See the `Rust documentation for next <https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterBreakIterator.html#method.next>`__ for more information.
+
+
+.. cpp:class:: ICU4XGraphemeClusterBreakIteratorUtf8
+
+ See the `Rust documentation for GraphemeClusterBreakIterator <https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterBreakIterator.html>`__ for more information.
+
+
+ .. cpp:function:: int32_t next()
+
+ Finds the next breakpoint. Returns -1 if at the end of the string or if the index is out of range of a 32-bit signed integer.
+
+ See the `Rust documentation for next <https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterBreakIterator.html#method.next>`__ for more information.
+
+
+.. cpp:class:: ICU4XGraphemeClusterSegmenter
+
+ An ICU4X grapheme-cluster-break segmenter, capable of finding grapheme cluster breakpoints in strings.
+
+ See the `Rust documentation for GraphemeClusterSegmenter <https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterSegmenter.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XGraphemeClusterSegmenter, ICU4XError> create(const ICU4XDataProvider& provider)
+
+ Construct an :cpp:class:`ICU4XGraphemeClusterSegmenter`.
+
+ See the `Rust documentation for new <https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterSegmenter.html#method.new>`__ for more information.
+
+
+ .. cpp:function:: ICU4XGraphemeClusterBreakIteratorUtf8 segment_utf8(const std::string_view input) const
+
+ Segments a (potentially ill-formed) UTF-8 string.
+
+ See the `Rust documentation for segment_utf8 <https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterSegmenter.html#method.segment_utf8>`__ for more information.
+
+ Lifetimes: ``this``, ``input`` must live at least as long as the output.
+
+
+ .. cpp:function:: ICU4XGraphemeClusterBreakIteratorUtf16 segment_utf16(const diplomat::span<const uint16_t> input) const
+
+ Segments a UTF-16 string.
+
+ See the `Rust documentation for segment_utf16 <https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterSegmenter.html#method.segment_utf16>`__ for more information.
+
+ Lifetimes: ``this``, ``input`` must live at least as long as the output.
+
+
+ .. cpp:function:: ICU4XGraphemeClusterBreakIteratorLatin1 segment_latin1(const diplomat::span<const uint8_t> input) const
+
+ Segments a Latin-1 string.
+
+ See the `Rust documentation for segment_latin1 <https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterSegmenter.html#method.segment_latin1>`__ for more information.
+
+ Lifetimes: ``this``, ``input`` must live at least as long as the output.
+
diff --git a/intl/icu_capi/cpp/docs/source/segmenter_line_ffi.rst b/intl/icu_capi/cpp/docs/source/segmenter_line_ffi.rst
new file mode 100644
index 0000000000..2d2aa514b1
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/segmenter_line_ffi.rst
@@ -0,0 +1,155 @@
+``segmenter_line::ffi``
+=======================
+
+.. cpp:class:: ICU4XLineBreakIteratorLatin1
+
+ See the `Rust documentation for LineBreakIterator <https://docs.rs/icu/latest/icu/segmenter/struct.LineBreakIterator.html>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/segmenter/type.LineBreakIteratorLatin1.html>`__
+
+
+ .. cpp:function:: int32_t next()
+
+ Finds the next breakpoint. Returns -1 if at the end of the string or if the index is out of range of a 32-bit signed integer.
+
+ See the `Rust documentation for next <https://docs.rs/icu/latest/icu/segmenter/struct.LineBreakIterator.html#method.next>`__ for more information.
+
+
+.. cpp:class:: ICU4XLineBreakIteratorUtf16
+
+ See the `Rust documentation for LineBreakIterator <https://docs.rs/icu/latest/icu/segmenter/struct.LineBreakIterator.html>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/segmenter/type.LineBreakIteratorUtf16.html>`__
+
+
+ .. cpp:function:: int32_t next()
+
+ Finds the next breakpoint. Returns -1 if at the end of the string or if the index is out of range of a 32-bit signed integer.
+
+ See the `Rust documentation for next <https://docs.rs/icu/latest/icu/segmenter/struct.LineBreakIterator.html#method.next>`__ for more information.
+
+
+.. cpp:class:: ICU4XLineBreakIteratorUtf8
+
+ See the `Rust documentation for LineBreakIterator <https://docs.rs/icu/latest/icu/segmenter/struct.LineBreakIterator.html>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/segmenter/type.LineBreakIteratorPotentiallyIllFormedUtf8.html>`__
+
+
+ .. cpp:function:: int32_t next()
+
+ Finds the next breakpoint. Returns -1 if at the end of the string or if the index is out of range of a 32-bit signed integer.
+
+ See the `Rust documentation for next <https://docs.rs/icu/latest/icu/segmenter/struct.LineBreakIterator.html#method.next>`__ for more information.
+
+
+.. cpp:struct:: ICU4XLineBreakOptionsV1
+
+ See the `Rust documentation for LineBreakOptions <https://docs.rs/icu/latest/icu/segmenter/struct.LineBreakOptions.html>`__ for more information.
+
+
+ .. cpp:member:: ICU4XLineBreakStrictness strictness
+
+ .. cpp:member:: ICU4XLineBreakWordOption word_option
+
+ .. cpp:member:: bool ja_zh
+
+.. cpp:enum-struct:: ICU4XLineBreakStrictness
+
+ See the `Rust documentation for LineBreakStrictness <https://docs.rs/icu/latest/icu/segmenter/enum.LineBreakStrictness.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Loose
+
+ .. cpp:enumerator:: Normal
+
+ .. cpp:enumerator:: Strict
+
+ .. cpp:enumerator:: Anywhere
+
+.. cpp:enum-struct:: ICU4XLineBreakWordOption
+
+ See the `Rust documentation for LineBreakWordOption <https://docs.rs/icu/latest/icu/segmenter/enum.LineBreakWordOption.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Normal
+
+ .. cpp:enumerator:: BreakAll
+
+ .. cpp:enumerator:: KeepAll
+
+.. cpp:class:: ICU4XLineSegmenter
+
+ An ICU4X line-break segmenter, capable of finding breakpoints in strings.
+
+ See the `Rust documentation for LineSegmenter <https://docs.rs/icu/latest/icu/segmenter/struct.LineSegmenter.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XLineSegmenter, ICU4XError> create_auto(const ICU4XDataProvider& provider)
+
+ Construct a :cpp:class:`ICU4XLineSegmenter` with default options. It automatically loads the best available payload data for Burmese, Khmer, Lao, and Thai.
+
+ See the `Rust documentation for new_auto <https://docs.rs/icu/latest/icu/segmenter/struct.LineSegmenter.html#method.new_auto>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XLineSegmenter, ICU4XError> create_lstm(const ICU4XDataProvider& provider)
+
+ Construct a :cpp:class:`ICU4XLineSegmenter` with default options and LSTM payload data for Burmese, Khmer, Lao, and Thai.
+
+ See the `Rust documentation for new_lstm <https://docs.rs/icu/latest/icu/segmenter/struct.LineSegmenter.html#method.new_lstm>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XLineSegmenter, ICU4XError> create_dictionary(const ICU4XDataProvider& provider)
+
+ Construct a :cpp:class:`ICU4XLineSegmenter` with default options and dictionary payload data for Burmese, Khmer, Lao, and Thai..
+
+ See the `Rust documentation for new_dictionary <https://docs.rs/icu/latest/icu/segmenter/struct.LineSegmenter.html#method.new_dictionary>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XLineSegmenter, ICU4XError> create_auto_with_options_v1(const ICU4XDataProvider& provider, ICU4XLineBreakOptionsV1 options)
+
+ Construct a :cpp:class:`ICU4XLineSegmenter` with custom options. It automatically loads the best available payload data for Burmese, Khmer, Lao, and Thai.
+
+ See the `Rust documentation for new_auto_with_options <https://docs.rs/icu/latest/icu/segmenter/struct.LineSegmenter.html#method.new_auto_with_options>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XLineSegmenter, ICU4XError> create_lstm_with_options_v1(const ICU4XDataProvider& provider, ICU4XLineBreakOptionsV1 options)
+
+ Construct a :cpp:class:`ICU4XLineSegmenter` with custom options and LSTM payload data for Burmese, Khmer, Lao, and Thai.
+
+ See the `Rust documentation for new_lstm_with_options <https://docs.rs/icu/latest/icu/segmenter/struct.LineSegmenter.html#method.new_lstm_with_options>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XLineSegmenter, ICU4XError> create_dictionary_with_options_v1(const ICU4XDataProvider& provider, ICU4XLineBreakOptionsV1 options)
+
+ Construct a :cpp:class:`ICU4XLineSegmenter` with custom options and dictionary payload data for Burmese, Khmer, Lao, and Thai.
+
+ See the `Rust documentation for new_dictionary_with_options <https://docs.rs/icu/latest/icu/segmenter/struct.LineSegmenter.html#method.new_dictionary_with_options>`__ for more information.
+
+
+ .. cpp:function:: ICU4XLineBreakIteratorUtf8 segment_utf8(const std::string_view input) const
+
+ Segments a (potentially ill-formed) UTF-8 string.
+
+ See the `Rust documentation for segment_utf8 <https://docs.rs/icu/latest/icu/segmenter/struct.LineSegmenter.html#method.segment_utf8>`__ for more information.
+
+ Lifetimes: ``this``, ``input`` must live at least as long as the output.
+
+
+ .. cpp:function:: ICU4XLineBreakIteratorUtf16 segment_utf16(const diplomat::span<const uint16_t> input) const
+
+ Segments a UTF-16 string.
+
+ See the `Rust documentation for segment_utf16 <https://docs.rs/icu/latest/icu/segmenter/struct.LineSegmenter.html#method.segment_utf16>`__ for more information.
+
+ Lifetimes: ``this``, ``input`` must live at least as long as the output.
+
+
+ .. cpp:function:: ICU4XLineBreakIteratorLatin1 segment_latin1(const diplomat::span<const uint8_t> input) const
+
+ Segments a Latin-1 string.
+
+ See the `Rust documentation for segment_latin1 <https://docs.rs/icu/latest/icu/segmenter/struct.LineSegmenter.html#method.segment_latin1>`__ for more information.
+
+ Lifetimes: ``this``, ``input`` must live at least as long as the output.
+
diff --git a/intl/icu_capi/cpp/docs/source/segmenter_sentence_ffi.rst b/intl/icu_capi/cpp/docs/source/segmenter_sentence_ffi.rst
new file mode 100644
index 0000000000..1d10fdcf4a
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/segmenter_sentence_ffi.rst
@@ -0,0 +1,79 @@
+``segmenter_sentence::ffi``
+===========================
+
+.. cpp:class:: ICU4XSentenceBreakIteratorLatin1
+
+ See the `Rust documentation for SentenceBreakIterator <https://docs.rs/icu/latest/icu/segmenter/struct.SentenceBreakIterator.html>`__ for more information.
+
+
+ .. cpp:function:: int32_t next()
+
+ Finds the next breakpoint. Returns -1 if at the end of the string or if the index is out of range of a 32-bit signed integer.
+
+ See the `Rust documentation for next <https://docs.rs/icu/latest/icu/segmenter/struct.SentenceBreakIterator.html#method.next>`__ for more information.
+
+
+.. cpp:class:: ICU4XSentenceBreakIteratorUtf16
+
+ See the `Rust documentation for SentenceBreakIterator <https://docs.rs/icu/latest/icu/segmenter/struct.SentenceBreakIterator.html>`__ for more information.
+
+
+ .. cpp:function:: int32_t next()
+
+ Finds the next breakpoint. Returns -1 if at the end of the string or if the index is out of range of a 32-bit signed integer.
+
+ See the `Rust documentation for next <https://docs.rs/icu/latest/icu/segmenter/struct.SentenceBreakIterator.html#method.next>`__ for more information.
+
+
+.. cpp:class:: ICU4XSentenceBreakIteratorUtf8
+
+ See the `Rust documentation for SentenceBreakIterator <https://docs.rs/icu/latest/icu/segmenter/struct.SentenceBreakIterator.html>`__ for more information.
+
+
+ .. cpp:function:: int32_t next()
+
+ Finds the next breakpoint. Returns -1 if at the end of the string or if the index is out of range of a 32-bit signed integer.
+
+ See the `Rust documentation for next <https://docs.rs/icu/latest/icu/segmenter/struct.SentenceBreakIterator.html#method.next>`__ for more information.
+
+
+.. cpp:class:: ICU4XSentenceSegmenter
+
+ An ICU4X sentence-break segmenter, capable of finding sentence breakpoints in strings.
+
+ See the `Rust documentation for SentenceSegmenter <https://docs.rs/icu/latest/icu/segmenter/struct.SentenceSegmenter.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XSentenceSegmenter, ICU4XError> create(const ICU4XDataProvider& provider)
+
+ Construct an :cpp:class:`ICU4XSentenceSegmenter`.
+
+ See the `Rust documentation for new <https://docs.rs/icu/latest/icu/segmenter/struct.SentenceSegmenter.html#method.new>`__ for more information.
+
+
+ .. cpp:function:: ICU4XSentenceBreakIteratorUtf8 segment_utf8(const std::string_view input) const
+
+ Segments a (potentially ill-formed) UTF-8 string.
+
+ See the `Rust documentation for segment_utf8 <https://docs.rs/icu/latest/icu/segmenter/struct.SentenceSegmenter.html#method.segment_utf8>`__ for more information.
+
+ Lifetimes: ``this``, ``input`` must live at least as long as the output.
+
+
+ .. cpp:function:: ICU4XSentenceBreakIteratorUtf16 segment_utf16(const diplomat::span<const uint16_t> input) const
+
+ Segments a UTF-16 string.
+
+ See the `Rust documentation for segment_utf16 <https://docs.rs/icu/latest/icu/segmenter/struct.SentenceSegmenter.html#method.segment_utf16>`__ for more information.
+
+ Lifetimes: ``this``, ``input`` must live at least as long as the output.
+
+
+ .. cpp:function:: ICU4XSentenceBreakIteratorLatin1 segment_latin1(const diplomat::span<const uint8_t> input) const
+
+ Segments a Latin-1 string.
+
+ See the `Rust documentation for segment_latin1 <https://docs.rs/icu/latest/icu/segmenter/struct.SentenceSegmenter.html#method.segment_latin1>`__ for more information.
+
+ Lifetimes: ``this``, ``input`` must live at least as long as the output.
+
diff --git a/intl/icu_capi/cpp/docs/source/segmenter_word_ffi.rst b/intl/icu_capi/cpp/docs/source/segmenter_word_ffi.rst
new file mode 100644
index 0000000000..fc9cbe1494
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/segmenter_word_ffi.rst
@@ -0,0 +1,150 @@
+``segmenter_word::ffi``
+=======================
+
+.. cpp:enum-struct:: ICU4XSegmenterWordType
+
+ See the `Rust documentation for WordType <https://docs.rs/icu/latest/icu/segmenter/enum.WordType.html>`__ for more information.
+
+
+ .. cpp:enumerator:: None
+
+ .. cpp:enumerator:: Number
+
+ .. cpp:enumerator:: Letter
+
+.. cpp:class:: ICU4XWordBreakIteratorLatin1
+
+ See the `Rust documentation for WordBreakIterator <https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html>`__ for more information.
+
+
+ .. cpp:function:: int32_t next()
+
+ Finds the next breakpoint. Returns -1 if at the end of the string or if the index is out of range of a 32-bit signed integer.
+
+ See the `Rust documentation for next <https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html#method.next>`__ for more information.
+
+
+ .. cpp:function:: ICU4XSegmenterWordType word_type() const
+
+ Return the status value of break boundary.
+
+ See the `Rust documentation for word_type <https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html#method.word_type>`__ for more information.
+
+
+ .. cpp:function:: bool is_word_like() const
+
+ Return true when break boundary is word-like such as letter/number/CJK
+
+ See the `Rust documentation for is_word_like <https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html#method.is_word_like>`__ for more information.
+
+
+.. cpp:class:: ICU4XWordBreakIteratorUtf16
+
+ See the `Rust documentation for WordBreakIterator <https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html>`__ for more information.
+
+
+ .. cpp:function:: int32_t next()
+
+ Finds the next breakpoint. Returns -1 if at the end of the string or if the index is out of range of a 32-bit signed integer.
+
+ See the `Rust documentation for next <https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html#method.next>`__ for more information.
+
+
+ .. cpp:function:: ICU4XSegmenterWordType word_type() const
+
+ Return the status value of break boundary.
+
+ See the `Rust documentation for word_type <https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html#method.word_type>`__ for more information.
+
+
+ .. cpp:function:: bool is_word_like() const
+
+ Return true when break boundary is word-like such as letter/number/CJK
+
+ See the `Rust documentation for is_word_like <https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html#method.is_word_like>`__ for more information.
+
+
+.. cpp:class:: ICU4XWordBreakIteratorUtf8
+
+ See the `Rust documentation for WordBreakIterator <https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html>`__ for more information.
+
+
+ .. cpp:function:: int32_t next()
+
+ Finds the next breakpoint. Returns -1 if at the end of the string or if the index is out of range of a 32-bit signed integer.
+
+ See the `Rust documentation for next <https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html#method.next>`__ for more information.
+
+
+ .. cpp:function:: ICU4XSegmenterWordType word_type() const
+
+ Return the status value of break boundary.
+
+ See the `Rust documentation for word_type <https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html#method.word_type>`__ for more information.
+
+
+ .. cpp:function:: bool is_word_like() const
+
+ Return true when break boundary is word-like such as letter/number/CJK
+
+ See the `Rust documentation for is_word_like <https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html#method.is_word_like>`__ for more information.
+
+
+.. cpp:class:: ICU4XWordSegmenter
+
+ An ICU4X word-break segmenter, capable of finding word breakpoints in strings.
+
+ See the `Rust documentation for WordSegmenter <https://docs.rs/icu/latest/icu/segmenter/struct.WordSegmenter.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XWordSegmenter, ICU4XError> create_auto(const ICU4XDataProvider& provider)
+
+ Construct an :cpp:class:`ICU4XWordSegmenter` with automatically selecting the best available LSTM or dictionary payload data.
+
+ Note: currently, it uses dictionary for Chinese and Japanese, and LSTM for Burmese, Khmer, Lao, and Thai.
+
+ See the `Rust documentation for new_auto <https://docs.rs/icu/latest/icu/segmenter/struct.WordSegmenter.html#method.new_auto>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XWordSegmenter, ICU4XError> create_lstm(const ICU4XDataProvider& provider)
+
+ Construct an :cpp:class:`ICU4XWordSegmenter` with LSTM payload data for Burmese, Khmer, Lao, and Thai.
+
+ Warning: :cpp:class:`ICU4XWordSegmenter` created by this function doesn't handle Chinese or Japanese.
+
+ See the `Rust documentation for new_lstm <https://docs.rs/icu/latest/icu/segmenter/struct.WordSegmenter.html#method.new_lstm>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XWordSegmenter, ICU4XError> create_dictionary(const ICU4XDataProvider& provider)
+
+ Construct an :cpp:class:`ICU4XWordSegmenter` with dictionary payload data for Chinese, Japanese, Burmese, Khmer, Lao, and Thai.
+
+ See the `Rust documentation for new_dictionary <https://docs.rs/icu/latest/icu/segmenter/struct.WordSegmenter.html#method.new_dictionary>`__ for more information.
+
+
+ .. cpp:function:: ICU4XWordBreakIteratorUtf8 segment_utf8(const std::string_view input) const
+
+ Segments a (potentially ill-formed) UTF-8 string.
+
+ See the `Rust documentation for segment_utf8 <https://docs.rs/icu/latest/icu/segmenter/struct.WordSegmenter.html#method.segment_utf8>`__ for more information.
+
+ Lifetimes: ``this``, ``input`` must live at least as long as the output.
+
+
+ .. cpp:function:: ICU4XWordBreakIteratorUtf16 segment_utf16(const diplomat::span<const uint16_t> input) const
+
+ Segments a UTF-16 string.
+
+ See the `Rust documentation for segment_utf16 <https://docs.rs/icu/latest/icu/segmenter/struct.WordSegmenter.html#method.segment_utf16>`__ for more information.
+
+ Lifetimes: ``this``, ``input`` must live at least as long as the output.
+
+
+ .. cpp:function:: ICU4XWordBreakIteratorLatin1 segment_latin1(const diplomat::span<const uint8_t> input) const
+
+ Segments a Latin-1 string.
+
+ See the `Rust documentation for segment_latin1 <https://docs.rs/icu/latest/icu/segmenter/struct.WordSegmenter.html#method.segment_latin1>`__ for more information.
+
+ Lifetimes: ``this``, ``input`` must live at least as long as the output.
+
diff --git a/intl/icu_capi/cpp/docs/source/time_ffi.rst b/intl/icu_capi/cpp/docs/source/time_ffi.rst
new file mode 100644
index 0000000000..173a309e24
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/time_ffi.rst
@@ -0,0 +1,51 @@
+``time::ffi``
+=============
+
+.. cpp:class:: ICU4XTime
+
+ An ICU4X Time object representing a time in terms of hour, minute, second, nanosecond
+
+ See the `Rust documentation for Time <https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XTime, ICU4XError> create(uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond)
+
+ Creates a new :cpp:class:`ICU4XTime` given field values
+
+ See the `Rust documentation for Time <https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XTime, ICU4XError> create_midnight()
+
+ Creates a new :cpp:class:`ICU4XTime` representing midnight (00:00.000).
+
+ See the `Rust documentation for Time <https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html>`__ for more information.
+
+
+ .. cpp:function:: uint8_t hour() const
+
+ Returns the hour in this time
+
+ See the `Rust documentation for hour <https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.hour>`__ for more information.
+
+
+ .. cpp:function:: uint8_t minute() const
+
+ Returns the minute in this time
+
+ See the `Rust documentation for minute <https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.minute>`__ for more information.
+
+
+ .. cpp:function:: uint8_t second() const
+
+ Returns the second in this time
+
+ See the `Rust documentation for second <https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.second>`__ for more information.
+
+
+ .. cpp:function:: uint32_t nanosecond() const
+
+ Returns the nanosecond in this time
+
+ See the `Rust documentation for nanosecond <https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.nanosecond>`__ for more information.
+
diff --git a/intl/icu_capi/cpp/docs/source/timezone_ffi.rst b/intl/icu_capi/cpp/docs/source/timezone_ffi.rst
new file mode 100644
index 0000000000..ee94c03524
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/timezone_ffi.rst
@@ -0,0 +1,279 @@
+``timezone::ffi``
+=================
+
+.. cpp:class:: ICU4XCustomTimeZone
+
+ See the `Rust documentation for CustomTimeZone <https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XCustomTimeZone, ICU4XError> create_from_string(const std::string_view s)
+
+ Creates a time zone from an offset string.
+
+ See the `Rust documentation for from_str <https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#method.from_str>`__ for more information.
+
+
+ .. cpp:function:: static ICU4XCustomTimeZone create_empty()
+
+ Creates a time zone with no information.
+
+ See the `Rust documentation for new_empty <https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#method.new_empty>`__ for more information.
+
+
+ .. cpp:function:: static ICU4XCustomTimeZone create_utc()
+
+ Creates a time zone for UTC.
+
+ See the `Rust documentation for utc <https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#method.utc>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::monostate, ICU4XError> try_set_gmt_offset_seconds(int32_t offset_seconds)
+
+ Sets the ``gmt_offset`` field from offset seconds.
+
+ Errors if the offset seconds are out of range.
+
+ See the `Rust documentation for try_from_offset_seconds <https://docs.rs/icu/latest/icu/timezone/struct.GmtOffset.html#method.try_from_offset_seconds>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/timezone/struct.GmtOffset.html>`__
+
+
+ .. cpp:function:: void clear_gmt_offset()
+
+ Clears the ``gmt_offset`` field.
+
+ See the `Rust documentation for offset_seconds <https://docs.rs/icu/latest/icu/timezone/struct.GmtOffset.html#method.offset_seconds>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/timezone/struct.GmtOffset.html>`__
+
+
+ .. cpp:function:: diplomat::result<int32_t, ICU4XError> gmt_offset_seconds() const
+
+ Returns the value of the ``gmt_offset`` field as offset seconds.
+
+ Errors if the ``gmt_offset`` field is empty.
+
+ See the `Rust documentation for offset_seconds <https://docs.rs/icu/latest/icu/timezone/struct.GmtOffset.html#method.offset_seconds>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/timezone/struct.GmtOffset.html>`__
+
+
+ .. cpp:function:: diplomat::result<bool, ICU4XError> is_gmt_offset_positive() const
+
+ Returns whether the ``gmt_offset`` field is positive.
+
+ Errors if the ``gmt_offset`` field is empty.
+
+ See the `Rust documentation for is_positive <https://docs.rs/icu/latest/icu/timezone/struct.GmtOffset.html#method.is_positive>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<bool, ICU4XError> is_gmt_offset_zero() const
+
+ Returns whether the ``gmt_offset`` field is zero.
+
+ Errors if the ``gmt_offset`` field is empty (which is not the same as zero).
+
+ See the `Rust documentation for is_zero <https://docs.rs/icu/latest/icu/timezone/struct.GmtOffset.html#method.is_zero>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<bool, ICU4XError> gmt_offset_has_minutes() const
+
+ Returns whether the ``gmt_offset`` field has nonzero minutes.
+
+ Errors if the ``gmt_offset`` field is empty.
+
+ See the `Rust documentation for has_minutes <https://docs.rs/icu/latest/icu/timezone/struct.GmtOffset.html#method.has_minutes>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<bool, ICU4XError> gmt_offset_has_seconds() const
+
+ Returns whether the ``gmt_offset`` field has nonzero seconds.
+
+ Errors if the ``gmt_offset`` field is empty.
+
+ See the `Rust documentation for has_seconds <https://docs.rs/icu/latest/icu/timezone/struct.GmtOffset.html#method.has_seconds>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::monostate, ICU4XError> try_set_time_zone_id(const std::string_view id)
+
+ Sets the ``time_zone_id`` field from a BCP-47 string.
+
+ Errors if the string is not a valid BCP-47 time zone ID.
+
+ See the `Rust documentation for time_zone_id <https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.time_zone_id>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/timezone/struct.TimeZoneBcp47Id.html>`__
+
+
+ .. cpp:function:: diplomat::result<std::monostate, ICU4XError> try_set_iana_time_zone_id(const ICU4XIanaToBcp47Mapper& mapper, const std::string_view id)
+
+ Sets the ``time_zone_id`` field from an IANA string by looking up the corresponding BCP-47 string.
+
+ Errors if the string is not a valid BCP-47 time zone ID.
+
+ See the `Rust documentation for get <https://docs.rs/icu/latest/icu/timezone/struct.IanaToBcp47MapperBorrowed.html#method.get>`__ for more information.
+
+
+ .. cpp:function:: void clear_time_zone_id()
+
+ Clears the ``time_zone_id`` field.
+
+ See the `Rust documentation for time_zone_id <https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.time_zone_id>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/timezone/struct.TimeZoneBcp47Id.html>`__
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> time_zone_id_to_writeable(W& write) const
+
+ Writes the value of the ``time_zone_id`` field as a string.
+
+ Errors if the ``time_zone_id`` field is empty.
+
+ See the `Rust documentation for time_zone_id <https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.time_zone_id>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/timezone/struct.TimeZoneBcp47Id.html>`__
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> time_zone_id() const
+
+ Writes the value of the ``time_zone_id`` field as a string.
+
+ Errors if the ``time_zone_id`` field is empty.
+
+ See the `Rust documentation for time_zone_id <https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.time_zone_id>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/timezone/struct.TimeZoneBcp47Id.html>`__
+
+
+ .. cpp:function:: diplomat::result<std::monostate, ICU4XError> try_set_metazone_id(const std::string_view id)
+
+ Sets the ``metazone_id`` field from a string.
+
+ Errors if the string is not a valid BCP-47 metazone ID.
+
+ See the `Rust documentation for metazone_id <https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.metazone_id>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/timezone/struct.MetazoneId.html>`__
+
+
+ .. cpp:function:: void clear_metazone_id()
+
+ Clears the ``metazone_id`` field.
+
+ See the `Rust documentation for metazone_id <https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.metazone_id>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/timezone/struct.MetazoneId.html>`__
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> metazone_id_to_writeable(W& write) const
+
+ Writes the value of the ``metazone_id`` field as a string.
+
+ Errors if the ``metazone_id`` field is empty.
+
+ See the `Rust documentation for metazone_id <https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.metazone_id>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/timezone/struct.MetazoneId.html>`__
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> metazone_id() const
+
+ Writes the value of the ``metazone_id`` field as a string.
+
+ Errors if the ``metazone_id`` field is empty.
+
+ See the `Rust documentation for metazone_id <https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.metazone_id>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/timezone/struct.MetazoneId.html>`__
+
+
+ .. cpp:function:: diplomat::result<std::monostate, ICU4XError> try_set_zone_variant(const std::string_view id)
+
+ Sets the ``zone_variant`` field from a string.
+
+ Errors if the string is not a valid zone variant.
+
+ See the `Rust documentation for zone_variant <https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.zone_variant>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/timezone/struct.ZoneVariant.html>`__
+
+
+ .. cpp:function:: void clear_zone_variant()
+
+ Clears the ``zone_variant`` field.
+
+ See the `Rust documentation for zone_variant <https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.zone_variant>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/timezone/struct.ZoneVariant.html>`__
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> zone_variant_to_writeable(W& write) const
+
+ Writes the value of the ``zone_variant`` field as a string.
+
+ Errors if the ``zone_variant`` field is empty.
+
+ See the `Rust documentation for zone_variant <https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.zone_variant>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/timezone/struct.ZoneVariant.html>`__
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> zone_variant() const
+
+ Writes the value of the ``zone_variant`` field as a string.
+
+ Errors if the ``zone_variant`` field is empty.
+
+ See the `Rust documentation for zone_variant <https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.zone_variant>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/timezone/struct.ZoneVariant.html>`__
+
+
+ .. cpp:function:: void set_standard_time()
+
+ Sets the ``zone_variant`` field to standard time.
+
+ See the `Rust documentation for standard <https://docs.rs/icu/latest/icu/timezone/struct.ZoneVariant.html#method.standard>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.zone_variant>`__
+
+
+ .. cpp:function:: void set_daylight_time()
+
+ Sets the ``zone_variant`` field to daylight time.
+
+ See the `Rust documentation for daylight <https://docs.rs/icu/latest/icu/timezone/struct.ZoneVariant.html#method.daylight>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.zone_variant>`__
+
+
+ .. cpp:function:: diplomat::result<bool, ICU4XError> is_standard_time() const
+
+ Returns whether the ``zone_variant`` field is standard time.
+
+ Errors if the ``zone_variant`` field is empty.
+
+ See the `Rust documentation for standard <https://docs.rs/icu/latest/icu/timezone/struct.ZoneVariant.html#method.standard>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.zone_variant>`__
+
+
+ .. cpp:function:: diplomat::result<bool, ICU4XError> is_daylight_time() const
+
+ Returns whether the ``zone_variant`` field is daylight time.
+
+ Errors if the ``zone_variant`` field is empty.
+
+ See the `Rust documentation for daylight <https://docs.rs/icu/latest/icu/timezone/struct.ZoneVariant.html#method.daylight>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.zone_variant>`__
+
+
+ .. cpp:function:: void maybe_calculate_metazone(const ICU4XMetazoneCalculator& metazone_calculator, const ICU4XIsoDateTime& local_datetime)
+
+ Sets the metazone based on the time zone and the local timestamp.
+
+ See the `Rust documentation for maybe_calculate_metazone <https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#method.maybe_calculate_metazone>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/timezone/struct.MetazoneCalculator.html#method.compute_metazone_from_time_zone>`__
+
diff --git a/intl/icu_capi/cpp/docs/source/timezone_formatter_ffi.rst b/intl/icu_capi/cpp/docs/source/timezone_formatter_ffi.rst
new file mode 100644
index 0000000000..38e2107b41
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/timezone_formatter_ffi.rst
@@ -0,0 +1,137 @@
+``timezone_formatter::ffi``
+===========================
+
+.. cpp:enum-struct:: ICU4XIsoTimeZoneFormat
+
+ See the `Rust documentation for IsoFormat <https://docs.rs/icu/latest/icu/datetime/time_zone/enum.IsoFormat.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Basic
+
+ .. cpp:enumerator:: Extended
+
+ .. cpp:enumerator:: UtcBasic
+
+ .. cpp:enumerator:: UtcExtended
+
+.. cpp:enum-struct:: ICU4XIsoTimeZoneMinuteDisplay
+
+ See the `Rust documentation for IsoMinutes <https://docs.rs/icu/latest/icu/datetime/time_zone/enum.IsoMinutes.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Required
+
+ .. cpp:enumerator:: Optional
+
+.. cpp:struct:: ICU4XIsoTimeZoneOptions
+
+ .. cpp:member:: ICU4XIsoTimeZoneFormat format
+
+ .. cpp:member:: ICU4XIsoTimeZoneMinuteDisplay minutes
+
+ .. cpp:member:: ICU4XIsoTimeZoneSecondDisplay seconds
+
+.. cpp:enum-struct:: ICU4XIsoTimeZoneSecondDisplay
+
+ See the `Rust documentation for IsoSeconds <https://docs.rs/icu/latest/icu/datetime/time_zone/enum.IsoSeconds.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Optional
+
+ .. cpp:enumerator:: Never
+
+.. cpp:class:: ICU4XTimeZoneFormatter
+
+ An ICU4X TimeZoneFormatter object capable of formatting an :cpp:class:`ICU4XCustomTimeZone` type (and others) as a string
+
+ See the `Rust documentation for TimeZoneFormatter <https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XTimeZoneFormatter, ICU4XError> create_with_localized_gmt_fallback(const ICU4XDataProvider& provider, const ICU4XLocale& locale)
+
+ Creates a new :cpp:class:`ICU4XTimeZoneFormatter` from locale data.
+
+ Uses localized GMT as the fallback format.
+
+ See the `Rust documentation for try_new <https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.try_new>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/datetime/time_zone/enum.FallbackFormat.html>`__
+
+
+ .. cpp:function:: static diplomat::result<ICU4XTimeZoneFormatter, ICU4XError> create_with_iso_8601_fallback(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XIsoTimeZoneOptions options)
+
+ Creates a new :cpp:class:`ICU4XTimeZoneFormatter` from locale data.
+
+ Uses ISO-8601 as the fallback format.
+
+ See the `Rust documentation for try_new <https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.try_new>`__ for more information.
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/datetime/time_zone/enum.FallbackFormat.html>`__
+
+
+ .. cpp:function:: diplomat::result<std::monostate, ICU4XError> load_generic_non_location_long(const ICU4XDataProvider& provider)
+
+ Loads generic non-location long format. Example: "Pacific Time"
+
+ See the `Rust documentation for include_generic_non_location_long <https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.include_generic_non_location_long>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::monostate, ICU4XError> load_generic_non_location_short(const ICU4XDataProvider& provider)
+
+ Loads generic non-location short format. Example: "PT"
+
+ See the `Rust documentation for include_generic_non_location_short <https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.include_generic_non_location_short>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::monostate, ICU4XError> load_specific_non_location_long(const ICU4XDataProvider& provider)
+
+ Loads specific non-location long format. Example: "Pacific Standard Time"
+
+ See the `Rust documentation for include_specific_non_location_long <https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.include_specific_non_location_long>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::monostate, ICU4XError> load_specific_non_location_short(const ICU4XDataProvider& provider)
+
+ Loads specific non-location short format. Example: "PST"
+
+ See the `Rust documentation for include_specific_non_location_short <https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.include_specific_non_location_short>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::monostate, ICU4XError> load_generic_location_format(const ICU4XDataProvider& provider)
+
+ Loads generic location format. Example: "Los Angeles Time"
+
+ See the `Rust documentation for include_generic_location_format <https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.include_generic_location_format>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::monostate, ICU4XError> include_localized_gmt_format()
+
+ Loads localized GMT format. Example: "GMT-07:00"
+
+ See the `Rust documentation for include_localized_gmt_format <https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.include_localized_gmt_format>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::monostate, ICU4XError> load_iso_8601_format(ICU4XIsoTimeZoneOptions options)
+
+ Loads ISO-8601 format. Example: "-07:00"
+
+ See the `Rust documentation for include_iso_8601_format <https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.include_iso_8601_format>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> format_custom_time_zone_to_writeable(const ICU4XCustomTimeZone& value, W& write) const
+
+ Formats a :cpp:class:`ICU4XCustomTimeZone` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.format>`__ for more information.
+
+ See the `Rust documentation for format_to_string <https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.format_to_string>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> format_custom_time_zone(const ICU4XCustomTimeZone& value) const
+
+ Formats a :cpp:class:`ICU4XCustomTimeZone` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.format>`__ for more information.
+
+ See the `Rust documentation for format_to_string <https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.format_to_string>`__ for more information.
+
diff --git a/intl/icu_capi/cpp/docs/source/week_ffi.rst b/intl/icu_capi/cpp/docs/source/week_ffi.rst
new file mode 100644
index 0000000000..b07f8f7c7c
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/week_ffi.rst
@@ -0,0 +1,55 @@
+``week::ffi``
+=============
+
+.. cpp:class:: ICU4XWeekCalculator
+
+ A Week calculator, useful to be passed in to ``week_of_year()`` on Date and DateTime types
+
+ See the `Rust documentation for WeekCalculator <https://docs.rs/icu/latest/icu/calendar/week/struct.WeekCalculator.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XWeekCalculator, ICU4XError> create(const ICU4XDataProvider& provider, const ICU4XLocale& locale)
+
+ Creates a new :cpp:class:`ICU4XWeekCalculator` from locale data.
+
+ See the `Rust documentation for try_new <https://docs.rs/icu/latest/icu/calendar/week/struct.WeekCalculator.html#method.try_new>`__ for more information.
+
+
+ .. cpp:function:: static ICU4XWeekCalculator create_from_first_day_of_week_and_min_week_days(ICU4XIsoWeekday first_weekday, uint8_t min_week_days)
+
+ Additional information: `1 <https://docs.rs/icu/latest/icu/calendar/week/struct.WeekCalculator.html#structfield.first_weekday>`__, `2 <https://docs.rs/icu/latest/icu/calendar/week/struct.WeekCalculator.html#structfield.min_week_days>`__
+
+
+ .. cpp:function:: ICU4XIsoWeekday first_weekday() const
+
+ Returns the weekday that starts the week for this object's locale
+
+ See the `Rust documentation for first_weekday <https://docs.rs/icu/latest/icu/calendar/week/struct.WeekCalculator.html#structfield.first_weekday>`__ for more information.
+
+
+ .. cpp:function:: uint8_t min_week_days() const
+
+ The minimum number of days overlapping a year required for a week to be considered part of that year
+
+ See the `Rust documentation for min_week_days <https://docs.rs/icu/latest/icu/calendar/week/struct.WeekCalculator.html#structfield.min_week_days>`__ for more information.
+
+
+.. cpp:struct:: ICU4XWeekOf
+
+ See the `Rust documentation for WeekOf <https://docs.rs/icu/latest/icu/calendar/week/struct.WeekOf.html>`__ for more information.
+
+
+ .. cpp:member:: uint16_t week
+
+ .. cpp:member:: ICU4XWeekRelativeUnit unit
+
+.. cpp:enum-struct:: ICU4XWeekRelativeUnit
+
+ See the `Rust documentation for RelativeUnit <https://docs.rs/icu/latest/icu/calendar/week/enum.RelativeUnit.html>`__ for more information.
+
+
+ .. cpp:enumerator:: Previous
+
+ .. cpp:enumerator:: Current
+
+ .. cpp:enumerator:: Next
diff --git a/intl/icu_capi/cpp/docs/source/zoned_formatter_ffi.rst b/intl/icu_capi/cpp/docs/source/zoned_formatter_ffi.rst
new file mode 100644
index 0000000000..9523798307
--- /dev/null
+++ b/intl/icu_capi/cpp/docs/source/zoned_formatter_ffi.rst
@@ -0,0 +1,94 @@
+``zoned_formatter::ffi``
+========================
+
+.. cpp:class:: ICU4XGregorianZonedDateTimeFormatter
+
+ An object capable of formatting a date time with time zone to a string.
+
+ See the `Rust documentation for TypedZonedDateTimeFormatter <https://docs.rs/icu/latest/icu/datetime/struct.TypedZonedDateTimeFormatter.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XGregorianZonedDateTimeFormatter, ICU4XError> create_with_lengths(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength date_length, ICU4XTimeLength time_length)
+
+ Creates a new :cpp:class:`ICU4XGregorianZonedDateTimeFormatter` from locale data.
+
+ This function has ``date_length`` and ``time_length`` arguments and uses default options for the time zone.
+
+ See the `Rust documentation for try_new <https://docs.rs/icu/latest/icu/datetime/struct.TypedZonedDateTimeFormatter.html#method.try_new>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XGregorianZonedDateTimeFormatter, ICU4XError> create_with_lengths_and_iso_8601_time_zone_fallback(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength date_length, ICU4XTimeLength time_length, ICU4XIsoTimeZoneOptions zone_options)
+
+ Creates a new :cpp:class:`ICU4XGregorianZonedDateTimeFormatter` from locale data.
+
+ This function has ``date_length`` and ``time_length`` arguments and uses an ISO-8601 style fallback for the time zone with the given configurations.
+
+ See the `Rust documentation for try_new <https://docs.rs/icu/latest/icu/datetime/struct.TypedZonedDateTimeFormatter.html#method.try_new>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> format_iso_datetime_with_custom_time_zone_to_writeable(const ICU4XIsoDateTime& datetime, const ICU4XCustomTimeZone& time_zone, W& write) const
+
+ Formats a :cpp:class:`ICU4XIsoDateTime` and :cpp:class:`ICU4XCustomTimeZone` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.TypedZonedDateTimeFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> format_iso_datetime_with_custom_time_zone(const ICU4XIsoDateTime& datetime, const ICU4XCustomTimeZone& time_zone) const
+
+ Formats a :cpp:class:`ICU4XIsoDateTime` and :cpp:class:`ICU4XCustomTimeZone` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.TypedZonedDateTimeFormatter.html#method.format>`__ for more information.
+
+
+.. cpp:class:: ICU4XZonedDateTimeFormatter
+
+ An object capable of formatting a date time with time zone to a string.
+
+ See the `Rust documentation for ZonedDateTimeFormatter <https://docs.rs/icu/latest/icu/datetime/struct.ZonedDateTimeFormatter.html>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XZonedDateTimeFormatter, ICU4XError> create_with_lengths(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength date_length, ICU4XTimeLength time_length)
+
+ Creates a new :cpp:class:`ICU4XZonedDateTimeFormatter` from locale data.
+
+ This function has ``date_length`` and ``time_length`` arguments and uses default options for the time zone.
+
+ See the `Rust documentation for try_new <https://docs.rs/icu/latest/icu/datetime/struct.ZonedDateTimeFormatter.html#method.try_new>`__ for more information.
+
+
+ .. cpp:function:: static diplomat::result<ICU4XZonedDateTimeFormatter, ICU4XError> create_with_lengths_and_iso_8601_time_zone_fallback(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength date_length, ICU4XTimeLength time_length, ICU4XIsoTimeZoneOptions zone_options)
+
+ Creates a new :cpp:class:`ICU4XZonedDateTimeFormatter` from locale data.
+
+ This function has ``date_length`` and ``time_length`` arguments and uses an ISO-8601 style fallback for the time zone with the given configurations.
+
+ See the `Rust documentation for try_new <https://docs.rs/icu/latest/icu/datetime/struct.ZonedDateTimeFormatter.html#method.try_new>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> format_datetime_with_custom_time_zone_to_writeable(const ICU4XDateTime& datetime, const ICU4XCustomTimeZone& time_zone, W& write) const
+
+ Formats a :cpp:class:`ICU4XDateTime` and :cpp:class:`ICU4XCustomTimeZone` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.ZonedDateTimeFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> format_datetime_with_custom_time_zone(const ICU4XDateTime& datetime, const ICU4XCustomTimeZone& time_zone) const
+
+ Formats a :cpp:class:`ICU4XDateTime` and :cpp:class:`ICU4XCustomTimeZone` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.ZonedDateTimeFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: template<typename W> diplomat::result<std::monostate, ICU4XError> format_iso_datetime_with_custom_time_zone_to_writeable(const ICU4XIsoDateTime& datetime, const ICU4XCustomTimeZone& time_zone, W& write) const
+
+ Formats a :cpp:class:`ICU4XIsoDateTime` and :cpp:class:`ICU4XCustomTimeZone` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.ZonedDateTimeFormatter.html#method.format>`__ for more information.
+
+
+ .. cpp:function:: diplomat::result<std::string, ICU4XError> format_iso_datetime_with_custom_time_zone(const ICU4XIsoDateTime& datetime, const ICU4XCustomTimeZone& time_zone) const
+
+ Formats a :cpp:class:`ICU4XIsoDateTime` and :cpp:class:`ICU4XCustomTimeZone` to a string.
+
+ See the `Rust documentation for format <https://docs.rs/icu/latest/icu/datetime/struct.ZonedDateTimeFormatter.html#method.format>`__ for more information.
+
diff --git a/intl/icu_capi/cpp/examples/bidi/.gitignore b/intl/icu_capi/cpp/examples/bidi/.gitignore
new file mode 100644
index 0000000000..cb34c546b3
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/bidi/.gitignore
@@ -0,0 +1,2 @@
+a.out
+a.out.dSYM
diff --git a/intl/icu_capi/cpp/examples/bidi/Makefile b/intl/icu_capi/cpp/examples/bidi/Makefile
new file mode 100644
index 0000000000..594ca66c37
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/bidi/Makefile
@@ -0,0 +1,28 @@
+# This file is part of ICU4X. For terms of use, please see the file
+# called LICENSE at the top level of the ICU4X source tree
+# (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+.DEFAULT_GOAL := test
+.PHONY: build test
+FORCE:
+
+ALL_HEADERS := $(wildcard ../../include/*.hpp) $(wildcard ../../../c/include/*.h)
+
+CXX?=g++
+
+$(ALL_HEADERS):
+
+../../../../../target/debug/libicu_capi_staticlib.a: FORCE
+ cargo build -p icu_capi_staticlib --features compiled_data
+
+a.out: ../../../../../target/debug/libicu_capi_staticlib.a $(ALL_HEADERS) test.cpp
+ $(CXX) -std=c++17 test.cpp ../../../../../target/debug/libicu_capi_staticlib.a -ldl -lpthread -lm -g
+
+build: a.out
+
+test: build
+ ./a.out
+
+clean:
+ git clean -xf *
+ rm -f ../../../../../target/debug/libicu_capi_staticlib.a
diff --git a/intl/icu_capi/cpp/examples/bidi/test.cpp b/intl/icu_capi/cpp/examples/bidi/test.cpp
new file mode 100644
index 0000000000..629cf752ce
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/bidi/test.cpp
@@ -0,0 +1,93 @@
+// This file is part of ICU4X. For terms of use, please see the file
+// called LICENSE at the top level of the ICU4X source tree
+// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+#include "../../include/ICU4XDataProvider.hpp"
+#include "../../include/ICU4XBidi.hpp"
+#include "../../include/ICU4XLogger.hpp"
+
+#include <iostream>
+
+int main() {
+ ICU4XDataProvider dp = ICU4XDataProvider::create_compiled();
+ auto bidi = ICU4XBidi::create(dp).ok().value();
+
+ // Written char-by-char to avoid messing up certain text editors.
+ std::string_view str =
+ "א"
+ "ב"
+ "ג"
+ "a"
+ "b"
+ "c"
+ "\n"
+ "a"
+ "b"
+ "c"
+ "א"
+ "ב"
+ "ג";
+
+ // reordered string is same for both lines
+ std::string_view reordered_expected =
+ "a"
+ "b"
+ "c"
+ "ג"
+ "ב"
+ "א";
+ auto bidi_info = bidi.for_text(str, ICU4XBidi::level_ltr());
+ auto n_para = bidi_info.paragraph_count();
+ if (n_para != 2) {
+ std::cout << "Expected 2 paragraphs, found " << n_para << std::endl;
+ return 1;
+ }
+
+ auto para = bidi_info.paragraph_at(0).value();
+
+ auto size = para.size();
+ if (size != 10) {
+ std::cout << "Expected paragraph of size 10, found " << size << std::endl;
+ return 1;
+ }
+
+ // The first paragraph's first strongly directional character is RTL
+ uint8_t level = para.level_at(0);
+ std::cout << "Level of first paragraph at index 0 is " << unsigned(level) << std::endl;
+ if (!ICU4XBidi::level_is_rtl(level)) {
+ std::cout << "Expected level at index 0 to be RTL" << std::endl;
+ return 1;
+ }
+
+
+ std::string reordered = para.reorder_line(0, 9).ok().value();
+ std::cout << "Reordered paragraph: " << reordered << std::endl;
+
+ if (reordered != reordered) {
+ std::cout << "Found incorrect reordering, expected: " << reordered << std::endl;
+ }
+
+ para.set_paragraph_in_text(1).ok().value();
+
+ size = para.size();
+ if (size != 9) {
+ std::cout << "Expected paragraph of size 9, found " << size << std::endl;
+ return 1;
+ }
+
+ // The second paragraph's first strongly directional character is LTR
+ level = para.level_at(0);
+ std::cout << "Level of second paragraph at index 0 is " << unsigned(level) << std::endl;
+ if (!ICU4XBidi::level_is_ltr(level)) {
+ std::cout << "Expected level at index 0 to be LTR" << std::endl;
+ return 1;
+ }
+ reordered = para.reorder_line(10, 19).ok().value();
+ std::cout << "Reordered paragraph: " << reordered << std::endl;
+
+ if (reordered != reordered) {
+ std::cout << "Found incorrect reordering, expected: " << reordered << std::endl;
+ }
+
+ return 0;
+}
diff --git a/intl/icu_capi/cpp/examples/casemapping/.gitignore b/intl/icu_capi/cpp/examples/casemapping/.gitignore
new file mode 100644
index 0000000000..cb34c546b3
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/casemapping/.gitignore
@@ -0,0 +1,2 @@
+a.out
+a.out.dSYM
diff --git a/intl/icu_capi/cpp/examples/casemapping/Makefile b/intl/icu_capi/cpp/examples/casemapping/Makefile
new file mode 100644
index 0000000000..57a9c06943
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/casemapping/Makefile
@@ -0,0 +1,28 @@
+# This file is part of ICU4X. For terms of use, please see the file
+# called LICENSE at the top level of the ICU4X source tree
+# (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+.DEFAULT_GOAL := test
+.PHONY: build test
+FORCE:
+
+ALL_HEADERS := $(wildcard ../../include/*.hpp) $(wildcard ../../../c/include/*.h)
+
+CXX?=g++
+
+$(ALL_HEADERS):
+
+../../../../../target/debug/libicu_capi_staticlib.a: FORCE
+ cargo build -p icu_capi_staticlib
+
+a.out: ../../../../../target/debug/libicu_capi_staticlib.a $(ALL_HEADERS) test.cpp
+ $(CXX) -std=c++17 test.cpp ../../../../../target/debug/libicu_capi_staticlib.a -ldl -lpthread -lm -g
+
+build: a.out
+
+test: build
+ ./a.out
+
+clean:
+ git clean -xf *
+ rm -f ../../../../../target/debug/libicu_capi_staticlib.a
diff --git a/intl/icu_capi/cpp/examples/casemapping/test.cpp b/intl/icu_capi/cpp/examples/casemapping/test.cpp
new file mode 100644
index 0000000000..3559c5435d
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/casemapping/test.cpp
@@ -0,0 +1,109 @@
+// This file is part of ICU4X. For terms of use, please see the file
+// called LICENSE at the top level of the ICU4X source tree
+// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+#include "../../include/ICU4XCaseMapper.hpp"
+#include "../../include/ICU4XLogger.hpp"
+#include "../../include/ICU4XDataProvider.hpp"
+#include "../../include/ICU4XCodePointSetBuilder.hpp"
+#include "../../include/ICU4XTitlecaseOptionsV1.hpp"
+
+#include <iostream>
+
+int main() {
+ ICU4XLogger::init_simple_logger();
+ ICU4XLocale und = ICU4XLocale::create_from_string("und").ok().value();
+ ICU4XLocale greek = ICU4XLocale::create_from_string("el").ok().value();
+ ICU4XLocale turkish = ICU4XLocale::create_from_string("tr").ok().value();
+ ICU4XDataProvider dp = ICU4XDataProvider::create_compiled();
+
+ ICU4XCaseMapper cm = ICU4XCaseMapper::create(dp).ok().value();
+
+ ICU4XTitlecaseOptionsV1 tc_options = ICU4XTitlecaseOptionsV1::default_options();
+
+ std::string out = cm.lowercase("hEllO WorLd", und).ok().value();
+ std::cout << "Lowercased value is " << out << std::endl;
+ if (out != "hello world") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+ out = cm.uppercase("hEllO WorLd", und).ok().value();
+ std::cout << "Uppercased value is " << out << std::endl;
+ if (out != "HELLO WORLD") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ out = cm.titlecase_segment_with_only_case_data_v1("hEllO WorLd", und, tc_options).ok().value();
+ std::cout << "Titlecased value is " << out << std::endl;
+ if (out != "Hello world") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+
+ // locale-specific behavior
+
+ out = cm.uppercase("Γειά σου Κόσμε", und).ok().value();
+ std::cout << "Uppercased value is " << out << std::endl;
+ if (out != "ΓΕΙΆ ΣΟΥ ΚΌΣΜΕ") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ out = cm.uppercase("Γειά σου Κόσμε", greek).ok().value();
+ std::cout << "Uppercased value is " << out << std::endl;
+ if (out != "ΓΕΙΑ ΣΟΥ ΚΟΣΜΕ") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ out = cm.uppercase("istanbul", und).ok().value();
+ std::cout << "Uppercased value is " << out << std::endl;
+ if (out != "ISTANBUL") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ out = cm.uppercase("istanbul", turkish).ok().value();
+ std::cout << "Uppercased value is " << out << std::endl;
+ if (out != "İSTANBUL") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+
+ out = cm.fold("ISTANBUL").ok().value();
+ std::cout << "Folded value is " << out << std::endl;
+ if (out != "istanbul") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ out = cm.fold_turkic("ISTANBUL").ok().value();
+ std::cout << "Turkic-folded value is " << out << std::endl;
+ if (out != "ıstanbul") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ ICU4XCodePointSetBuilder builder = ICU4XCodePointSetBuilder::create();
+
+ cm.add_case_closure_to('s', builder);
+
+ auto set = builder.build();
+
+ if (set.contains('s')) {
+ std::cout << "Set contains 's', which was not expected" << std::endl;
+ return 1;
+ }
+ if (!set.contains('S')) {
+ std::cout << "Set does not 'S', which was not expected" << std::endl;
+ return 1;
+ }
+ if (!set.contains(U'ſ')) {
+ std::cout << "Set does not 'S', which was not expected" << std::endl;
+ return 1;
+ }
+ return 0;
+}
diff --git a/intl/icu_capi/cpp/examples/collator/.gitignore b/intl/icu_capi/cpp/examples/collator/.gitignore
new file mode 100644
index 0000000000..cb34c546b3
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/collator/.gitignore
@@ -0,0 +1,2 @@
+a.out
+a.out.dSYM
diff --git a/intl/icu_capi/cpp/examples/collator/Makefile b/intl/icu_capi/cpp/examples/collator/Makefile
new file mode 100644
index 0000000000..57a9c06943
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/collator/Makefile
@@ -0,0 +1,28 @@
+# This file is part of ICU4X. For terms of use, please see the file
+# called LICENSE at the top level of the ICU4X source tree
+# (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+.DEFAULT_GOAL := test
+.PHONY: build test
+FORCE:
+
+ALL_HEADERS := $(wildcard ../../include/*.hpp) $(wildcard ../../../c/include/*.h)
+
+CXX?=g++
+
+$(ALL_HEADERS):
+
+../../../../../target/debug/libicu_capi_staticlib.a: FORCE
+ cargo build -p icu_capi_staticlib
+
+a.out: ../../../../../target/debug/libicu_capi_staticlib.a $(ALL_HEADERS) test.cpp
+ $(CXX) -std=c++17 test.cpp ../../../../../target/debug/libicu_capi_staticlib.a -ldl -lpthread -lm -g
+
+build: a.out
+
+test: build
+ ./a.out
+
+clean:
+ git clean -xf *
+ rm -f ../../../../../target/debug/libicu_capi_staticlib.a
diff --git a/intl/icu_capi/cpp/examples/collator/test.cpp b/intl/icu_capi/cpp/examples/collator/test.cpp
new file mode 100644
index 0000000000..20cd0d1315
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/collator/test.cpp
@@ -0,0 +1,67 @@
+// This file is part of ICU4X. For terms of use, please see the file
+// called LICENSE at the top level of the ICU4X source tree
+// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+#include "../../include/ICU4XCollator.hpp"
+#include "../../include/ICU4XDataProvider.hpp"
+#include "../../include/ICU4XLocale.hpp"
+#include "../../include/ICU4XLogger.hpp"
+#include "../../include/ICU4XOrdering.hpp"
+
+#include <iostream>
+#include <string_view>
+
+int main() {
+ ICU4XLogger::init_simple_logger();
+ ICU4XDataProvider dp = ICU4XDataProvider::create_compiled();
+
+ // test 01 - basic collation example, default CollatorOptions
+
+ std::string_view manna{ "manna" };
+ std::string_view manana{ "mañana" };
+
+ ICU4XLocale locale = ICU4XLocale::create_from_string("en").ok().value();
+ ICU4XCollatorOptionsV1 options = {};
+ ICU4XCollator collator = ICU4XCollator::create_v1(dp, locale, options).ok().value();
+ ICU4XOrdering actual = collator.compare(manna, manana);
+
+ if (actual != ICU4XOrdering::Greater) {
+ std::cout << "Expected manna > mañana for locale " << locale.to_string().ok().value() << std::endl;
+ return 1;
+ }
+
+ locale = ICU4XLocale::create_from_string("es").ok().value();
+ collator = ICU4XCollator::create_v1(dp, locale, options).ok().value();
+ actual = collator.compare(manna, manana);
+
+ if (actual != ICU4XOrdering::Less) {
+ std::cout << "Expected manna < mañana for locale " << locale.to_string().ok().value()<< std::endl;
+ return 1;
+ }
+
+ // test 02 - collation strength example, requires non-default CollatorOptions
+
+ std::string_view as{ "as" };
+ std::string_view graveAs{ "às" };
+
+ locale = ICU4XLocale::create_from_string("en").ok().value();
+ options.strength = ICU4XCollatorStrength::Primary;
+ collator = ICU4XCollator::create_v1(dp, locale, options).ok().value();
+ actual = collator.compare(as, graveAs);
+
+ if (actual != ICU4XOrdering::Equal) {
+ std::cout << "Expected as = às for primary strength, locale " << locale.to_string().ok().value()<< std::endl;
+ return 1;
+ }
+
+ options.strength = ICU4XCollatorStrength::Secondary;
+ collator = ICU4XCollator::create_v1(dp, locale, options).ok().value();
+ actual = collator.compare(as, graveAs);
+
+ if (actual != ICU4XOrdering::Less) {
+ std::cout << "Expected as < às for secondary strength, locale " << locale.to_string().ok().value()<< std::endl;
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/intl/icu_capi/cpp/examples/datetime/.gitignore b/intl/icu_capi/cpp/examples/datetime/.gitignore
new file mode 100644
index 0000000000..cb34c546b3
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/datetime/.gitignore
@@ -0,0 +1,2 @@
+a.out
+a.out.dSYM
diff --git a/intl/icu_capi/cpp/examples/datetime/Makefile b/intl/icu_capi/cpp/examples/datetime/Makefile
new file mode 100644
index 0000000000..57a9c06943
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/datetime/Makefile
@@ -0,0 +1,28 @@
+# This file is part of ICU4X. For terms of use, please see the file
+# called LICENSE at the top level of the ICU4X source tree
+# (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+.DEFAULT_GOAL := test
+.PHONY: build test
+FORCE:
+
+ALL_HEADERS := $(wildcard ../../include/*.hpp) $(wildcard ../../../c/include/*.h)
+
+CXX?=g++
+
+$(ALL_HEADERS):
+
+../../../../../target/debug/libicu_capi_staticlib.a: FORCE
+ cargo build -p icu_capi_staticlib
+
+a.out: ../../../../../target/debug/libicu_capi_staticlib.a $(ALL_HEADERS) test.cpp
+ $(CXX) -std=c++17 test.cpp ../../../../../target/debug/libicu_capi_staticlib.a -ldl -lpthread -lm -g
+
+build: a.out
+
+test: build
+ ./a.out
+
+clean:
+ git clean -xf *
+ rm -f ../../../../../target/debug/libicu_capi_staticlib.a
diff --git a/intl/icu_capi/cpp/examples/datetime/test.cpp b/intl/icu_capi/cpp/examples/datetime/test.cpp
new file mode 100644
index 0000000000..4e86e86e52
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/datetime/test.cpp
@@ -0,0 +1,116 @@
+// This file is part of ICU4X. For terms of use, please see the file
+// called LICENSE at the top level of the ICU4X source tree
+// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+#include "../../include/ICU4XGregorianDateFormatter.hpp"
+#include "../../include/ICU4XGregorianDateTimeFormatter.hpp"
+#include "../../include/ICU4XDateTimeFormatter.hpp"
+#include "../../include/ICU4XTimeFormatter.hpp"
+#include "../../include/ICU4XDataStruct.hpp"
+#include "../../include/ICU4XLogger.hpp"
+#include "../../include/ICU4XCustomTimeZone.hpp"
+#include "../../include/ICU4XIanaToBcp47Mapper.hpp"
+#include "../../include/ICU4XBcp47ToIanaMapper.hpp"
+#include "../../include/ICU4XGregorianZonedDateTimeFormatter.hpp"
+#include "../../include/ICU4XZonedDateTimeFormatter.hpp"
+
+#include <atomic>
+#include <iostream>
+#include <array>
+
+int main() {
+ ICU4XLogger::init_simple_logger();
+ ICU4XLocale locale = ICU4XLocale::create_from_string("es").ok().value();
+ std::cout << "Running test for locale " << locale.to_string().ok().value() << std::endl;
+ ICU4XDataProvider dp = ICU4XDataProvider::create_compiled();
+
+ ICU4XIsoDateTime date = ICU4XIsoDateTime::create(2022, 07, 11, 13, 06, 42, 0).ok().value();
+
+ ICU4XTimeFormatter tf = ICU4XTimeFormatter::create_with_length(dp, locale, ICU4XTimeLength::Short).ok().value();
+ std::string out = tf.format_iso_datetime(date).ok().value();
+ std::cout << "Formatted value is " << out << std::endl;
+ if (out != "13:06") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ ICU4XGregorianDateFormatter df = ICU4XGregorianDateFormatter::create_with_length(dp, locale, ICU4XDateLength::Full).ok().value();
+ out = df.format_iso_datetime(date).ok().value();
+ std::cout << "Formatted value is " << out << std::endl;
+ if (out != "lunes, 11 de julio de 2022") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ ICU4XGregorianDateTimeFormatter dtf = ICU4XGregorianDateTimeFormatter::create_with_lengths(dp, locale, ICU4XDateLength::Medium, ICU4XTimeLength::Short).ok().value();
+ out = dtf.format_iso_datetime(date).ok().value();
+ std::cout << "Formatted value is " << out << std::endl;
+ if (out != "11 jul 2022, 13:06") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ locale = ICU4XLocale::create_from_string("en-u-ca-japanese").ok().value();
+ ICU4XCalendar cal = ICU4XCalendar::create_for_locale(dp, locale).ok().value();
+ ICU4XDateTime any_date = ICU4XDateTime::create_from_iso_in_calendar(2020, 10, 5, 13, 33, 15, 0, cal).ok().value();
+ ICU4XDateTimeFormatter any_dtf = ICU4XDateTimeFormatter::create_with_lengths(dp, locale, ICU4XDateLength::Medium, ICU4XTimeLength::Short).ok().value();
+ out = any_dtf.format_datetime(any_date).ok().value();
+ std::cout << "Formatted value is " << out << std::endl;
+ if (out != "Oct 5, 2 Reiwa, 1:33\u202fPM") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ ICU4XCustomTimeZone time_zone = ICU4XCustomTimeZone::create_from_string("-06:00").ok().value();
+ int32_t offset = time_zone.gmt_offset_seconds().ok().value();
+ if (offset != -21600) {
+ std::cout << "GMT offset doesn't parse" << std::endl;
+ return 1;
+ }
+ ICU4XMetazoneCalculator mzcalc = ICU4XMetazoneCalculator::create(dp).ok().value();
+ ICU4XIanaToBcp47Mapper mapper = ICU4XIanaToBcp47Mapper::create(dp).ok().value();
+ time_zone.try_set_iana_time_zone_id(mapper, "america/chicago").ok().value();
+ std::string time_zone_id_return = time_zone.time_zone_id().ok().value();
+ if (time_zone_id_return != "uschi") {
+ std::cout << "Time zone ID does not roundtrip: " << time_zone_id_return << std::endl;
+ return 1;
+ }
+ ICU4XBcp47ToIanaMapper reverse_mapper = ICU4XBcp47ToIanaMapper::create(dp).ok().value();
+ std::string recovered_iana_id = reverse_mapper.get("uschi").ok().value();
+ if (recovered_iana_id != "America/Chicago") {
+ std::cout << "Time zone ID does not canonicalize to IANA: " << recovered_iana_id << std::endl;
+ return 1;
+ }
+ ICU4XIsoDateTime local_datetime = ICU4XIsoDateTime::create(2022, 8, 25, 0, 0, 0, 0).ok().value();
+ time_zone.maybe_calculate_metazone(mzcalc, local_datetime);
+ std::string metazone_id_return = time_zone.metazone_id().ok().value();
+ if (metazone_id_return != "amce") {
+ std::cout << "Metazone ID not calculated correctly; got " << metazone_id_return << std::endl;
+ return 1;
+ }
+ // Note: The daylight time switch should normally come from TZDB calculations.
+ time_zone.set_daylight_time();
+ std::string zone_variant_return = time_zone.zone_variant().ok().value();
+ if (zone_variant_return != "dt") {
+ std::cout << "Zone variant not calculated correctly; got " << zone_variant_return << std::endl;
+ return 1;
+ }
+
+ ICU4XGregorianZonedDateTimeFormatter gzdtf = ICU4XGregorianZonedDateTimeFormatter::create_with_lengths(dp, locale, ICU4XDateLength::Full, ICU4XTimeLength::Full).ok().value();
+ out = gzdtf.format_iso_datetime_with_custom_time_zone(date, time_zone).ok().value();
+ std::cout << "Formatted value is " << out << std::endl;
+ if (out != "Monday, July 11, 2022, 1:06:42\u202fPM Central Daylight Time") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ ICU4XZonedDateTimeFormatter zdtf = ICU4XZonedDateTimeFormatter::create_with_lengths(dp, locale, ICU4XDateLength::Full, ICU4XTimeLength::Full).ok().value();
+ out = zdtf.format_datetime_with_custom_time_zone(any_date, time_zone).ok().value();
+ std::cout << "Formatted value is " << out << std::endl;
+ if (out != "Monday, October 5, 2 Reiwa, 1:33:15\u202fPM Central Daylight Time") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/intl/icu_capi/cpp/examples/fixeddecimal/.gitignore b/intl/icu_capi/cpp/examples/fixeddecimal/.gitignore
new file mode 100644
index 0000000000..cb34c546b3
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/fixeddecimal/.gitignore
@@ -0,0 +1,2 @@
+a.out
+a.out.dSYM
diff --git a/intl/icu_capi/cpp/examples/fixeddecimal/Makefile b/intl/icu_capi/cpp/examples/fixeddecimal/Makefile
new file mode 100644
index 0000000000..57a9c06943
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/fixeddecimal/Makefile
@@ -0,0 +1,28 @@
+# This file is part of ICU4X. For terms of use, please see the file
+# called LICENSE at the top level of the ICU4X source tree
+# (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+.DEFAULT_GOAL := test
+.PHONY: build test
+FORCE:
+
+ALL_HEADERS := $(wildcard ../../include/*.hpp) $(wildcard ../../../c/include/*.h)
+
+CXX?=g++
+
+$(ALL_HEADERS):
+
+../../../../../target/debug/libicu_capi_staticlib.a: FORCE
+ cargo build -p icu_capi_staticlib
+
+a.out: ../../../../../target/debug/libicu_capi_staticlib.a $(ALL_HEADERS) test.cpp
+ $(CXX) -std=c++17 test.cpp ../../../../../target/debug/libicu_capi_staticlib.a -ldl -lpthread -lm -g
+
+build: a.out
+
+test: build
+ ./a.out
+
+clean:
+ git clean -xf *
+ rm -f ../../../../../target/debug/libicu_capi_staticlib.a
diff --git a/intl/icu_capi/cpp/examples/fixeddecimal/test.cpp b/intl/icu_capi/cpp/examples/fixeddecimal/test.cpp
new file mode 100644
index 0000000000..365d3972c5
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/fixeddecimal/test.cpp
@@ -0,0 +1,127 @@
+// This file is part of ICU4X. For terms of use, please see the file
+// called LICENSE at the top level of the ICU4X source tree
+// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+#include "../../include/ICU4XFixedDecimalFormatter.hpp"
+#include "../../include/ICU4XDataStruct.hpp"
+#include "../../include/ICU4XLogger.hpp"
+
+#include <iostream>
+#include <array>
+
+int main() {
+ ICU4XLogger::init_simple_logger();
+ ICU4XLocale locale = ICU4XLocale::create_from_string("bn").ok().value();
+ std::cout << "Running test for locale " << locale.to_string().ok().value() << std::endl;
+ ICU4XDataProvider dp = ICU4XDataProvider::create_compiled();
+ ICU4XFixedDecimalFormatter fdf = ICU4XFixedDecimalFormatter::create_with_grouping_strategy(
+ dp, locale, ICU4XFixedDecimalGroupingStrategy::Auto).ok().value();
+
+ ICU4XFixedDecimal decimal = ICU4XFixedDecimal::create_from_u64(1000007);
+ std::string out = fdf.format(decimal).ok().value();
+ std::cout << "Formatted value is " << out << std::endl;
+ if (out != "১০,০০,০০৭") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ std::string out2;
+ fdf.format_to_writeable(decimal, out2);
+ std::cout << "Formatted writeable value is " << out2 << std::endl;
+ if (out2 != "১০,০০,০০৭") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ decimal.multiply_pow10(2);
+ decimal.set_sign(ICU4XFixedDecimalSign::Negative);
+ out = fdf.format(decimal).ok().value();
+ std::cout << "Value x100 and negated is " << out << std::endl;
+ if (out != "-১০,০০,০০,৭০০") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ decimal = ICU4XFixedDecimal::create_from_f64_with_floating_precision(100.01).ok().value();
+ out = fdf.format(decimal).ok().value();
+ std::cout << "Formatted float value is " << out << std::endl;
+ if (out != "১০০.০১") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ decimal.pad_end(-4);
+ out = fdf.format(decimal).ok().value();
+ std::cout << "Formatted left-padded float value is " << out << std::endl;
+ if (out != "১০০.০১০০") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ decimal.pad_start(4);
+ out = fdf.format(decimal).ok().value();
+ std::cout << "Formatted right-padded float value is " << out << std::endl;
+ if (out != "০,১০০.০১০০") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ decimal.set_max_position(3);
+ out = fdf.format(decimal).ok().value();
+ std::cout << "Formatted truncated float value is " << out << std::endl;
+ if (out != "১০০.০১০০") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ decimal = ICU4XFixedDecimal::create_from_f64_with_lower_magnitude(100.0006, -2).ok().value();
+ out = fdf.format(decimal).ok().value();
+ std::cout << "Formatted float value from precision 2 is " << out << std::endl;
+ if (out != "১০০.০০") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ decimal = ICU4XFixedDecimal::create_from_f64_with_significant_digits(100.0006, 5).ok().value();
+ out = fdf.format(decimal).ok().value();
+ std::cout << "Formatted float value with 5 digits is " << out << std::endl;
+ if (out != "১০০.০০") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ std::array<char32_t, 10> digits = {U'a', U'b', U'c', U'd', U'e', U'f', U'g', U'h', U'i', U'j'};
+
+ auto data = ICU4XDataStruct::create_decimal_symbols_v1("+", "", "-", "", "/", "_", 4, 2, 4, digits).ok().value();
+
+ fdf = ICU4XFixedDecimalFormatter::create_with_decimal_symbols_v1(data, ICU4XFixedDecimalGroupingStrategy::Auto).ok().value();
+
+ decimal = ICU4XFixedDecimal::create_from_f64_with_floating_precision(123456.8901).ok().value();
+ out = fdf.format(decimal).ok().value();
+ std::cout << "Formatted float value for custom numeric system is " << out << std::endl;
+ if (out != "bcdefg/ijab") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+ decimal = ICU4XFixedDecimal::create_from_f64_with_floating_precision(123451234567.8901).ok().value();
+ out = fdf.format(decimal).ok().value();
+ std::cout << "Formatted float value for custom numeric system is " << out << std::endl;
+ if (out != "bc_de_fb_cd_efgh/ijab") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ locale = ICU4XLocale::create_from_string("th-u-nu-thai").ok().value();
+ std::cout << "Running test for locale " << locale.to_string().ok().value() << std::endl;
+ fdf = ICU4XFixedDecimalFormatter::create_with_grouping_strategy(
+ dp, locale, ICU4XFixedDecimalGroupingStrategy::Auto).ok().value();
+
+ decimal = ICU4XFixedDecimal::create_from_f64_with_floating_precision(123456.8901).ok().value();
+ out = fdf.format(decimal).ok().value();
+ std::cout << "Formatted value is " << out << std::endl;
+ if (out != "๑๒๓,๔๕๖.๘๙๐๑") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+ return 0;
+}
diff --git a/intl/icu_capi/cpp/examples/fixeddecimal_wasm/.gitignore b/intl/icu_capi/cpp/examples/fixeddecimal_wasm/.gitignore
new file mode 100644
index 0000000000..100536298e
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/fixeddecimal_wasm/.gitignore
@@ -0,0 +1,9 @@
+web-version.html
+web-version.wasm
+web-version.js
+node-version.js
+node-version.wasm
+package-lock.json
+node_modules
+a.out
+a.out.dSYM
diff --git a/intl/icu_capi/cpp/examples/fixeddecimal_wasm/Makefile b/intl/icu_capi/cpp/examples/fixeddecimal_wasm/Makefile
new file mode 100644
index 0000000000..b2c0a018cf
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/fixeddecimal_wasm/Makefile
@@ -0,0 +1,53 @@
+# This file is part of ICU4X. For terms of use, please see the file
+# called LICENSE at the top level of the ICU4X source tree
+# (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+.DEFAULT_GOAL := build
+.PHONY: build test clean serve build-host test-host
+FORCE:
+
+ALL_HEADERS := $(wildcard ../../include/*.hpp) $(wildcard ../../../c/include/*.h)
+ICU4X_NIGHTLY_TOOLCHAIN ?= "nightly-2022-12-26"
+
+CXX?=g++
+EMCC?=emcc
+
+$(ALL_HEADERS):
+
+crate/target/debug/libcrate.a: FORCE
+ cd crate && cargo build
+
+a.out: crate/target/debug/libcrate.a $(ALL_HEADERS) test.cpp
+ $(CXX) -std=c++17 test.cpp crate/target/debug/libcrate.a -ldl -lpthread -lm -g
+
+crate/target/wasm32-unknown-emscripten/release/libcrate.a: FORCE
+ rustup toolchain install ${ICU4X_NIGHTLY_TOOLCHAIN}
+ rustup component add rust-src --toolchain ${ICU4X_NIGHTLY_TOOLCHAIN}
+ RUSTFLAGS="-Cpanic=abort -Copt-level=s -Clto -Cembed-bitcode" \
+ cd crate && cargo +${ICU4X_NIGHTLY_TOOLCHAIN} build --release --target wasm32-unknown-emscripten -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort
+
+web-version.html: crate/target/wasm32-unknown-emscripten/release/libcrate.a $(ALL_HEADERS) test.cpp
+ $(EMCC) -std=c++17 test.cpp crate/target/wasm32-unknown-emscripten/release/libcrate.a -ldl -lpthread -lm -g -o web-version.html --bind --emrun -sENVIRONMENT=web -sWASM=1 -sEXPORT_ES6=1 -sMODULARIZE=1
+
+node-version.js: crate/target/wasm32-unknown-emscripten/release/libcrate.a $(ALL_HEADERS) test.cpp
+ $(EMCC) -std=c++17 test.cpp crate/target/wasm32-unknown-emscripten/release/libcrate.a -ldl -lpthread -lm -g -o node-version.js --bind -sWASM=1 -sENVIRONMENT=node -sWASM_ASYNC_COMPILATION=0 -DNOMAIN
+
+build: web-version.html node-version.js
+
+test: node-version.js
+ exec node ./node-test.js
+
+serve: web-version.html
+ emrun web-version.html
+
+# These make it possible to ensure that the C++ code is up to date with the bindings
+# without needing to set up emsdk. This way `make test-ffi` works without emsdk.
+build-host: a.out
+
+test-host: build-host
+ ./a.out
+
+clean:
+ git clean -xf *
+ rm -f crate/target/wasm32-unknown-emscripten/release/libcrate.a
+ rm -f crate/target/debug/libcrate.a
diff --git a/intl/icu_capi/cpp/examples/fixeddecimal_wasm/README b/intl/icu_capi/cpp/examples/fixeddecimal_wasm/README
new file mode 100644
index 0000000000..1299d40bf0
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/fixeddecimal_wasm/README
@@ -0,0 +1,7 @@
+This folder contains a test for calling ICU4X from C++ compiled to WASM (via emscripten).
+
+You need the [Emscripten SDK](https://emscripten.org/docs/getting_started/downloads.html) downloaded and sourced into your environment to run this.
+
+There are two ways to run the test. Firstly, you can call `make test`, which runs `node node-test.js` after building the appropriate WASM files. This runs a CLI test with the fixed decimal example in test.cpp.
+
+The other way is to run `make serve`, which will open a web page running test.cpp in your browser. \ No newline at end of file
diff --git a/intl/icu_capi/cpp/examples/fixeddecimal_wasm/node-test.js b/intl/icu_capi/cpp/examples/fixeddecimal_wasm/node-test.js
new file mode 100644
index 0000000000..d4a7a99d41
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/fixeddecimal_wasm/node-test.js
@@ -0,0 +1,6 @@
+wasm = require("./node-version.js");
+
+const exitCode = wasm.runFixedDecimal();
+if (exitCode !== 0) {
+ throw new Error(`Test failed with exit code ${exitCode}`)
+}
diff --git a/intl/icu_capi/cpp/examples/fixeddecimal_wasm/package.json b/intl/icu_capi/cpp/examples/fixeddecimal_wasm/package.json
new file mode 100644
index 0000000000..5567954da2
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/fixeddecimal_wasm/package.json
@@ -0,0 +1,6 @@
+{
+ "type": "commonjs",
+ "scripts": {
+ "test": "node node-test.js"
+ }
+}
diff --git a/intl/icu_capi/cpp/examples/fixeddecimal_wasm/test.cpp b/intl/icu_capi/cpp/examples/fixeddecimal_wasm/test.cpp
new file mode 100644
index 0000000000..e9bca35216
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/fixeddecimal_wasm/test.cpp
@@ -0,0 +1,70 @@
+// This file is part of ICU4X. For terms of use, please see the file
+// called LICENSE at the top level of the ICU4X source tree
+// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+#ifdef __EMSCRIPTEN__
+#include <emscripten/bind.h>
+#endif
+
+#include "../../include/ICU4XFixedDecimalFormatter.hpp"
+#include "../../include/ICU4XLogger.hpp"
+
+#include <iostream>
+
+extern "C" void diplomat_init();
+extern "C" void log_js(char* s, u_int len) {
+ std::cout<<"LOG: " << std::string_view(s, len) <<std::endl;
+}
+extern "C" void warn_js(char* s, u_int len) {
+ std::cout<<"WARN: " << std::string_view(s, len) <<std::endl;
+}
+
+int runFixedDecimal() {
+#ifdef __EMSCRIPTEN__
+ diplomat_init();
+ ICU4XLogger::init_console_logger();
+#endif
+ ICU4XLocale locale = ICU4XLocale::create_from_string("bn").ok().value();
+ std::cout << "Running test for locale " << locale.to_string().ok().value() << std::endl;
+ ICU4XDataProvider dp = ICU4XDataProvider::create_compiled();
+ ICU4XFixedDecimalFormatter fdf = ICU4XFixedDecimalFormatter::create_with_grouping_strategy(
+ dp, locale, ICU4XFixedDecimalGroupingStrategy::Auto).ok().value();
+
+ ICU4XFixedDecimal decimal = ICU4XFixedDecimal::create_from_u64(1000007);
+ std::string out = fdf.format(decimal).ok().value();
+ std::cout << "Formatted value is " << out << std::endl;
+ if (out != "১০,০০,০০৭") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ std::string out2;
+ fdf.format_to_writeable(decimal, out2);
+ std::cout << "Formatted writeable value is " << out2 << std::endl;
+ if (out2 != "১০,০০,০০৭") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+
+ decimal.multiply_pow10(2);
+ decimal.set_sign(ICU4XFixedDecimalSign::Negative);
+ out = fdf.format(decimal).ok().value();
+ std::cout << "Value x100 and negated is " << out << std::endl;
+ if (out != "-১০,০০,০০,৭০০") {
+ std::cout << "Output does not match expected output" << std::endl;
+ return 1;
+ }
+ return 0;
+}
+
+#ifdef __EMSCRIPTEN__
+EMSCRIPTEN_BINDINGS(testFixedDecimal) {
+ emscripten::function("runFixedDecimal", &runFixedDecimal);
+}
+#endif
+
+#ifndef NOMAIN
+int main() {
+ return runFixedDecimal();
+}
+#endif
diff --git a/intl/icu_capi/cpp/examples/locale/.gitignore b/intl/icu_capi/cpp/examples/locale/.gitignore
new file mode 100644
index 0000000000..cb34c546b3
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/locale/.gitignore
@@ -0,0 +1,2 @@
+a.out
+a.out.dSYM
diff --git a/intl/icu_capi/cpp/examples/locale/Makefile b/intl/icu_capi/cpp/examples/locale/Makefile
new file mode 100644
index 0000000000..57a9c06943
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/locale/Makefile
@@ -0,0 +1,28 @@
+# This file is part of ICU4X. For terms of use, please see the file
+# called LICENSE at the top level of the ICU4X source tree
+# (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+.DEFAULT_GOAL := test
+.PHONY: build test
+FORCE:
+
+ALL_HEADERS := $(wildcard ../../include/*.hpp) $(wildcard ../../../c/include/*.h)
+
+CXX?=g++
+
+$(ALL_HEADERS):
+
+../../../../../target/debug/libicu_capi_staticlib.a: FORCE
+ cargo build -p icu_capi_staticlib
+
+a.out: ../../../../../target/debug/libicu_capi_staticlib.a $(ALL_HEADERS) test.cpp
+ $(CXX) -std=c++17 test.cpp ../../../../../target/debug/libicu_capi_staticlib.a -ldl -lpthread -lm -g
+
+build: a.out
+
+test: build
+ ./a.out
+
+clean:
+ git clean -xf *
+ rm -f ../../../../../target/debug/libicu_capi_staticlib.a
diff --git a/intl/icu_capi/cpp/examples/locale/test.cpp b/intl/icu_capi/cpp/examples/locale/test.cpp
new file mode 100644
index 0000000000..b2bba0ceff
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/locale/test.cpp
@@ -0,0 +1,107 @@
+// This file is part of ICU4X. For terms of use, please see the file
+// called LICENSE at the top level of the ICU4X source tree
+// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+#include "../../include/ICU4XLocale.hpp"
+#include "../../include/ICU4XLogger.hpp"
+
+#include <iostream>
+
+static bool test_locale(ICU4XLocale &locale, std::string_view expectedString,
+ const char *message) {
+ std::string actualString = locale.to_string().ok().value();
+ std::cout << message << ": \"" << actualString << "\"" << std::endl;
+ if (actualString != expectedString) {
+ std::cout << "Locale did not match expected: \"" << expectedString << "\""
+ << std::endl;
+ return false;
+ }
+ return true;
+}
+
+static bool test_string(std::string_view actualString,
+ std::string_view expectedString, const char *message) {
+ std::cout << message << ": \"" << actualString << "\"" << std::endl;
+ if (actualString != expectedString) {
+ std::cout << "String did not match expected: \"" << expectedString << "\""
+ << std::endl;
+ return false;
+ }
+ return true;
+}
+
+int main() {
+ ICU4XLogger::init_simple_logger();
+ ICU4XLocale locale = ICU4XLocale::create_from_string("es-ES").ok().value();
+ if (!test_locale(locale, "es-ES", "Created a locale")) {
+ return 1;
+ }
+
+ locale.set_language("en").ok();
+ if (!test_locale(locale, "en-ES", "The language can be updated")) {
+ return 1;
+ }
+
+ locale.set_region("US").ok();
+ if (!test_locale(locale, "en-US", "The region can be updated")) {
+ return 1;
+ }
+
+ locale.set_script("Latn").ok();
+ if (!test_locale(locale, "en-Latn-US", "The script can be updated")) {
+ return 1;
+ }
+
+ if (!test_string(locale.language().ok().value(), "en",
+ "The language can be accessed")) {
+ return 1;
+ }
+ if (!test_string(locale.region().ok().value(), "US",
+ "The region can be accessed")) {
+ return 1;
+ }
+ if (!test_string(locale.script().ok().value(), "Latn",
+ "The script can be accessed")) {
+ return 1;
+ }
+
+ locale.set_language("").ok();
+ if (!test_locale(locale, "und-Latn-US", "Removed the language")) {
+ return 1;
+ }
+
+ locale.set_region("").ok();
+ if (locale.region().is_ok()) {
+ std::cout << "Expected region to be an err" << std::endl;
+ return 1;
+ }
+ if (!test_locale(locale, "und-Latn", "Removed the region")) {
+ return 1;
+ }
+
+ locale.set_script("").ok();
+ if (locale.script().is_ok()) {
+ std::cout << "Expected script to be an err" << std::endl;
+ return 1;
+ }
+ if (!test_locale(locale, "und", "Removed the script")) {
+ return 1;
+ }
+
+ locale = ICU4XLocale::create_from_string("en-US-u-hc-h12").ok().value();
+ if (!test_string(locale.get_unicode_extension("hc").ok().value(), "h12",
+ "The unicode extension can be accessed")) {
+ return 1;
+ }
+ if (!test_string(locale.basename().ok().value(), "en-US",
+ "The basename can be accessed")) {
+ return 1;
+ }
+
+ locale = ICU4XLocale::create_und();
+ if (!test_locale(locale, "und", "Created an undefined locale")) {
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/intl/icu_capi/cpp/examples/pluralrules/.gitignore b/intl/icu_capi/cpp/examples/pluralrules/.gitignore
new file mode 100644
index 0000000000..cba7efc8ef
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/pluralrules/.gitignore
@@ -0,0 +1 @@
+a.out
diff --git a/intl/icu_capi/cpp/examples/pluralrules/Makefile b/intl/icu_capi/cpp/examples/pluralrules/Makefile
new file mode 100644
index 0000000000..fd43d93d00
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/pluralrules/Makefile
@@ -0,0 +1,28 @@
+# This file is part of ICU4X. For terms of use, please see the file
+# called LICENSE at the top level of the ICU4X source tree
+# (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+.DEFAULT_GOAL := test
+.PHONY: build test
+FORCE:
+
+ALL_HEADERS := $(wildcard ../../include/*.hpp) $(wildcard ../../../c/include/*.h)
+
+CXX?=g++
+
+$(ALL_HEADERS):
+
+../../../../../target/debug/libicu_capi_staticlib.a: FORCE
+ cargo build -p icu_capi_staticlib -p icu_provider --features provider_fs,deserialize_json
+
+a.out: ../../../../../target/debug/libicu_capi_staticlib.a $(ALL_HEADERS) test.cpp
+ $(CXX) -std=c++17 test.cpp ../../../../../target/debug/libicu_capi_staticlib.a -ldl -lpthread -lm -g
+
+build: a.out
+
+test: build
+ ./a.out
+
+clean:
+ git clean -xf *
+ rm -f ../../../../../target/debug/libicu_capi_staticlib.a
diff --git a/intl/icu_capi/cpp/examples/pluralrules/test.cpp b/intl/icu_capi/cpp/examples/pluralrules/test.cpp
new file mode 100644
index 0000000000..254e96ecef
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/pluralrules/test.cpp
@@ -0,0 +1,38 @@
+// This file is part of ICU4X. For terms of use, please see the file
+// called LICENSE at the top level of the ICU4X source tree
+// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+#include "../../include/ICU4XPluralRules.hpp"
+#include "../../include/ICU4XLogger.hpp"
+
+#include <iostream>
+
+const std::string_view path = "../../../../../provider/datagen/tests/data/json/";
+
+int main() {
+ ICU4XLogger::init_simple_logger();
+ ICU4XLocale locale = ICU4XLocale::create_from_string("ar").ok().value();
+ std::cout << "Running test for locale " << locale.to_string().ok().value() << std::endl;
+ ICU4XDataProvider dp = ICU4XDataProvider::create_fs(path).ok().value();
+ ICU4XPluralRules pr = ICU4XPluralRules::create_cardinal(dp, locale).ok().value();
+
+ ICU4XPluralOperands op = ICU4XPluralOperands::create_from_string("3").ok().value();
+ ICU4XPluralCategory cat = pr.category_for(op);
+
+ std::cout << "Category is " << static_cast<int32_t>(cat)
+ << " (should be " << static_cast<int32_t>(ICU4XPluralCategory::Few) << ")"
+ << std::endl;
+ if (cat != ICU4XPluralCategory::Few) {
+ return 1;
+ }
+
+ op = ICU4XPluralOperands::create_from_string("1011.0").ok().value();
+ cat = pr.category_for(op);
+ std::cout << "Category is " << static_cast<int32_t>(cat)
+ << " (should be " << static_cast<int32_t>(ICU4XPluralCategory::Many) << ")"
+ << std::endl;
+ if (cat != ICU4XPluralCategory::Many) {
+ return 1;
+ }
+ return 0;
+}
diff --git a/intl/icu_capi/cpp/examples/properties/.gitignore b/intl/icu_capi/cpp/examples/properties/.gitignore
new file mode 100644
index 0000000000..cb34c546b3
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/properties/.gitignore
@@ -0,0 +1,2 @@
+a.out
+a.out.dSYM
diff --git a/intl/icu_capi/cpp/examples/properties/Makefile b/intl/icu_capi/cpp/examples/properties/Makefile
new file mode 100644
index 0000000000..57a9c06943
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/properties/Makefile
@@ -0,0 +1,28 @@
+# This file is part of ICU4X. For terms of use, please see the file
+# called LICENSE at the top level of the ICU4X source tree
+# (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+.DEFAULT_GOAL := test
+.PHONY: build test
+FORCE:
+
+ALL_HEADERS := $(wildcard ../../include/*.hpp) $(wildcard ../../../c/include/*.h)
+
+CXX?=g++
+
+$(ALL_HEADERS):
+
+../../../../../target/debug/libicu_capi_staticlib.a: FORCE
+ cargo build -p icu_capi_staticlib
+
+a.out: ../../../../../target/debug/libicu_capi_staticlib.a $(ALL_HEADERS) test.cpp
+ $(CXX) -std=c++17 test.cpp ../../../../../target/debug/libicu_capi_staticlib.a -ldl -lpthread -lm -g
+
+build: a.out
+
+test: build
+ ./a.out
+
+clean:
+ git clean -xf *
+ rm -f ../../../../../target/debug/libicu_capi_staticlib.a
diff --git a/intl/icu_capi/cpp/examples/properties/test.cpp b/intl/icu_capi/cpp/examples/properties/test.cpp
new file mode 100644
index 0000000000..24583041df
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/properties/test.cpp
@@ -0,0 +1,251 @@
+// This file is part of ICU4X. For terms of use, please see the file
+// called LICENSE at the top level of the ICU4X source tree
+// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+#include "../../include/ICU4XCodePointSetData.hpp"
+#include "../../include/ICU4XUnicodeSetData.hpp"
+#include "../../include/ICU4XCodePointMapData16.hpp"
+#include "../../include/ICU4XCodePointMapData8.hpp"
+#include "../../include/ICU4XPropertyValueNameToEnumMapper.hpp"
+#include "../../include/ICU4XGeneralCategoryNameToMaskMapper.hpp"
+#include "../../include/ICU4XLogger.hpp"
+
+#include <iostream>
+
+int test_set_property(ICU4XCodePointSetData data, char32_t included, char32_t excluded) {
+ bool contains1 = data.contains(included);
+ bool contains2 = data.contains(excluded);
+ std::cout << std::hex; // print hex for U+####
+ if (contains1 && !contains2) {
+ std::cout << "Set correctly contains U+" << included << " and not U+" << excluded << std::endl;
+ } else {
+ std::cout << "Set returns wrong result on U+" << included << " or U+" << excluded << std::endl;
+ return 1;
+ }
+ return 0;
+}
+
+int test_map_16_property(ICU4XCodePointMapData16 data, char32_t sample, uint32_t expected) {
+ uint32_t actual = data.get(sample);
+ std::cout << std::hex; // print hex for U+####
+ if (actual == expected) {
+ std::cout << "Code point U+" << sample << " correctly mapped to 0x" << actual << std::endl;
+ } else {
+ std::cout << "Code point U+" << sample << " incorrectly mapped to 0x" << actual << std::endl;
+ return 1;
+ }
+ return 0;
+}
+
+int test_map_8_property(ICU4XCodePointMapData8 data, char32_t sample, uint32_t expected) {
+ uint32_t actual = data.get(sample);
+ std::cout << std::hex; // print hex for U+####
+ if (actual == expected) {
+ std::cout << "Code point U+" << sample << " correctly mapped to 0x" << actual << std::endl;
+ } else {
+ std::cout << "Code point U+" << sample << " incorrectly mapped to 0x" << actual << std::endl;
+ return 1;
+ }
+ return 0;
+}
+
+int main() {
+ ICU4XLogger::init_simple_logger();
+ ICU4XDataProvider dp = ICU4XDataProvider::create_compiled();
+ int result;
+
+ result = test_set_property(
+ ICU4XCodePointSetData::load_ascii_hex_digit(dp).ok().value(),
+ u'3',
+ u'੩'
+ );
+ if (result != 0) {
+ return result;
+ }
+
+ result = test_map_16_property(
+ ICU4XCodePointMapData16::load_script(dp).ok().value(),
+ u'木',
+ 17 // Script::Han
+ );
+ if (result != 0) {
+ return result;
+ }
+
+ result = test_map_8_property(
+ ICU4XCodePointMapData8::load_general_category(dp).ok().value(),
+ u'木',
+ 5 // GeneralCategory::OtherLetter
+ );
+ if (result != 0) {
+ return result;
+ }
+
+ result = test_map_8_property(
+ ICU4XCodePointMapData8::load_bidi_class(dp).ok().value(),
+ u'ع',
+ 13 // GeneralCategory::ArabicLetter
+ );
+ if (result != 0) {
+ return result;
+ }
+
+ ICU4XUnicodeSetData basic_emoji = ICU4XUnicodeSetData::load_basic_emoji(dp).ok().value();
+ std::string letter = u8"hello";
+
+ if (!basic_emoji.contains_char(U'🔥')) {
+ std::cout << "Character 🔥 not found in Basic_Emoji set" << std::endl;
+ result = 1;
+ }
+
+ if (!basic_emoji.contains(u8"🗺️")) {
+ std::cout << "String \"🗺️\" (U+1F5FA U+FE0F) not found in Basic_Emoji set" << std::endl;
+ result = 1;
+ }
+ if (basic_emoji.contains_char(U'a')) {
+ std::cout << "Character a found in Basic_Emoji set" << std::endl;
+ result = 1;
+ }
+
+ if (basic_emoji.contains(u8"aa")) {
+ std::cout << "String \"aa\" found in Basic_Emoji set" << std::endl;
+ result = 1;
+ }
+
+ if (result != 0) {
+ return result;
+ } else {
+ std::cout << "Basic_Emoji set contains appropriate characters" << std::endl;
+ }
+ ICU4XLocale locale = ICU4XLocale::create_from_string("bn").ok().value();
+ ICU4XUnicodeSetData exemplars = ICU4XUnicodeSetData::load_exemplars_main(dp, locale).ok().value();
+ if (!exemplars.contains_char(U'ব')) {
+ std::cout << "Character 'ব' not found in Bangla exemplar chars set" << std::endl;
+ result = 1;
+ }
+
+ if (!exemplars.contains(u8"ক্ষ")) {
+ std::cout << "String \"ক্ষ\" (U+0995U+09CDU+09B7) not found in Bangla exemplar chars set" << std::endl;
+ result = 1;
+ }
+ if (exemplars.contains_char(U'a')) {
+ std::cout << "Character a found in Bangla exemplar chars set" << std::endl;
+ result = 1;
+ }
+
+ if (exemplars.contains(u8"aa")) {
+ std::cout << "String \"aa\" not found in Bangla exemplar chars set" << std::endl;
+ result = 1;
+ }
+ if (result != 0) {
+ return result;
+ } else {
+ std::cout << "Bangla exemplar chars set contains appropriate characters" << std::endl;
+ }
+
+
+ ICU4XPropertyValueNameToEnumMapper mapper = ICU4XPropertyValueNameToEnumMapper::load_script(dp).ok().value();
+ int32_t script = mapper.get_strict("Brah");
+ if (script != 65) {
+ std::cout << "Expected discriminant 64 for script name `Brah`, found " << script << std::endl;
+ result = 1;
+ }
+ script = mapper.get_strict("Brahmi");
+ if (script != 65) {
+ std::cout << "Expected discriminant 64 for script name `Brahmi`, found " << script << std::endl;
+ result = 1;
+ }
+ script = mapper.get_loose("brah");
+ if (script != 65) {
+ std::cout << "Expected discriminant 64 for (loose matched) script name `brah`, found " << script << std::endl;
+ result = 1;
+ }
+ script = mapper.get_strict("Linear_Z");
+ if (script != -1) {
+ std::cout << "Expected no value for fake script name `Linear_Z`, found " << script << std::endl;
+ result = 1;
+ }
+ if (result != 0) {
+ return result;
+ } else {
+ std::cout << "Script name mapper returns correct values" << std::endl;
+ }
+
+ ICU4XGeneralCategoryNameToMaskMapper mask_mapper = ICU4XGeneralCategoryNameToMaskMapper::load(dp).ok().value();
+ int32_t mask = mask_mapper.get_strict("Lu");
+ if (mask != 0x02) {
+ std::cout << "Expected discriminant 0x02 for mask name `Lu`, found " << mask << std::endl;
+ result = 1;
+ }
+ mask = mask_mapper.get_strict("L");
+ if (mask != 0x3e) {
+ std::cout << "Expected discriminant 0x3e for mask name `Lu`, found " << mask << std::endl;
+ result = 1;
+ }
+ mask = mask_mapper.get_strict("Letter");
+ if (mask != 0x3e) {
+ std::cout << "Expected discriminant 0x3e for mask name `Letter`, found " << mask << std::endl;
+ result = 1;
+ }
+ mask = mask_mapper.get_loose("l");
+ if (mask != 0x3e) {
+ std::cout << "Expected discriminant 0x3e for mask name `l`, found " << mask << std::endl;
+ result = 1;
+ }
+ mask = mask_mapper.get_strict("letter");
+ if (mask != 0) {
+ std::cout << "Expected no mask for (strict matched) name `letter`, found " << mask << std::endl;
+ result = 1;
+ }
+ mask = mask_mapper.get_strict("EverythingLol");
+ if (mask != 0) {
+ std::cout << "Expected no mask for nonexistant name `EverythingLol`, found " << mask << std::endl;
+ result = 1;
+ }
+
+
+ if (result != 0) {
+ return result;
+ } else {
+ std::cout << "Mask name mapper returns correct values" << std::endl;
+ }
+
+
+ mask = mask_mapper.get_strict("Lu");
+ ICU4XCodePointMapData8 gc = ICU4XCodePointMapData8::load_general_category(dp).ok().value();
+ auto ranges = gc.iter_ranges_for_mask(mask);
+ auto next = ranges.next();
+ if (next.done) {
+ std::cout << "Got empty iterator!";
+ result = 1;
+ }
+ if (next.start != U'A' || next.end != U'Z') {
+ std::cout << "Expected range [" << U'A' << ", " << U'Z' << "], got range [" << next.start << ", " << next.end << "]" << std::endl;
+ result = 1;
+ }
+
+ // Test iteration to completion for a small set
+ mask = mask_mapper.get_strict("Control");
+ ranges = gc.iter_ranges_for_mask(mask);
+ next = ranges.next();
+
+ if (next.start != 0 || next.end != 0x1f) {
+ std::cout << "Expected range [0, 0x1f], got range [" << next.start << ", " << next.end << "]" << std::endl;
+ result = 1;
+ }
+
+ std::cout << "Found ranges for gc=Control:";
+ while (!next.done) {
+ std::cout << " [" << next.start << ", " << next.end << "]";
+
+ next = ranges.next();
+ }
+ std::cout << std::endl;
+
+ if (result != 0) {
+ return result;
+ } else {
+ std::cout << "Ranges iterator works" << std::endl;
+ }
+ return 0;
+}
diff --git a/intl/icu_capi/cpp/examples/segmenter/.gitignore b/intl/icu_capi/cpp/examples/segmenter/.gitignore
new file mode 100644
index 0000000000..cb34c546b3
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/segmenter/.gitignore
@@ -0,0 +1,2 @@
+a.out
+a.out.dSYM
diff --git a/intl/icu_capi/cpp/examples/segmenter/Makefile b/intl/icu_capi/cpp/examples/segmenter/Makefile
new file mode 100644
index 0000000000..57a9c06943
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/segmenter/Makefile
@@ -0,0 +1,28 @@
+# This file is part of ICU4X. For terms of use, please see the file
+# called LICENSE at the top level of the ICU4X source tree
+# (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+.DEFAULT_GOAL := test
+.PHONY: build test
+FORCE:
+
+ALL_HEADERS := $(wildcard ../../include/*.hpp) $(wildcard ../../../c/include/*.h)
+
+CXX?=g++
+
+$(ALL_HEADERS):
+
+../../../../../target/debug/libicu_capi_staticlib.a: FORCE
+ cargo build -p icu_capi_staticlib
+
+a.out: ../../../../../target/debug/libicu_capi_staticlib.a $(ALL_HEADERS) test.cpp
+ $(CXX) -std=c++17 test.cpp ../../../../../target/debug/libicu_capi_staticlib.a -ldl -lpthread -lm -g
+
+build: a.out
+
+test: build
+ ./a.out
+
+clean:
+ git clean -xf *
+ rm -f ../../../../../target/debug/libicu_capi_staticlib.a
diff --git a/intl/icu_capi/cpp/examples/segmenter/test.cpp b/intl/icu_capi/cpp/examples/segmenter/test.cpp
new file mode 100644
index 0000000000..cfe0899f76
--- /dev/null
+++ b/intl/icu_capi/cpp/examples/segmenter/test.cpp
@@ -0,0 +1,160 @@
+// This file is part of ICU4X. For terms of use, please see the file
+// called LICENSE at the top level of the ICU4X source tree
+// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+#include "../../include/ICU4XDataProvider.hpp"
+#include "../../include/ICU4XGraphemeClusterSegmenter.hpp"
+#include "../../include/ICU4XLineSegmenter.hpp"
+#include "../../include/ICU4XSentenceSegmenter.hpp"
+#include "../../include/ICU4XWordSegmenter.hpp"
+#include "../../include/ICU4XLogger.hpp"
+
+#include <iostream>
+#include <string_view>
+
+using std::cout;
+using std::endl;
+
+void print_ruler(size_t str_len) {
+ for (size_t i = 0; i < str_len; i++) {
+ if (i % 10 == 0) {
+ cout << "0";
+ } else if (i % 5 == 0) {
+ cout << "5";
+ } else {
+ cout << ".";
+ }
+ }
+ cout << endl;
+}
+
+template <typename Iterator>
+void iterate_breakpoints(Iterator& iterator) {
+ while (true) {
+ int32_t breakpoint = iterator.next();
+ if (breakpoint == -1) {
+ break;
+ }
+ cout << " " << breakpoint;
+ }
+ cout << endl;
+}
+
+template <typename Iterator>
+void iterate_word_breakpoints(Iterator& iterator) {
+ while (true) {
+ int32_t breakpoint = iterator.next();
+ if (breakpoint == -1) {
+ break;
+ }
+ cout << " " << breakpoint;
+ switch (iterator.word_type()) {
+ case ICU4XSegmenterWordType::None:
+ cout << " (none";
+ break;
+ case ICU4XSegmenterWordType::Number:
+ cout << " (number";
+ break;
+ case ICU4XSegmenterWordType::Letter:
+ cout << " (letter";
+ break;
+ default:
+ cout << " (unknown status";
+ break;
+ }
+ if (iterator.is_word_like()) {
+ cout << ", word-like";
+ }
+ cout << ")";
+ }
+ cout << endl;
+}
+
+void test_line(const std::string_view& str) {
+ const auto provider = ICU4XDataProvider::create_compiled();
+ const auto segmenter_auto =
+ ICU4XLineSegmenter::create_auto(provider).ok().value();
+ const auto segmenter_lstm =
+ ICU4XLineSegmenter::create_lstm(provider).ok().value();
+ const auto segmenter_dictionary =
+ ICU4XLineSegmenter::create_dictionary(provider).ok().value();
+
+ const ICU4XLineSegmenter* segmenters[] = {&segmenter_auto, &segmenter_lstm,
+ &segmenter_dictionary};
+ for (const auto* segmenter : segmenters) {
+ cout << "Finding line breakpoints in string:" << endl << str << endl;
+ print_ruler(str.size());
+
+ cout << "Line breakpoints:";
+ auto iterator = segmenter->segment_utf8(str);
+ iterate_breakpoints(iterator);
+ }
+}
+
+void test_grapheme(const std::string_view& str) {
+ const auto provider = ICU4XDataProvider::create_compiled();
+ const auto segmenter = ICU4XGraphemeClusterSegmenter::create(provider).ok().value();
+ cout << "Finding grapheme cluster breakpoints in string:" << endl
+ << str << endl;
+ print_ruler(str.size());
+
+ cout << "Grapheme cluster breakpoints:";
+ auto iterator = segmenter.segment_utf8(str);
+ iterate_breakpoints(iterator);
+}
+
+void test_word(const std::string_view& str) {
+ const auto provider = ICU4XDataProvider::create_compiled();
+ const auto segmenter_auto =
+ ICU4XWordSegmenter::create_auto(provider).ok().value();
+ const auto segmenter_lstm =
+ ICU4XWordSegmenter::create_lstm(provider).ok().value();
+ const auto segmenter_dictionary =
+ ICU4XWordSegmenter::create_dictionary(provider).ok().value();
+
+ const ICU4XWordSegmenter* segmenters[] = {&segmenter_auto, &segmenter_lstm,
+ &segmenter_dictionary};
+ for (const auto* segmenter : segmenters) {
+ cout << "Finding word breakpoints in string:" << endl << str << endl;
+ print_ruler(str.size());
+
+ cout << "Word breakpoints:";
+ auto iterator = segmenter->segment_utf8(str);
+ iterate_word_breakpoints(iterator);
+ }
+}
+
+void test_sentence(const std::string_view& str) {
+ const auto provider = ICU4XDataProvider::create_compiled();
+ const auto segmenter = ICU4XSentenceSegmenter::create(provider).ok().value();
+ cout << "Finding sentence breakpoints in string:" << endl
+ << str << endl;
+ print_ruler(str.size());
+
+ cout << "Sentence breakpoints:";
+ auto iterator = segmenter.segment_utf8(str);
+ iterate_breakpoints(iterator);
+}
+
+int main(int argc, char* argv[]) {
+ ICU4XLogger::init_simple_logger();
+ std::string_view str;
+ if (argc >= 2) {
+ str = argv[1];
+ } else {
+ str = "The 101 quick brown foxes jump over the lazy dog.";
+ }
+
+ test_line(str);
+ cout << endl;
+
+ test_grapheme(str);
+ cout << endl;
+
+ test_word(str);
+ cout << endl;
+
+ test_sentence(str);
+ cout << endl;
+ return 0;
+}
diff --git a/intl/icu_capi/cpp/include/CodePointRangeIterator.h b/intl/icu_capi/cpp/include/CodePointRangeIterator.h
new file mode 100644
index 0000000000..36d6d23175
--- /dev/null
+++ b/intl/icu_capi/cpp/include/CodePointRangeIterator.h
@@ -0,0 +1,30 @@
+#ifndef CodePointRangeIterator_H
+#define CodePointRangeIterator_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct CodePointRangeIterator CodePointRangeIterator;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "CodePointRangeIteratorResult.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+CodePointRangeIteratorResult CodePointRangeIterator_next(CodePointRangeIterator* self);
+void CodePointRangeIterator_destroy(CodePointRangeIterator* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/CodePointRangeIterator.hpp b/intl/icu_capi/cpp/include/CodePointRangeIterator.hpp
new file mode 100644
index 0000000000..3c2d5caef0
--- /dev/null
+++ b/intl/icu_capi/cpp/include/CodePointRangeIterator.hpp
@@ -0,0 +1,54 @@
+#ifndef CodePointRangeIterator_HPP
+#define CodePointRangeIterator_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "CodePointRangeIterator.h"
+
+struct CodePointRangeIteratorResult;
+
+/**
+ * A destruction policy for using CodePointRangeIterator with std::unique_ptr.
+ */
+struct CodePointRangeIteratorDeleter {
+ void operator()(capi::CodePointRangeIterator* l) const noexcept {
+ capi::CodePointRangeIterator_destroy(l);
+ }
+};
+
+/**
+ * An iterator over code point ranges, produced by `ICU4XCodePointSetData` or
+ * one of the `ICU4XCodePointMapData` types
+ */
+class CodePointRangeIterator {
+ public:
+
+ /**
+ * Advance the iterator by one and return the next range.
+ *
+ * If the iterator is out of items, `done` will be true
+ */
+ CodePointRangeIteratorResult next();
+ inline const capi::CodePointRangeIterator* AsFFI() const { return this->inner.get(); }
+ inline capi::CodePointRangeIterator* AsFFIMut() { return this->inner.get(); }
+ inline CodePointRangeIterator(capi::CodePointRangeIterator* i) : inner(i) {}
+ CodePointRangeIterator() = default;
+ CodePointRangeIterator(CodePointRangeIterator&&) noexcept = default;
+ CodePointRangeIterator& operator=(CodePointRangeIterator&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::CodePointRangeIterator, CodePointRangeIteratorDeleter> inner;
+};
+
+#include "CodePointRangeIteratorResult.hpp"
+
+inline CodePointRangeIteratorResult CodePointRangeIterator::next() {
+ capi::CodePointRangeIteratorResult diplomat_raw_struct_out_value = capi::CodePointRangeIterator_next(this->inner.get());
+ return CodePointRangeIteratorResult{ .start = std::move(diplomat_raw_struct_out_value.start), .end = std::move(diplomat_raw_struct_out_value.end), .done = std::move(diplomat_raw_struct_out_value.done) };
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/CodePointRangeIteratorResult.h b/intl/icu_capi/cpp/include/CodePointRangeIteratorResult.h
new file mode 100644
index 0000000000..846873be11
--- /dev/null
+++ b/intl/icu_capi/cpp/include/CodePointRangeIteratorResult.h
@@ -0,0 +1,32 @@
+#ifndef CodePointRangeIteratorResult_H
+#define CodePointRangeIteratorResult_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct CodePointRangeIteratorResult {
+ uint32_t start;
+ uint32_t end;
+ bool done;
+} CodePointRangeIteratorResult;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void CodePointRangeIteratorResult_destroy(CodePointRangeIteratorResult* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/CodePointRangeIteratorResult.hpp b/intl/icu_capi/cpp/include/CodePointRangeIteratorResult.hpp
new file mode 100644
index 0000000000..086ddfce08
--- /dev/null
+++ b/intl/icu_capi/cpp/include/CodePointRangeIteratorResult.hpp
@@ -0,0 +1,33 @@
+#ifndef CodePointRangeIteratorResult_HPP
+#define CodePointRangeIteratorResult_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "CodePointRangeIteratorResult.h"
+
+
+
+/**
+ * Result of a single iteration of [`CodePointRangeIterator`].
+ * Logically can be considered to be an `Option<RangeInclusive<u32>>`,
+ *
+ * `start` and `end` represent an inclusive range of code points [start, end],
+ * and `done` will be true if the iterator has already finished. The last contentful
+ * iteration will NOT produce a range done=true, in other words `start` and `end` are useful
+ * values if and only if `done=false`.
+ */
+struct CodePointRangeIteratorResult {
+ public:
+ uint32_t start;
+ uint32_t end;
+ bool done;
+};
+
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XAnyCalendarKind.h b/intl/icu_capi/cpp/include/ICU4XAnyCalendarKind.h
new file mode 100644
index 0000000000..329f381577
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XAnyCalendarKind.h
@@ -0,0 +1,55 @@
+#ifndef ICU4XAnyCalendarKind_H
+#define ICU4XAnyCalendarKind_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XAnyCalendarKind {
+ ICU4XAnyCalendarKind_Iso = 0,
+ ICU4XAnyCalendarKind_Gregorian = 1,
+ ICU4XAnyCalendarKind_Buddhist = 2,
+ ICU4XAnyCalendarKind_Japanese = 3,
+ ICU4XAnyCalendarKind_JapaneseExtended = 4,
+ ICU4XAnyCalendarKind_Ethiopian = 5,
+ ICU4XAnyCalendarKind_EthiopianAmeteAlem = 6,
+ ICU4XAnyCalendarKind_Indian = 7,
+ ICU4XAnyCalendarKind_Coptic = 8,
+ ICU4XAnyCalendarKind_Dangi = 9,
+ ICU4XAnyCalendarKind_Chinese = 10,
+ ICU4XAnyCalendarKind_Hebrew = 11,
+ ICU4XAnyCalendarKind_IslamicCivil = 12,
+ ICU4XAnyCalendarKind_IslamicObservational = 13,
+ ICU4XAnyCalendarKind_IslamicTabular = 14,
+ ICU4XAnyCalendarKind_IslamicUmmAlQura = 15,
+ ICU4XAnyCalendarKind_Persian = 16,
+ ICU4XAnyCalendarKind_Roc = 17,
+} ICU4XAnyCalendarKind;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XLocale.h"
+#include "diplomat_result_ICU4XAnyCalendarKind_void.h"
+#include "diplomat_result_void_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_ICU4XAnyCalendarKind_void ICU4XAnyCalendarKind_get_for_locale(const ICU4XLocale* locale);
+
+diplomat_result_ICU4XAnyCalendarKind_void ICU4XAnyCalendarKind_get_for_bcp47(const char* s_data, size_t s_len);
+
+diplomat_result_void_ICU4XError ICU4XAnyCalendarKind_bcp47(ICU4XAnyCalendarKind self, DiplomatWriteable* write);
+void ICU4XAnyCalendarKind_destroy(ICU4XAnyCalendarKind* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XAnyCalendarKind.hpp b/intl/icu_capi/cpp/include/ICU4XAnyCalendarKind.hpp
new file mode 100644
index 0000000000..93210f455e
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XAnyCalendarKind.hpp
@@ -0,0 +1,117 @@
+#ifndef ICU4XAnyCalendarKind_HPP
+#define ICU4XAnyCalendarKind_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XAnyCalendarKind.h"
+
+
+
+/**
+ * The various calendar types currently supported by [`ICU4XCalendar`]
+ *
+ * See the [Rust documentation for `AnyCalendarKind`](https://docs.rs/icu/latest/icu/calendar/enum.AnyCalendarKind.html) for more information.
+ */
+enum struct ICU4XAnyCalendarKind {
+
+ /**
+ * The kind of an Iso calendar
+ */
+ Iso = 0,
+
+ /**
+ * The kind of a Gregorian calendar
+ */
+ Gregorian = 1,
+
+ /**
+ * The kind of a Buddhist calendar
+ */
+ Buddhist = 2,
+
+ /**
+ * The kind of a Japanese calendar with modern eras
+ */
+ Japanese = 3,
+
+ /**
+ * The kind of a Japanese calendar with modern and historic eras
+ */
+ JapaneseExtended = 4,
+
+ /**
+ * The kind of an Ethiopian calendar, with Amete Mihret era
+ */
+ Ethiopian = 5,
+
+ /**
+ * The kind of an Ethiopian calendar, with Amete Alem era
+ */
+ EthiopianAmeteAlem = 6,
+
+ /**
+ * The kind of a Indian calendar
+ */
+ Indian = 7,
+
+ /**
+ * The kind of a Coptic calendar
+ */
+ Coptic = 8,
+
+ /**
+ * The kind of a Dangi calendar
+ */
+ Dangi = 9,
+
+ /**
+ * The kind of a Chinese calendar
+ */
+ Chinese = 10,
+
+ /**
+ * The kind of a Hebrew calendar
+ */
+ Hebrew = 11,
+
+ /**
+ * The kind of a Islamic civil calendar
+ */
+ IslamicCivil = 12,
+
+ /**
+ * The kind of a Islamic observational calendar
+ */
+ IslamicObservational = 13,
+
+ /**
+ * The kind of a Islamic tabular calendar
+ */
+ IslamicTabular = 14,
+
+ /**
+ * The kind of a Islamic Umm al-Qura calendar
+ */
+ IslamicUmmAlQura = 15,
+
+ /**
+ * The kind of a Persian calendar
+ */
+ Persian = 16,
+
+ /**
+ * The kind of a Roc calendar
+ */
+ Roc = 17,
+};
+class ICU4XLocale;
+#include "ICU4XError.hpp"
+
+#include "ICU4XLocale.hpp"
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XBcp47ToIanaMapper.h b/intl/icu_capi/cpp/include/ICU4XBcp47ToIanaMapper.h
new file mode 100644
index 0000000000..483afe1ec2
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XBcp47ToIanaMapper.h
@@ -0,0 +1,34 @@
+#ifndef ICU4XBcp47ToIanaMapper_H
+#define ICU4XBcp47ToIanaMapper_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XBcp47ToIanaMapper ICU4XBcp47ToIanaMapper;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XBcp47ToIanaMapper_ICU4XError.h"
+#include "diplomat_result_void_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XBcp47ToIanaMapper_ICU4XError ICU4XBcp47ToIanaMapper_create(const ICU4XDataProvider* provider);
+
+diplomat_result_void_ICU4XError ICU4XBcp47ToIanaMapper_get(const ICU4XBcp47ToIanaMapper* self, const char* value_data, size_t value_len, DiplomatWriteable* write);
+void ICU4XBcp47ToIanaMapper_destroy(ICU4XBcp47ToIanaMapper* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XBcp47ToIanaMapper.hpp b/intl/icu_capi/cpp/include/ICU4XBcp47ToIanaMapper.hpp
new file mode 100644
index 0000000000..b8c303e79a
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XBcp47ToIanaMapper.hpp
@@ -0,0 +1,98 @@
+#ifndef ICU4XBcp47ToIanaMapper_HPP
+#define ICU4XBcp47ToIanaMapper_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XBcp47ToIanaMapper.h"
+
+class ICU4XDataProvider;
+class ICU4XBcp47ToIanaMapper;
+#include "ICU4XError.hpp"
+
+/**
+ * A destruction policy for using ICU4XBcp47ToIanaMapper with std::unique_ptr.
+ */
+struct ICU4XBcp47ToIanaMapperDeleter {
+ void operator()(capi::ICU4XBcp47ToIanaMapper* l) const noexcept {
+ capi::ICU4XBcp47ToIanaMapper_destroy(l);
+ }
+};
+
+/**
+ * An object capable of mapping from a BCP-47 time zone ID to an IANA ID.
+ *
+ * See the [Rust documentation for `IanaBcp47RoundTripMapper`](https://docs.rs/icu/latest/icu/timezone/struct.IanaBcp47RoundTripMapper.html) for more information.
+ */
+class ICU4XBcp47ToIanaMapper {
+ public:
+
+ /**
+ * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/timezone/struct.IanaBcp47RoundTripMapper.html#method.new) for more information.
+ */
+ static diplomat::result<ICU4XBcp47ToIanaMapper, ICU4XError> create(const ICU4XDataProvider& provider);
+
+ /**
+ * Writes out the canonical IANA time zone ID corresponding to the given BCP-47 ID.
+ *
+ * See the [Rust documentation for `bcp47_to_iana`](https://docs.rs/icu/latest/icu/datetime/time_zone/struct.IanaBcp47RoundTripMapper.html#method.bcp47_to_iana) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> get_to_writeable(const std::string_view value, W& write) const;
+
+ /**
+ * Writes out the canonical IANA time zone ID corresponding to the given BCP-47 ID.
+ *
+ * See the [Rust documentation for `bcp47_to_iana`](https://docs.rs/icu/latest/icu/datetime/time_zone/struct.IanaBcp47RoundTripMapper.html#method.bcp47_to_iana) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> get(const std::string_view value) const;
+ inline const capi::ICU4XBcp47ToIanaMapper* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XBcp47ToIanaMapper* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XBcp47ToIanaMapper(capi::ICU4XBcp47ToIanaMapper* i) : inner(i) {}
+ ICU4XBcp47ToIanaMapper() = default;
+ ICU4XBcp47ToIanaMapper(ICU4XBcp47ToIanaMapper&&) noexcept = default;
+ ICU4XBcp47ToIanaMapper& operator=(ICU4XBcp47ToIanaMapper&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XBcp47ToIanaMapper, ICU4XBcp47ToIanaMapperDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+
+inline diplomat::result<ICU4XBcp47ToIanaMapper, ICU4XError> ICU4XBcp47ToIanaMapper::create(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XBcp47ToIanaMapper_create(provider.AsFFI());
+ diplomat::result<ICU4XBcp47ToIanaMapper, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XBcp47ToIanaMapper>(ICU4XBcp47ToIanaMapper(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XBcp47ToIanaMapper::get_to_writeable(const std::string_view value, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XBcp47ToIanaMapper_get(this->inner.get(), value.data(), value.size(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XBcp47ToIanaMapper::get(const std::string_view value) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XBcp47ToIanaMapper_get(this->inner.get(), value.data(), value.size(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XBidi.h b/intl/icu_capi/cpp/include/ICU4XBidi.h
new file mode 100644
index 0000000000..1ed7cfc8c2
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XBidi.h
@@ -0,0 +1,45 @@
+#ifndef ICU4XBidi_H
+#define ICU4XBidi_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XBidi ICU4XBidi;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XBidi_ICU4XError.h"
+#include "ICU4XBidiInfo.h"
+#include "ICU4XReorderedIndexMap.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XBidi_ICU4XError ICU4XBidi_create(const ICU4XDataProvider* provider);
+
+ICU4XBidiInfo* ICU4XBidi_for_text(const ICU4XBidi* self, const char* text_data, size_t text_len, uint8_t default_level);
+
+ICU4XReorderedIndexMap* ICU4XBidi_reorder_visual(const ICU4XBidi* self, const uint8_t* levels_data, size_t levels_len);
+
+bool ICU4XBidi_level_is_rtl(uint8_t level);
+
+bool ICU4XBidi_level_is_ltr(uint8_t level);
+
+uint8_t ICU4XBidi_level_rtl();
+
+uint8_t ICU4XBidi_level_ltr();
+void ICU4XBidi_destroy(ICU4XBidi* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XBidi.hpp b/intl/icu_capi/cpp/include/ICU4XBidi.hpp
new file mode 100644
index 0000000000..00ab389d7b
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XBidi.hpp
@@ -0,0 +1,142 @@
+#ifndef ICU4XBidi_HPP
+#define ICU4XBidi_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XBidi.h"
+
+class ICU4XDataProvider;
+class ICU4XBidi;
+#include "ICU4XError.hpp"
+class ICU4XBidiInfo;
+class ICU4XReorderedIndexMap;
+
+/**
+ * A destruction policy for using ICU4XBidi with std::unique_ptr.
+ */
+struct ICU4XBidiDeleter {
+ void operator()(capi::ICU4XBidi* l) const noexcept {
+ capi::ICU4XBidi_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X Bidi object, containing loaded bidi data
+ *
+ * See the [Rust documentation for `BidiClassAdapter`](https://docs.rs/icu/latest/icu/properties/bidi/struct.BidiClassAdapter.html) for more information.
+ */
+class ICU4XBidi {
+ public:
+
+ /**
+ * Creates a new [`ICU4XBidi`] from locale data.
+ *
+ * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/properties/bidi/struct.BidiClassAdapter.html#method.new) for more information.
+ */
+ static diplomat::result<ICU4XBidi, ICU4XError> create(const ICU4XDataProvider& provider);
+
+ /**
+ * Use the data loaded in this object to process a string and calculate bidi information
+ *
+ * Takes in a Level for the default level, if it is an invalid value it will default to LTR
+ *
+ * See the [Rust documentation for `new_with_data_source`](https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.BidiInfo.html#method.new_with_data_source) for more information.
+ *
+ * Lifetimes: `text` must live at least as long as the output.
+ */
+ ICU4XBidiInfo for_text(const std::string_view text, uint8_t default_level) const;
+
+ /**
+ * Utility function for producing reorderings given a list of levels
+ *
+ * Produces a map saying which visual index maps to which source index.
+ *
+ * The levels array must not have values greater than 126 (this is the
+ * Bidi maximum explicit depth plus one).
+ * Failure to follow this invariant may lead to incorrect results,
+ * but is still safe.
+ *
+ * See the [Rust documentation for `reorder_visual`](https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.BidiInfo.html#method.reorder_visual) for more information.
+ */
+ ICU4XReorderedIndexMap reorder_visual(const diplomat::span<const uint8_t> levels) const;
+
+ /**
+ * Check if a Level returned by level_at is an RTL level.
+ *
+ * Invalid levels (numbers greater than 125) will be assumed LTR
+ *
+ * See the [Rust documentation for `is_rtl`](https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.Level.html#method.is_rtl) for more information.
+ */
+ static bool level_is_rtl(uint8_t level);
+
+ /**
+ * Check if a Level returned by level_at is an LTR level.
+ *
+ * Invalid levels (numbers greater than 125) will be assumed LTR
+ *
+ * See the [Rust documentation for `is_ltr`](https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.Level.html#method.is_ltr) for more information.
+ */
+ static bool level_is_ltr(uint8_t level);
+
+ /**
+ * Get a basic RTL Level value
+ *
+ * See the [Rust documentation for `rtl`](https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.Level.html#method.rtl) for more information.
+ */
+ static uint8_t level_rtl();
+
+ /**
+ * Get a simple LTR Level value
+ *
+ * See the [Rust documentation for `ltr`](https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.Level.html#method.ltr) for more information.
+ */
+ static uint8_t level_ltr();
+ inline const capi::ICU4XBidi* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XBidi* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XBidi(capi::ICU4XBidi* i) : inner(i) {}
+ ICU4XBidi() = default;
+ ICU4XBidi(ICU4XBidi&&) noexcept = default;
+ ICU4XBidi& operator=(ICU4XBidi&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XBidi, ICU4XBidiDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XBidiInfo.hpp"
+#include "ICU4XReorderedIndexMap.hpp"
+
+inline diplomat::result<ICU4XBidi, ICU4XError> ICU4XBidi::create(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XBidi_create(provider.AsFFI());
+ diplomat::result<ICU4XBidi, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XBidi>(ICU4XBidi(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XBidiInfo ICU4XBidi::for_text(const std::string_view text, uint8_t default_level) const {
+ return ICU4XBidiInfo(capi::ICU4XBidi_for_text(this->inner.get(), text.data(), text.size(), default_level));
+}
+inline ICU4XReorderedIndexMap ICU4XBidi::reorder_visual(const diplomat::span<const uint8_t> levels) const {
+ return ICU4XReorderedIndexMap(capi::ICU4XBidi_reorder_visual(this->inner.get(), levels.data(), levels.size()));
+}
+inline bool ICU4XBidi::level_is_rtl(uint8_t level) {
+ return capi::ICU4XBidi_level_is_rtl(level);
+}
+inline bool ICU4XBidi::level_is_ltr(uint8_t level) {
+ return capi::ICU4XBidi_level_is_ltr(level);
+}
+inline uint8_t ICU4XBidi::level_rtl() {
+ return capi::ICU4XBidi_level_rtl();
+}
+inline uint8_t ICU4XBidi::level_ltr() {
+ return capi::ICU4XBidi_level_ltr();
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XBidiDirection.h b/intl/icu_capi/cpp/include/ICU4XBidiDirection.h
new file mode 100644
index 0000000000..33de81d6e9
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XBidiDirection.h
@@ -0,0 +1,32 @@
+#ifndef ICU4XBidiDirection_H
+#define ICU4XBidiDirection_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XBidiDirection {
+ ICU4XBidiDirection_Ltr = 0,
+ ICU4XBidiDirection_Rtl = 1,
+ ICU4XBidiDirection_Mixed = 2,
+} ICU4XBidiDirection;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XBidiDirection_destroy(ICU4XBidiDirection* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XBidiDirection.hpp b/intl/icu_capi/cpp/include/ICU4XBidiDirection.hpp
new file mode 100644
index 0000000000..ad21e51910
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XBidiDirection.hpp
@@ -0,0 +1,21 @@
+#ifndef ICU4XBidiDirection_HPP
+#define ICU4XBidiDirection_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XBidiDirection.h"
+
+
+enum struct ICU4XBidiDirection {
+ Ltr = 0,
+ Rtl = 1,
+ Mixed = 2,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XBidiInfo.h b/intl/icu_capi/cpp/include/ICU4XBidiInfo.h
new file mode 100644
index 0000000000..02e8c21659
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XBidiInfo.h
@@ -0,0 +1,36 @@
+#ifndef ICU4XBidiInfo_H
+#define ICU4XBidiInfo_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XBidiInfo ICU4XBidiInfo;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XBidiParagraph.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+size_t ICU4XBidiInfo_paragraph_count(const ICU4XBidiInfo* self);
+
+ICU4XBidiParagraph* ICU4XBidiInfo_paragraph_at(const ICU4XBidiInfo* self, size_t n);
+
+size_t ICU4XBidiInfo_size(const ICU4XBidiInfo* self);
+
+uint8_t ICU4XBidiInfo_level_at(const ICU4XBidiInfo* self, size_t pos);
+void ICU4XBidiInfo_destroy(ICU4XBidiInfo* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XBidiInfo.hpp b/intl/icu_capi/cpp/include/ICU4XBidiInfo.hpp
new file mode 100644
index 0000000000..c19ad630fb
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XBidiInfo.hpp
@@ -0,0 +1,89 @@
+#ifndef ICU4XBidiInfo_HPP
+#define ICU4XBidiInfo_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XBidiInfo.h"
+
+class ICU4XBidiParagraph;
+
+/**
+ * A destruction policy for using ICU4XBidiInfo with std::unique_ptr.
+ */
+struct ICU4XBidiInfoDeleter {
+ void operator()(capi::ICU4XBidiInfo* l) const noexcept {
+ capi::ICU4XBidiInfo_destroy(l);
+ }
+};
+
+/**
+ * An object containing bidi information for a given string, produced by `for_text()` on `ICU4XBidi`
+ *
+ * See the [Rust documentation for `BidiInfo`](https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.BidiInfo.html) for more information.
+ */
+class ICU4XBidiInfo {
+ public:
+
+ /**
+ * The number of paragraphs contained here
+ */
+ size_t paragraph_count() const;
+
+ /**
+ * Get the nth paragraph, returning `None` if out of bounds
+ *
+ * Lifetimes: `this` must live at least as long as the output.
+ */
+ std::optional<ICU4XBidiParagraph> paragraph_at(size_t n) const;
+
+ /**
+ * The number of bytes in this full text
+ */
+ size_t size() const;
+
+ /**
+ * Get the BIDI level at a particular byte index in the full text.
+ * This integer is conceptually a `unicode_bidi::Level`,
+ * and can be further inspected using the static methods on ICU4XBidi.
+ *
+ * Returns 0 (equivalent to `Level::ltr()`) on error
+ */
+ uint8_t level_at(size_t pos) const;
+ inline const capi::ICU4XBidiInfo* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XBidiInfo* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XBidiInfo(capi::ICU4XBidiInfo* i) : inner(i) {}
+ ICU4XBidiInfo() = default;
+ ICU4XBidiInfo(ICU4XBidiInfo&&) noexcept = default;
+ ICU4XBidiInfo& operator=(ICU4XBidiInfo&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XBidiInfo, ICU4XBidiInfoDeleter> inner;
+};
+
+#include "ICU4XBidiParagraph.hpp"
+
+inline size_t ICU4XBidiInfo::paragraph_count() const {
+ return capi::ICU4XBidiInfo_paragraph_count(this->inner.get());
+}
+inline std::optional<ICU4XBidiParagraph> ICU4XBidiInfo::paragraph_at(size_t n) const {
+ auto diplomat_optional_raw_out_value = capi::ICU4XBidiInfo_paragraph_at(this->inner.get(), n);
+ std::optional<ICU4XBidiParagraph> diplomat_optional_out_value;
+ if (diplomat_optional_raw_out_value != nullptr) {
+ diplomat_optional_out_value = ICU4XBidiParagraph(diplomat_optional_raw_out_value);
+ } else {
+ diplomat_optional_out_value = std::nullopt;
+ }
+ return diplomat_optional_out_value;
+}
+inline size_t ICU4XBidiInfo::size() const {
+ return capi::ICU4XBidiInfo_size(this->inner.get());
+}
+inline uint8_t ICU4XBidiInfo::level_at(size_t pos) const {
+ return capi::ICU4XBidiInfo_level_at(this->inner.get(), pos);
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XBidiParagraph.h b/intl/icu_capi/cpp/include/ICU4XBidiParagraph.h
new file mode 100644
index 0000000000..269f940cc7
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XBidiParagraph.h
@@ -0,0 +1,43 @@
+#ifndef ICU4XBidiParagraph_H
+#define ICU4XBidiParagraph_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XBidiParagraph ICU4XBidiParagraph;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "diplomat_result_void_ICU4XError.h"
+#include "ICU4XBidiDirection.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_void_ICU4XError ICU4XBidiParagraph_set_paragraph_in_text(ICU4XBidiParagraph* self, size_t n);
+
+ICU4XBidiDirection ICU4XBidiParagraph_direction(const ICU4XBidiParagraph* self);
+
+size_t ICU4XBidiParagraph_size(const ICU4XBidiParagraph* self);
+
+size_t ICU4XBidiParagraph_range_start(const ICU4XBidiParagraph* self);
+
+size_t ICU4XBidiParagraph_range_end(const ICU4XBidiParagraph* self);
+
+diplomat_result_void_ICU4XError ICU4XBidiParagraph_reorder_line(const ICU4XBidiParagraph* self, size_t range_start, size_t range_end, DiplomatWriteable* out);
+
+uint8_t ICU4XBidiParagraph_level_at(const ICU4XBidiParagraph* self, size_t pos);
+void ICU4XBidiParagraph_destroy(ICU4XBidiParagraph* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XBidiParagraph.hpp b/intl/icu_capi/cpp/include/ICU4XBidiParagraph.hpp
new file mode 100644
index 0000000000..645390640b
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XBidiParagraph.hpp
@@ -0,0 +1,150 @@
+#ifndef ICU4XBidiParagraph_HPP
+#define ICU4XBidiParagraph_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XBidiParagraph.h"
+
+#include "ICU4XError.hpp"
+#include "ICU4XBidiDirection.hpp"
+
+/**
+ * A destruction policy for using ICU4XBidiParagraph with std::unique_ptr.
+ */
+struct ICU4XBidiParagraphDeleter {
+ void operator()(capi::ICU4XBidiParagraph* l) const noexcept {
+ capi::ICU4XBidiParagraph_destroy(l);
+ }
+};
+
+/**
+ * Bidi information for a single processed paragraph
+ */
+class ICU4XBidiParagraph {
+ public:
+
+ /**
+ * Given a paragraph index `n` within the surrounding text, this sets this
+ * object to the paragraph at that index. Returns `ICU4XError::OutOfBoundsError` when out of bounds.
+ *
+ * This is equivalent to calling `paragraph_at()` on `ICU4XBidiInfo` but doesn't
+ * create a new object
+ */
+ diplomat::result<std::monostate, ICU4XError> set_paragraph_in_text(size_t n);
+
+ /**
+ * The primary direction of this paragraph
+ *
+ * See the [Rust documentation for `level_at`](https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.Paragraph.html#method.level_at) for more information.
+ */
+ ICU4XBidiDirection direction() const;
+
+ /**
+ * The number of bytes in this paragraph
+ *
+ * See the [Rust documentation for `len`](https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.ParagraphInfo.html#method.len) for more information.
+ */
+ size_t size() const;
+
+ /**
+ * The start index of this paragraph within the source text
+ */
+ size_t range_start() const;
+
+ /**
+ * The end index of this paragraph within the source text
+ */
+ size_t range_end() const;
+
+ /**
+ * Reorder a line based on display order. The ranges are specified relative to the source text and must be contained
+ * within this paragraph's range.
+ *
+ * See the [Rust documentation for `level_at`](https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.Paragraph.html#method.level_at) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> reorder_line_to_writeable(size_t range_start, size_t range_end, W& out) const;
+
+ /**
+ * Reorder a line based on display order. The ranges are specified relative to the source text and must be contained
+ * within this paragraph's range.
+ *
+ * See the [Rust documentation for `level_at`](https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.Paragraph.html#method.level_at) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> reorder_line(size_t range_start, size_t range_end) const;
+
+ /**
+ * Get the BIDI level at a particular byte index in this paragraph.
+ * This integer is conceptually a `unicode_bidi::Level`,
+ * and can be further inspected using the static methods on ICU4XBidi.
+ *
+ * Returns 0 (equivalent to `Level::ltr()`) on error
+ *
+ * See the [Rust documentation for `level_at`](https://docs.rs/unicode_bidi/latest/unicode_bidi/struct.Paragraph.html#method.level_at) for more information.
+ */
+ uint8_t level_at(size_t pos) const;
+ inline const capi::ICU4XBidiParagraph* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XBidiParagraph* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XBidiParagraph(capi::ICU4XBidiParagraph* i) : inner(i) {}
+ ICU4XBidiParagraph() = default;
+ ICU4XBidiParagraph(ICU4XBidiParagraph&&) noexcept = default;
+ ICU4XBidiParagraph& operator=(ICU4XBidiParagraph&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XBidiParagraph, ICU4XBidiParagraphDeleter> inner;
+};
+
+
+inline diplomat::result<std::monostate, ICU4XError> ICU4XBidiParagraph::set_paragraph_in_text(size_t n) {
+ auto diplomat_result_raw_out_value = capi::ICU4XBidiParagraph_set_paragraph_in_text(this->inner.get(), n);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XBidiDirection ICU4XBidiParagraph::direction() const {
+ return static_cast<ICU4XBidiDirection>(capi::ICU4XBidiParagraph_direction(this->inner.get()));
+}
+inline size_t ICU4XBidiParagraph::size() const {
+ return capi::ICU4XBidiParagraph_size(this->inner.get());
+}
+inline size_t ICU4XBidiParagraph::range_start() const {
+ return capi::ICU4XBidiParagraph_range_start(this->inner.get());
+}
+inline size_t ICU4XBidiParagraph::range_end() const {
+ return capi::ICU4XBidiParagraph_range_end(this->inner.get());
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XBidiParagraph::reorder_line_to_writeable(size_t range_start, size_t range_end, W& out) const {
+ capi::DiplomatWriteable out_writer = diplomat::WriteableTrait<W>::Construct(out);
+ auto diplomat_result_raw_out_value = capi::ICU4XBidiParagraph_reorder_line(this->inner.get(), range_start, range_end, &out_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XBidiParagraph::reorder_line(size_t range_start, size_t range_end) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XBidiParagraph_reorder_line(this->inner.get(), range_start, range_end, &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+inline uint8_t ICU4XBidiParagraph::level_at(size_t pos) const {
+ return capi::ICU4XBidiParagraph_level_at(this->inner.get(), pos);
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCalendar.h b/intl/icu_capi/cpp/include/ICU4XCalendar.h
new file mode 100644
index 0000000000..9ea6484b5f
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCalendar.h
@@ -0,0 +1,37 @@
+#ifndef ICU4XCalendar_H
+#define ICU4XCalendar_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XCalendar ICU4XCalendar;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "ICU4XLocale.h"
+#include "diplomat_result_box_ICU4XCalendar_ICU4XError.h"
+#include "ICU4XAnyCalendarKind.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XCalendar_ICU4XError ICU4XCalendar_create_for_locale(const ICU4XDataProvider* provider, const ICU4XLocale* locale);
+
+diplomat_result_box_ICU4XCalendar_ICU4XError ICU4XCalendar_create_for_kind(const ICU4XDataProvider* provider, ICU4XAnyCalendarKind kind);
+
+ICU4XAnyCalendarKind ICU4XCalendar_kind(const ICU4XCalendar* self);
+void ICU4XCalendar_destroy(ICU4XCalendar* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCalendar.hpp b/intl/icu_capi/cpp/include/ICU4XCalendar.hpp
new file mode 100644
index 0000000000..e6ae0608c5
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCalendar.hpp
@@ -0,0 +1,91 @@
+#ifndef ICU4XCalendar_HPP
+#define ICU4XCalendar_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XCalendar.h"
+
+class ICU4XDataProvider;
+class ICU4XLocale;
+class ICU4XCalendar;
+#include "ICU4XError.hpp"
+#include "ICU4XAnyCalendarKind.hpp"
+
+/**
+ * A destruction policy for using ICU4XCalendar with std::unique_ptr.
+ */
+struct ICU4XCalendarDeleter {
+ void operator()(capi::ICU4XCalendar* l) const noexcept {
+ capi::ICU4XCalendar_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `AnyCalendar`](https://docs.rs/icu/latest/icu/calendar/enum.AnyCalendar.html) for more information.
+ */
+class ICU4XCalendar {
+ public:
+
+ /**
+ * Creates a new [`ICU4XCalendar`] from the specified date and time.
+ *
+ * See the [Rust documentation for `new_for_locale`](https://docs.rs/icu/latest/icu/calendar/enum.AnyCalendar.html#method.new_for_locale) for more information.
+ */
+ static diplomat::result<ICU4XCalendar, ICU4XError> create_for_locale(const ICU4XDataProvider& provider, const ICU4XLocale& locale);
+
+ /**
+ * Creates a new [`ICU4XCalendar`] from the specified date and time.
+ *
+ * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/calendar/enum.AnyCalendar.html#method.new) for more information.
+ */
+ static diplomat::result<ICU4XCalendar, ICU4XError> create_for_kind(const ICU4XDataProvider& provider, ICU4XAnyCalendarKind kind);
+
+ /**
+ * Returns the kind of this calendar
+ *
+ * See the [Rust documentation for `kind`](https://docs.rs/icu/latest/icu/calendar/enum.AnyCalendar.html#method.kind) for more information.
+ */
+ ICU4XAnyCalendarKind kind() const;
+ inline const capi::ICU4XCalendar* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XCalendar* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XCalendar(capi::ICU4XCalendar* i) : inner(i) {}
+ ICU4XCalendar() = default;
+ ICU4XCalendar(ICU4XCalendar&&) noexcept = default;
+ ICU4XCalendar& operator=(ICU4XCalendar&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XCalendar, ICU4XCalendarDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocale.hpp"
+
+inline diplomat::result<ICU4XCalendar, ICU4XError> ICU4XCalendar::create_for_locale(const ICU4XDataProvider& provider, const ICU4XLocale& locale) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCalendar_create_for_locale(provider.AsFFI(), locale.AsFFI());
+ diplomat::result<ICU4XCalendar, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCalendar>(ICU4XCalendar(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCalendar, ICU4XError> ICU4XCalendar::create_for_kind(const ICU4XDataProvider& provider, ICU4XAnyCalendarKind kind) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCalendar_create_for_kind(provider.AsFFI(), static_cast<capi::ICU4XAnyCalendarKind>(kind));
+ diplomat::result<ICU4XCalendar, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCalendar>(ICU4XCalendar(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XAnyCalendarKind ICU4XCalendar::kind() const {
+ return static_cast<ICU4XAnyCalendarKind>(capi::ICU4XCalendar_kind(this->inner.get()));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCanonicalCombiningClassMap.h b/intl/icu_capi/cpp/include/ICU4XCanonicalCombiningClassMap.h
new file mode 100644
index 0000000000..f0fc447ba0
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCanonicalCombiningClassMap.h
@@ -0,0 +1,35 @@
+#ifndef ICU4XCanonicalCombiningClassMap_H
+#define ICU4XCanonicalCombiningClassMap_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XCanonicalCombiningClassMap ICU4XCanonicalCombiningClassMap;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XCanonicalCombiningClassMap_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XCanonicalCombiningClassMap_ICU4XError ICU4XCanonicalCombiningClassMap_create(const ICU4XDataProvider* provider);
+
+uint8_t ICU4XCanonicalCombiningClassMap_get(const ICU4XCanonicalCombiningClassMap* self, char32_t ch);
+
+uint8_t ICU4XCanonicalCombiningClassMap_get32(const ICU4XCanonicalCombiningClassMap* self, uint32_t ch);
+void ICU4XCanonicalCombiningClassMap_destroy(ICU4XCanonicalCombiningClassMap* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCanonicalCombiningClassMap.hpp b/intl/icu_capi/cpp/include/ICU4XCanonicalCombiningClassMap.hpp
new file mode 100644
index 0000000000..e663d47824
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCanonicalCombiningClassMap.hpp
@@ -0,0 +1,83 @@
+#ifndef ICU4XCanonicalCombiningClassMap_HPP
+#define ICU4XCanonicalCombiningClassMap_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XCanonicalCombiningClassMap.h"
+
+class ICU4XDataProvider;
+class ICU4XCanonicalCombiningClassMap;
+#include "ICU4XError.hpp"
+
+/**
+ * A destruction policy for using ICU4XCanonicalCombiningClassMap with std::unique_ptr.
+ */
+struct ICU4XCanonicalCombiningClassMapDeleter {
+ void operator()(capi::ICU4XCanonicalCombiningClassMap* l) const noexcept {
+ capi::ICU4XCanonicalCombiningClassMap_destroy(l);
+ }
+};
+
+/**
+ * Lookup of the Canonical_Combining_Class Unicode property
+ *
+ * See the [Rust documentation for `CanonicalCombiningClassMap`](https://docs.rs/icu/latest/icu/normalizer/properties/struct.CanonicalCombiningClassMap.html) for more information.
+ */
+class ICU4XCanonicalCombiningClassMap {
+ public:
+
+ /**
+ * Construct a new ICU4XCanonicalCombiningClassMap instance for NFC
+ *
+ * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/normalizer/properties/struct.CanonicalCombiningClassMap.html#method.new) for more information.
+ */
+ static diplomat::result<ICU4XCanonicalCombiningClassMap, ICU4XError> create(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `get`](https://docs.rs/icu/latest/icu/normalizer/properties/struct.CanonicalCombiningClassMap.html#method.get) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/properties/properties/struct.CanonicalCombiningClass.html)
+ */
+ uint8_t get(char32_t ch) const;
+
+ /**
+ * See the [Rust documentation for `get32`](https://docs.rs/icu/latest/icu/normalizer/properties/struct.CanonicalCombiningClassMap.html#method.get32) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/properties/properties/struct.CanonicalCombiningClass.html)
+ */
+ uint8_t get32(uint32_t ch) const;
+ inline const capi::ICU4XCanonicalCombiningClassMap* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XCanonicalCombiningClassMap* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XCanonicalCombiningClassMap(capi::ICU4XCanonicalCombiningClassMap* i) : inner(i) {}
+ ICU4XCanonicalCombiningClassMap() = default;
+ ICU4XCanonicalCombiningClassMap(ICU4XCanonicalCombiningClassMap&&) noexcept = default;
+ ICU4XCanonicalCombiningClassMap& operator=(ICU4XCanonicalCombiningClassMap&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XCanonicalCombiningClassMap, ICU4XCanonicalCombiningClassMapDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+
+inline diplomat::result<ICU4XCanonicalCombiningClassMap, ICU4XError> ICU4XCanonicalCombiningClassMap::create(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCanonicalCombiningClassMap_create(provider.AsFFI());
+ diplomat::result<ICU4XCanonicalCombiningClassMap, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCanonicalCombiningClassMap>(ICU4XCanonicalCombiningClassMap(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline uint8_t ICU4XCanonicalCombiningClassMap::get(char32_t ch) const {
+ return capi::ICU4XCanonicalCombiningClassMap_get(this->inner.get(), ch);
+}
+inline uint8_t ICU4XCanonicalCombiningClassMap::get32(uint32_t ch) const {
+ return capi::ICU4XCanonicalCombiningClassMap_get32(this->inner.get(), ch);
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCanonicalComposition.h b/intl/icu_capi/cpp/include/ICU4XCanonicalComposition.h
new file mode 100644
index 0000000000..e9ae621739
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCanonicalComposition.h
@@ -0,0 +1,33 @@
+#ifndef ICU4XCanonicalComposition_H
+#define ICU4XCanonicalComposition_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XCanonicalComposition ICU4XCanonicalComposition;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XCanonicalComposition_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XCanonicalComposition_ICU4XError ICU4XCanonicalComposition_create(const ICU4XDataProvider* provider);
+
+char32_t ICU4XCanonicalComposition_compose(const ICU4XCanonicalComposition* self, char32_t starter, char32_t second);
+void ICU4XCanonicalComposition_destroy(ICU4XCanonicalComposition* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCanonicalComposition.hpp b/intl/icu_capi/cpp/include/ICU4XCanonicalComposition.hpp
new file mode 100644
index 0000000000..f9e226f0f7
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCanonicalComposition.hpp
@@ -0,0 +1,76 @@
+#ifndef ICU4XCanonicalComposition_HPP
+#define ICU4XCanonicalComposition_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XCanonicalComposition.h"
+
+class ICU4XDataProvider;
+class ICU4XCanonicalComposition;
+#include "ICU4XError.hpp"
+
+/**
+ * A destruction policy for using ICU4XCanonicalComposition with std::unique_ptr.
+ */
+struct ICU4XCanonicalCompositionDeleter {
+ void operator()(capi::ICU4XCanonicalComposition* l) const noexcept {
+ capi::ICU4XCanonicalComposition_destroy(l);
+ }
+};
+
+/**
+ * The raw canonical composition operation.
+ *
+ * Callers should generally use ICU4XComposingNormalizer unless they specifically need raw composition operations
+ *
+ * See the [Rust documentation for `CanonicalComposition`](https://docs.rs/icu/latest/icu/normalizer/properties/struct.CanonicalComposition.html) for more information.
+ */
+class ICU4XCanonicalComposition {
+ public:
+
+ /**
+ * Construct a new ICU4XCanonicalComposition instance for NFC
+ *
+ * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/normalizer/properties/struct.CanonicalComposition.html#method.new) for more information.
+ */
+ static diplomat::result<ICU4XCanonicalComposition, ICU4XError> create(const ICU4XDataProvider& provider);
+
+ /**
+ * Performs canonical composition (including Hangul) on a pair of characters
+ * or returns NUL if these characters don’t compose. Composition exclusions are taken into account.
+ *
+ * See the [Rust documentation for `compose`](https://docs.rs/icu/latest/icu/normalizer/properties/struct.CanonicalComposition.html#method.compose) for more information.
+ */
+ char32_t compose(char32_t starter, char32_t second) const;
+ inline const capi::ICU4XCanonicalComposition* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XCanonicalComposition* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XCanonicalComposition(capi::ICU4XCanonicalComposition* i) : inner(i) {}
+ ICU4XCanonicalComposition() = default;
+ ICU4XCanonicalComposition(ICU4XCanonicalComposition&&) noexcept = default;
+ ICU4XCanonicalComposition& operator=(ICU4XCanonicalComposition&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XCanonicalComposition, ICU4XCanonicalCompositionDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+
+inline diplomat::result<ICU4XCanonicalComposition, ICU4XError> ICU4XCanonicalComposition::create(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCanonicalComposition_create(provider.AsFFI());
+ diplomat::result<ICU4XCanonicalComposition, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCanonicalComposition>(ICU4XCanonicalComposition(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline char32_t ICU4XCanonicalComposition::compose(char32_t starter, char32_t second) const {
+ return capi::ICU4XCanonicalComposition_compose(this->inner.get(), starter, second);
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCanonicalDecomposition.h b/intl/icu_capi/cpp/include/ICU4XCanonicalDecomposition.h
new file mode 100644
index 0000000000..d18d108b90
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCanonicalDecomposition.h
@@ -0,0 +1,34 @@
+#ifndef ICU4XCanonicalDecomposition_H
+#define ICU4XCanonicalDecomposition_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XCanonicalDecomposition ICU4XCanonicalDecomposition;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XCanonicalDecomposition_ICU4XError.h"
+#include "ICU4XDecomposed.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XCanonicalDecomposition_ICU4XError ICU4XCanonicalDecomposition_create(const ICU4XDataProvider* provider);
+
+ICU4XDecomposed ICU4XCanonicalDecomposition_decompose(const ICU4XCanonicalDecomposition* self, char32_t c);
+void ICU4XCanonicalDecomposition_destroy(ICU4XCanonicalDecomposition* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCanonicalDecomposition.hpp b/intl/icu_capi/cpp/include/ICU4XCanonicalDecomposition.hpp
new file mode 100644
index 0000000000..2bbf5abb82
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCanonicalDecomposition.hpp
@@ -0,0 +1,78 @@
+#ifndef ICU4XCanonicalDecomposition_HPP
+#define ICU4XCanonicalDecomposition_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XCanonicalDecomposition.h"
+
+class ICU4XDataProvider;
+class ICU4XCanonicalDecomposition;
+#include "ICU4XError.hpp"
+struct ICU4XDecomposed;
+
+/**
+ * A destruction policy for using ICU4XCanonicalDecomposition with std::unique_ptr.
+ */
+struct ICU4XCanonicalDecompositionDeleter {
+ void operator()(capi::ICU4XCanonicalDecomposition* l) const noexcept {
+ capi::ICU4XCanonicalDecomposition_destroy(l);
+ }
+};
+
+/**
+ * The raw (non-recursive) canonical decomposition operation.
+ *
+ * Callers should generally use ICU4XDecomposingNormalizer unless they specifically need raw composition operations
+ *
+ * See the [Rust documentation for `CanonicalDecomposition`](https://docs.rs/icu/latest/icu/normalizer/properties/struct.CanonicalDecomposition.html) for more information.
+ */
+class ICU4XCanonicalDecomposition {
+ public:
+
+ /**
+ * Construct a new ICU4XCanonicalDecomposition instance for NFC
+ *
+ * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/normalizer/properties/struct.CanonicalDecomposition.html#method.new) for more information.
+ */
+ static diplomat::result<ICU4XCanonicalDecomposition, ICU4XError> create(const ICU4XDataProvider& provider);
+
+ /**
+ * Performs non-recursive canonical decomposition (including for Hangul).
+ *
+ * See the [Rust documentation for `decompose`](https://docs.rs/icu/latest/icu/normalizer/properties/struct.CanonicalDecomposition.html#method.decompose) for more information.
+ */
+ ICU4XDecomposed decompose(char32_t c) const;
+ inline const capi::ICU4XCanonicalDecomposition* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XCanonicalDecomposition* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XCanonicalDecomposition(capi::ICU4XCanonicalDecomposition* i) : inner(i) {}
+ ICU4XCanonicalDecomposition() = default;
+ ICU4XCanonicalDecomposition(ICU4XCanonicalDecomposition&&) noexcept = default;
+ ICU4XCanonicalDecomposition& operator=(ICU4XCanonicalDecomposition&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XCanonicalDecomposition, ICU4XCanonicalDecompositionDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XDecomposed.hpp"
+
+inline diplomat::result<ICU4XCanonicalDecomposition, ICU4XError> ICU4XCanonicalDecomposition::create(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCanonicalDecomposition_create(provider.AsFFI());
+ diplomat::result<ICU4XCanonicalDecomposition, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCanonicalDecomposition>(ICU4XCanonicalDecomposition(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XDecomposed ICU4XCanonicalDecomposition::decompose(char32_t c) const {
+ capi::ICU4XDecomposed diplomat_raw_struct_out_value = capi::ICU4XCanonicalDecomposition_decompose(this->inner.get(), c);
+ return ICU4XDecomposed{ .first = std::move(diplomat_raw_struct_out_value.first), .second = std::move(diplomat_raw_struct_out_value.second) };
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCaseMapCloser.h b/intl/icu_capi/cpp/include/ICU4XCaseMapCloser.h
new file mode 100644
index 0000000000..ed2129006c
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCaseMapCloser.h
@@ -0,0 +1,36 @@
+#ifndef ICU4XCaseMapCloser_H
+#define ICU4XCaseMapCloser_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XCaseMapCloser ICU4XCaseMapCloser;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XCaseMapCloser_ICU4XError.h"
+#include "ICU4XCodePointSetBuilder.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XCaseMapCloser_ICU4XError ICU4XCaseMapCloser_create(const ICU4XDataProvider* provider);
+
+void ICU4XCaseMapCloser_add_case_closure_to(const ICU4XCaseMapCloser* self, char32_t c, ICU4XCodePointSetBuilder* builder);
+
+bool ICU4XCaseMapCloser_add_string_case_closure_to(const ICU4XCaseMapCloser* self, const char* s_data, size_t s_len, ICU4XCodePointSetBuilder* builder);
+void ICU4XCaseMapCloser_destroy(ICU4XCaseMapCloser* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCaseMapCloser.hpp b/intl/icu_capi/cpp/include/ICU4XCaseMapCloser.hpp
new file mode 100644
index 0000000000..a76167f2df
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCaseMapCloser.hpp
@@ -0,0 +1,87 @@
+#ifndef ICU4XCaseMapCloser_HPP
+#define ICU4XCaseMapCloser_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XCaseMapCloser.h"
+
+class ICU4XDataProvider;
+class ICU4XCaseMapCloser;
+#include "ICU4XError.hpp"
+class ICU4XCodePointSetBuilder;
+
+/**
+ * A destruction policy for using ICU4XCaseMapCloser with std::unique_ptr.
+ */
+struct ICU4XCaseMapCloserDeleter {
+ void operator()(capi::ICU4XCaseMapCloser* l) const noexcept {
+ capi::ICU4XCaseMapCloser_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `CaseMapCloser`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapCloser.html) for more information.
+ */
+class ICU4XCaseMapCloser {
+ public:
+
+ /**
+ * Construct a new ICU4XCaseMapper instance
+ *
+ * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapCloser.html#method.new) for more information.
+ */
+ static diplomat::result<ICU4XCaseMapCloser, ICU4XError> create(const ICU4XDataProvider& provider);
+
+ /**
+ * Adds all simple case mappings and the full case folding for `c` to `builder`.
+ * Also adds special case closure mappings.
+ *
+ * See the [Rust documentation for `add_case_closure_to`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapCloser.html#method.add_case_closure_to) for more information.
+ */
+ void add_case_closure_to(char32_t c, ICU4XCodePointSetBuilder& builder) const;
+
+ /**
+ * Finds all characters and strings which may casemap to `s` as their full case folding string
+ * and adds them to the set.
+ *
+ * Returns true if the string was found
+ *
+ * See the [Rust documentation for `add_string_case_closure_to`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapCloser.html#method.add_string_case_closure_to) for more information.
+ */
+ bool add_string_case_closure_to(const std::string_view s, ICU4XCodePointSetBuilder& builder) const;
+ inline const capi::ICU4XCaseMapCloser* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XCaseMapCloser* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XCaseMapCloser(capi::ICU4XCaseMapCloser* i) : inner(i) {}
+ ICU4XCaseMapCloser() = default;
+ ICU4XCaseMapCloser(ICU4XCaseMapCloser&&) noexcept = default;
+ ICU4XCaseMapCloser& operator=(ICU4XCaseMapCloser&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XCaseMapCloser, ICU4XCaseMapCloserDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XCodePointSetBuilder.hpp"
+
+inline diplomat::result<ICU4XCaseMapCloser, ICU4XError> ICU4XCaseMapCloser::create(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCaseMapCloser_create(provider.AsFFI());
+ diplomat::result<ICU4XCaseMapCloser, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCaseMapCloser>(ICU4XCaseMapCloser(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline void ICU4XCaseMapCloser::add_case_closure_to(char32_t c, ICU4XCodePointSetBuilder& builder) const {
+ capi::ICU4XCaseMapCloser_add_case_closure_to(this->inner.get(), c, builder.AsFFIMut());
+}
+inline bool ICU4XCaseMapCloser::add_string_case_closure_to(const std::string_view s, ICU4XCodePointSetBuilder& builder) const {
+ return capi::ICU4XCaseMapCloser_add_string_case_closure_to(this->inner.get(), s.data(), s.size(), builder.AsFFIMut());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCaseMapper.h b/intl/icu_capi/cpp/include/ICU4XCaseMapper.h
new file mode 100644
index 0000000000..aef264f722
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCaseMapper.h
@@ -0,0 +1,57 @@
+#ifndef ICU4XCaseMapper_H
+#define ICU4XCaseMapper_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XCaseMapper ICU4XCaseMapper;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XCaseMapper_ICU4XError.h"
+#include "ICU4XLocale.h"
+#include "diplomat_result_void_ICU4XError.h"
+#include "ICU4XTitlecaseOptionsV1.h"
+#include "ICU4XCodePointSetBuilder.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XCaseMapper_ICU4XError ICU4XCaseMapper_create(const ICU4XDataProvider* provider);
+
+diplomat_result_void_ICU4XError ICU4XCaseMapper_lowercase(const ICU4XCaseMapper* self, const char* s_data, size_t s_len, const ICU4XLocale* locale, DiplomatWriteable* write);
+
+diplomat_result_void_ICU4XError ICU4XCaseMapper_uppercase(const ICU4XCaseMapper* self, const char* s_data, size_t s_len, const ICU4XLocale* locale, DiplomatWriteable* write);
+
+diplomat_result_void_ICU4XError ICU4XCaseMapper_titlecase_segment_with_only_case_data_v1(const ICU4XCaseMapper* self, const char* s_data, size_t s_len, const ICU4XLocale* locale, ICU4XTitlecaseOptionsV1 options, DiplomatWriteable* write);
+
+diplomat_result_void_ICU4XError ICU4XCaseMapper_fold(const ICU4XCaseMapper* self, const char* s_data, size_t s_len, DiplomatWriteable* write);
+
+diplomat_result_void_ICU4XError ICU4XCaseMapper_fold_turkic(const ICU4XCaseMapper* self, const char* s_data, size_t s_len, DiplomatWriteable* write);
+
+void ICU4XCaseMapper_add_case_closure_to(const ICU4XCaseMapper* self, char32_t c, ICU4XCodePointSetBuilder* builder);
+
+char32_t ICU4XCaseMapper_simple_lowercase(const ICU4XCaseMapper* self, char32_t ch);
+
+char32_t ICU4XCaseMapper_simple_uppercase(const ICU4XCaseMapper* self, char32_t ch);
+
+char32_t ICU4XCaseMapper_simple_titlecase(const ICU4XCaseMapper* self, char32_t ch);
+
+char32_t ICU4XCaseMapper_simple_fold(const ICU4XCaseMapper* self, char32_t ch);
+
+char32_t ICU4XCaseMapper_simple_fold_turkic(const ICU4XCaseMapper* self, char32_t ch);
+void ICU4XCaseMapper_destroy(ICU4XCaseMapper* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCaseMapper.hpp b/intl/icu_capi/cpp/include/ICU4XCaseMapper.hpp
new file mode 100644
index 0000000000..ffb95b1c22
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCaseMapper.hpp
@@ -0,0 +1,352 @@
+#ifndef ICU4XCaseMapper_HPP
+#define ICU4XCaseMapper_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XCaseMapper.h"
+
+class ICU4XDataProvider;
+class ICU4XCaseMapper;
+#include "ICU4XError.hpp"
+class ICU4XLocale;
+struct ICU4XTitlecaseOptionsV1;
+class ICU4XCodePointSetBuilder;
+
+/**
+ * A destruction policy for using ICU4XCaseMapper with std::unique_ptr.
+ */
+struct ICU4XCaseMapperDeleter {
+ void operator()(capi::ICU4XCaseMapper* l) const noexcept {
+ capi::ICU4XCaseMapper_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `CaseMapper`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html) for more information.
+ */
+class ICU4XCaseMapper {
+ public:
+
+ /**
+ * Construct a new ICU4XCaseMapper instance
+ *
+ * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.new) for more information.
+ */
+ static diplomat::result<ICU4XCaseMapper, ICU4XError> create(const ICU4XDataProvider& provider);
+
+ /**
+ * Returns the full lowercase mapping of the given string
+ *
+ * See the [Rust documentation for `lowercase`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.lowercase) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> lowercase_to_writeable(const std::string_view s, const ICU4XLocale& locale, W& write) const;
+
+ /**
+ * Returns the full lowercase mapping of the given string
+ *
+ * See the [Rust documentation for `lowercase`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.lowercase) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> lowercase(const std::string_view s, const ICU4XLocale& locale) const;
+
+ /**
+ * Returns the full uppercase mapping of the given string
+ *
+ * See the [Rust documentation for `uppercase`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.uppercase) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> uppercase_to_writeable(const std::string_view s, const ICU4XLocale& locale, W& write) const;
+
+ /**
+ * Returns the full uppercase mapping of the given string
+ *
+ * See the [Rust documentation for `uppercase`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.uppercase) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> uppercase(const std::string_view s, const ICU4XLocale& locale) const;
+
+ /**
+ * Returns the full titlecase mapping of the given string, performing head adjustment without
+ * loading additional data.
+ * (if head adjustment is enabled in the options)
+ *
+ * The `v1` refers to the version of the options struct, which may change as we add more options
+ *
+ * See the [Rust documentation for `titlecase_segment_with_only_case_data`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.titlecase_segment_with_only_case_data) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> titlecase_segment_with_only_case_data_v1_to_writeable(const std::string_view s, const ICU4XLocale& locale, ICU4XTitlecaseOptionsV1 options, W& write) const;
+
+ /**
+ * Returns the full titlecase mapping of the given string, performing head adjustment without
+ * loading additional data.
+ * (if head adjustment is enabled in the options)
+ *
+ * The `v1` refers to the version of the options struct, which may change as we add more options
+ *
+ * See the [Rust documentation for `titlecase_segment_with_only_case_data`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.titlecase_segment_with_only_case_data) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> titlecase_segment_with_only_case_data_v1(const std::string_view s, const ICU4XLocale& locale, ICU4XTitlecaseOptionsV1 options) const;
+
+ /**
+ * Case-folds the characters in the given string
+ *
+ * See the [Rust documentation for `fold`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.fold) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> fold_to_writeable(const std::string_view s, W& write) const;
+
+ /**
+ * Case-folds the characters in the given string
+ *
+ * See the [Rust documentation for `fold`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.fold) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> fold(const std::string_view s) const;
+
+ /**
+ * Case-folds the characters in the given string
+ * using Turkic (T) mappings for dotted/dotless I.
+ *
+ * See the [Rust documentation for `fold_turkic`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.fold_turkic) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> fold_turkic_to_writeable(const std::string_view s, W& write) const;
+
+ /**
+ * Case-folds the characters in the given string
+ * using Turkic (T) mappings for dotted/dotless I.
+ *
+ * See the [Rust documentation for `fold_turkic`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.fold_turkic) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> fold_turkic(const std::string_view s) const;
+
+ /**
+ * Adds all simple case mappings and the full case folding for `c` to `builder`.
+ * Also adds special case closure mappings.
+ *
+ * In other words, this adds all characters that this casemaps to, as
+ * well as all characters that may casemap to this one.
+ *
+ * Note that since ICU4XCodePointSetBuilder does not contain strings, this will
+ * ignore string mappings.
+ *
+ * Identical to the similarly named method on `ICU4XCaseMapCloser`, use that if you
+ * plan on using string case closure mappings too.
+ *
+ * See the [Rust documentation for `add_case_closure_to`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.add_case_closure_to) for more information.
+ */
+ void add_case_closure_to(char32_t c, ICU4XCodePointSetBuilder& builder) const;
+
+ /**
+ * Returns the simple lowercase mapping of the given character.
+ *
+ * This function only implements simple and common mappings.
+ * Full mappings, which can map one char to a string, are not included.
+ * For full mappings, use `ICU4XCaseMapper::lowercase`.
+ *
+ * See the [Rust documentation for `simple_lowercase`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.simple_lowercase) for more information.
+ */
+ char32_t simple_lowercase(char32_t ch) const;
+
+ /**
+ * Returns the simple uppercase mapping of the given character.
+ *
+ * This function only implements simple and common mappings.
+ * Full mappings, which can map one char to a string, are not included.
+ * For full mappings, use `ICU4XCaseMapper::uppercase`.
+ *
+ * See the [Rust documentation for `simple_uppercase`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.simple_uppercase) for more information.
+ */
+ char32_t simple_uppercase(char32_t ch) const;
+
+ /**
+ * Returns the simple titlecase mapping of the given character.
+ *
+ * This function only implements simple and common mappings.
+ * Full mappings, which can map one char to a string, are not included.
+ * For full mappings, use `ICU4XCaseMapper::titlecase_segment`.
+ *
+ * See the [Rust documentation for `simple_titlecase`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.simple_titlecase) for more information.
+ */
+ char32_t simple_titlecase(char32_t ch) const;
+
+ /**
+ * Returns the simple casefolding of the given character.
+ *
+ * This function only implements simple folding.
+ * For full folding, use `ICU4XCaseMapper::fold`.
+ *
+ * See the [Rust documentation for `simple_fold`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.simple_fold) for more information.
+ */
+ char32_t simple_fold(char32_t ch) const;
+
+ /**
+ * Returns the simple casefolding of the given character in the Turkic locale
+ *
+ * This function only implements simple folding.
+ * For full folding, use `ICU4XCaseMapper::fold_turkic`.
+ *
+ * See the [Rust documentation for `simple_fold_turkic`](https://docs.rs/icu/latest/icu/casemap/struct.CaseMapper.html#method.simple_fold_turkic) for more information.
+ */
+ char32_t simple_fold_turkic(char32_t ch) const;
+ inline const capi::ICU4XCaseMapper* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XCaseMapper* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XCaseMapper(capi::ICU4XCaseMapper* i) : inner(i) {}
+ ICU4XCaseMapper() = default;
+ ICU4XCaseMapper(ICU4XCaseMapper&&) noexcept = default;
+ ICU4XCaseMapper& operator=(ICU4XCaseMapper&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XCaseMapper, ICU4XCaseMapperDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocale.hpp"
+#include "ICU4XTitlecaseOptionsV1.hpp"
+#include "ICU4XCodePointSetBuilder.hpp"
+
+inline diplomat::result<ICU4XCaseMapper, ICU4XError> ICU4XCaseMapper::create(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCaseMapper_create(provider.AsFFI());
+ diplomat::result<ICU4XCaseMapper, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCaseMapper>(ICU4XCaseMapper(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XCaseMapper::lowercase_to_writeable(const std::string_view s, const ICU4XLocale& locale, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XCaseMapper_lowercase(this->inner.get(), s.data(), s.size(), locale.AsFFI(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XCaseMapper::lowercase(const std::string_view s, const ICU4XLocale& locale) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XCaseMapper_lowercase(this->inner.get(), s.data(), s.size(), locale.AsFFI(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XCaseMapper::uppercase_to_writeable(const std::string_view s, const ICU4XLocale& locale, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XCaseMapper_uppercase(this->inner.get(), s.data(), s.size(), locale.AsFFI(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XCaseMapper::uppercase(const std::string_view s, const ICU4XLocale& locale) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XCaseMapper_uppercase(this->inner.get(), s.data(), s.size(), locale.AsFFI(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XCaseMapper::titlecase_segment_with_only_case_data_v1_to_writeable(const std::string_view s, const ICU4XLocale& locale, ICU4XTitlecaseOptionsV1 options, W& write) const {
+ ICU4XTitlecaseOptionsV1 diplomat_wrapped_struct_options = options;
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XCaseMapper_titlecase_segment_with_only_case_data_v1(this->inner.get(), s.data(), s.size(), locale.AsFFI(), capi::ICU4XTitlecaseOptionsV1{ .leading_adjustment = static_cast<capi::ICU4XLeadingAdjustment>(diplomat_wrapped_struct_options.leading_adjustment), .trailing_case = static_cast<capi::ICU4XTrailingCase>(diplomat_wrapped_struct_options.trailing_case) }, &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XCaseMapper::titlecase_segment_with_only_case_data_v1(const std::string_view s, const ICU4XLocale& locale, ICU4XTitlecaseOptionsV1 options) const {
+ ICU4XTitlecaseOptionsV1 diplomat_wrapped_struct_options = options;
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XCaseMapper_titlecase_segment_with_only_case_data_v1(this->inner.get(), s.data(), s.size(), locale.AsFFI(), capi::ICU4XTitlecaseOptionsV1{ .leading_adjustment = static_cast<capi::ICU4XLeadingAdjustment>(diplomat_wrapped_struct_options.leading_adjustment), .trailing_case = static_cast<capi::ICU4XTrailingCase>(diplomat_wrapped_struct_options.trailing_case) }, &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XCaseMapper::fold_to_writeable(const std::string_view s, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XCaseMapper_fold(this->inner.get(), s.data(), s.size(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XCaseMapper::fold(const std::string_view s) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XCaseMapper_fold(this->inner.get(), s.data(), s.size(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XCaseMapper::fold_turkic_to_writeable(const std::string_view s, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XCaseMapper_fold_turkic(this->inner.get(), s.data(), s.size(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XCaseMapper::fold_turkic(const std::string_view s) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XCaseMapper_fold_turkic(this->inner.get(), s.data(), s.size(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+inline void ICU4XCaseMapper::add_case_closure_to(char32_t c, ICU4XCodePointSetBuilder& builder) const {
+ capi::ICU4XCaseMapper_add_case_closure_to(this->inner.get(), c, builder.AsFFIMut());
+}
+inline char32_t ICU4XCaseMapper::simple_lowercase(char32_t ch) const {
+ return capi::ICU4XCaseMapper_simple_lowercase(this->inner.get(), ch);
+}
+inline char32_t ICU4XCaseMapper::simple_uppercase(char32_t ch) const {
+ return capi::ICU4XCaseMapper_simple_uppercase(this->inner.get(), ch);
+}
+inline char32_t ICU4XCaseMapper::simple_titlecase(char32_t ch) const {
+ return capi::ICU4XCaseMapper_simple_titlecase(this->inner.get(), ch);
+}
+inline char32_t ICU4XCaseMapper::simple_fold(char32_t ch) const {
+ return capi::ICU4XCaseMapper_simple_fold(this->inner.get(), ch);
+}
+inline char32_t ICU4XCaseMapper::simple_fold_turkic(char32_t ch) const {
+ return capi::ICU4XCaseMapper_simple_fold_turkic(this->inner.get(), ch);
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCodePointMapData16.h b/intl/icu_capi/cpp/include/ICU4XCodePointMapData16.h
new file mode 100644
index 0000000000..19effe2d92
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCodePointMapData16.h
@@ -0,0 +1,43 @@
+#ifndef ICU4XCodePointMapData16_H
+#define ICU4XCodePointMapData16_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XCodePointMapData16 ICU4XCodePointMapData16;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "CodePointRangeIterator.h"
+#include "ICU4XCodePointSetData.h"
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XCodePointMapData16_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+uint16_t ICU4XCodePointMapData16_get(const ICU4XCodePointMapData16* self, char32_t cp);
+
+uint16_t ICU4XCodePointMapData16_get32(const ICU4XCodePointMapData16* self, uint32_t cp);
+
+CodePointRangeIterator* ICU4XCodePointMapData16_iter_ranges_for_value(const ICU4XCodePointMapData16* self, uint16_t value);
+
+CodePointRangeIterator* ICU4XCodePointMapData16_iter_ranges_for_value_complemented(const ICU4XCodePointMapData16* self, uint16_t value);
+
+ICU4XCodePointSetData* ICU4XCodePointMapData16_get_set_for_value(const ICU4XCodePointMapData16* self, uint16_t value);
+
+diplomat_result_box_ICU4XCodePointMapData16_ICU4XError ICU4XCodePointMapData16_load_script(const ICU4XDataProvider* provider);
+void ICU4XCodePointMapData16_destroy(ICU4XCodePointMapData16* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCodePointMapData16.hpp b/intl/icu_capi/cpp/include/ICU4XCodePointMapData16.hpp
new file mode 100644
index 0000000000..3bdefb51f6
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCodePointMapData16.hpp
@@ -0,0 +1,123 @@
+#ifndef ICU4XCodePointMapData16_HPP
+#define ICU4XCodePointMapData16_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XCodePointMapData16.h"
+
+class CodePointRangeIterator;
+class ICU4XCodePointSetData;
+class ICU4XDataProvider;
+class ICU4XCodePointMapData16;
+#include "ICU4XError.hpp"
+
+/**
+ * A destruction policy for using ICU4XCodePointMapData16 with std::unique_ptr.
+ */
+struct ICU4XCodePointMapData16Deleter {
+ void operator()(capi::ICU4XCodePointMapData16* l) const noexcept {
+ capi::ICU4XCodePointMapData16_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X Unicode Map Property object, capable of querying whether a code point (key) to obtain the Unicode property value, for a specific Unicode property.
+ *
+ * For properties whose values fit into 16 bits.
+ *
+ * See the [Rust documentation for `properties`](https://docs.rs/icu/latest/icu/properties/index.html) for more information.
+ *
+ * See the [Rust documentation for `CodePointMapData`](https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapData.html) for more information.
+ *
+ * See the [Rust documentation for `CodePointMapDataBorrowed`](https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html) for more information.
+ */
+class ICU4XCodePointMapData16 {
+ public:
+
+ /**
+ * Gets the value for a code point.
+ *
+ * See the [Rust documentation for `get`](https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html#method.get) for more information.
+ */
+ uint16_t get(char32_t cp) const;
+
+ /**
+ * Gets the value for a code point (specified as a 32 bit integer, in UTF-32)
+ */
+ uint16_t get32(uint32_t cp) const;
+
+ /**
+ * Produces an iterator over ranges of code points that map to `value`
+ *
+ * See the [Rust documentation for `iter_ranges_for_value`](https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html#method.iter_ranges_for_value) for more information.
+ *
+ * Lifetimes: `this` must live at least as long as the output.
+ */
+ CodePointRangeIterator iter_ranges_for_value(uint16_t value) const;
+
+ /**
+ * Produces an iterator over ranges of code points that do not map to `value`
+ *
+ * See the [Rust documentation for `iter_ranges_for_value_complemented`](https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html#method.iter_ranges_for_value_complemented) for more information.
+ *
+ * Lifetimes: `this` must live at least as long as the output.
+ */
+ CodePointRangeIterator iter_ranges_for_value_complemented(uint16_t value) const;
+
+ /**
+ * Gets a [`ICU4XCodePointSetData`] representing all entries in this map that map to the given value
+ *
+ * See the [Rust documentation for `get_set_for_value`](https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html#method.get_set_for_value) for more information.
+ */
+ ICU4XCodePointSetData get_set_for_value(uint16_t value) const;
+
+ /**
+ * See the [Rust documentation for `script`](https://docs.rs/icu/latest/icu/properties/maps/fn.script.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointMapData16, ICU4XError> load_script(const ICU4XDataProvider& provider);
+ inline const capi::ICU4XCodePointMapData16* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XCodePointMapData16* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XCodePointMapData16(capi::ICU4XCodePointMapData16* i) : inner(i) {}
+ ICU4XCodePointMapData16() = default;
+ ICU4XCodePointMapData16(ICU4XCodePointMapData16&&) noexcept = default;
+ ICU4XCodePointMapData16& operator=(ICU4XCodePointMapData16&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XCodePointMapData16, ICU4XCodePointMapData16Deleter> inner;
+};
+
+#include "CodePointRangeIterator.hpp"
+#include "ICU4XCodePointSetData.hpp"
+#include "ICU4XDataProvider.hpp"
+
+inline uint16_t ICU4XCodePointMapData16::get(char32_t cp) const {
+ return capi::ICU4XCodePointMapData16_get(this->inner.get(), cp);
+}
+inline uint16_t ICU4XCodePointMapData16::get32(uint32_t cp) const {
+ return capi::ICU4XCodePointMapData16_get32(this->inner.get(), cp);
+}
+inline CodePointRangeIterator ICU4XCodePointMapData16::iter_ranges_for_value(uint16_t value) const {
+ return CodePointRangeIterator(capi::ICU4XCodePointMapData16_iter_ranges_for_value(this->inner.get(), value));
+}
+inline CodePointRangeIterator ICU4XCodePointMapData16::iter_ranges_for_value_complemented(uint16_t value) const {
+ return CodePointRangeIterator(capi::ICU4XCodePointMapData16_iter_ranges_for_value_complemented(this->inner.get(), value));
+}
+inline ICU4XCodePointSetData ICU4XCodePointMapData16::get_set_for_value(uint16_t value) const {
+ return ICU4XCodePointSetData(capi::ICU4XCodePointMapData16_get_set_for_value(this->inner.get(), value));
+}
+inline diplomat::result<ICU4XCodePointMapData16, ICU4XError> ICU4XCodePointMapData16::load_script(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointMapData16_load_script(provider.AsFFI());
+ diplomat::result<ICU4XCodePointMapData16, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointMapData16>(ICU4XCodePointMapData16(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCodePointMapData8.h b/intl/icu_capi/cpp/include/ICU4XCodePointMapData8.h
new file mode 100644
index 0000000000..87fe8854b2
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCodePointMapData8.h
@@ -0,0 +1,61 @@
+#ifndef ICU4XCodePointMapData8_H
+#define ICU4XCodePointMapData8_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XCodePointMapData8 ICU4XCodePointMapData8;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "CodePointRangeIterator.h"
+#include "ICU4XCodePointSetData.h"
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XCodePointMapData8_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+uint8_t ICU4XCodePointMapData8_get(const ICU4XCodePointMapData8* self, char32_t cp);
+
+uint8_t ICU4XCodePointMapData8_get32(const ICU4XCodePointMapData8* self, uint32_t cp);
+
+uint32_t ICU4XCodePointMapData8_general_category_to_mask(uint8_t gc);
+
+CodePointRangeIterator* ICU4XCodePointMapData8_iter_ranges_for_value(const ICU4XCodePointMapData8* self, uint8_t value);
+
+CodePointRangeIterator* ICU4XCodePointMapData8_iter_ranges_for_value_complemented(const ICU4XCodePointMapData8* self, uint8_t value);
+
+CodePointRangeIterator* ICU4XCodePointMapData8_iter_ranges_for_mask(const ICU4XCodePointMapData8* self, uint32_t mask);
+
+ICU4XCodePointSetData* ICU4XCodePointMapData8_get_set_for_value(const ICU4XCodePointMapData8* self, uint8_t value);
+
+diplomat_result_box_ICU4XCodePointMapData8_ICU4XError ICU4XCodePointMapData8_load_general_category(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointMapData8_ICU4XError ICU4XCodePointMapData8_load_bidi_class(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointMapData8_ICU4XError ICU4XCodePointMapData8_load_east_asian_width(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointMapData8_ICU4XError ICU4XCodePointMapData8_load_indic_syllabic_category(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointMapData8_ICU4XError ICU4XCodePointMapData8_load_line_break(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointMapData8_ICU4XError ICU4XCodePointMapData8_try_grapheme_cluster_break(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointMapData8_ICU4XError ICU4XCodePointMapData8_load_word_break(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointMapData8_ICU4XError ICU4XCodePointMapData8_load_sentence_break(const ICU4XDataProvider* provider);
+void ICU4XCodePointMapData8_destroy(ICU4XCodePointMapData8* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCodePointMapData8.hpp b/intl/icu_capi/cpp/include/ICU4XCodePointMapData8.hpp
new file mode 100644
index 0000000000..7631375f15
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCodePointMapData8.hpp
@@ -0,0 +1,259 @@
+#ifndef ICU4XCodePointMapData8_HPP
+#define ICU4XCodePointMapData8_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XCodePointMapData8.h"
+
+class CodePointRangeIterator;
+class ICU4XCodePointSetData;
+class ICU4XDataProvider;
+class ICU4XCodePointMapData8;
+#include "ICU4XError.hpp"
+
+/**
+ * A destruction policy for using ICU4XCodePointMapData8 with std::unique_ptr.
+ */
+struct ICU4XCodePointMapData8Deleter {
+ void operator()(capi::ICU4XCodePointMapData8* l) const noexcept {
+ capi::ICU4XCodePointMapData8_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X Unicode Map Property object, capable of querying whether a code point (key) to obtain the Unicode property value, for a specific Unicode property.
+ *
+ * For properties whose values fit into 8 bits.
+ *
+ * See the [Rust documentation for `properties`](https://docs.rs/icu/latest/icu/properties/index.html) for more information.
+ *
+ * See the [Rust documentation for `CodePointMapData`](https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapData.html) for more information.
+ *
+ * See the [Rust documentation for `CodePointMapDataBorrowed`](https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html) for more information.
+ */
+class ICU4XCodePointMapData8 {
+ public:
+
+ /**
+ * Gets the value for a code point.
+ *
+ * See the [Rust documentation for `get`](https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html#method.get) for more information.
+ */
+ uint8_t get(char32_t cp) const;
+
+ /**
+ * Gets the value for a code point (specified as a 32 bit integer, in UTF-32)
+ */
+ uint8_t get32(uint32_t cp) const;
+
+ /**
+ * Converts a general category to its corresponding mask value
+ *
+ * Nonexistant general categories will map to the empty mask
+ *
+ * See the [Rust documentation for `GeneralCategoryGroup`](https://docs.rs/icu/latest/icu/properties/struct.GeneralCategoryGroup.html) for more information.
+ */
+ static uint32_t general_category_to_mask(uint8_t gc);
+
+ /**
+ * Produces an iterator over ranges of code points that map to `value`
+ *
+ * See the [Rust documentation for `iter_ranges_for_value`](https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html#method.iter_ranges_for_value) for more information.
+ *
+ * Lifetimes: `this` must live at least as long as the output.
+ */
+ CodePointRangeIterator iter_ranges_for_value(uint8_t value) const;
+
+ /**
+ * Produces an iterator over ranges of code points that do not map to `value`
+ *
+ * See the [Rust documentation for `iter_ranges_for_value_complemented`](https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html#method.iter_ranges_for_value_complemented) for more information.
+ *
+ * Lifetimes: `this` must live at least as long as the output.
+ */
+ CodePointRangeIterator iter_ranges_for_value_complemented(uint8_t value) const;
+
+ /**
+ * Given a mask value (the nth bit marks property value = n), produce an iterator over ranges of code points
+ * whose property values are contained in the mask.
+ *
+ * The main mask property supported is that for General_Category, which can be obtained via `general_category_to_mask()` or
+ * by using `ICU4XGeneralCategoryNameToMaskMapper`
+ *
+ * Should only be used on maps for properties with values less than 32 (like Generak_Category),
+ * other maps will have unpredictable results
+ *
+ * See the [Rust documentation for `iter_ranges_for_group`](https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html#method.iter_ranges_for_group) for more information.
+ *
+ * Lifetimes: `this` must live at least as long as the output.
+ */
+ CodePointRangeIterator iter_ranges_for_mask(uint32_t mask) const;
+
+ /**
+ * Gets a [`ICU4XCodePointSetData`] representing all entries in this map that map to the given value
+ *
+ * See the [Rust documentation for `get_set_for_value`](https://docs.rs/icu/latest/icu/properties/maps/struct.CodePointMapDataBorrowed.html#method.get_set_for_value) for more information.
+ */
+ ICU4XCodePointSetData get_set_for_value(uint8_t value) const;
+
+ /**
+ * See the [Rust documentation for `general_category`](https://docs.rs/icu/latest/icu/properties/maps/fn.general_category.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointMapData8, ICU4XError> load_general_category(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `bidi_class`](https://docs.rs/icu/latest/icu/properties/maps/fn.bidi_class.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointMapData8, ICU4XError> load_bidi_class(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `east_asian_width`](https://docs.rs/icu/latest/icu/properties/maps/fn.east_asian_width.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointMapData8, ICU4XError> load_east_asian_width(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `indic_syllabic_category`](https://docs.rs/icu/latest/icu/properties/maps/fn.indic_syllabic_category.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointMapData8, ICU4XError> load_indic_syllabic_category(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `line_break`](https://docs.rs/icu/latest/icu/properties/maps/fn.line_break.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointMapData8, ICU4XError> load_line_break(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `grapheme_cluster_break`](https://docs.rs/icu/latest/icu/properties/maps/fn.grapheme_cluster_break.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointMapData8, ICU4XError> try_grapheme_cluster_break(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `word_break`](https://docs.rs/icu/latest/icu/properties/maps/fn.word_break.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointMapData8, ICU4XError> load_word_break(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `sentence_break`](https://docs.rs/icu/latest/icu/properties/maps/fn.sentence_break.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointMapData8, ICU4XError> load_sentence_break(const ICU4XDataProvider& provider);
+ inline const capi::ICU4XCodePointMapData8* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XCodePointMapData8* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XCodePointMapData8(capi::ICU4XCodePointMapData8* i) : inner(i) {}
+ ICU4XCodePointMapData8() = default;
+ ICU4XCodePointMapData8(ICU4XCodePointMapData8&&) noexcept = default;
+ ICU4XCodePointMapData8& operator=(ICU4XCodePointMapData8&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XCodePointMapData8, ICU4XCodePointMapData8Deleter> inner;
+};
+
+#include "CodePointRangeIterator.hpp"
+#include "ICU4XCodePointSetData.hpp"
+#include "ICU4XDataProvider.hpp"
+
+inline uint8_t ICU4XCodePointMapData8::get(char32_t cp) const {
+ return capi::ICU4XCodePointMapData8_get(this->inner.get(), cp);
+}
+inline uint8_t ICU4XCodePointMapData8::get32(uint32_t cp) const {
+ return capi::ICU4XCodePointMapData8_get32(this->inner.get(), cp);
+}
+inline uint32_t ICU4XCodePointMapData8::general_category_to_mask(uint8_t gc) {
+ return capi::ICU4XCodePointMapData8_general_category_to_mask(gc);
+}
+inline CodePointRangeIterator ICU4XCodePointMapData8::iter_ranges_for_value(uint8_t value) const {
+ return CodePointRangeIterator(capi::ICU4XCodePointMapData8_iter_ranges_for_value(this->inner.get(), value));
+}
+inline CodePointRangeIterator ICU4XCodePointMapData8::iter_ranges_for_value_complemented(uint8_t value) const {
+ return CodePointRangeIterator(capi::ICU4XCodePointMapData8_iter_ranges_for_value_complemented(this->inner.get(), value));
+}
+inline CodePointRangeIterator ICU4XCodePointMapData8::iter_ranges_for_mask(uint32_t mask) const {
+ return CodePointRangeIterator(capi::ICU4XCodePointMapData8_iter_ranges_for_mask(this->inner.get(), mask));
+}
+inline ICU4XCodePointSetData ICU4XCodePointMapData8::get_set_for_value(uint8_t value) const {
+ return ICU4XCodePointSetData(capi::ICU4XCodePointMapData8_get_set_for_value(this->inner.get(), value));
+}
+inline diplomat::result<ICU4XCodePointMapData8, ICU4XError> ICU4XCodePointMapData8::load_general_category(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointMapData8_load_general_category(provider.AsFFI());
+ diplomat::result<ICU4XCodePointMapData8, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointMapData8>(ICU4XCodePointMapData8(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointMapData8, ICU4XError> ICU4XCodePointMapData8::load_bidi_class(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointMapData8_load_bidi_class(provider.AsFFI());
+ diplomat::result<ICU4XCodePointMapData8, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointMapData8>(ICU4XCodePointMapData8(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointMapData8, ICU4XError> ICU4XCodePointMapData8::load_east_asian_width(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointMapData8_load_east_asian_width(provider.AsFFI());
+ diplomat::result<ICU4XCodePointMapData8, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointMapData8>(ICU4XCodePointMapData8(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointMapData8, ICU4XError> ICU4XCodePointMapData8::load_indic_syllabic_category(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointMapData8_load_indic_syllabic_category(provider.AsFFI());
+ diplomat::result<ICU4XCodePointMapData8, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointMapData8>(ICU4XCodePointMapData8(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointMapData8, ICU4XError> ICU4XCodePointMapData8::load_line_break(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointMapData8_load_line_break(provider.AsFFI());
+ diplomat::result<ICU4XCodePointMapData8, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointMapData8>(ICU4XCodePointMapData8(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointMapData8, ICU4XError> ICU4XCodePointMapData8::try_grapheme_cluster_break(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointMapData8_try_grapheme_cluster_break(provider.AsFFI());
+ diplomat::result<ICU4XCodePointMapData8, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointMapData8>(ICU4XCodePointMapData8(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointMapData8, ICU4XError> ICU4XCodePointMapData8::load_word_break(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointMapData8_load_word_break(provider.AsFFI());
+ diplomat::result<ICU4XCodePointMapData8, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointMapData8>(ICU4XCodePointMapData8(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointMapData8, ICU4XError> ICU4XCodePointMapData8::load_sentence_break(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointMapData8_load_sentence_break(provider.AsFFI());
+ diplomat::result<ICU4XCodePointMapData8, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointMapData8>(ICU4XCodePointMapData8(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCodePointSetBuilder.h b/intl/icu_capi/cpp/include/ICU4XCodePointSetBuilder.h
new file mode 100644
index 0000000000..d36697c7cf
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCodePointSetBuilder.h
@@ -0,0 +1,64 @@
+#ifndef ICU4XCodePointSetBuilder_H
+#define ICU4XCodePointSetBuilder_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XCodePointSetBuilder ICU4XCodePointSetBuilder;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XCodePointSetData.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+ICU4XCodePointSetBuilder* ICU4XCodePointSetBuilder_create();
+
+ICU4XCodePointSetData* ICU4XCodePointSetBuilder_build(ICU4XCodePointSetBuilder* self);
+
+void ICU4XCodePointSetBuilder_complement(ICU4XCodePointSetBuilder* self);
+
+bool ICU4XCodePointSetBuilder_is_empty(const ICU4XCodePointSetBuilder* self);
+
+void ICU4XCodePointSetBuilder_add_char(ICU4XCodePointSetBuilder* self, char32_t ch);
+
+void ICU4XCodePointSetBuilder_add_u32(ICU4XCodePointSetBuilder* self, uint32_t ch);
+
+void ICU4XCodePointSetBuilder_add_inclusive_range(ICU4XCodePointSetBuilder* self, char32_t start, char32_t end);
+
+void ICU4XCodePointSetBuilder_add_inclusive_range_u32(ICU4XCodePointSetBuilder* self, uint32_t start, uint32_t end);
+
+void ICU4XCodePointSetBuilder_add_set(ICU4XCodePointSetBuilder* self, const ICU4XCodePointSetData* data);
+
+void ICU4XCodePointSetBuilder_remove_char(ICU4XCodePointSetBuilder* self, char32_t ch);
+
+void ICU4XCodePointSetBuilder_remove_inclusive_range(ICU4XCodePointSetBuilder* self, char32_t start, char32_t end);
+
+void ICU4XCodePointSetBuilder_remove_set(ICU4XCodePointSetBuilder* self, const ICU4XCodePointSetData* data);
+
+void ICU4XCodePointSetBuilder_retain_char(ICU4XCodePointSetBuilder* self, char32_t ch);
+
+void ICU4XCodePointSetBuilder_retain_inclusive_range(ICU4XCodePointSetBuilder* self, char32_t start, char32_t end);
+
+void ICU4XCodePointSetBuilder_retain_set(ICU4XCodePointSetBuilder* self, const ICU4XCodePointSetData* data);
+
+void ICU4XCodePointSetBuilder_complement_char(ICU4XCodePointSetBuilder* self, char32_t ch);
+
+void ICU4XCodePointSetBuilder_complement_inclusive_range(ICU4XCodePointSetBuilder* self, char32_t start, char32_t end);
+
+void ICU4XCodePointSetBuilder_complement_set(ICU4XCodePointSetBuilder* self, const ICU4XCodePointSetData* data);
+void ICU4XCodePointSetBuilder_destroy(ICU4XCodePointSetBuilder* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCodePointSetBuilder.hpp b/intl/icu_capi/cpp/include/ICU4XCodePointSetBuilder.hpp
new file mode 100644
index 0000000000..bf77eb56a4
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCodePointSetBuilder.hpp
@@ -0,0 +1,233 @@
+#ifndef ICU4XCodePointSetBuilder_HPP
+#define ICU4XCodePointSetBuilder_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XCodePointSetBuilder.h"
+
+class ICU4XCodePointSetBuilder;
+class ICU4XCodePointSetData;
+
+/**
+ * A destruction policy for using ICU4XCodePointSetBuilder with std::unique_ptr.
+ */
+struct ICU4XCodePointSetBuilderDeleter {
+ void operator()(capi::ICU4XCodePointSetBuilder* l) const noexcept {
+ capi::ICU4XCodePointSetBuilder_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `CodePointInversionListBuilder`](https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html) for more information.
+ */
+class ICU4XCodePointSetBuilder {
+ public:
+
+ /**
+ * Make a new set builder containing nothing
+ *
+ * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.new) for more information.
+ */
+ static ICU4XCodePointSetBuilder create();
+
+ /**
+ * Build this into a set
+ *
+ * This object is repopulated with an empty builder
+ *
+ * See the [Rust documentation for `build`](https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.build) for more information.
+ */
+ ICU4XCodePointSetData build();
+
+ /**
+ * Complements this set
+ *
+ * (Elements in this set are removed and vice versa)
+ *
+ * See the [Rust documentation for `complement`](https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.complement) for more information.
+ */
+ void complement();
+
+ /**
+ * Returns whether this set is empty
+ *
+ * See the [Rust documentation for `is_empty`](https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.is_empty) for more information.
+ */
+ bool is_empty() const;
+
+ /**
+ * Add a single character to the set
+ *
+ * See the [Rust documentation for `add_char`](https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.add_char) for more information.
+ */
+ void add_char(char32_t ch);
+
+ /**
+ * Add a single u32 value to the set
+ *
+ * See the [Rust documentation for `add_u32`](https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.add_u32) for more information.
+ */
+ void add_u32(uint32_t ch);
+
+ /**
+ * Add an inclusive range of characters to the set
+ *
+ * See the [Rust documentation for `add_range`](https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.add_range) for more information.
+ */
+ void add_inclusive_range(char32_t start, char32_t end);
+
+ /**
+ * Add an inclusive range of u32s to the set
+ *
+ * See the [Rust documentation for `add_range_u32`](https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.add_range_u32) for more information.
+ */
+ void add_inclusive_range_u32(uint32_t start, uint32_t end);
+
+ /**
+ * Add all elements that belong to the provided set to the set
+ *
+ * See the [Rust documentation for `add_set`](https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.add_set) for more information.
+ */
+ void add_set(const ICU4XCodePointSetData& data);
+
+ /**
+ * Remove a single character to the set
+ *
+ * See the [Rust documentation for `remove_char`](https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.remove_char) for more information.
+ */
+ void remove_char(char32_t ch);
+
+ /**
+ * Remove an inclusive range of characters from the set
+ *
+ * See the [Rust documentation for `remove_range`](https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.remove_range) for more information.
+ */
+ void remove_inclusive_range(char32_t start, char32_t end);
+
+ /**
+ * Remove all elements that belong to the provided set from the set
+ *
+ * See the [Rust documentation for `remove_set`](https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.remove_set) for more information.
+ */
+ void remove_set(const ICU4XCodePointSetData& data);
+
+ /**
+ * Removes all elements from the set except a single character
+ *
+ * See the [Rust documentation for `retain_char`](https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.retain_char) for more information.
+ */
+ void retain_char(char32_t ch);
+
+ /**
+ * Removes all elements from the set except an inclusive range of characters f
+ *
+ * See the [Rust documentation for `retain_range`](https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.retain_range) for more information.
+ */
+ void retain_inclusive_range(char32_t start, char32_t end);
+
+ /**
+ * Removes all elements from the set except all elements in the provided set
+ *
+ * See the [Rust documentation for `retain_set`](https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.retain_set) for more information.
+ */
+ void retain_set(const ICU4XCodePointSetData& data);
+
+ /**
+ * Complement a single character to the set
+ *
+ * (Characters which are in this set are removed and vice versa)
+ *
+ * See the [Rust documentation for `complement_char`](https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.complement_char) for more information.
+ */
+ void complement_char(char32_t ch);
+
+ /**
+ * Complement an inclusive range of characters from the set
+ *
+ * (Characters which are in this set are removed and vice versa)
+ *
+ * See the [Rust documentation for `complement_range`](https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.complement_range) for more information.
+ */
+ void complement_inclusive_range(char32_t start, char32_t end);
+
+ /**
+ * Complement all elements that belong to the provided set from the set
+ *
+ * (Characters which are in this set are removed and vice versa)
+ *
+ * See the [Rust documentation for `complement_set`](https://docs.rs/icu/latest/icu/collections/codepointinvlist/struct.CodePointInversionListBuilder.html#method.complement_set) for more information.
+ */
+ void complement_set(const ICU4XCodePointSetData& data);
+ inline const capi::ICU4XCodePointSetBuilder* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XCodePointSetBuilder* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XCodePointSetBuilder(capi::ICU4XCodePointSetBuilder* i) : inner(i) {}
+ ICU4XCodePointSetBuilder() = default;
+ ICU4XCodePointSetBuilder(ICU4XCodePointSetBuilder&&) noexcept = default;
+ ICU4XCodePointSetBuilder& operator=(ICU4XCodePointSetBuilder&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XCodePointSetBuilder, ICU4XCodePointSetBuilderDeleter> inner;
+};
+
+#include "ICU4XCodePointSetData.hpp"
+
+inline ICU4XCodePointSetBuilder ICU4XCodePointSetBuilder::create() {
+ return ICU4XCodePointSetBuilder(capi::ICU4XCodePointSetBuilder_create());
+}
+inline ICU4XCodePointSetData ICU4XCodePointSetBuilder::build() {
+ return ICU4XCodePointSetData(capi::ICU4XCodePointSetBuilder_build(this->inner.get()));
+}
+inline void ICU4XCodePointSetBuilder::complement() {
+ capi::ICU4XCodePointSetBuilder_complement(this->inner.get());
+}
+inline bool ICU4XCodePointSetBuilder::is_empty() const {
+ return capi::ICU4XCodePointSetBuilder_is_empty(this->inner.get());
+}
+inline void ICU4XCodePointSetBuilder::add_char(char32_t ch) {
+ capi::ICU4XCodePointSetBuilder_add_char(this->inner.get(), ch);
+}
+inline void ICU4XCodePointSetBuilder::add_u32(uint32_t ch) {
+ capi::ICU4XCodePointSetBuilder_add_u32(this->inner.get(), ch);
+}
+inline void ICU4XCodePointSetBuilder::add_inclusive_range(char32_t start, char32_t end) {
+ capi::ICU4XCodePointSetBuilder_add_inclusive_range(this->inner.get(), start, end);
+}
+inline void ICU4XCodePointSetBuilder::add_inclusive_range_u32(uint32_t start, uint32_t end) {
+ capi::ICU4XCodePointSetBuilder_add_inclusive_range_u32(this->inner.get(), start, end);
+}
+inline void ICU4XCodePointSetBuilder::add_set(const ICU4XCodePointSetData& data) {
+ capi::ICU4XCodePointSetBuilder_add_set(this->inner.get(), data.AsFFI());
+}
+inline void ICU4XCodePointSetBuilder::remove_char(char32_t ch) {
+ capi::ICU4XCodePointSetBuilder_remove_char(this->inner.get(), ch);
+}
+inline void ICU4XCodePointSetBuilder::remove_inclusive_range(char32_t start, char32_t end) {
+ capi::ICU4XCodePointSetBuilder_remove_inclusive_range(this->inner.get(), start, end);
+}
+inline void ICU4XCodePointSetBuilder::remove_set(const ICU4XCodePointSetData& data) {
+ capi::ICU4XCodePointSetBuilder_remove_set(this->inner.get(), data.AsFFI());
+}
+inline void ICU4XCodePointSetBuilder::retain_char(char32_t ch) {
+ capi::ICU4XCodePointSetBuilder_retain_char(this->inner.get(), ch);
+}
+inline void ICU4XCodePointSetBuilder::retain_inclusive_range(char32_t start, char32_t end) {
+ capi::ICU4XCodePointSetBuilder_retain_inclusive_range(this->inner.get(), start, end);
+}
+inline void ICU4XCodePointSetBuilder::retain_set(const ICU4XCodePointSetData& data) {
+ capi::ICU4XCodePointSetBuilder_retain_set(this->inner.get(), data.AsFFI());
+}
+inline void ICU4XCodePointSetBuilder::complement_char(char32_t ch) {
+ capi::ICU4XCodePointSetBuilder_complement_char(this->inner.get(), ch);
+}
+inline void ICU4XCodePointSetBuilder::complement_inclusive_range(char32_t start, char32_t end) {
+ capi::ICU4XCodePointSetBuilder_complement_inclusive_range(this->inner.get(), start, end);
+}
+inline void ICU4XCodePointSetBuilder::complement_set(const ICU4XCodePointSetData& data) {
+ capi::ICU4XCodePointSetBuilder_complement_set(this->inner.get(), data.AsFFI());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCodePointSetData.h b/intl/icu_capi/cpp/include/ICU4XCodePointSetData.h
new file mode 100644
index 0000000000..10356e90b7
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCodePointSetData.h
@@ -0,0 +1,172 @@
+#ifndef ICU4XCodePointSetData_H
+#define ICU4XCodePointSetData_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XCodePointSetData ICU4XCodePointSetData;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "CodePointRangeIterator.h"
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XCodePointSetData_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+bool ICU4XCodePointSetData_contains(const ICU4XCodePointSetData* self, char32_t cp);
+
+bool ICU4XCodePointSetData_contains32(const ICU4XCodePointSetData* self, uint32_t cp);
+
+CodePointRangeIterator* ICU4XCodePointSetData_iter_ranges(const ICU4XCodePointSetData* self);
+
+CodePointRangeIterator* ICU4XCodePointSetData_iter_ranges_complemented(const ICU4XCodePointSetData* self);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_for_general_category_group(const ICU4XDataProvider* provider, uint32_t group);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_ascii_hex_digit(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_alnum(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_alphabetic(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_bidi_control(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_bidi_mirrored(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_blank(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_cased(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_case_ignorable(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_full_composition_exclusion(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_changes_when_casefolded(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_changes_when_casemapped(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_changes_when_nfkc_casefolded(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_changes_when_lowercased(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_changes_when_titlecased(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_changes_when_uppercased(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_dash(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_deprecated(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_default_ignorable_code_point(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_diacritic(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_emoji_modifier_base(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_emoji_component(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_emoji_modifier(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_emoji(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_emoji_presentation(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_extender(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_extended_pictographic(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_graph(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_grapheme_base(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_grapheme_extend(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_grapheme_link(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_hex_digit(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_hyphen(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_id_continue(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_ideographic(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_id_start(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_ids_binary_operator(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_ids_trinary_operator(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_join_control(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_logical_order_exception(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_lowercase(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_math(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_noncharacter_code_point(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_nfc_inert(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_nfd_inert(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_nfkc_inert(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_nfkd_inert(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_pattern_syntax(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_pattern_white_space(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_prepended_concatenation_mark(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_print(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_quotation_mark(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_radical(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_regional_indicator(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_soft_dotted(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_segment_starter(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_case_sensitive(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_sentence_terminal(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_terminal_punctuation(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_unified_ideograph(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_uppercase(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_variation_selector(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_white_space(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_xdigit(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_xid_continue(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_xid_start(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XCodePointSetData_ICU4XError ICU4XCodePointSetData_load_for_ecma262(const ICU4XDataProvider* provider, const char* property_name_data, size_t property_name_len);
+void ICU4XCodePointSetData_destroy(ICU4XCodePointSetData* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCodePointSetData.hpp b/intl/icu_capi/cpp/include/ICU4XCodePointSetData.hpp
new file mode 100644
index 0000000000..64b32e2e97
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCodePointSetData.hpp
@@ -0,0 +1,1109 @@
+#ifndef ICU4XCodePointSetData_HPP
+#define ICU4XCodePointSetData_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XCodePointSetData.h"
+
+class CodePointRangeIterator;
+class ICU4XDataProvider;
+class ICU4XCodePointSetData;
+#include "ICU4XError.hpp"
+
+/**
+ * A destruction policy for using ICU4XCodePointSetData with std::unique_ptr.
+ */
+struct ICU4XCodePointSetDataDeleter {
+ void operator()(capi::ICU4XCodePointSetData* l) const noexcept {
+ capi::ICU4XCodePointSetData_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X Unicode Set Property object, capable of querying whether a code point is contained in a set based on a Unicode property.
+ *
+ * See the [Rust documentation for `properties`](https://docs.rs/icu/latest/icu/properties/index.html) for more information.
+ *
+ * See the [Rust documentation for `CodePointSetData`](https://docs.rs/icu/latest/icu/properties/sets/struct.CodePointSetData.html) for more information.
+ *
+ * See the [Rust documentation for `CodePointSetDataBorrowed`](https://docs.rs/icu/latest/icu/properties/sets/struct.CodePointSetDataBorrowed.html) for more information.
+ */
+class ICU4XCodePointSetData {
+ public:
+
+ /**
+ * Checks whether the code point is in the set.
+ *
+ * See the [Rust documentation for `contains`](https://docs.rs/icu/latest/icu/properties/sets/struct.CodePointSetDataBorrowed.html#method.contains) for more information.
+ */
+ bool contains(char32_t cp) const;
+
+ /**
+ * Checks whether the code point (specified as a 32 bit integer, in UTF-32) is in the set.
+ */
+ bool contains32(uint32_t cp) const;
+
+ /**
+ * Produces an iterator over ranges of code points contained in this set
+ *
+ * See the [Rust documentation for `iter_ranges`](https://docs.rs/icu/latest/icu/properties/sets/struct.CodePointSetDataBorrowed.html#method.iter_ranges) for more information.
+ *
+ * Lifetimes: `this` must live at least as long as the output.
+ */
+ CodePointRangeIterator iter_ranges() const;
+
+ /**
+ * Produces an iterator over ranges of code points not contained in this set
+ *
+ * See the [Rust documentation for `iter_ranges_complemented`](https://docs.rs/icu/latest/icu/properties/sets/struct.CodePointSetDataBorrowed.html#method.iter_ranges_complemented) for more information.
+ *
+ * Lifetimes: `this` must live at least as long as the output.
+ */
+ CodePointRangeIterator iter_ranges_complemented() const;
+
+ /**
+ * which is a mask with the same format as the `U_GC_XX_MASK` mask in ICU4C
+ *
+ * See the [Rust documentation for `for_general_category_group`](https://docs.rs/icu/latest/icu/properties/sets/fn.for_general_category_group.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_for_general_category_group(const ICU4XDataProvider& provider, uint32_t group);
+
+ /**
+ * See the [Rust documentation for `ascii_hex_digit`](https://docs.rs/icu/latest/icu/properties/sets/fn.ascii_hex_digit.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_ascii_hex_digit(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `alnum`](https://docs.rs/icu/latest/icu/properties/sets/fn.alnum.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_alnum(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `alphabetic`](https://docs.rs/icu/latest/icu/properties/sets/fn.alphabetic.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_alphabetic(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `bidi_control`](https://docs.rs/icu/latest/icu/properties/sets/fn.bidi_control.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_bidi_control(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `bidi_mirrored`](https://docs.rs/icu/latest/icu/properties/sets/fn.bidi_mirrored.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_bidi_mirrored(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `blank`](https://docs.rs/icu/latest/icu/properties/sets/fn.blank.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_blank(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `cased`](https://docs.rs/icu/latest/icu/properties/sets/fn.cased.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_cased(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `case_ignorable`](https://docs.rs/icu/latest/icu/properties/sets/fn.case_ignorable.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_case_ignorable(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `full_composition_exclusion`](https://docs.rs/icu/latest/icu/properties/sets/fn.full_composition_exclusion.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_full_composition_exclusion(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `changes_when_casefolded`](https://docs.rs/icu/latest/icu/properties/sets/fn.changes_when_casefolded.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_changes_when_casefolded(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `changes_when_casemapped`](https://docs.rs/icu/latest/icu/properties/sets/fn.changes_when_casemapped.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_changes_when_casemapped(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `changes_when_nfkc_casefolded`](https://docs.rs/icu/latest/icu/properties/sets/fn.changes_when_nfkc_casefolded.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_changes_when_nfkc_casefolded(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `changes_when_lowercased`](https://docs.rs/icu/latest/icu/properties/sets/fn.changes_when_lowercased.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_changes_when_lowercased(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `changes_when_titlecased`](https://docs.rs/icu/latest/icu/properties/sets/fn.changes_when_titlecased.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_changes_when_titlecased(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `changes_when_uppercased`](https://docs.rs/icu/latest/icu/properties/sets/fn.changes_when_uppercased.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_changes_when_uppercased(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `dash`](https://docs.rs/icu/latest/icu/properties/sets/fn.dash.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_dash(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `deprecated`](https://docs.rs/icu/latest/icu/properties/sets/fn.deprecated.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_deprecated(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `default_ignorable_code_point`](https://docs.rs/icu/latest/icu/properties/sets/fn.default_ignorable_code_point.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_default_ignorable_code_point(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `diacritic`](https://docs.rs/icu/latest/icu/properties/sets/fn.diacritic.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_diacritic(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `emoji_modifier_base`](https://docs.rs/icu/latest/icu/properties/sets/fn.emoji_modifier_base.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_emoji_modifier_base(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `emoji_component`](https://docs.rs/icu/latest/icu/properties/sets/fn.emoji_component.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_emoji_component(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `emoji_modifier`](https://docs.rs/icu/latest/icu/properties/sets/fn.emoji_modifier.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_emoji_modifier(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `emoji`](https://docs.rs/icu/latest/icu/properties/sets/fn.emoji.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_emoji(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `emoji_presentation`](https://docs.rs/icu/latest/icu/properties/sets/fn.emoji_presentation.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_emoji_presentation(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `extender`](https://docs.rs/icu/latest/icu/properties/sets/fn.extender.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_extender(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `extended_pictographic`](https://docs.rs/icu/latest/icu/properties/sets/fn.extended_pictographic.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_extended_pictographic(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `graph`](https://docs.rs/icu/latest/icu/properties/sets/fn.graph.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_graph(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `grapheme_base`](https://docs.rs/icu/latest/icu/properties/sets/fn.grapheme_base.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_grapheme_base(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `grapheme_extend`](https://docs.rs/icu/latest/icu/properties/sets/fn.grapheme_extend.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_grapheme_extend(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `grapheme_link`](https://docs.rs/icu/latest/icu/properties/sets/fn.grapheme_link.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_grapheme_link(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `hex_digit`](https://docs.rs/icu/latest/icu/properties/sets/fn.hex_digit.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_hex_digit(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `hyphen`](https://docs.rs/icu/latest/icu/properties/sets/fn.hyphen.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_hyphen(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `id_continue`](https://docs.rs/icu/latest/icu/properties/sets/fn.id_continue.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_id_continue(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `ideographic`](https://docs.rs/icu/latest/icu/properties/sets/fn.ideographic.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_ideographic(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `id_start`](https://docs.rs/icu/latest/icu/properties/sets/fn.id_start.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_id_start(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `ids_binary_operator`](https://docs.rs/icu/latest/icu/properties/sets/fn.ids_binary_operator.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_ids_binary_operator(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `ids_trinary_operator`](https://docs.rs/icu/latest/icu/properties/sets/fn.ids_trinary_operator.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_ids_trinary_operator(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `join_control`](https://docs.rs/icu/latest/icu/properties/sets/fn.join_control.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_join_control(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `logical_order_exception`](https://docs.rs/icu/latest/icu/properties/sets/fn.logical_order_exception.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_logical_order_exception(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `lowercase`](https://docs.rs/icu/latest/icu/properties/sets/fn.lowercase.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_lowercase(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `math`](https://docs.rs/icu/latest/icu/properties/sets/fn.math.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_math(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `noncharacter_code_point`](https://docs.rs/icu/latest/icu/properties/sets/fn.noncharacter_code_point.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_noncharacter_code_point(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `nfc_inert`](https://docs.rs/icu/latest/icu/properties/sets/fn.nfc_inert.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_nfc_inert(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `nfd_inert`](https://docs.rs/icu/latest/icu/properties/sets/fn.nfd_inert.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_nfd_inert(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `nfkc_inert`](https://docs.rs/icu/latest/icu/properties/sets/fn.nfkc_inert.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_nfkc_inert(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `nfkd_inert`](https://docs.rs/icu/latest/icu/properties/sets/fn.nfkd_inert.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_nfkd_inert(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `pattern_syntax`](https://docs.rs/icu/latest/icu/properties/sets/fn.pattern_syntax.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_pattern_syntax(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `pattern_white_space`](https://docs.rs/icu/latest/icu/properties/sets/fn.pattern_white_space.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_pattern_white_space(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `prepended_concatenation_mark`](https://docs.rs/icu/latest/icu/properties/sets/fn.prepended_concatenation_mark.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_prepended_concatenation_mark(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `print`](https://docs.rs/icu/latest/icu/properties/sets/fn.print.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_print(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `quotation_mark`](https://docs.rs/icu/latest/icu/properties/sets/fn.quotation_mark.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_quotation_mark(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `radical`](https://docs.rs/icu/latest/icu/properties/sets/fn.radical.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_radical(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `regional_indicator`](https://docs.rs/icu/latest/icu/properties/sets/fn.regional_indicator.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_regional_indicator(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `soft_dotted`](https://docs.rs/icu/latest/icu/properties/sets/fn.soft_dotted.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_soft_dotted(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `segment_starter`](https://docs.rs/icu/latest/icu/properties/sets/fn.segment_starter.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_segment_starter(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `case_sensitive`](https://docs.rs/icu/latest/icu/properties/sets/fn.case_sensitive.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_case_sensitive(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `sentence_terminal`](https://docs.rs/icu/latest/icu/properties/sets/fn.sentence_terminal.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_sentence_terminal(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `terminal_punctuation`](https://docs.rs/icu/latest/icu/properties/sets/fn.terminal_punctuation.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_terminal_punctuation(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `unified_ideograph`](https://docs.rs/icu/latest/icu/properties/sets/fn.unified_ideograph.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_unified_ideograph(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `uppercase`](https://docs.rs/icu/latest/icu/properties/sets/fn.uppercase.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_uppercase(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `variation_selector`](https://docs.rs/icu/latest/icu/properties/sets/fn.variation_selector.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_variation_selector(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `white_space`](https://docs.rs/icu/latest/icu/properties/sets/fn.white_space.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_white_space(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `xdigit`](https://docs.rs/icu/latest/icu/properties/sets/fn.xdigit.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_xdigit(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `xid_continue`](https://docs.rs/icu/latest/icu/properties/sets/fn.xid_continue.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_xid_continue(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `xid_start`](https://docs.rs/icu/latest/icu/properties/sets/fn.xid_start.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_xid_start(const ICU4XDataProvider& provider);
+
+ /**
+ * Loads data for a property specified as a string as long as it is one of the
+ * [ECMA-262 binary properties][ecma] (not including Any, ASCII, and Assigned pseudoproperties).
+ *
+ * Returns `ICU4XError::PropertyUnexpectedPropertyNameError` in case the string does not
+ * match any property in the list
+ *
+ * [ecma]: https://tc39.es/ecma262/#table-binary-unicode-properties
+ *
+ * See the [Rust documentation for `for_ecma262`](https://docs.rs/icu/latest/icu/properties/sets/fn.for_ecma262.html) for more information.
+ */
+ static diplomat::result<ICU4XCodePointSetData, ICU4XError> load_for_ecma262(const ICU4XDataProvider& provider, const std::string_view property_name);
+ inline const capi::ICU4XCodePointSetData* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XCodePointSetData* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XCodePointSetData(capi::ICU4XCodePointSetData* i) : inner(i) {}
+ ICU4XCodePointSetData() = default;
+ ICU4XCodePointSetData(ICU4XCodePointSetData&&) noexcept = default;
+ ICU4XCodePointSetData& operator=(ICU4XCodePointSetData&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XCodePointSetData, ICU4XCodePointSetDataDeleter> inner;
+};
+
+#include "CodePointRangeIterator.hpp"
+#include "ICU4XDataProvider.hpp"
+
+inline bool ICU4XCodePointSetData::contains(char32_t cp) const {
+ return capi::ICU4XCodePointSetData_contains(this->inner.get(), cp);
+}
+inline bool ICU4XCodePointSetData::contains32(uint32_t cp) const {
+ return capi::ICU4XCodePointSetData_contains32(this->inner.get(), cp);
+}
+inline CodePointRangeIterator ICU4XCodePointSetData::iter_ranges() const {
+ return CodePointRangeIterator(capi::ICU4XCodePointSetData_iter_ranges(this->inner.get()));
+}
+inline CodePointRangeIterator ICU4XCodePointSetData::iter_ranges_complemented() const {
+ return CodePointRangeIterator(capi::ICU4XCodePointSetData_iter_ranges_complemented(this->inner.get()));
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_for_general_category_group(const ICU4XDataProvider& provider, uint32_t group) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_for_general_category_group(provider.AsFFI(), group);
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_ascii_hex_digit(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_ascii_hex_digit(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_alnum(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_alnum(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_alphabetic(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_alphabetic(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_bidi_control(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_bidi_control(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_bidi_mirrored(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_bidi_mirrored(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_blank(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_blank(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_cased(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_cased(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_case_ignorable(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_case_ignorable(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_full_composition_exclusion(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_full_composition_exclusion(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_changes_when_casefolded(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_changes_when_casefolded(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_changes_when_casemapped(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_changes_when_casemapped(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_changes_when_nfkc_casefolded(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_changes_when_nfkc_casefolded(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_changes_when_lowercased(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_changes_when_lowercased(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_changes_when_titlecased(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_changes_when_titlecased(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_changes_when_uppercased(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_changes_when_uppercased(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_dash(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_dash(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_deprecated(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_deprecated(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_default_ignorable_code_point(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_default_ignorable_code_point(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_diacritic(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_diacritic(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_emoji_modifier_base(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_emoji_modifier_base(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_emoji_component(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_emoji_component(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_emoji_modifier(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_emoji_modifier(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_emoji(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_emoji(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_emoji_presentation(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_emoji_presentation(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_extender(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_extender(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_extended_pictographic(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_extended_pictographic(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_graph(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_graph(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_grapheme_base(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_grapheme_base(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_grapheme_extend(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_grapheme_extend(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_grapheme_link(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_grapheme_link(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_hex_digit(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_hex_digit(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_hyphen(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_hyphen(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_id_continue(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_id_continue(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_ideographic(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_ideographic(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_id_start(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_id_start(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_ids_binary_operator(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_ids_binary_operator(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_ids_trinary_operator(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_ids_trinary_operator(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_join_control(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_join_control(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_logical_order_exception(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_logical_order_exception(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_lowercase(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_lowercase(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_math(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_math(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_noncharacter_code_point(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_noncharacter_code_point(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_nfc_inert(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_nfc_inert(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_nfd_inert(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_nfd_inert(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_nfkc_inert(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_nfkc_inert(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_nfkd_inert(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_nfkd_inert(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_pattern_syntax(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_pattern_syntax(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_pattern_white_space(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_pattern_white_space(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_prepended_concatenation_mark(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_prepended_concatenation_mark(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_print(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_print(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_quotation_mark(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_quotation_mark(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_radical(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_radical(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_regional_indicator(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_regional_indicator(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_soft_dotted(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_soft_dotted(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_segment_starter(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_segment_starter(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_case_sensitive(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_case_sensitive(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_sentence_terminal(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_sentence_terminal(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_terminal_punctuation(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_terminal_punctuation(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_unified_ideograph(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_unified_ideograph(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_uppercase(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_uppercase(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_variation_selector(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_variation_selector(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_white_space(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_white_space(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_xdigit(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_xdigit(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_xid_continue(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_xid_continue(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_xid_start(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_xid_start(provider.AsFFI());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XCodePointSetData, ICU4XError> ICU4XCodePointSetData::load_for_ecma262(const ICU4XDataProvider& provider, const std::string_view property_name) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCodePointSetData_load_for_ecma262(provider.AsFFI(), property_name.data(), property_name.size());
+ diplomat::result<ICU4XCodePointSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCodePointSetData>(ICU4XCodePointSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCollator.h b/intl/icu_capi/cpp/include/ICU4XCollator.h
new file mode 100644
index 0000000000..973c2cedd9
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCollator.h
@@ -0,0 +1,40 @@
+#ifndef ICU4XCollator_H
+#define ICU4XCollator_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XCollator ICU4XCollator;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "ICU4XLocale.h"
+#include "ICU4XCollatorOptionsV1.h"
+#include "diplomat_result_box_ICU4XCollator_ICU4XError.h"
+#include "ICU4XOrdering.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XCollator_ICU4XError ICU4XCollator_create_v1(const ICU4XDataProvider* provider, const ICU4XLocale* locale, ICU4XCollatorOptionsV1 options);
+
+ICU4XOrdering ICU4XCollator_compare(const ICU4XCollator* self, const char* left_data, size_t left_len, const char* right_data, size_t right_len);
+
+ICU4XOrdering ICU4XCollator_compare_valid_utf8(const ICU4XCollator* self, const char* left_data, size_t left_len, const char* right_data, size_t right_len);
+
+ICU4XOrdering ICU4XCollator_compare_utf16(const ICU4XCollator* self, const uint16_t* left_data, size_t left_len, const uint16_t* right_data, size_t right_len);
+void ICU4XCollator_destroy(ICU4XCollator* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCollator.hpp b/intl/icu_capi/cpp/include/ICU4XCollator.hpp
new file mode 100644
index 0000000000..d661661f5a
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCollator.hpp
@@ -0,0 +1,105 @@
+#ifndef ICU4XCollator_HPP
+#define ICU4XCollator_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XCollator.h"
+
+class ICU4XDataProvider;
+class ICU4XLocale;
+struct ICU4XCollatorOptionsV1;
+class ICU4XCollator;
+#include "ICU4XError.hpp"
+#include "ICU4XOrdering.hpp"
+
+/**
+ * A destruction policy for using ICU4XCollator with std::unique_ptr.
+ */
+struct ICU4XCollatorDeleter {
+ void operator()(capi::ICU4XCollator* l) const noexcept {
+ capi::ICU4XCollator_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `Collator`](https://docs.rs/icu/latest/icu/collator/struct.Collator.html) for more information.
+ */
+class ICU4XCollator {
+ public:
+
+ /**
+ * Construct a new Collator instance.
+ *
+ * See the [Rust documentation for `try_new`](https://docs.rs/icu/latest/icu/collator/struct.Collator.html#method.try_new) for more information.
+ */
+ static diplomat::result<ICU4XCollator, ICU4XError> create_v1(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XCollatorOptionsV1 options);
+
+ /**
+ * Compare potentially ill-formed UTF-8 strings.
+ *
+ * Ill-formed input is compared
+ * as if errors had been replaced with REPLACEMENT CHARACTERs according
+ * to the WHATWG Encoding Standard.
+ *
+ * See the [Rust documentation for `compare_utf8`](https://docs.rs/icu/latest/icu/collator/struct.Collator.html#method.compare_utf8) for more information.
+ */
+ ICU4XOrdering compare(const std::string_view left, const std::string_view right) const;
+
+ /**
+ * Compare guaranteed well-formed UTF-8 strings.
+ *
+ * Note: In C++, passing ill-formed UTF-8 strings is undefined behavior
+ * (and may be memory-unsafe to do so, too).
+ *
+ * See the [Rust documentation for `compare`](https://docs.rs/icu/latest/icu/collator/struct.Collator.html#method.compare) for more information.
+ */
+ ICU4XOrdering compare_valid_utf8(const std::string_view left, const std::string_view right) const;
+
+ /**
+ * Compare potentially ill-formed UTF-16 strings, with unpaired surrogates
+ * compared as REPLACEMENT CHARACTER.
+ *
+ * See the [Rust documentation for `compare_utf16`](https://docs.rs/icu/latest/icu/collator/struct.Collator.html#method.compare_utf16) for more information.
+ */
+ ICU4XOrdering compare_utf16(const diplomat::span<const uint16_t> left, const diplomat::span<const uint16_t> right) const;
+ inline const capi::ICU4XCollator* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XCollator* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XCollator(capi::ICU4XCollator* i) : inner(i) {}
+ ICU4XCollator() = default;
+ ICU4XCollator(ICU4XCollator&&) noexcept = default;
+ ICU4XCollator& operator=(ICU4XCollator&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XCollator, ICU4XCollatorDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocale.hpp"
+#include "ICU4XCollatorOptionsV1.hpp"
+
+inline diplomat::result<ICU4XCollator, ICU4XError> ICU4XCollator::create_v1(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XCollatorOptionsV1 options) {
+ ICU4XCollatorOptionsV1 diplomat_wrapped_struct_options = options;
+ auto diplomat_result_raw_out_value = capi::ICU4XCollator_create_v1(provider.AsFFI(), locale.AsFFI(), capi::ICU4XCollatorOptionsV1{ .strength = static_cast<capi::ICU4XCollatorStrength>(diplomat_wrapped_struct_options.strength), .alternate_handling = static_cast<capi::ICU4XCollatorAlternateHandling>(diplomat_wrapped_struct_options.alternate_handling), .case_first = static_cast<capi::ICU4XCollatorCaseFirst>(diplomat_wrapped_struct_options.case_first), .max_variable = static_cast<capi::ICU4XCollatorMaxVariable>(diplomat_wrapped_struct_options.max_variable), .case_level = static_cast<capi::ICU4XCollatorCaseLevel>(diplomat_wrapped_struct_options.case_level), .numeric = static_cast<capi::ICU4XCollatorNumeric>(diplomat_wrapped_struct_options.numeric), .backward_second_level = static_cast<capi::ICU4XCollatorBackwardSecondLevel>(diplomat_wrapped_struct_options.backward_second_level) });
+ diplomat::result<ICU4XCollator, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCollator>(ICU4XCollator(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XOrdering ICU4XCollator::compare(const std::string_view left, const std::string_view right) const {
+ return static_cast<ICU4XOrdering>(capi::ICU4XCollator_compare(this->inner.get(), left.data(), left.size(), right.data(), right.size()));
+}
+inline ICU4XOrdering ICU4XCollator::compare_valid_utf8(const std::string_view left, const std::string_view right) const {
+ return static_cast<ICU4XOrdering>(capi::ICU4XCollator_compare_valid_utf8(this->inner.get(), left.data(), left.size(), right.data(), right.size()));
+}
+inline ICU4XOrdering ICU4XCollator::compare_utf16(const diplomat::span<const uint16_t> left, const diplomat::span<const uint16_t> right) const {
+ return static_cast<ICU4XOrdering>(capi::ICU4XCollator_compare_utf16(this->inner.get(), left.data(), left.size(), right.data(), right.size()));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCollatorAlternateHandling.h b/intl/icu_capi/cpp/include/ICU4XCollatorAlternateHandling.h
new file mode 100644
index 0000000000..dfc3d595eb
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCollatorAlternateHandling.h
@@ -0,0 +1,32 @@
+#ifndef ICU4XCollatorAlternateHandling_H
+#define ICU4XCollatorAlternateHandling_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XCollatorAlternateHandling {
+ ICU4XCollatorAlternateHandling_Auto = 0,
+ ICU4XCollatorAlternateHandling_NonIgnorable = 1,
+ ICU4XCollatorAlternateHandling_Shifted = 2,
+} ICU4XCollatorAlternateHandling;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XCollatorAlternateHandling_destroy(ICU4XCollatorAlternateHandling* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCollatorAlternateHandling.hpp b/intl/icu_capi/cpp/include/ICU4XCollatorAlternateHandling.hpp
new file mode 100644
index 0000000000..957bdac780
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCollatorAlternateHandling.hpp
@@ -0,0 +1,25 @@
+#ifndef ICU4XCollatorAlternateHandling_HPP
+#define ICU4XCollatorAlternateHandling_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XCollatorAlternateHandling.h"
+
+
+
+/**
+ * See the [Rust documentation for `AlternateHandling`](https://docs.rs/icu/latest/icu/collator/enum.AlternateHandling.html) for more information.
+ */
+enum struct ICU4XCollatorAlternateHandling {
+ Auto = 0,
+ NonIgnorable = 1,
+ Shifted = 2,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCollatorBackwardSecondLevel.h b/intl/icu_capi/cpp/include/ICU4XCollatorBackwardSecondLevel.h
new file mode 100644
index 0000000000..659f9b2f10
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCollatorBackwardSecondLevel.h
@@ -0,0 +1,32 @@
+#ifndef ICU4XCollatorBackwardSecondLevel_H
+#define ICU4XCollatorBackwardSecondLevel_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XCollatorBackwardSecondLevel {
+ ICU4XCollatorBackwardSecondLevel_Auto = 0,
+ ICU4XCollatorBackwardSecondLevel_Off = 1,
+ ICU4XCollatorBackwardSecondLevel_On = 2,
+} ICU4XCollatorBackwardSecondLevel;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XCollatorBackwardSecondLevel_destroy(ICU4XCollatorBackwardSecondLevel* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCollatorBackwardSecondLevel.hpp b/intl/icu_capi/cpp/include/ICU4XCollatorBackwardSecondLevel.hpp
new file mode 100644
index 0000000000..7bd601a59f
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCollatorBackwardSecondLevel.hpp
@@ -0,0 +1,25 @@
+#ifndef ICU4XCollatorBackwardSecondLevel_HPP
+#define ICU4XCollatorBackwardSecondLevel_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XCollatorBackwardSecondLevel.h"
+
+
+
+/**
+ * See the [Rust documentation for `BackwardSecondLevel`](https://docs.rs/icu/latest/icu/collator/enum.BackwardSecondLevel.html) for more information.
+ */
+enum struct ICU4XCollatorBackwardSecondLevel {
+ Auto = 0,
+ Off = 1,
+ On = 2,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCollatorCaseFirst.h b/intl/icu_capi/cpp/include/ICU4XCollatorCaseFirst.h
new file mode 100644
index 0000000000..c01eb216d0
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCollatorCaseFirst.h
@@ -0,0 +1,33 @@
+#ifndef ICU4XCollatorCaseFirst_H
+#define ICU4XCollatorCaseFirst_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XCollatorCaseFirst {
+ ICU4XCollatorCaseFirst_Auto = 0,
+ ICU4XCollatorCaseFirst_Off = 1,
+ ICU4XCollatorCaseFirst_LowerFirst = 2,
+ ICU4XCollatorCaseFirst_UpperFirst = 3,
+} ICU4XCollatorCaseFirst;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XCollatorCaseFirst_destroy(ICU4XCollatorCaseFirst* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCollatorCaseFirst.hpp b/intl/icu_capi/cpp/include/ICU4XCollatorCaseFirst.hpp
new file mode 100644
index 0000000000..680e3e9f9a
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCollatorCaseFirst.hpp
@@ -0,0 +1,26 @@
+#ifndef ICU4XCollatorCaseFirst_HPP
+#define ICU4XCollatorCaseFirst_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XCollatorCaseFirst.h"
+
+
+
+/**
+ * See the [Rust documentation for `CaseFirst`](https://docs.rs/icu/latest/icu/collator/enum.CaseFirst.html) for more information.
+ */
+enum struct ICU4XCollatorCaseFirst {
+ Auto = 0,
+ Off = 1,
+ LowerFirst = 2,
+ UpperFirst = 3,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCollatorCaseLevel.h b/intl/icu_capi/cpp/include/ICU4XCollatorCaseLevel.h
new file mode 100644
index 0000000000..cbf6865967
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCollatorCaseLevel.h
@@ -0,0 +1,32 @@
+#ifndef ICU4XCollatorCaseLevel_H
+#define ICU4XCollatorCaseLevel_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XCollatorCaseLevel {
+ ICU4XCollatorCaseLevel_Auto = 0,
+ ICU4XCollatorCaseLevel_Off = 1,
+ ICU4XCollatorCaseLevel_On = 2,
+} ICU4XCollatorCaseLevel;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XCollatorCaseLevel_destroy(ICU4XCollatorCaseLevel* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCollatorCaseLevel.hpp b/intl/icu_capi/cpp/include/ICU4XCollatorCaseLevel.hpp
new file mode 100644
index 0000000000..849f891591
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCollatorCaseLevel.hpp
@@ -0,0 +1,25 @@
+#ifndef ICU4XCollatorCaseLevel_HPP
+#define ICU4XCollatorCaseLevel_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XCollatorCaseLevel.h"
+
+
+
+/**
+ * See the [Rust documentation for `CaseLevel`](https://docs.rs/icu/latest/icu/collator/enum.CaseLevel.html) for more information.
+ */
+enum struct ICU4XCollatorCaseLevel {
+ Auto = 0,
+ Off = 1,
+ On = 2,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCollatorMaxVariable.h b/intl/icu_capi/cpp/include/ICU4XCollatorMaxVariable.h
new file mode 100644
index 0000000000..0e5a3a516f
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCollatorMaxVariable.h
@@ -0,0 +1,34 @@
+#ifndef ICU4XCollatorMaxVariable_H
+#define ICU4XCollatorMaxVariable_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XCollatorMaxVariable {
+ ICU4XCollatorMaxVariable_Auto = 0,
+ ICU4XCollatorMaxVariable_Space = 1,
+ ICU4XCollatorMaxVariable_Punctuation = 2,
+ ICU4XCollatorMaxVariable_Symbol = 3,
+ ICU4XCollatorMaxVariable_Currency = 4,
+} ICU4XCollatorMaxVariable;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XCollatorMaxVariable_destroy(ICU4XCollatorMaxVariable* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCollatorMaxVariable.hpp b/intl/icu_capi/cpp/include/ICU4XCollatorMaxVariable.hpp
new file mode 100644
index 0000000000..6092118851
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCollatorMaxVariable.hpp
@@ -0,0 +1,27 @@
+#ifndef ICU4XCollatorMaxVariable_HPP
+#define ICU4XCollatorMaxVariable_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XCollatorMaxVariable.h"
+
+
+
+/**
+ * See the [Rust documentation for `MaxVariable`](https://docs.rs/icu/latest/icu/collator/enum.MaxVariable.html) for more information.
+ */
+enum struct ICU4XCollatorMaxVariable {
+ Auto = 0,
+ Space = 1,
+ Punctuation = 2,
+ Symbol = 3,
+ Currency = 4,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCollatorNumeric.h b/intl/icu_capi/cpp/include/ICU4XCollatorNumeric.h
new file mode 100644
index 0000000000..4dd2ec0408
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCollatorNumeric.h
@@ -0,0 +1,32 @@
+#ifndef ICU4XCollatorNumeric_H
+#define ICU4XCollatorNumeric_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XCollatorNumeric {
+ ICU4XCollatorNumeric_Auto = 0,
+ ICU4XCollatorNumeric_Off = 1,
+ ICU4XCollatorNumeric_On = 2,
+} ICU4XCollatorNumeric;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XCollatorNumeric_destroy(ICU4XCollatorNumeric* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCollatorNumeric.hpp b/intl/icu_capi/cpp/include/ICU4XCollatorNumeric.hpp
new file mode 100644
index 0000000000..1c60a7102f
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCollatorNumeric.hpp
@@ -0,0 +1,25 @@
+#ifndef ICU4XCollatorNumeric_HPP
+#define ICU4XCollatorNumeric_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XCollatorNumeric.h"
+
+
+
+/**
+ * See the [Rust documentation for `Numeric`](https://docs.rs/icu/latest/icu/collator/enum.Numeric.html) for more information.
+ */
+enum struct ICU4XCollatorNumeric {
+ Auto = 0,
+ Off = 1,
+ On = 2,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCollatorOptionsV1.h b/intl/icu_capi/cpp/include/ICU4XCollatorOptionsV1.h
new file mode 100644
index 0000000000..dc73557efe
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCollatorOptionsV1.h
@@ -0,0 +1,50 @@
+#ifndef ICU4XCollatorOptionsV1_H
+#define ICU4XCollatorOptionsV1_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#include "ICU4XCollatorStrength.h"
+#include "ICU4XCollatorAlternateHandling.h"
+#include "ICU4XCollatorCaseFirst.h"
+#include "ICU4XCollatorMaxVariable.h"
+#include "ICU4XCollatorCaseLevel.h"
+#include "ICU4XCollatorNumeric.h"
+#include "ICU4XCollatorBackwardSecondLevel.h"
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XCollatorOptionsV1 {
+ ICU4XCollatorStrength strength;
+ ICU4XCollatorAlternateHandling alternate_handling;
+ ICU4XCollatorCaseFirst case_first;
+ ICU4XCollatorMaxVariable max_variable;
+ ICU4XCollatorCaseLevel case_level;
+ ICU4XCollatorNumeric numeric;
+ ICU4XCollatorBackwardSecondLevel backward_second_level;
+} ICU4XCollatorOptionsV1;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XCollatorStrength.h"
+#include "ICU4XCollatorAlternateHandling.h"
+#include "ICU4XCollatorCaseFirst.h"
+#include "ICU4XCollatorMaxVariable.h"
+#include "ICU4XCollatorCaseLevel.h"
+#include "ICU4XCollatorNumeric.h"
+#include "ICU4XCollatorBackwardSecondLevel.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XCollatorOptionsV1_destroy(ICU4XCollatorOptionsV1* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCollatorOptionsV1.hpp b/intl/icu_capi/cpp/include/ICU4XCollatorOptionsV1.hpp
new file mode 100644
index 0000000000..cc646c2154
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCollatorOptionsV1.hpp
@@ -0,0 +1,38 @@
+#ifndef ICU4XCollatorOptionsV1_HPP
+#define ICU4XCollatorOptionsV1_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XCollatorOptionsV1.h"
+
+#include "ICU4XCollatorStrength.hpp"
+#include "ICU4XCollatorAlternateHandling.hpp"
+#include "ICU4XCollatorCaseFirst.hpp"
+#include "ICU4XCollatorMaxVariable.hpp"
+#include "ICU4XCollatorCaseLevel.hpp"
+#include "ICU4XCollatorNumeric.hpp"
+#include "ICU4XCollatorBackwardSecondLevel.hpp"
+
+
+/**
+ * See the [Rust documentation for `CollatorOptions`](https://docs.rs/icu/latest/icu/collator/struct.CollatorOptions.html) for more information.
+ */
+struct ICU4XCollatorOptionsV1 {
+ public:
+ ICU4XCollatorStrength strength;
+ ICU4XCollatorAlternateHandling alternate_handling;
+ ICU4XCollatorCaseFirst case_first;
+ ICU4XCollatorMaxVariable max_variable;
+ ICU4XCollatorCaseLevel case_level;
+ ICU4XCollatorNumeric numeric;
+ ICU4XCollatorBackwardSecondLevel backward_second_level;
+};
+
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCollatorStrength.h b/intl/icu_capi/cpp/include/ICU4XCollatorStrength.h
new file mode 100644
index 0000000000..f230214feb
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCollatorStrength.h
@@ -0,0 +1,35 @@
+#ifndef ICU4XCollatorStrength_H
+#define ICU4XCollatorStrength_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XCollatorStrength {
+ ICU4XCollatorStrength_Auto = 0,
+ ICU4XCollatorStrength_Primary = 1,
+ ICU4XCollatorStrength_Secondary = 2,
+ ICU4XCollatorStrength_Tertiary = 3,
+ ICU4XCollatorStrength_Quaternary = 4,
+ ICU4XCollatorStrength_Identical = 5,
+} ICU4XCollatorStrength;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XCollatorStrength_destroy(ICU4XCollatorStrength* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCollatorStrength.hpp b/intl/icu_capi/cpp/include/ICU4XCollatorStrength.hpp
new file mode 100644
index 0000000000..3fdebcd1f4
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCollatorStrength.hpp
@@ -0,0 +1,28 @@
+#ifndef ICU4XCollatorStrength_HPP
+#define ICU4XCollatorStrength_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XCollatorStrength.h"
+
+
+
+/**
+ * See the [Rust documentation for `Strength`](https://docs.rs/icu/latest/icu/collator/enum.Strength.html) for more information.
+ */
+enum struct ICU4XCollatorStrength {
+ Auto = 0,
+ Primary = 1,
+ Secondary = 2,
+ Tertiary = 3,
+ Quaternary = 4,
+ Identical = 5,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XComposingNormalizer.h b/intl/icu_capi/cpp/include/ICU4XComposingNormalizer.h
new file mode 100644
index 0000000000..1798af0d8e
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XComposingNormalizer.h
@@ -0,0 +1,38 @@
+#ifndef ICU4XComposingNormalizer_H
+#define ICU4XComposingNormalizer_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XComposingNormalizer ICU4XComposingNormalizer;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XComposingNormalizer_ICU4XError.h"
+#include "diplomat_result_void_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XComposingNormalizer_ICU4XError ICU4XComposingNormalizer_create_nfc(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XComposingNormalizer_ICU4XError ICU4XComposingNormalizer_create_nfkc(const ICU4XDataProvider* provider);
+
+diplomat_result_void_ICU4XError ICU4XComposingNormalizer_normalize(const ICU4XComposingNormalizer* self, const char* s_data, size_t s_len, DiplomatWriteable* write);
+
+bool ICU4XComposingNormalizer_is_normalized(const ICU4XComposingNormalizer* self, const char* s_data, size_t s_len);
+void ICU4XComposingNormalizer_destroy(ICU4XComposingNormalizer* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XComposingNormalizer.hpp b/intl/icu_capi/cpp/include/ICU4XComposingNormalizer.hpp
new file mode 100644
index 0000000000..c1a1dcc417
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XComposingNormalizer.hpp
@@ -0,0 +1,131 @@
+#ifndef ICU4XComposingNormalizer_HPP
+#define ICU4XComposingNormalizer_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XComposingNormalizer.h"
+
+class ICU4XDataProvider;
+class ICU4XComposingNormalizer;
+#include "ICU4XError.hpp"
+
+/**
+ * A destruction policy for using ICU4XComposingNormalizer with std::unique_ptr.
+ */
+struct ICU4XComposingNormalizerDeleter {
+ void operator()(capi::ICU4XComposingNormalizer* l) const noexcept {
+ capi::ICU4XComposingNormalizer_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `ComposingNormalizer`](https://docs.rs/icu/latest/icu/normalizer/struct.ComposingNormalizer.html) for more information.
+ */
+class ICU4XComposingNormalizer {
+ public:
+
+ /**
+ * Construct a new ICU4XComposingNormalizer instance for NFC
+ *
+ * See the [Rust documentation for `new_nfc`](https://docs.rs/icu/latest/icu/normalizer/struct.ComposingNormalizer.html#method.new_nfc) for more information.
+ */
+ static diplomat::result<ICU4XComposingNormalizer, ICU4XError> create_nfc(const ICU4XDataProvider& provider);
+
+ /**
+ * Construct a new ICU4XComposingNormalizer instance for NFKC
+ *
+ * See the [Rust documentation for `new_nfkc`](https://docs.rs/icu/latest/icu/normalizer/struct.ComposingNormalizer.html#method.new_nfkc) for more information.
+ */
+ static diplomat::result<ICU4XComposingNormalizer, ICU4XError> create_nfkc(const ICU4XDataProvider& provider);
+
+ /**
+ * Normalize a (potentially ill-formed) UTF8 string
+ *
+ * Errors are mapped to REPLACEMENT CHARACTER
+ *
+ * See the [Rust documentation for `normalize_utf8`](https://docs.rs/icu/latest/icu/normalizer/struct.ComposingNormalizer.html#method.normalize_utf8) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> normalize_to_writeable(const std::string_view s, W& write) const;
+
+ /**
+ * Normalize a (potentially ill-formed) UTF8 string
+ *
+ * Errors are mapped to REPLACEMENT CHARACTER
+ *
+ * See the [Rust documentation for `normalize_utf8`](https://docs.rs/icu/latest/icu/normalizer/struct.ComposingNormalizer.html#method.normalize_utf8) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> normalize(const std::string_view s) const;
+
+ /**
+ * Check if a (potentially ill-formed) UTF8 string is normalized
+ *
+ * Errors are mapped to REPLACEMENT CHARACTER
+ *
+ * See the [Rust documentation for `is_normalized_utf8`](https://docs.rs/icu/latest/icu/normalizer/struct.ComposingNormalizer.html#method.is_normalized_utf8) for more information.
+ */
+ bool is_normalized(const std::string_view s) const;
+ inline const capi::ICU4XComposingNormalizer* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XComposingNormalizer* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XComposingNormalizer(capi::ICU4XComposingNormalizer* i) : inner(i) {}
+ ICU4XComposingNormalizer() = default;
+ ICU4XComposingNormalizer(ICU4XComposingNormalizer&&) noexcept = default;
+ ICU4XComposingNormalizer& operator=(ICU4XComposingNormalizer&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XComposingNormalizer, ICU4XComposingNormalizerDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+
+inline diplomat::result<ICU4XComposingNormalizer, ICU4XError> ICU4XComposingNormalizer::create_nfc(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XComposingNormalizer_create_nfc(provider.AsFFI());
+ diplomat::result<ICU4XComposingNormalizer, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XComposingNormalizer>(ICU4XComposingNormalizer(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XComposingNormalizer, ICU4XError> ICU4XComposingNormalizer::create_nfkc(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XComposingNormalizer_create_nfkc(provider.AsFFI());
+ diplomat::result<ICU4XComposingNormalizer, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XComposingNormalizer>(ICU4XComposingNormalizer(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XComposingNormalizer::normalize_to_writeable(const std::string_view s, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XComposingNormalizer_normalize(this->inner.get(), s.data(), s.size(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XComposingNormalizer::normalize(const std::string_view s) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XComposingNormalizer_normalize(this->inner.get(), s.data(), s.size(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+inline bool ICU4XComposingNormalizer::is_normalized(const std::string_view s) const {
+ return capi::ICU4XComposingNormalizer_is_normalized(this->inner.get(), s.data(), s.size());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCustomTimeZone.h b/intl/icu_capi/cpp/include/ICU4XCustomTimeZone.h
new file mode 100644
index 0000000000..422b7fa382
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCustomTimeZone.h
@@ -0,0 +1,84 @@
+#ifndef ICU4XCustomTimeZone_H
+#define ICU4XCustomTimeZone_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XCustomTimeZone ICU4XCustomTimeZone;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "diplomat_result_box_ICU4XCustomTimeZone_ICU4XError.h"
+#include "diplomat_result_void_ICU4XError.h"
+#include "diplomat_result_int32_t_ICU4XError.h"
+#include "diplomat_result_bool_ICU4XError.h"
+#include "ICU4XIanaToBcp47Mapper.h"
+#include "ICU4XMetazoneCalculator.h"
+#include "ICU4XIsoDateTime.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XCustomTimeZone_ICU4XError ICU4XCustomTimeZone_create_from_string(const char* s_data, size_t s_len);
+
+ICU4XCustomTimeZone* ICU4XCustomTimeZone_create_empty();
+
+ICU4XCustomTimeZone* ICU4XCustomTimeZone_create_utc();
+
+diplomat_result_void_ICU4XError ICU4XCustomTimeZone_try_set_gmt_offset_seconds(ICU4XCustomTimeZone* self, int32_t offset_seconds);
+
+void ICU4XCustomTimeZone_clear_gmt_offset(ICU4XCustomTimeZone* self);
+
+diplomat_result_int32_t_ICU4XError ICU4XCustomTimeZone_gmt_offset_seconds(const ICU4XCustomTimeZone* self);
+
+diplomat_result_bool_ICU4XError ICU4XCustomTimeZone_is_gmt_offset_positive(const ICU4XCustomTimeZone* self);
+
+diplomat_result_bool_ICU4XError ICU4XCustomTimeZone_is_gmt_offset_zero(const ICU4XCustomTimeZone* self);
+
+diplomat_result_bool_ICU4XError ICU4XCustomTimeZone_gmt_offset_has_minutes(const ICU4XCustomTimeZone* self);
+
+diplomat_result_bool_ICU4XError ICU4XCustomTimeZone_gmt_offset_has_seconds(const ICU4XCustomTimeZone* self);
+
+diplomat_result_void_ICU4XError ICU4XCustomTimeZone_try_set_time_zone_id(ICU4XCustomTimeZone* self, const char* id_data, size_t id_len);
+
+diplomat_result_void_ICU4XError ICU4XCustomTimeZone_try_set_iana_time_zone_id(ICU4XCustomTimeZone* self, const ICU4XIanaToBcp47Mapper* mapper, const char* id_data, size_t id_len);
+
+void ICU4XCustomTimeZone_clear_time_zone_id(ICU4XCustomTimeZone* self);
+
+diplomat_result_void_ICU4XError ICU4XCustomTimeZone_time_zone_id(const ICU4XCustomTimeZone* self, DiplomatWriteable* write);
+
+diplomat_result_void_ICU4XError ICU4XCustomTimeZone_try_set_metazone_id(ICU4XCustomTimeZone* self, const char* id_data, size_t id_len);
+
+void ICU4XCustomTimeZone_clear_metazone_id(ICU4XCustomTimeZone* self);
+
+diplomat_result_void_ICU4XError ICU4XCustomTimeZone_metazone_id(const ICU4XCustomTimeZone* self, DiplomatWriteable* write);
+
+diplomat_result_void_ICU4XError ICU4XCustomTimeZone_try_set_zone_variant(ICU4XCustomTimeZone* self, const char* id_data, size_t id_len);
+
+void ICU4XCustomTimeZone_clear_zone_variant(ICU4XCustomTimeZone* self);
+
+diplomat_result_void_ICU4XError ICU4XCustomTimeZone_zone_variant(const ICU4XCustomTimeZone* self, DiplomatWriteable* write);
+
+void ICU4XCustomTimeZone_set_standard_time(ICU4XCustomTimeZone* self);
+
+void ICU4XCustomTimeZone_set_daylight_time(ICU4XCustomTimeZone* self);
+
+diplomat_result_bool_ICU4XError ICU4XCustomTimeZone_is_standard_time(const ICU4XCustomTimeZone* self);
+
+diplomat_result_bool_ICU4XError ICU4XCustomTimeZone_is_daylight_time(const ICU4XCustomTimeZone* self);
+
+void ICU4XCustomTimeZone_maybe_calculate_metazone(ICU4XCustomTimeZone* self, const ICU4XMetazoneCalculator* metazone_calculator, const ICU4XIsoDateTime* local_datetime);
+void ICU4XCustomTimeZone_destroy(ICU4XCustomTimeZone* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XCustomTimeZone.hpp b/intl/icu_capi/cpp/include/ICU4XCustomTimeZone.hpp
new file mode 100644
index 0000000000..f3bea2d494
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XCustomTimeZone.hpp
@@ -0,0 +1,547 @@
+#ifndef ICU4XCustomTimeZone_HPP
+#define ICU4XCustomTimeZone_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XCustomTimeZone.h"
+
+class ICU4XCustomTimeZone;
+#include "ICU4XError.hpp"
+class ICU4XIanaToBcp47Mapper;
+class ICU4XMetazoneCalculator;
+class ICU4XIsoDateTime;
+
+/**
+ * A destruction policy for using ICU4XCustomTimeZone with std::unique_ptr.
+ */
+struct ICU4XCustomTimeZoneDeleter {
+ void operator()(capi::ICU4XCustomTimeZone* l) const noexcept {
+ capi::ICU4XCustomTimeZone_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `CustomTimeZone`](https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html) for more information.
+ */
+class ICU4XCustomTimeZone {
+ public:
+
+ /**
+ * Creates a time zone from an offset string.
+ *
+ * See the [Rust documentation for `from_str`](https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#method.from_str) for more information.
+ */
+ static diplomat::result<ICU4XCustomTimeZone, ICU4XError> create_from_string(const std::string_view s);
+
+ /**
+ * Creates a time zone with no information.
+ *
+ * See the [Rust documentation for `new_empty`](https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#method.new_empty) for more information.
+ */
+ static ICU4XCustomTimeZone create_empty();
+
+ /**
+ * Creates a time zone for UTC.
+ *
+ * See the [Rust documentation for `utc`](https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#method.utc) for more information.
+ */
+ static ICU4XCustomTimeZone create_utc();
+
+ /**
+ * Sets the `gmt_offset` field from offset seconds.
+ *
+ * Errors if the offset seconds are out of range.
+ *
+ * See the [Rust documentation for `try_from_offset_seconds`](https://docs.rs/icu/latest/icu/timezone/struct.GmtOffset.html#method.try_from_offset_seconds) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/timezone/struct.GmtOffset.html)
+ */
+ diplomat::result<std::monostate, ICU4XError> try_set_gmt_offset_seconds(int32_t offset_seconds);
+
+ /**
+ * Clears the `gmt_offset` field.
+ *
+ * See the [Rust documentation for `offset_seconds`](https://docs.rs/icu/latest/icu/timezone/struct.GmtOffset.html#method.offset_seconds) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/timezone/struct.GmtOffset.html)
+ */
+ void clear_gmt_offset();
+
+ /**
+ * Returns the value of the `gmt_offset` field as offset seconds.
+ *
+ * Errors if the `gmt_offset` field is empty.
+ *
+ * See the [Rust documentation for `offset_seconds`](https://docs.rs/icu/latest/icu/timezone/struct.GmtOffset.html#method.offset_seconds) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/timezone/struct.GmtOffset.html)
+ */
+ diplomat::result<int32_t, ICU4XError> gmt_offset_seconds() const;
+
+ /**
+ * Returns whether the `gmt_offset` field is positive.
+ *
+ * Errors if the `gmt_offset` field is empty.
+ *
+ * See the [Rust documentation for `is_positive`](https://docs.rs/icu/latest/icu/timezone/struct.GmtOffset.html#method.is_positive) for more information.
+ */
+ diplomat::result<bool, ICU4XError> is_gmt_offset_positive() const;
+
+ /**
+ * Returns whether the `gmt_offset` field is zero.
+ *
+ * Errors if the `gmt_offset` field is empty (which is not the same as zero).
+ *
+ * See the [Rust documentation for `is_zero`](https://docs.rs/icu/latest/icu/timezone/struct.GmtOffset.html#method.is_zero) for more information.
+ */
+ diplomat::result<bool, ICU4XError> is_gmt_offset_zero() const;
+
+ /**
+ * Returns whether the `gmt_offset` field has nonzero minutes.
+ *
+ * Errors if the `gmt_offset` field is empty.
+ *
+ * See the [Rust documentation for `has_minutes`](https://docs.rs/icu/latest/icu/timezone/struct.GmtOffset.html#method.has_minutes) for more information.
+ */
+ diplomat::result<bool, ICU4XError> gmt_offset_has_minutes() const;
+
+ /**
+ * Returns whether the `gmt_offset` field has nonzero seconds.
+ *
+ * Errors if the `gmt_offset` field is empty.
+ *
+ * See the [Rust documentation for `has_seconds`](https://docs.rs/icu/latest/icu/timezone/struct.GmtOffset.html#method.has_seconds) for more information.
+ */
+ diplomat::result<bool, ICU4XError> gmt_offset_has_seconds() const;
+
+ /**
+ * Sets the `time_zone_id` field from a BCP-47 string.
+ *
+ * Errors if the string is not a valid BCP-47 time zone ID.
+ *
+ * See the [Rust documentation for `time_zone_id`](https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.time_zone_id) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/timezone/struct.TimeZoneBcp47Id.html)
+ */
+ diplomat::result<std::monostate, ICU4XError> try_set_time_zone_id(const std::string_view id);
+
+ /**
+ * Sets the `time_zone_id` field from an IANA string by looking up
+ * the corresponding BCP-47 string.
+ *
+ * Errors if the string is not a valid BCP-47 time zone ID.
+ *
+ * See the [Rust documentation for `get`](https://docs.rs/icu/latest/icu/timezone/struct.IanaToBcp47MapperBorrowed.html#method.get) for more information.
+ */
+ diplomat::result<std::monostate, ICU4XError> try_set_iana_time_zone_id(const ICU4XIanaToBcp47Mapper& mapper, const std::string_view id);
+
+ /**
+ * Clears the `time_zone_id` field.
+ *
+ * See the [Rust documentation for `time_zone_id`](https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.time_zone_id) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/timezone/struct.TimeZoneBcp47Id.html)
+ */
+ void clear_time_zone_id();
+
+ /**
+ * Writes the value of the `time_zone_id` field as a string.
+ *
+ * Errors if the `time_zone_id` field is empty.
+ *
+ * See the [Rust documentation for `time_zone_id`](https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.time_zone_id) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/timezone/struct.TimeZoneBcp47Id.html)
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> time_zone_id_to_writeable(W& write) const;
+
+ /**
+ * Writes the value of the `time_zone_id` field as a string.
+ *
+ * Errors if the `time_zone_id` field is empty.
+ *
+ * See the [Rust documentation for `time_zone_id`](https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.time_zone_id) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/timezone/struct.TimeZoneBcp47Id.html)
+ */
+ diplomat::result<std::string, ICU4XError> time_zone_id() const;
+
+ /**
+ * Sets the `metazone_id` field from a string.
+ *
+ * Errors if the string is not a valid BCP-47 metazone ID.
+ *
+ * See the [Rust documentation for `metazone_id`](https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.metazone_id) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/timezone/struct.MetazoneId.html)
+ */
+ diplomat::result<std::monostate, ICU4XError> try_set_metazone_id(const std::string_view id);
+
+ /**
+ * Clears the `metazone_id` field.
+ *
+ * See the [Rust documentation for `metazone_id`](https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.metazone_id) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/timezone/struct.MetazoneId.html)
+ */
+ void clear_metazone_id();
+
+ /**
+ * Writes the value of the `metazone_id` field as a string.
+ *
+ * Errors if the `metazone_id` field is empty.
+ *
+ * See the [Rust documentation for `metazone_id`](https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.metazone_id) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/timezone/struct.MetazoneId.html)
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> metazone_id_to_writeable(W& write) const;
+
+ /**
+ * Writes the value of the `metazone_id` field as a string.
+ *
+ * Errors if the `metazone_id` field is empty.
+ *
+ * See the [Rust documentation for `metazone_id`](https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.metazone_id) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/timezone/struct.MetazoneId.html)
+ */
+ diplomat::result<std::string, ICU4XError> metazone_id() const;
+
+ /**
+ * Sets the `zone_variant` field from a string.
+ *
+ * Errors if the string is not a valid zone variant.
+ *
+ * See the [Rust documentation for `zone_variant`](https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.zone_variant) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/timezone/struct.ZoneVariant.html)
+ */
+ diplomat::result<std::monostate, ICU4XError> try_set_zone_variant(const std::string_view id);
+
+ /**
+ * Clears the `zone_variant` field.
+ *
+ * See the [Rust documentation for `zone_variant`](https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.zone_variant) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/timezone/struct.ZoneVariant.html)
+ */
+ void clear_zone_variant();
+
+ /**
+ * Writes the value of the `zone_variant` field as a string.
+ *
+ * Errors if the `zone_variant` field is empty.
+ *
+ * See the [Rust documentation for `zone_variant`](https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.zone_variant) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/timezone/struct.ZoneVariant.html)
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> zone_variant_to_writeable(W& write) const;
+
+ /**
+ * Writes the value of the `zone_variant` field as a string.
+ *
+ * Errors if the `zone_variant` field is empty.
+ *
+ * See the [Rust documentation for `zone_variant`](https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.zone_variant) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/timezone/struct.ZoneVariant.html)
+ */
+ diplomat::result<std::string, ICU4XError> zone_variant() const;
+
+ /**
+ * Sets the `zone_variant` field to standard time.
+ *
+ * See the [Rust documentation for `standard`](https://docs.rs/icu/latest/icu/timezone/struct.ZoneVariant.html#method.standard) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.zone_variant)
+ */
+ void set_standard_time();
+
+ /**
+ * Sets the `zone_variant` field to daylight time.
+ *
+ * See the [Rust documentation for `daylight`](https://docs.rs/icu/latest/icu/timezone/struct.ZoneVariant.html#method.daylight) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.zone_variant)
+ */
+ void set_daylight_time();
+
+ /**
+ * Returns whether the `zone_variant` field is standard time.
+ *
+ * Errors if the `zone_variant` field is empty.
+ *
+ * See the [Rust documentation for `standard`](https://docs.rs/icu/latest/icu/timezone/struct.ZoneVariant.html#method.standard) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.zone_variant)
+ */
+ diplomat::result<bool, ICU4XError> is_standard_time() const;
+
+ /**
+ * Returns whether the `zone_variant` field is daylight time.
+ *
+ * Errors if the `zone_variant` field is empty.
+ *
+ * See the [Rust documentation for `daylight`](https://docs.rs/icu/latest/icu/timezone/struct.ZoneVariant.html#method.daylight) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#structfield.zone_variant)
+ */
+ diplomat::result<bool, ICU4XError> is_daylight_time() const;
+
+ /**
+ * Sets the metazone based on the time zone and the local timestamp.
+ *
+ * See the [Rust documentation for `maybe_calculate_metazone`](https://docs.rs/icu/latest/icu/timezone/struct.CustomTimeZone.html#method.maybe_calculate_metazone) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/timezone/struct.MetazoneCalculator.html#method.compute_metazone_from_time_zone)
+ */
+ void maybe_calculate_metazone(const ICU4XMetazoneCalculator& metazone_calculator, const ICU4XIsoDateTime& local_datetime);
+ inline const capi::ICU4XCustomTimeZone* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XCustomTimeZone* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XCustomTimeZone(capi::ICU4XCustomTimeZone* i) : inner(i) {}
+ ICU4XCustomTimeZone() = default;
+ ICU4XCustomTimeZone(ICU4XCustomTimeZone&&) noexcept = default;
+ ICU4XCustomTimeZone& operator=(ICU4XCustomTimeZone&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XCustomTimeZone, ICU4XCustomTimeZoneDeleter> inner;
+};
+
+#include "ICU4XIanaToBcp47Mapper.hpp"
+#include "ICU4XMetazoneCalculator.hpp"
+#include "ICU4XIsoDateTime.hpp"
+
+inline diplomat::result<ICU4XCustomTimeZone, ICU4XError> ICU4XCustomTimeZone::create_from_string(const std::string_view s) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCustomTimeZone_create_from_string(s.data(), s.size());
+ diplomat::result<ICU4XCustomTimeZone, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XCustomTimeZone>(ICU4XCustomTimeZone(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XCustomTimeZone ICU4XCustomTimeZone::create_empty() {
+ return ICU4XCustomTimeZone(capi::ICU4XCustomTimeZone_create_empty());
+}
+inline ICU4XCustomTimeZone ICU4XCustomTimeZone::create_utc() {
+ return ICU4XCustomTimeZone(capi::ICU4XCustomTimeZone_create_utc());
+}
+inline diplomat::result<std::monostate, ICU4XError> ICU4XCustomTimeZone::try_set_gmt_offset_seconds(int32_t offset_seconds) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCustomTimeZone_try_set_gmt_offset_seconds(this->inner.get(), offset_seconds);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline void ICU4XCustomTimeZone::clear_gmt_offset() {
+ capi::ICU4XCustomTimeZone_clear_gmt_offset(this->inner.get());
+}
+inline diplomat::result<int32_t, ICU4XError> ICU4XCustomTimeZone::gmt_offset_seconds() const {
+ auto diplomat_result_raw_out_value = capi::ICU4XCustomTimeZone_gmt_offset_seconds(this->inner.get());
+ diplomat::result<int32_t, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<int32_t>(diplomat_result_raw_out_value.ok);
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<bool, ICU4XError> ICU4XCustomTimeZone::is_gmt_offset_positive() const {
+ auto diplomat_result_raw_out_value = capi::ICU4XCustomTimeZone_is_gmt_offset_positive(this->inner.get());
+ diplomat::result<bool, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<bool>(diplomat_result_raw_out_value.ok);
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<bool, ICU4XError> ICU4XCustomTimeZone::is_gmt_offset_zero() const {
+ auto diplomat_result_raw_out_value = capi::ICU4XCustomTimeZone_is_gmt_offset_zero(this->inner.get());
+ diplomat::result<bool, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<bool>(diplomat_result_raw_out_value.ok);
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<bool, ICU4XError> ICU4XCustomTimeZone::gmt_offset_has_minutes() const {
+ auto diplomat_result_raw_out_value = capi::ICU4XCustomTimeZone_gmt_offset_has_minutes(this->inner.get());
+ diplomat::result<bool, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<bool>(diplomat_result_raw_out_value.ok);
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<bool, ICU4XError> ICU4XCustomTimeZone::gmt_offset_has_seconds() const {
+ auto diplomat_result_raw_out_value = capi::ICU4XCustomTimeZone_gmt_offset_has_seconds(this->inner.get());
+ diplomat::result<bool, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<bool>(diplomat_result_raw_out_value.ok);
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::monostate, ICU4XError> ICU4XCustomTimeZone::try_set_time_zone_id(const std::string_view id) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCustomTimeZone_try_set_time_zone_id(this->inner.get(), id.data(), id.size());
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::monostate, ICU4XError> ICU4XCustomTimeZone::try_set_iana_time_zone_id(const ICU4XIanaToBcp47Mapper& mapper, const std::string_view id) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCustomTimeZone_try_set_iana_time_zone_id(this->inner.get(), mapper.AsFFI(), id.data(), id.size());
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline void ICU4XCustomTimeZone::clear_time_zone_id() {
+ capi::ICU4XCustomTimeZone_clear_time_zone_id(this->inner.get());
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XCustomTimeZone::time_zone_id_to_writeable(W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XCustomTimeZone_time_zone_id(this->inner.get(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XCustomTimeZone::time_zone_id() const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XCustomTimeZone_time_zone_id(this->inner.get(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+inline diplomat::result<std::monostate, ICU4XError> ICU4XCustomTimeZone::try_set_metazone_id(const std::string_view id) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCustomTimeZone_try_set_metazone_id(this->inner.get(), id.data(), id.size());
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline void ICU4XCustomTimeZone::clear_metazone_id() {
+ capi::ICU4XCustomTimeZone_clear_metazone_id(this->inner.get());
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XCustomTimeZone::metazone_id_to_writeable(W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XCustomTimeZone_metazone_id(this->inner.get(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XCustomTimeZone::metazone_id() const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XCustomTimeZone_metazone_id(this->inner.get(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+inline diplomat::result<std::monostate, ICU4XError> ICU4XCustomTimeZone::try_set_zone_variant(const std::string_view id) {
+ auto diplomat_result_raw_out_value = capi::ICU4XCustomTimeZone_try_set_zone_variant(this->inner.get(), id.data(), id.size());
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline void ICU4XCustomTimeZone::clear_zone_variant() {
+ capi::ICU4XCustomTimeZone_clear_zone_variant(this->inner.get());
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XCustomTimeZone::zone_variant_to_writeable(W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XCustomTimeZone_zone_variant(this->inner.get(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XCustomTimeZone::zone_variant() const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XCustomTimeZone_zone_variant(this->inner.get(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+inline void ICU4XCustomTimeZone::set_standard_time() {
+ capi::ICU4XCustomTimeZone_set_standard_time(this->inner.get());
+}
+inline void ICU4XCustomTimeZone::set_daylight_time() {
+ capi::ICU4XCustomTimeZone_set_daylight_time(this->inner.get());
+}
+inline diplomat::result<bool, ICU4XError> ICU4XCustomTimeZone::is_standard_time() const {
+ auto diplomat_result_raw_out_value = capi::ICU4XCustomTimeZone_is_standard_time(this->inner.get());
+ diplomat::result<bool, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<bool>(diplomat_result_raw_out_value.ok);
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<bool, ICU4XError> ICU4XCustomTimeZone::is_daylight_time() const {
+ auto diplomat_result_raw_out_value = capi::ICU4XCustomTimeZone_is_daylight_time(this->inner.get());
+ diplomat::result<bool, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<bool>(diplomat_result_raw_out_value.ok);
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline void ICU4XCustomTimeZone::maybe_calculate_metazone(const ICU4XMetazoneCalculator& metazone_calculator, const ICU4XIsoDateTime& local_datetime) {
+ capi::ICU4XCustomTimeZone_maybe_calculate_metazone(this->inner.get(), metazone_calculator.AsFFI(), local_datetime.AsFFI());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDataProvider.h b/intl/icu_capi/cpp/include/ICU4XDataProvider.h
new file mode 100644
index 0000000000..8d7700e224
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDataProvider.h
@@ -0,0 +1,48 @@
+#ifndef ICU4XDataProvider_H
+#define ICU4XDataProvider_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XDataProvider ICU4XDataProvider;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "diplomat_result_box_ICU4XDataProvider_ICU4XError.h"
+#include "diplomat_result_void_ICU4XError.h"
+#include "ICU4XLocaleFallbacker.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+ICU4XDataProvider* ICU4XDataProvider_create_compiled();
+
+diplomat_result_box_ICU4XDataProvider_ICU4XError ICU4XDataProvider_create_fs(const char* path_data, size_t path_len);
+
+ICU4XDataProvider* ICU4XDataProvider_create_test();
+
+diplomat_result_box_ICU4XDataProvider_ICU4XError ICU4XDataProvider_create_from_byte_slice(const uint8_t* blob_data, size_t blob_len);
+
+ICU4XDataProvider* ICU4XDataProvider_create_empty();
+
+diplomat_result_void_ICU4XError ICU4XDataProvider_fork_by_key(ICU4XDataProvider* self, ICU4XDataProvider* other);
+
+diplomat_result_void_ICU4XError ICU4XDataProvider_fork_by_locale(ICU4XDataProvider* self, ICU4XDataProvider* other);
+
+diplomat_result_void_ICU4XError ICU4XDataProvider_enable_locale_fallback(ICU4XDataProvider* self);
+
+diplomat_result_void_ICU4XError ICU4XDataProvider_enable_locale_fallback_with(ICU4XDataProvider* self, const ICU4XLocaleFallbacker* fallbacker);
+void ICU4XDataProvider_destroy(ICU4XDataProvider* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDataProvider.hpp b/intl/icu_capi/cpp/include/ICU4XDataProvider.hpp
new file mode 100644
index 0000000000..b007076aca
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDataProvider.hpp
@@ -0,0 +1,196 @@
+#ifndef ICU4XDataProvider_HPP
+#define ICU4XDataProvider_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XDataProvider.h"
+
+class ICU4XDataProvider;
+#include "ICU4XError.hpp"
+class ICU4XLocaleFallbacker;
+
+/**
+ * A destruction policy for using ICU4XDataProvider with std::unique_ptr.
+ */
+struct ICU4XDataProviderDeleter {
+ void operator()(capi::ICU4XDataProvider* l) const noexcept {
+ capi::ICU4XDataProvider_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X data provider, capable of loading ICU4X data keys from some source.
+ *
+ * See the [Rust documentation for `icu_provider`](https://docs.rs/icu_provider/latest/icu_provider/index.html) for more information.
+ */
+class ICU4XDataProvider {
+ public:
+
+ /**
+ * Constructs an [`ICU4XDataProvider`] that uses compiled data.
+ *
+ * Requires the `compiled_data` feature.
+ *
+ * This provider cannot be modified or combined with other providers, so `enable_fallback`,
+ * `enabled_fallback_with`, `fork_by_locale`, and `fork_by_key` will return `Err`s.
+ */
+ static ICU4XDataProvider create_compiled();
+
+ /**
+ * Constructs an `FsDataProvider` and returns it as an [`ICU4XDataProvider`].
+ * Requires the `provider_fs` Cargo feature.
+ * Not supported in WASM.
+ *
+ * See the [Rust documentation for `FsDataProvider`](https://docs.rs/icu_provider_fs/latest/icu_provider_fs/struct.FsDataProvider.html) for more information.
+ */
+ static diplomat::result<ICU4XDataProvider, ICU4XError> create_fs(const std::string_view path);
+
+ /**
+ * Deprecated
+ *
+ * Use `create_compiled()`.
+ */
+ static ICU4XDataProvider create_test();
+
+ /**
+ * Constructs a `BlobDataProvider` and returns it as an [`ICU4XDataProvider`].
+ *
+ * See the [Rust documentation for `BlobDataProvider`](https://docs.rs/icu_provider_blob/latest/icu_provider_blob/struct.BlobDataProvider.html) for more information.
+ *
+ * Lifetimes: `blob` must live for the duration of the program.
+ */
+ static diplomat::result<ICU4XDataProvider, ICU4XError> create_from_byte_slice(const diplomat::span<const uint8_t> blob);
+
+ /**
+ * Constructs an empty [`ICU4XDataProvider`].
+ *
+ * See the [Rust documentation for `EmptyDataProvider`](https://docs.rs/icu_provider_adapters/latest/icu_provider_adapters/empty/struct.EmptyDataProvider.html) for more information.
+ */
+ static ICU4XDataProvider create_empty();
+
+ /**
+ * Creates a provider that tries the current provider and then, if the current provider
+ * doesn't support the data key, another provider `other`.
+ *
+ * This takes ownership of the `other` provider, leaving an empty provider in its place.
+ *
+ * The providers must be the same type (Any or Buffer). This condition is satisfied if
+ * both providers originate from the same constructor, such as `create_from_byte_slice`
+ * or `create_fs`. If the condition is not upheld, a runtime error occurs.
+ *
+ * See the [Rust documentation for `ForkByKeyProvider`](https://docs.rs/icu_provider_adapters/latest/icu_provider_adapters/fork/type.ForkByKeyProvider.html) for more information.
+ */
+ diplomat::result<std::monostate, ICU4XError> fork_by_key(ICU4XDataProvider& other);
+
+ /**
+ * Same as `fork_by_key` but forks by locale instead of key.
+ *
+ * See the [Rust documentation for `MissingLocalePredicate`](https://docs.rs/icu_provider_adapters/latest/icu_provider_adapters/fork/predicates/struct.MissingLocalePredicate.html) for more information.
+ */
+ diplomat::result<std::monostate, ICU4XError> fork_by_locale(ICU4XDataProvider& other);
+
+ /**
+ * Enables locale fallbacking for data requests made to this provider.
+ *
+ * Note that the test provider (from `create_test`) already has fallbacking enabled.
+ *
+ * See the [Rust documentation for `try_new`](https://docs.rs/icu_provider_adapters/latest/icu_provider_adapters/fallback/struct.LocaleFallbackProvider.html#method.try_new) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu_provider_adapters/latest/icu_provider_adapters/fallback/struct.LocaleFallbackProvider.html)
+ */
+ diplomat::result<std::monostate, ICU4XError> enable_locale_fallback();
+
+ /**
+ * See the [Rust documentation for `new_with_fallbacker`](https://docs.rs/icu_provider_adapters/latest/icu_provider_adapters/fallback/struct.LocaleFallbackProvider.html#method.new_with_fallbacker) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu_provider_adapters/latest/icu_provider_adapters/fallback/struct.LocaleFallbackProvider.html)
+ */
+ diplomat::result<std::monostate, ICU4XError> enable_locale_fallback_with(const ICU4XLocaleFallbacker& fallbacker);
+ inline const capi::ICU4XDataProvider* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XDataProvider* AsFFIMut() { return this->inner.get(); }
+ inline explicit ICU4XDataProvider(capi::ICU4XDataProvider* i) : inner(i) {}
+ ICU4XDataProvider() = default;
+ ICU4XDataProvider(ICU4XDataProvider&&) noexcept = default;
+ ICU4XDataProvider& operator=(ICU4XDataProvider&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XDataProvider, ICU4XDataProviderDeleter> inner;
+};
+
+#include "ICU4XLocaleFallbacker.hpp"
+
+inline ICU4XDataProvider ICU4XDataProvider::create_compiled() {
+ return ICU4XDataProvider(capi::ICU4XDataProvider_create_compiled());
+}
+inline diplomat::result<ICU4XDataProvider, ICU4XError> ICU4XDataProvider::create_fs(const std::string_view path) {
+ auto diplomat_result_raw_out_value = capi::ICU4XDataProvider_create_fs(path.data(), path.size());
+ diplomat::result<ICU4XDataProvider, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XDataProvider>(ICU4XDataProvider(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XDataProvider ICU4XDataProvider::create_test() {
+ return ICU4XDataProvider(capi::ICU4XDataProvider_create_test());
+}
+inline diplomat::result<ICU4XDataProvider, ICU4XError> ICU4XDataProvider::create_from_byte_slice(const diplomat::span<const uint8_t> blob) {
+ auto diplomat_result_raw_out_value = capi::ICU4XDataProvider_create_from_byte_slice(blob.data(), blob.size());
+ diplomat::result<ICU4XDataProvider, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XDataProvider>(ICU4XDataProvider(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XDataProvider ICU4XDataProvider::create_empty() {
+ return ICU4XDataProvider(capi::ICU4XDataProvider_create_empty());
+}
+inline diplomat::result<std::monostate, ICU4XError> ICU4XDataProvider::fork_by_key(ICU4XDataProvider& other) {
+ auto diplomat_result_raw_out_value = capi::ICU4XDataProvider_fork_by_key(this->inner.get(), other.AsFFIMut());
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::monostate, ICU4XError> ICU4XDataProvider::fork_by_locale(ICU4XDataProvider& other) {
+ auto diplomat_result_raw_out_value = capi::ICU4XDataProvider_fork_by_locale(this->inner.get(), other.AsFFIMut());
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::monostate, ICU4XError> ICU4XDataProvider::enable_locale_fallback() {
+ auto diplomat_result_raw_out_value = capi::ICU4XDataProvider_enable_locale_fallback(this->inner.get());
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::monostate, ICU4XError> ICU4XDataProvider::enable_locale_fallback_with(const ICU4XLocaleFallbacker& fallbacker) {
+ auto diplomat_result_raw_out_value = capi::ICU4XDataProvider_enable_locale_fallback_with(this->inner.get(), fallbacker.AsFFI());
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDataStruct.h b/intl/icu_capi/cpp/include/ICU4XDataStruct.h
new file mode 100644
index 0000000000..a07ff02fb8
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDataStruct.h
@@ -0,0 +1,30 @@
+#ifndef ICU4XDataStruct_H
+#define ICU4XDataStruct_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XDataStruct ICU4XDataStruct;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "diplomat_result_box_ICU4XDataStruct_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XDataStruct_ICU4XError ICU4XDataStruct_create_decimal_symbols_v1(const char* plus_sign_prefix_data, size_t plus_sign_prefix_len, const char* plus_sign_suffix_data, size_t plus_sign_suffix_len, const char* minus_sign_prefix_data, size_t minus_sign_prefix_len, const char* minus_sign_suffix_data, size_t minus_sign_suffix_len, const char* decimal_separator_data, size_t decimal_separator_len, const char* grouping_separator_data, size_t grouping_separator_len, uint8_t primary_group_size, uint8_t secondary_group_size, uint8_t min_group_size, const char32_t* digits_data, size_t digits_len);
+void ICU4XDataStruct_destroy(ICU4XDataStruct* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDataStruct.hpp b/intl/icu_capi/cpp/include/ICU4XDataStruct.hpp
new file mode 100644
index 0000000000..877de4400a
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDataStruct.hpp
@@ -0,0 +1,63 @@
+#ifndef ICU4XDataStruct_HPP
+#define ICU4XDataStruct_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XDataStruct.h"
+
+class ICU4XDataStruct;
+#include "ICU4XError.hpp"
+
+/**
+ * A destruction policy for using ICU4XDataStruct with std::unique_ptr.
+ */
+struct ICU4XDataStructDeleter {
+ void operator()(capi::ICU4XDataStruct* l) const noexcept {
+ capi::ICU4XDataStruct_destroy(l);
+ }
+};
+
+/**
+ * A generic data struct to be used by ICU4X
+ *
+ * This can be used to construct a StructDataProvider.
+ */
+class ICU4XDataStruct {
+ public:
+
+ /**
+ * Construct a new DecimalSymbolsV1 data struct.
+ *
+ * C++ users: All string arguments must be valid UTF8
+ *
+ * See the [Rust documentation for `DecimalSymbolsV1`](https://docs.rs/icu/latest/icu/decimal/provider/struct.DecimalSymbolsV1.html) for more information.
+ */
+ static diplomat::result<ICU4XDataStruct, ICU4XError> create_decimal_symbols_v1(const std::string_view plus_sign_prefix, const std::string_view plus_sign_suffix, const std::string_view minus_sign_prefix, const std::string_view minus_sign_suffix, const std::string_view decimal_separator, const std::string_view grouping_separator, uint8_t primary_group_size, uint8_t secondary_group_size, uint8_t min_group_size, const diplomat::span<const char32_t> digits);
+ inline const capi::ICU4XDataStruct* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XDataStruct* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XDataStruct(capi::ICU4XDataStruct* i) : inner(i) {}
+ ICU4XDataStruct() = default;
+ ICU4XDataStruct(ICU4XDataStruct&&) noexcept = default;
+ ICU4XDataStruct& operator=(ICU4XDataStruct&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XDataStruct, ICU4XDataStructDeleter> inner;
+};
+
+
+inline diplomat::result<ICU4XDataStruct, ICU4XError> ICU4XDataStruct::create_decimal_symbols_v1(const std::string_view plus_sign_prefix, const std::string_view plus_sign_suffix, const std::string_view minus_sign_prefix, const std::string_view minus_sign_suffix, const std::string_view decimal_separator, const std::string_view grouping_separator, uint8_t primary_group_size, uint8_t secondary_group_size, uint8_t min_group_size, const diplomat::span<const char32_t> digits) {
+ auto diplomat_result_raw_out_value = capi::ICU4XDataStruct_create_decimal_symbols_v1(plus_sign_prefix.data(), plus_sign_prefix.size(), plus_sign_suffix.data(), plus_sign_suffix.size(), minus_sign_prefix.data(), minus_sign_prefix.size(), minus_sign_suffix.data(), minus_sign_suffix.size(), decimal_separator.data(), decimal_separator.size(), grouping_separator.data(), grouping_separator.size(), primary_group_size, secondary_group_size, min_group_size, digits.data(), digits.size());
+ diplomat::result<ICU4XDataStruct, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XDataStruct>(ICU4XDataStruct(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDate.h b/intl/icu_capi/cpp/include/ICU4XDate.h
new file mode 100644
index 0000000000..f5a0c06de6
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDate.h
@@ -0,0 +1,66 @@
+#ifndef ICU4XDate_H
+#define ICU4XDate_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XDate ICU4XDate;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XCalendar.h"
+#include "diplomat_result_box_ICU4XDate_ICU4XError.h"
+#include "ICU4XIsoDate.h"
+#include "ICU4XIsoWeekday.h"
+#include "ICU4XWeekCalculator.h"
+#include "diplomat_result_ICU4XWeekOf_ICU4XError.h"
+#include "diplomat_result_void_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XDate_ICU4XError ICU4XDate_create_from_iso_in_calendar(int32_t year, uint8_t month, uint8_t day, const ICU4XCalendar* calendar);
+
+diplomat_result_box_ICU4XDate_ICU4XError ICU4XDate_create_from_codes_in_calendar(const char* era_code_data, size_t era_code_len, int32_t year, const char* month_code_data, size_t month_code_len, uint8_t day, const ICU4XCalendar* calendar);
+
+ICU4XDate* ICU4XDate_to_calendar(const ICU4XDate* self, const ICU4XCalendar* calendar);
+
+ICU4XIsoDate* ICU4XDate_to_iso(const ICU4XDate* self);
+
+uint32_t ICU4XDate_day_of_month(const ICU4XDate* self);
+
+ICU4XIsoWeekday ICU4XDate_day_of_week(const ICU4XDate* self);
+
+uint32_t ICU4XDate_week_of_month(const ICU4XDate* self, ICU4XIsoWeekday first_weekday);
+
+diplomat_result_ICU4XWeekOf_ICU4XError ICU4XDate_week_of_year(const ICU4XDate* self, const ICU4XWeekCalculator* calculator);
+
+uint32_t ICU4XDate_ordinal_month(const ICU4XDate* self);
+
+diplomat_result_void_ICU4XError ICU4XDate_month_code(const ICU4XDate* self, DiplomatWriteable* write);
+
+int32_t ICU4XDate_year_in_era(const ICU4XDate* self);
+
+diplomat_result_void_ICU4XError ICU4XDate_era(const ICU4XDate* self, DiplomatWriteable* write);
+
+uint8_t ICU4XDate_months_in_year(const ICU4XDate* self);
+
+uint8_t ICU4XDate_days_in_month(const ICU4XDate* self);
+
+uint16_t ICU4XDate_days_in_year(const ICU4XDate* self);
+
+ICU4XCalendar* ICU4XDate_calendar(const ICU4XDate* self);
+void ICU4XDate_destroy(ICU4XDate* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDate.hpp b/intl/icu_capi/cpp/include/ICU4XDate.hpp
new file mode 100644
index 0000000000..ef23cc31a8
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDate.hpp
@@ -0,0 +1,303 @@
+#ifndef ICU4XDate_HPP
+#define ICU4XDate_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XDate.h"
+
+class ICU4XCalendar;
+class ICU4XDate;
+#include "ICU4XError.hpp"
+class ICU4XIsoDate;
+#include "ICU4XIsoWeekday.hpp"
+class ICU4XWeekCalculator;
+struct ICU4XWeekOf;
+
+/**
+ * A destruction policy for using ICU4XDate with std::unique_ptr.
+ */
+struct ICU4XDateDeleter {
+ void operator()(capi::ICU4XDate* l) const noexcept {
+ capi::ICU4XDate_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X Date object capable of containing a date and time for any calendar.
+ *
+ * See the [Rust documentation for `Date`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html) for more information.
+ */
+class ICU4XDate {
+ public:
+
+ /**
+ * Creates a new [`ICU4XDate`] representing the ISO date and time
+ * given but in a given calendar
+ *
+ * See the [Rust documentation for `new_from_iso`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.new_from_iso) for more information.
+ */
+ static diplomat::result<ICU4XDate, ICU4XError> create_from_iso_in_calendar(int32_t year, uint8_t month, uint8_t day, const ICU4XCalendar& calendar);
+
+ /**
+ * Creates a new [`ICU4XDate`] from the given codes, which are interpreted in the given calendar system
+ *
+ * See the [Rust documentation for `try_new_from_codes`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.try_new_from_codes) for more information.
+ */
+ static diplomat::result<ICU4XDate, ICU4XError> create_from_codes_in_calendar(const std::string_view era_code, int32_t year, const std::string_view month_code, uint8_t day, const ICU4XCalendar& calendar);
+
+ /**
+ * Convert this date to one in a different calendar
+ *
+ * See the [Rust documentation for `to_calendar`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.to_calendar) for more information.
+ */
+ ICU4XDate to_calendar(const ICU4XCalendar& calendar) const;
+
+ /**
+ * Converts this date to ISO
+ *
+ * See the [Rust documentation for `to_iso`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.to_iso) for more information.
+ */
+ ICU4XIsoDate to_iso() const;
+
+ /**
+ * Returns the 1-indexed day in the month for this date
+ *
+ * See the [Rust documentation for `day_of_month`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.day_of_month) for more information.
+ */
+ uint32_t day_of_month() const;
+
+ /**
+ * Returns the day in the week for this day
+ *
+ * See the [Rust documentation for `day_of_week`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.day_of_week) for more information.
+ */
+ ICU4XIsoWeekday day_of_week() const;
+
+ /**
+ * Returns the week number in this month, 1-indexed, based on what
+ * is considered the first day of the week (often a locale preference).
+ *
+ * `first_weekday` can be obtained via `first_weekday()` on [`ICU4XWeekCalculator`]
+ *
+ * See the [Rust documentation for `week_of_month`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.week_of_month) for more information.
+ */
+ uint32_t week_of_month(ICU4XIsoWeekday first_weekday) const;
+
+ /**
+ * Returns the week number in this year, using week data
+ *
+ * See the [Rust documentation for `week_of_year`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.week_of_year) for more information.
+ */
+ diplomat::result<ICU4XWeekOf, ICU4XError> week_of_year(const ICU4XWeekCalculator& calculator) const;
+
+ /**
+ * Returns 1-indexed number of the month of this date in its year
+ *
+ * Note that for lunar calendars this may not lead to the same month
+ * having the same ordinal month across years; use month_code if you care
+ * about month identity.
+ *
+ * See the [Rust documentation for `month`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.month) for more information.
+ */
+ uint32_t ordinal_month() const;
+
+ /**
+ * Returns the month code for this date. Typically something
+ * like "M01", "M02", but can be more complicated for lunar calendars.
+ *
+ * See the [Rust documentation for `month`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.month) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> month_code_to_writeable(W& write) const;
+
+ /**
+ * Returns the month code for this date. Typically something
+ * like "M01", "M02", but can be more complicated for lunar calendars.
+ *
+ * See the [Rust documentation for `month`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.month) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> month_code() const;
+
+ /**
+ * Returns the year number in the current era for this date
+ *
+ * See the [Rust documentation for `year`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.year) for more information.
+ */
+ int32_t year_in_era() const;
+
+ /**
+ * Returns the era for this date,
+ *
+ * See the [Rust documentation for `year`](https://docs.rs/icu/latest/icu/struct.Date.html#method.year) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/types/struct.Era.html)
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> era_to_writeable(W& write) const;
+
+ /**
+ * Returns the era for this date,
+ *
+ * See the [Rust documentation for `year`](https://docs.rs/icu/latest/icu/struct.Date.html#method.year) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/types/struct.Era.html)
+ */
+ diplomat::result<std::string, ICU4XError> era() const;
+
+ /**
+ * Returns the number of months in the year represented by this date
+ *
+ * See the [Rust documentation for `months_in_year`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.months_in_year) for more information.
+ */
+ uint8_t months_in_year() const;
+
+ /**
+ * Returns the number of days in the month represented by this date
+ *
+ * See the [Rust documentation for `days_in_month`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.days_in_month) for more information.
+ */
+ uint8_t days_in_month() const;
+
+ /**
+ * Returns the number of days in the year represented by this date
+ *
+ * See the [Rust documentation for `days_in_year`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.days_in_year) for more information.
+ */
+ uint16_t days_in_year() const;
+
+ /**
+ * Returns the [`ICU4XCalendar`] object backing this date
+ *
+ * See the [Rust documentation for `calendar`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.calendar) for more information.
+ */
+ ICU4XCalendar calendar() const;
+ inline const capi::ICU4XDate* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XDate* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XDate(capi::ICU4XDate* i) : inner(i) {}
+ ICU4XDate() = default;
+ ICU4XDate(ICU4XDate&&) noexcept = default;
+ ICU4XDate& operator=(ICU4XDate&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XDate, ICU4XDateDeleter> inner;
+};
+
+#include "ICU4XCalendar.hpp"
+#include "ICU4XIsoDate.hpp"
+#include "ICU4XWeekCalculator.hpp"
+#include "ICU4XWeekOf.hpp"
+
+inline diplomat::result<ICU4XDate, ICU4XError> ICU4XDate::create_from_iso_in_calendar(int32_t year, uint8_t month, uint8_t day, const ICU4XCalendar& calendar) {
+ auto diplomat_result_raw_out_value = capi::ICU4XDate_create_from_iso_in_calendar(year, month, day, calendar.AsFFI());
+ diplomat::result<ICU4XDate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XDate>(ICU4XDate(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XDate, ICU4XError> ICU4XDate::create_from_codes_in_calendar(const std::string_view era_code, int32_t year, const std::string_view month_code, uint8_t day, const ICU4XCalendar& calendar) {
+ auto diplomat_result_raw_out_value = capi::ICU4XDate_create_from_codes_in_calendar(era_code.data(), era_code.size(), year, month_code.data(), month_code.size(), day, calendar.AsFFI());
+ diplomat::result<ICU4XDate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XDate>(ICU4XDate(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XDate ICU4XDate::to_calendar(const ICU4XCalendar& calendar) const {
+ return ICU4XDate(capi::ICU4XDate_to_calendar(this->inner.get(), calendar.AsFFI()));
+}
+inline ICU4XIsoDate ICU4XDate::to_iso() const {
+ return ICU4XIsoDate(capi::ICU4XDate_to_iso(this->inner.get()));
+}
+inline uint32_t ICU4XDate::day_of_month() const {
+ return capi::ICU4XDate_day_of_month(this->inner.get());
+}
+inline ICU4XIsoWeekday ICU4XDate::day_of_week() const {
+ return static_cast<ICU4XIsoWeekday>(capi::ICU4XDate_day_of_week(this->inner.get()));
+}
+inline uint32_t ICU4XDate::week_of_month(ICU4XIsoWeekday first_weekday) const {
+ return capi::ICU4XDate_week_of_month(this->inner.get(), static_cast<capi::ICU4XIsoWeekday>(first_weekday));
+}
+inline diplomat::result<ICU4XWeekOf, ICU4XError> ICU4XDate::week_of_year(const ICU4XWeekCalculator& calculator) const {
+ auto diplomat_result_raw_out_value = capi::ICU4XDate_week_of_year(this->inner.get(), calculator.AsFFI());
+ diplomat::result<ICU4XWeekOf, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ capi::ICU4XWeekOf diplomat_raw_struct_out_value = diplomat_result_raw_out_value.ok;
+ diplomat_result_out_value = diplomat::Ok<ICU4XWeekOf>(ICU4XWeekOf{ .week = std::move(diplomat_raw_struct_out_value.week), .unit = std::move(static_cast<ICU4XWeekRelativeUnit>(diplomat_raw_struct_out_value.unit)) });
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline uint32_t ICU4XDate::ordinal_month() const {
+ return capi::ICU4XDate_ordinal_month(this->inner.get());
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XDate::month_code_to_writeable(W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XDate_month_code(this->inner.get(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XDate::month_code() const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XDate_month_code(this->inner.get(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+inline int32_t ICU4XDate::year_in_era() const {
+ return capi::ICU4XDate_year_in_era(this->inner.get());
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XDate::era_to_writeable(W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XDate_era(this->inner.get(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XDate::era() const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XDate_era(this->inner.get(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+inline uint8_t ICU4XDate::months_in_year() const {
+ return capi::ICU4XDate_months_in_year(this->inner.get());
+}
+inline uint8_t ICU4XDate::days_in_month() const {
+ return capi::ICU4XDate_days_in_month(this->inner.get());
+}
+inline uint16_t ICU4XDate::days_in_year() const {
+ return capi::ICU4XDate_days_in_year(this->inner.get());
+}
+inline ICU4XCalendar ICU4XDate::calendar() const {
+ return ICU4XCalendar(capi::ICU4XDate_calendar(this->inner.get()));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDateFormatter.h b/intl/icu_capi/cpp/include/ICU4XDateFormatter.h
new file mode 100644
index 0000000000..8dc5316e47
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDateFormatter.h
@@ -0,0 +1,46 @@
+#ifndef ICU4XDateFormatter_H
+#define ICU4XDateFormatter_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XDateFormatter ICU4XDateFormatter;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "ICU4XLocale.h"
+#include "ICU4XDateLength.h"
+#include "diplomat_result_box_ICU4XDateFormatter_ICU4XError.h"
+#include "ICU4XDate.h"
+#include "diplomat_result_void_ICU4XError.h"
+#include "ICU4XIsoDate.h"
+#include "ICU4XDateTime.h"
+#include "ICU4XIsoDateTime.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XDateFormatter_ICU4XError ICU4XDateFormatter_create_with_length(const ICU4XDataProvider* provider, const ICU4XLocale* locale, ICU4XDateLength date_length);
+
+diplomat_result_void_ICU4XError ICU4XDateFormatter_format_date(const ICU4XDateFormatter* self, const ICU4XDate* value, DiplomatWriteable* write);
+
+diplomat_result_void_ICU4XError ICU4XDateFormatter_format_iso_date(const ICU4XDateFormatter* self, const ICU4XIsoDate* value, DiplomatWriteable* write);
+
+diplomat_result_void_ICU4XError ICU4XDateFormatter_format_datetime(const ICU4XDateFormatter* self, const ICU4XDateTime* value, DiplomatWriteable* write);
+
+diplomat_result_void_ICU4XError ICU4XDateFormatter_format_iso_datetime(const ICU4XDateFormatter* self, const ICU4XIsoDateTime* value, DiplomatWriteable* write);
+void ICU4XDateFormatter_destroy(ICU4XDateFormatter* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDateFormatter.hpp b/intl/icu_capi/cpp/include/ICU4XDateFormatter.hpp
new file mode 100644
index 0000000000..13525b0cc6
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDateFormatter.hpp
@@ -0,0 +1,231 @@
+#ifndef ICU4XDateFormatter_HPP
+#define ICU4XDateFormatter_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XDateFormatter.h"
+
+class ICU4XDataProvider;
+class ICU4XLocale;
+#include "ICU4XDateLength.hpp"
+class ICU4XDateFormatter;
+#include "ICU4XError.hpp"
+class ICU4XDate;
+class ICU4XIsoDate;
+class ICU4XDateTime;
+class ICU4XIsoDateTime;
+
+/**
+ * A destruction policy for using ICU4XDateFormatter with std::unique_ptr.
+ */
+struct ICU4XDateFormatterDeleter {
+ void operator()(capi::ICU4XDateFormatter* l) const noexcept {
+ capi::ICU4XDateFormatter_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X DateFormatter object capable of formatting a [`ICU4XDate`] as a string,
+ * using some calendar specified at runtime in the locale.
+ *
+ * See the [Rust documentation for `DateFormatter`](https://docs.rs/icu/latest/icu/datetime/struct.DateFormatter.html) for more information.
+ */
+class ICU4XDateFormatter {
+ public:
+
+ /**
+ * Creates a new [`ICU4XDateFormatter`] from locale data.
+ *
+ * See the [Rust documentation for `try_new_with_length`](https://docs.rs/icu/latest/icu/datetime/struct.DateFormatter.html#method.try_new_with_length) for more information.
+ */
+ static diplomat::result<ICU4XDateFormatter, ICU4XError> create_with_length(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength date_length);
+
+ /**
+ * Formats a [`ICU4XDate`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.DateFormatter.html#method.format) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> format_date_to_writeable(const ICU4XDate& value, W& write) const;
+
+ /**
+ * Formats a [`ICU4XDate`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.DateFormatter.html#method.format) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> format_date(const ICU4XDate& value) const;
+
+ /**
+ * Formats a [`ICU4XIsoDate`] to a string.
+ *
+ * Will convert to this formatter's calendar first
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.DateFormatter.html#method.format) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> format_iso_date_to_writeable(const ICU4XIsoDate& value, W& write) const;
+
+ /**
+ * Formats a [`ICU4XIsoDate`] to a string.
+ *
+ * Will convert to this formatter's calendar first
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.DateFormatter.html#method.format) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> format_iso_date(const ICU4XIsoDate& value) const;
+
+ /**
+ * Formats a [`ICU4XDateTime`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.DateFormatter.html#method.format) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> format_datetime_to_writeable(const ICU4XDateTime& value, W& write) const;
+
+ /**
+ * Formats a [`ICU4XDateTime`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.DateFormatter.html#method.format) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> format_datetime(const ICU4XDateTime& value) const;
+
+ /**
+ * Formats a [`ICU4XIsoDateTime`] to a string.
+ *
+ * Will convert to this formatter's calendar first
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.DateFormatter.html#method.format) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> format_iso_datetime_to_writeable(const ICU4XIsoDateTime& value, W& write) const;
+
+ /**
+ * Formats a [`ICU4XIsoDateTime`] to a string.
+ *
+ * Will convert to this formatter's calendar first
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.DateFormatter.html#method.format) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> format_iso_datetime(const ICU4XIsoDateTime& value) const;
+ inline const capi::ICU4XDateFormatter* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XDateFormatter* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XDateFormatter(capi::ICU4XDateFormatter* i) : inner(i) {}
+ ICU4XDateFormatter() = default;
+ ICU4XDateFormatter(ICU4XDateFormatter&&) noexcept = default;
+ ICU4XDateFormatter& operator=(ICU4XDateFormatter&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XDateFormatter, ICU4XDateFormatterDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocale.hpp"
+#include "ICU4XDate.hpp"
+#include "ICU4XIsoDate.hpp"
+#include "ICU4XDateTime.hpp"
+#include "ICU4XIsoDateTime.hpp"
+
+inline diplomat::result<ICU4XDateFormatter, ICU4XError> ICU4XDateFormatter::create_with_length(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength date_length) {
+ auto diplomat_result_raw_out_value = capi::ICU4XDateFormatter_create_with_length(provider.AsFFI(), locale.AsFFI(), static_cast<capi::ICU4XDateLength>(date_length));
+ diplomat::result<ICU4XDateFormatter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XDateFormatter>(ICU4XDateFormatter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XDateFormatter::format_date_to_writeable(const ICU4XDate& value, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XDateFormatter_format_date(this->inner.get(), value.AsFFI(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XDateFormatter::format_date(const ICU4XDate& value) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XDateFormatter_format_date(this->inner.get(), value.AsFFI(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XDateFormatter::format_iso_date_to_writeable(const ICU4XIsoDate& value, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XDateFormatter_format_iso_date(this->inner.get(), value.AsFFI(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XDateFormatter::format_iso_date(const ICU4XIsoDate& value) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XDateFormatter_format_iso_date(this->inner.get(), value.AsFFI(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XDateFormatter::format_datetime_to_writeable(const ICU4XDateTime& value, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XDateFormatter_format_datetime(this->inner.get(), value.AsFFI(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XDateFormatter::format_datetime(const ICU4XDateTime& value) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XDateFormatter_format_datetime(this->inner.get(), value.AsFFI(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XDateFormatter::format_iso_datetime_to_writeable(const ICU4XIsoDateTime& value, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XDateFormatter_format_iso_datetime(this->inner.get(), value.AsFFI(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XDateFormatter::format_iso_datetime(const ICU4XIsoDateTime& value) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XDateFormatter_format_iso_datetime(this->inner.get(), value.AsFFI(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDateLength.h b/intl/icu_capi/cpp/include/ICU4XDateLength.h
new file mode 100644
index 0000000000..b2ca918233
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDateLength.h
@@ -0,0 +1,33 @@
+#ifndef ICU4XDateLength_H
+#define ICU4XDateLength_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XDateLength {
+ ICU4XDateLength_Full = 0,
+ ICU4XDateLength_Long = 1,
+ ICU4XDateLength_Medium = 2,
+ ICU4XDateLength_Short = 3,
+} ICU4XDateLength;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XDateLength_destroy(ICU4XDateLength* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDateLength.hpp b/intl/icu_capi/cpp/include/ICU4XDateLength.hpp
new file mode 100644
index 0000000000..8e7edd4d64
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDateLength.hpp
@@ -0,0 +1,26 @@
+#ifndef ICU4XDateLength_HPP
+#define ICU4XDateLength_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XDateLength.h"
+
+
+
+/**
+ * See the [Rust documentation for `Date`](https://docs.rs/icu/latest/icu/datetime/options/length/enum.Date.html) for more information.
+ */
+enum struct ICU4XDateLength {
+ Full = 0,
+ Long = 1,
+ Medium = 2,
+ Short = 3,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDateTime.h b/intl/icu_capi/cpp/include/ICU4XDateTime.h
new file mode 100644
index 0000000000..adb0a19798
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDateTime.h
@@ -0,0 +1,82 @@
+#ifndef ICU4XDateTime_H
+#define ICU4XDateTime_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XDateTime ICU4XDateTime;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XCalendar.h"
+#include "diplomat_result_box_ICU4XDateTime_ICU4XError.h"
+#include "ICU4XDate.h"
+#include "ICU4XTime.h"
+#include "ICU4XIsoDateTime.h"
+#include "ICU4XIsoWeekday.h"
+#include "ICU4XWeekCalculator.h"
+#include "diplomat_result_ICU4XWeekOf_ICU4XError.h"
+#include "diplomat_result_void_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XDateTime_ICU4XError ICU4XDateTime_create_from_iso_in_calendar(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond, const ICU4XCalendar* calendar);
+
+diplomat_result_box_ICU4XDateTime_ICU4XError ICU4XDateTime_create_from_codes_in_calendar(const char* era_code_data, size_t era_code_len, int32_t year, const char* month_code_data, size_t month_code_len, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond, const ICU4XCalendar* calendar);
+
+ICU4XDateTime* ICU4XDateTime_create_from_date_and_time(const ICU4XDate* date, const ICU4XTime* time);
+
+ICU4XDate* ICU4XDateTime_date(const ICU4XDateTime* self);
+
+ICU4XTime* ICU4XDateTime_time(const ICU4XDateTime* self);
+
+ICU4XIsoDateTime* ICU4XDateTime_to_iso(const ICU4XDateTime* self);
+
+ICU4XDateTime* ICU4XDateTime_to_calendar(const ICU4XDateTime* self, const ICU4XCalendar* calendar);
+
+uint8_t ICU4XDateTime_hour(const ICU4XDateTime* self);
+
+uint8_t ICU4XDateTime_minute(const ICU4XDateTime* self);
+
+uint8_t ICU4XDateTime_second(const ICU4XDateTime* self);
+
+uint32_t ICU4XDateTime_nanosecond(const ICU4XDateTime* self);
+
+uint32_t ICU4XDateTime_day_of_month(const ICU4XDateTime* self);
+
+ICU4XIsoWeekday ICU4XDateTime_day_of_week(const ICU4XDateTime* self);
+
+uint32_t ICU4XDateTime_week_of_month(const ICU4XDateTime* self, ICU4XIsoWeekday first_weekday);
+
+diplomat_result_ICU4XWeekOf_ICU4XError ICU4XDateTime_week_of_year(const ICU4XDateTime* self, const ICU4XWeekCalculator* calculator);
+
+uint32_t ICU4XDateTime_ordinal_month(const ICU4XDateTime* self);
+
+diplomat_result_void_ICU4XError ICU4XDateTime_month_code(const ICU4XDateTime* self, DiplomatWriteable* write);
+
+int32_t ICU4XDateTime_year_in_era(const ICU4XDateTime* self);
+
+diplomat_result_void_ICU4XError ICU4XDateTime_era(const ICU4XDateTime* self, DiplomatWriteable* write);
+
+uint8_t ICU4XDateTime_months_in_year(const ICU4XDateTime* self);
+
+uint8_t ICU4XDateTime_days_in_month(const ICU4XDateTime* self);
+
+uint16_t ICU4XDateTime_days_in_year(const ICU4XDateTime* self);
+
+ICU4XCalendar* ICU4XDateTime_calendar(const ICU4XDateTime* self);
+void ICU4XDateTime_destroy(ICU4XDateTime* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDateTime.hpp b/intl/icu_capi/cpp/include/ICU4XDateTime.hpp
new file mode 100644
index 0000000000..baf7ca9565
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDateTime.hpp
@@ -0,0 +1,373 @@
+#ifndef ICU4XDateTime_HPP
+#define ICU4XDateTime_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XDateTime.h"
+
+class ICU4XCalendar;
+class ICU4XDateTime;
+#include "ICU4XError.hpp"
+class ICU4XDate;
+class ICU4XTime;
+class ICU4XIsoDateTime;
+#include "ICU4XIsoWeekday.hpp"
+class ICU4XWeekCalculator;
+struct ICU4XWeekOf;
+
+/**
+ * A destruction policy for using ICU4XDateTime with std::unique_ptr.
+ */
+struct ICU4XDateTimeDeleter {
+ void operator()(capi::ICU4XDateTime* l) const noexcept {
+ capi::ICU4XDateTime_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X DateTime object capable of containing a date and time for any calendar.
+ *
+ * See the [Rust documentation for `DateTime`](https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html) for more information.
+ */
+class ICU4XDateTime {
+ public:
+
+ /**
+ * Creates a new [`ICU4XDateTime`] representing the ISO date and time
+ * given but in a given calendar
+ *
+ * See the [Rust documentation for `new_from_iso`](https://docs.rs/icu/latest/icu/struct.DateTime.html#method.new_from_iso) for more information.
+ */
+ static diplomat::result<ICU4XDateTime, ICU4XError> create_from_iso_in_calendar(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond, const ICU4XCalendar& calendar);
+
+ /**
+ * Creates a new [`ICU4XDateTime`] from the given codes, which are interpreted in the given calendar system
+ *
+ * See the [Rust documentation for `try_new_from_codes`](https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.try_new_from_codes) for more information.
+ */
+ static diplomat::result<ICU4XDateTime, ICU4XError> create_from_codes_in_calendar(const std::string_view era_code, int32_t year, const std::string_view month_code, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond, const ICU4XCalendar& calendar);
+
+ /**
+ * Creates a new [`ICU4XDateTime`] from an [`ICU4XDate`] and [`ICU4XTime`] object
+ *
+ * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.new) for more information.
+ */
+ static ICU4XDateTime create_from_date_and_time(const ICU4XDate& date, const ICU4XTime& time);
+
+ /**
+ * Gets a copy of the date contained in this object
+ *
+ * See the [Rust documentation for `date`](https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#structfield.date) for more information.
+ */
+ ICU4XDate date() const;
+
+ /**
+ * Gets the time contained in this object
+ *
+ * See the [Rust documentation for `time`](https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#structfield.time) for more information.
+ */
+ ICU4XTime time() const;
+
+ /**
+ * Converts this date to ISO
+ *
+ * See the [Rust documentation for `to_iso`](https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.to_iso) for more information.
+ */
+ ICU4XIsoDateTime to_iso() const;
+
+ /**
+ * Convert this datetime to one in a different calendar
+ *
+ * See the [Rust documentation for `to_calendar`](https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.to_calendar) for more information.
+ */
+ ICU4XDateTime to_calendar(const ICU4XCalendar& calendar) const;
+
+ /**
+ * Returns the hour in this time
+ *
+ * See the [Rust documentation for `hour`](https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.hour) for more information.
+ */
+ uint8_t hour() const;
+
+ /**
+ * Returns the minute in this time
+ *
+ * See the [Rust documentation for `minute`](https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.minute) for more information.
+ */
+ uint8_t minute() const;
+
+ /**
+ * Returns the second in this time
+ *
+ * See the [Rust documentation for `second`](https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.second) for more information.
+ */
+ uint8_t second() const;
+
+ /**
+ * Returns the nanosecond in this time
+ *
+ * See the [Rust documentation for `nanosecond`](https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.nanosecond) for more information.
+ */
+ uint32_t nanosecond() const;
+
+ /**
+ * Returns the 1-indexed day in the month for this date
+ *
+ * See the [Rust documentation for `day_of_month`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.day_of_month) for more information.
+ */
+ uint32_t day_of_month() const;
+
+ /**
+ * Returns the day in the week for this day
+ *
+ * See the [Rust documentation for `day_of_week`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.day_of_week) for more information.
+ */
+ ICU4XIsoWeekday day_of_week() const;
+
+ /**
+ * Returns the week number in this month, 1-indexed, based on what
+ * is considered the first day of the week (often a locale preference).
+ *
+ * `first_weekday` can be obtained via `first_weekday()` on [`ICU4XWeekCalculator`]
+ *
+ * See the [Rust documentation for `week_of_month`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.week_of_month) for more information.
+ */
+ uint32_t week_of_month(ICU4XIsoWeekday first_weekday) const;
+
+ /**
+ * Returns the week number in this year, using week data
+ *
+ * See the [Rust documentation for `week_of_year`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.week_of_year) for more information.
+ */
+ diplomat::result<ICU4XWeekOf, ICU4XError> week_of_year(const ICU4XWeekCalculator& calculator) const;
+
+ /**
+ * Returns 1-indexed number of the month of this date in its year
+ *
+ * Note that for lunar calendars this may not lead to the same month
+ * having the same ordinal month across years; use month_code if you care
+ * about month identity.
+ *
+ * See the [Rust documentation for `month`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.month) for more information.
+ */
+ uint32_t ordinal_month() const;
+
+ /**
+ * Returns the month code for this date. Typically something
+ * like "M01", "M02", but can be more complicated for lunar calendars.
+ *
+ * See the [Rust documentation for `month`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.month) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> month_code_to_writeable(W& write) const;
+
+ /**
+ * Returns the month code for this date. Typically something
+ * like "M01", "M02", but can be more complicated for lunar calendars.
+ *
+ * See the [Rust documentation for `month`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.month) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> month_code() const;
+
+ /**
+ * Returns the year number in the current era for this date
+ *
+ * See the [Rust documentation for `year`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.year) for more information.
+ */
+ int32_t year_in_era() const;
+
+ /**
+ * Returns the era for this date,
+ *
+ * See the [Rust documentation for `year`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.year) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> era_to_writeable(W& write) const;
+
+ /**
+ * Returns the era for this date,
+ *
+ * See the [Rust documentation for `year`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.year) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> era() const;
+
+ /**
+ * Returns the number of months in the year represented by this date
+ *
+ * See the [Rust documentation for `months_in_year`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.months_in_year) for more information.
+ */
+ uint8_t months_in_year() const;
+
+ /**
+ * Returns the number of days in the month represented by this date
+ *
+ * See the [Rust documentation for `days_in_month`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.days_in_month) for more information.
+ */
+ uint8_t days_in_month() const;
+
+ /**
+ * Returns the number of days in the year represented by this date
+ *
+ * See the [Rust documentation for `days_in_year`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.days_in_year) for more information.
+ */
+ uint16_t days_in_year() const;
+
+ /**
+ * Returns the [`ICU4XCalendar`] object backing this date
+ *
+ * See the [Rust documentation for `calendar`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.calendar) for more information.
+ */
+ ICU4XCalendar calendar() const;
+ inline const capi::ICU4XDateTime* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XDateTime* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XDateTime(capi::ICU4XDateTime* i) : inner(i) {}
+ ICU4XDateTime() = default;
+ ICU4XDateTime(ICU4XDateTime&&) noexcept = default;
+ ICU4XDateTime& operator=(ICU4XDateTime&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XDateTime, ICU4XDateTimeDeleter> inner;
+};
+
+#include "ICU4XCalendar.hpp"
+#include "ICU4XDate.hpp"
+#include "ICU4XTime.hpp"
+#include "ICU4XIsoDateTime.hpp"
+#include "ICU4XWeekCalculator.hpp"
+#include "ICU4XWeekOf.hpp"
+
+inline diplomat::result<ICU4XDateTime, ICU4XError> ICU4XDateTime::create_from_iso_in_calendar(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond, const ICU4XCalendar& calendar) {
+ auto diplomat_result_raw_out_value = capi::ICU4XDateTime_create_from_iso_in_calendar(year, month, day, hour, minute, second, nanosecond, calendar.AsFFI());
+ diplomat::result<ICU4XDateTime, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XDateTime>(ICU4XDateTime(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XDateTime, ICU4XError> ICU4XDateTime::create_from_codes_in_calendar(const std::string_view era_code, int32_t year, const std::string_view month_code, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond, const ICU4XCalendar& calendar) {
+ auto diplomat_result_raw_out_value = capi::ICU4XDateTime_create_from_codes_in_calendar(era_code.data(), era_code.size(), year, month_code.data(), month_code.size(), day, hour, minute, second, nanosecond, calendar.AsFFI());
+ diplomat::result<ICU4XDateTime, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XDateTime>(ICU4XDateTime(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XDateTime ICU4XDateTime::create_from_date_and_time(const ICU4XDate& date, const ICU4XTime& time) {
+ return ICU4XDateTime(capi::ICU4XDateTime_create_from_date_and_time(date.AsFFI(), time.AsFFI()));
+}
+inline ICU4XDate ICU4XDateTime::date() const {
+ return ICU4XDate(capi::ICU4XDateTime_date(this->inner.get()));
+}
+inline ICU4XTime ICU4XDateTime::time() const {
+ return ICU4XTime(capi::ICU4XDateTime_time(this->inner.get()));
+}
+inline ICU4XIsoDateTime ICU4XDateTime::to_iso() const {
+ return ICU4XIsoDateTime(capi::ICU4XDateTime_to_iso(this->inner.get()));
+}
+inline ICU4XDateTime ICU4XDateTime::to_calendar(const ICU4XCalendar& calendar) const {
+ return ICU4XDateTime(capi::ICU4XDateTime_to_calendar(this->inner.get(), calendar.AsFFI()));
+}
+inline uint8_t ICU4XDateTime::hour() const {
+ return capi::ICU4XDateTime_hour(this->inner.get());
+}
+inline uint8_t ICU4XDateTime::minute() const {
+ return capi::ICU4XDateTime_minute(this->inner.get());
+}
+inline uint8_t ICU4XDateTime::second() const {
+ return capi::ICU4XDateTime_second(this->inner.get());
+}
+inline uint32_t ICU4XDateTime::nanosecond() const {
+ return capi::ICU4XDateTime_nanosecond(this->inner.get());
+}
+inline uint32_t ICU4XDateTime::day_of_month() const {
+ return capi::ICU4XDateTime_day_of_month(this->inner.get());
+}
+inline ICU4XIsoWeekday ICU4XDateTime::day_of_week() const {
+ return static_cast<ICU4XIsoWeekday>(capi::ICU4XDateTime_day_of_week(this->inner.get()));
+}
+inline uint32_t ICU4XDateTime::week_of_month(ICU4XIsoWeekday first_weekday) const {
+ return capi::ICU4XDateTime_week_of_month(this->inner.get(), static_cast<capi::ICU4XIsoWeekday>(first_weekday));
+}
+inline diplomat::result<ICU4XWeekOf, ICU4XError> ICU4XDateTime::week_of_year(const ICU4XWeekCalculator& calculator) const {
+ auto diplomat_result_raw_out_value = capi::ICU4XDateTime_week_of_year(this->inner.get(), calculator.AsFFI());
+ diplomat::result<ICU4XWeekOf, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ capi::ICU4XWeekOf diplomat_raw_struct_out_value = diplomat_result_raw_out_value.ok;
+ diplomat_result_out_value = diplomat::Ok<ICU4XWeekOf>(ICU4XWeekOf{ .week = std::move(diplomat_raw_struct_out_value.week), .unit = std::move(static_cast<ICU4XWeekRelativeUnit>(diplomat_raw_struct_out_value.unit)) });
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline uint32_t ICU4XDateTime::ordinal_month() const {
+ return capi::ICU4XDateTime_ordinal_month(this->inner.get());
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XDateTime::month_code_to_writeable(W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XDateTime_month_code(this->inner.get(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XDateTime::month_code() const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XDateTime_month_code(this->inner.get(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+inline int32_t ICU4XDateTime::year_in_era() const {
+ return capi::ICU4XDateTime_year_in_era(this->inner.get());
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XDateTime::era_to_writeable(W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XDateTime_era(this->inner.get(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XDateTime::era() const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XDateTime_era(this->inner.get(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+inline uint8_t ICU4XDateTime::months_in_year() const {
+ return capi::ICU4XDateTime_months_in_year(this->inner.get());
+}
+inline uint8_t ICU4XDateTime::days_in_month() const {
+ return capi::ICU4XDateTime_days_in_month(this->inner.get());
+}
+inline uint16_t ICU4XDateTime::days_in_year() const {
+ return capi::ICU4XDateTime_days_in_year(this->inner.get());
+}
+inline ICU4XCalendar ICU4XDateTime::calendar() const {
+ return ICU4XCalendar(capi::ICU4XDateTime_calendar(this->inner.get()));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDateTimeFormatter.h b/intl/icu_capi/cpp/include/ICU4XDateTimeFormatter.h
new file mode 100644
index 0000000000..5f0af4ddba
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDateTimeFormatter.h
@@ -0,0 +1,41 @@
+#ifndef ICU4XDateTimeFormatter_H
+#define ICU4XDateTimeFormatter_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XDateTimeFormatter ICU4XDateTimeFormatter;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "ICU4XLocale.h"
+#include "ICU4XDateLength.h"
+#include "ICU4XTimeLength.h"
+#include "diplomat_result_box_ICU4XDateTimeFormatter_ICU4XError.h"
+#include "ICU4XDateTime.h"
+#include "diplomat_result_void_ICU4XError.h"
+#include "ICU4XIsoDateTime.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XDateTimeFormatter_ICU4XError ICU4XDateTimeFormatter_create_with_lengths(const ICU4XDataProvider* provider, const ICU4XLocale* locale, ICU4XDateLength date_length, ICU4XTimeLength time_length);
+
+diplomat_result_void_ICU4XError ICU4XDateTimeFormatter_format_datetime(const ICU4XDateTimeFormatter* self, const ICU4XDateTime* value, DiplomatWriteable* write);
+
+diplomat_result_void_ICU4XError ICU4XDateTimeFormatter_format_iso_datetime(const ICU4XDateTimeFormatter* self, const ICU4XIsoDateTime* value, DiplomatWriteable* write);
+void ICU4XDateTimeFormatter_destroy(ICU4XDateTimeFormatter* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDateTimeFormatter.hpp b/intl/icu_capi/cpp/include/ICU4XDateTimeFormatter.hpp
new file mode 100644
index 0000000000..2a556eedc8
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDateTimeFormatter.hpp
@@ -0,0 +1,150 @@
+#ifndef ICU4XDateTimeFormatter_HPP
+#define ICU4XDateTimeFormatter_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XDateTimeFormatter.h"
+
+class ICU4XDataProvider;
+class ICU4XLocale;
+#include "ICU4XDateLength.hpp"
+#include "ICU4XTimeLength.hpp"
+class ICU4XDateTimeFormatter;
+#include "ICU4XError.hpp"
+class ICU4XDateTime;
+class ICU4XIsoDateTime;
+
+/**
+ * A destruction policy for using ICU4XDateTimeFormatter with std::unique_ptr.
+ */
+struct ICU4XDateTimeFormatterDeleter {
+ void operator()(capi::ICU4XDateTimeFormatter* l) const noexcept {
+ capi::ICU4XDateTimeFormatter_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X DateFormatter object capable of formatting a [`ICU4XDateTime`] as a string,
+ * using some calendar specified at runtime in the locale.
+ *
+ * See the [Rust documentation for `DateTimeFormatter`](https://docs.rs/icu/latest/icu/datetime/struct.DateTimeFormatter.html) for more information.
+ */
+class ICU4XDateTimeFormatter {
+ public:
+
+ /**
+ * Creates a new [`ICU4XDateTimeFormatter`] from locale data.
+ *
+ * See the [Rust documentation for `try_new`](https://docs.rs/icu/latest/icu/datetime/struct.DateTimeFormatter.html#method.try_new) for more information.
+ */
+ static diplomat::result<ICU4XDateTimeFormatter, ICU4XError> create_with_lengths(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength date_length, ICU4XTimeLength time_length);
+
+ /**
+ * Formats a [`ICU4XDateTime`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.DateTimeFormatter.html#method.format) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> format_datetime_to_writeable(const ICU4XDateTime& value, W& write) const;
+
+ /**
+ * Formats a [`ICU4XDateTime`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.DateTimeFormatter.html#method.format) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> format_datetime(const ICU4XDateTime& value) const;
+
+ /**
+ * Formats a [`ICU4XIsoDateTime`] to a string.
+ *
+ * Will convert to this formatter's calendar first
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.DateTimeFormatter.html#method.format) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> format_iso_datetime_to_writeable(const ICU4XIsoDateTime& value, W& write) const;
+
+ /**
+ * Formats a [`ICU4XIsoDateTime`] to a string.
+ *
+ * Will convert to this formatter's calendar first
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.DateTimeFormatter.html#method.format) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> format_iso_datetime(const ICU4XIsoDateTime& value) const;
+ inline const capi::ICU4XDateTimeFormatter* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XDateTimeFormatter* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XDateTimeFormatter(capi::ICU4XDateTimeFormatter* i) : inner(i) {}
+ ICU4XDateTimeFormatter() = default;
+ ICU4XDateTimeFormatter(ICU4XDateTimeFormatter&&) noexcept = default;
+ ICU4XDateTimeFormatter& operator=(ICU4XDateTimeFormatter&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XDateTimeFormatter, ICU4XDateTimeFormatterDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocale.hpp"
+#include "ICU4XDateTime.hpp"
+#include "ICU4XIsoDateTime.hpp"
+
+inline diplomat::result<ICU4XDateTimeFormatter, ICU4XError> ICU4XDateTimeFormatter::create_with_lengths(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength date_length, ICU4XTimeLength time_length) {
+ auto diplomat_result_raw_out_value = capi::ICU4XDateTimeFormatter_create_with_lengths(provider.AsFFI(), locale.AsFFI(), static_cast<capi::ICU4XDateLength>(date_length), static_cast<capi::ICU4XTimeLength>(time_length));
+ diplomat::result<ICU4XDateTimeFormatter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XDateTimeFormatter>(ICU4XDateTimeFormatter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XDateTimeFormatter::format_datetime_to_writeable(const ICU4XDateTime& value, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XDateTimeFormatter_format_datetime(this->inner.get(), value.AsFFI(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XDateTimeFormatter::format_datetime(const ICU4XDateTime& value) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XDateTimeFormatter_format_datetime(this->inner.get(), value.AsFFI(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XDateTimeFormatter::format_iso_datetime_to_writeable(const ICU4XIsoDateTime& value, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XDateTimeFormatter_format_iso_datetime(this->inner.get(), value.AsFFI(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XDateTimeFormatter::format_iso_datetime(const ICU4XIsoDateTime& value) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XDateTimeFormatter_format_iso_datetime(this->inner.get(), value.AsFFI(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDecomposed.h b/intl/icu_capi/cpp/include/ICU4XDecomposed.h
new file mode 100644
index 0000000000..3f287e8192
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDecomposed.h
@@ -0,0 +1,31 @@
+#ifndef ICU4XDecomposed_H
+#define ICU4XDecomposed_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XDecomposed {
+ char32_t first;
+ char32_t second;
+} ICU4XDecomposed;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XDecomposed_destroy(ICU4XDecomposed* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDecomposed.hpp b/intl/icu_capi/cpp/include/ICU4XDecomposed.hpp
new file mode 100644
index 0000000000..5628ae2be9
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDecomposed.hpp
@@ -0,0 +1,30 @@
+#ifndef ICU4XDecomposed_HPP
+#define ICU4XDecomposed_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XDecomposed.h"
+
+
+
+/**
+ * The outcome of non-recursive canonical decomposition of a character.
+ * `second` will be NUL when the decomposition expands to a single character
+ * (which may or may not be the original one)
+ *
+ * See the [Rust documentation for `Decomposed`](https://docs.rs/icu/latest/icu/normalizer/properties/enum.Decomposed.html) for more information.
+ */
+struct ICU4XDecomposed {
+ public:
+ char32_t first;
+ char32_t second;
+};
+
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDecomposingNormalizer.h b/intl/icu_capi/cpp/include/ICU4XDecomposingNormalizer.h
new file mode 100644
index 0000000000..f542f7a730
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDecomposingNormalizer.h
@@ -0,0 +1,38 @@
+#ifndef ICU4XDecomposingNormalizer_H
+#define ICU4XDecomposingNormalizer_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XDecomposingNormalizer ICU4XDecomposingNormalizer;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XDecomposingNormalizer_ICU4XError.h"
+#include "diplomat_result_void_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XDecomposingNormalizer_ICU4XError ICU4XDecomposingNormalizer_create_nfd(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XDecomposingNormalizer_ICU4XError ICU4XDecomposingNormalizer_create_nfkd(const ICU4XDataProvider* provider);
+
+diplomat_result_void_ICU4XError ICU4XDecomposingNormalizer_normalize(const ICU4XDecomposingNormalizer* self, const char* s_data, size_t s_len, DiplomatWriteable* write);
+
+bool ICU4XDecomposingNormalizer_is_normalized(const ICU4XDecomposingNormalizer* self, const char* s_data, size_t s_len);
+void ICU4XDecomposingNormalizer_destroy(ICU4XDecomposingNormalizer* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDecomposingNormalizer.hpp b/intl/icu_capi/cpp/include/ICU4XDecomposingNormalizer.hpp
new file mode 100644
index 0000000000..501513f7c2
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDecomposingNormalizer.hpp
@@ -0,0 +1,131 @@
+#ifndef ICU4XDecomposingNormalizer_HPP
+#define ICU4XDecomposingNormalizer_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XDecomposingNormalizer.h"
+
+class ICU4XDataProvider;
+class ICU4XDecomposingNormalizer;
+#include "ICU4XError.hpp"
+
+/**
+ * A destruction policy for using ICU4XDecomposingNormalizer with std::unique_ptr.
+ */
+struct ICU4XDecomposingNormalizerDeleter {
+ void operator()(capi::ICU4XDecomposingNormalizer* l) const noexcept {
+ capi::ICU4XDecomposingNormalizer_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `DecomposingNormalizer`](https://docs.rs/icu/latest/icu/normalizer/struct.DecomposingNormalizer.html) for more information.
+ */
+class ICU4XDecomposingNormalizer {
+ public:
+
+ /**
+ * Construct a new ICU4XDecomposingNormalizer instance for NFC
+ *
+ * See the [Rust documentation for `new_nfd`](https://docs.rs/icu/latest/icu/normalizer/struct.DecomposingNormalizer.html#method.new_nfd) for more information.
+ */
+ static diplomat::result<ICU4XDecomposingNormalizer, ICU4XError> create_nfd(const ICU4XDataProvider& provider);
+
+ /**
+ * Construct a new ICU4XDecomposingNormalizer instance for NFKC
+ *
+ * See the [Rust documentation for `new_nfkd`](https://docs.rs/icu/latest/icu/normalizer/struct.DecomposingNormalizer.html#method.new_nfkd) for more information.
+ */
+ static diplomat::result<ICU4XDecomposingNormalizer, ICU4XError> create_nfkd(const ICU4XDataProvider& provider);
+
+ /**
+ * Normalize a (potentially ill-formed) UTF8 string
+ *
+ * Errors are mapped to REPLACEMENT CHARACTER
+ *
+ * See the [Rust documentation for `normalize_utf8`](https://docs.rs/icu/latest/icu/normalizer/struct.DecomposingNormalizer.html#method.normalize_utf8) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> normalize_to_writeable(const std::string_view s, W& write) const;
+
+ /**
+ * Normalize a (potentially ill-formed) UTF8 string
+ *
+ * Errors are mapped to REPLACEMENT CHARACTER
+ *
+ * See the [Rust documentation for `normalize_utf8`](https://docs.rs/icu/latest/icu/normalizer/struct.DecomposingNormalizer.html#method.normalize_utf8) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> normalize(const std::string_view s) const;
+
+ /**
+ * Check if a (potentially ill-formed) UTF8 string is normalized
+ *
+ * Errors are mapped to REPLACEMENT CHARACTER
+ *
+ * See the [Rust documentation for `is_normalized_utf8`](https://docs.rs/icu/latest/icu/normalizer/struct.DecomposingNormalizer.html#method.is_normalized_utf8) for more information.
+ */
+ bool is_normalized(const std::string_view s) const;
+ inline const capi::ICU4XDecomposingNormalizer* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XDecomposingNormalizer* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XDecomposingNormalizer(capi::ICU4XDecomposingNormalizer* i) : inner(i) {}
+ ICU4XDecomposingNormalizer() = default;
+ ICU4XDecomposingNormalizer(ICU4XDecomposingNormalizer&&) noexcept = default;
+ ICU4XDecomposingNormalizer& operator=(ICU4XDecomposingNormalizer&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XDecomposingNormalizer, ICU4XDecomposingNormalizerDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+
+inline diplomat::result<ICU4XDecomposingNormalizer, ICU4XError> ICU4XDecomposingNormalizer::create_nfd(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XDecomposingNormalizer_create_nfd(provider.AsFFI());
+ diplomat::result<ICU4XDecomposingNormalizer, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XDecomposingNormalizer>(ICU4XDecomposingNormalizer(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XDecomposingNormalizer, ICU4XError> ICU4XDecomposingNormalizer::create_nfkd(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XDecomposingNormalizer_create_nfkd(provider.AsFFI());
+ diplomat::result<ICU4XDecomposingNormalizer, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XDecomposingNormalizer>(ICU4XDecomposingNormalizer(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XDecomposingNormalizer::normalize_to_writeable(const std::string_view s, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XDecomposingNormalizer_normalize(this->inner.get(), s.data(), s.size(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XDecomposingNormalizer::normalize(const std::string_view s) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XDecomposingNormalizer_normalize(this->inner.get(), s.data(), s.size(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+inline bool ICU4XDecomposingNormalizer::is_normalized(const std::string_view s) const {
+ return capi::ICU4XDecomposingNormalizer_is_normalized(this->inner.get(), s.data(), s.size());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDisplayNamesFallback.h b/intl/icu_capi/cpp/include/ICU4XDisplayNamesFallback.h
new file mode 100644
index 0000000000..085fc8de5d
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDisplayNamesFallback.h
@@ -0,0 +1,31 @@
+#ifndef ICU4XDisplayNamesFallback_H
+#define ICU4XDisplayNamesFallback_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XDisplayNamesFallback {
+ ICU4XDisplayNamesFallback_Code = 0,
+ ICU4XDisplayNamesFallback_None = 1,
+} ICU4XDisplayNamesFallback;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XDisplayNamesFallback_destroy(ICU4XDisplayNamesFallback* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDisplayNamesFallback.hpp b/intl/icu_capi/cpp/include/ICU4XDisplayNamesFallback.hpp
new file mode 100644
index 0000000000..230539852b
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDisplayNamesFallback.hpp
@@ -0,0 +1,24 @@
+#ifndef ICU4XDisplayNamesFallback_HPP
+#define ICU4XDisplayNamesFallback_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XDisplayNamesFallback.h"
+
+
+
+/**
+ * See the [Rust documentation for `Fallback`](https://docs.rs/icu/latest/icu/displaynames/options/enum.Fallback.html) for more information.
+ */
+enum struct ICU4XDisplayNamesFallback {
+ Code = 0,
+ None = 1,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDisplayNamesOptionsV1.h b/intl/icu_capi/cpp/include/ICU4XDisplayNamesOptionsV1.h
new file mode 100644
index 0000000000..e998cde0e7
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDisplayNamesOptionsV1.h
@@ -0,0 +1,38 @@
+#ifndef ICU4XDisplayNamesOptionsV1_H
+#define ICU4XDisplayNamesOptionsV1_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#include "ICU4XDisplayNamesStyle.h"
+#include "ICU4XDisplayNamesFallback.h"
+#include "ICU4XLanguageDisplay.h"
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XDisplayNamesOptionsV1 {
+ ICU4XDisplayNamesStyle style;
+ ICU4XDisplayNamesFallback fallback;
+ ICU4XLanguageDisplay language_display;
+} ICU4XDisplayNamesOptionsV1;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDisplayNamesStyle.h"
+#include "ICU4XDisplayNamesFallback.h"
+#include "ICU4XLanguageDisplay.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XDisplayNamesOptionsV1_destroy(ICU4XDisplayNamesOptionsV1* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDisplayNamesOptionsV1.hpp b/intl/icu_capi/cpp/include/ICU4XDisplayNamesOptionsV1.hpp
new file mode 100644
index 0000000000..52b66efa7e
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDisplayNamesOptionsV1.hpp
@@ -0,0 +1,43 @@
+#ifndef ICU4XDisplayNamesOptionsV1_HPP
+#define ICU4XDisplayNamesOptionsV1_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XDisplayNamesOptionsV1.h"
+
+#include "ICU4XDisplayNamesStyle.hpp"
+#include "ICU4XDisplayNamesFallback.hpp"
+#include "ICU4XLanguageDisplay.hpp"
+
+
+/**
+ * See the [Rust documentation for `DisplayNamesOptions`](https://docs.rs/icu/latest/icu/displaynames/options/struct.DisplayNamesOptions.html) for more information.
+ */
+struct ICU4XDisplayNamesOptionsV1 {
+ public:
+
+ /**
+ * The optional formatting style to use for display name.
+ */
+ ICU4XDisplayNamesStyle style;
+
+ /**
+ * The fallback return when the system does not have the
+ * requested display name, defaults to "code".
+ */
+ ICU4XDisplayNamesFallback fallback;
+
+ /**
+ * The language display kind, defaults to "dialect".
+ */
+ ICU4XLanguageDisplay language_display;
+};
+
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDisplayNamesStyle.h b/intl/icu_capi/cpp/include/ICU4XDisplayNamesStyle.h
new file mode 100644
index 0000000000..048da455da
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDisplayNamesStyle.h
@@ -0,0 +1,34 @@
+#ifndef ICU4XDisplayNamesStyle_H
+#define ICU4XDisplayNamesStyle_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XDisplayNamesStyle {
+ ICU4XDisplayNamesStyle_Auto = 0,
+ ICU4XDisplayNamesStyle_Narrow = 1,
+ ICU4XDisplayNamesStyle_Short = 2,
+ ICU4XDisplayNamesStyle_Long = 3,
+ ICU4XDisplayNamesStyle_Menu = 4,
+} ICU4XDisplayNamesStyle;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XDisplayNamesStyle_destroy(ICU4XDisplayNamesStyle* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XDisplayNamesStyle.hpp b/intl/icu_capi/cpp/include/ICU4XDisplayNamesStyle.hpp
new file mode 100644
index 0000000000..0199bdc80d
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XDisplayNamesStyle.hpp
@@ -0,0 +1,27 @@
+#ifndef ICU4XDisplayNamesStyle_HPP
+#define ICU4XDisplayNamesStyle_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XDisplayNamesStyle.h"
+
+
+
+/**
+ * See the [Rust documentation for `Style`](https://docs.rs/icu/latest/icu/displaynames/options/enum.Style.html) for more information.
+ */
+enum struct ICU4XDisplayNamesStyle {
+ Auto = 0,
+ Narrow = 1,
+ Short = 2,
+ Long = 3,
+ Menu = 4,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XError.h b/intl/icu_capi/cpp/include/ICU4XError.h
new file mode 100644
index 0000000000..8836275ac5
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XError.h
@@ -0,0 +1,84 @@
+#ifndef ICU4XError_H
+#define ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XError {
+ ICU4XError_UnknownError = 0,
+ ICU4XError_WriteableError = 1,
+ ICU4XError_OutOfBoundsError = 2,
+ ICU4XError_DataMissingDataKeyError = 256,
+ ICU4XError_DataMissingVariantError = 257,
+ ICU4XError_DataMissingLocaleError = 258,
+ ICU4XError_DataNeedsVariantError = 259,
+ ICU4XError_DataNeedsLocaleError = 260,
+ ICU4XError_DataExtraneousLocaleError = 261,
+ ICU4XError_DataFilteredResourceError = 262,
+ ICU4XError_DataMismatchedTypeError = 263,
+ ICU4XError_DataMissingPayloadError = 264,
+ ICU4XError_DataInvalidStateError = 265,
+ ICU4XError_DataCustomError = 266,
+ ICU4XError_DataIoError = 267,
+ ICU4XError_DataUnavailableBufferFormatError = 268,
+ ICU4XError_DataMismatchedAnyBufferError = 269,
+ ICU4XError_LocaleUndefinedSubtagError = 512,
+ ICU4XError_LocaleParserLanguageError = 513,
+ ICU4XError_LocaleParserSubtagError = 514,
+ ICU4XError_LocaleParserExtensionError = 515,
+ ICU4XError_DataStructValidityError = 768,
+ ICU4XError_PropertyUnknownScriptIdError = 1024,
+ ICU4XError_PropertyUnknownGeneralCategoryGroupError = 1025,
+ ICU4XError_PropertyUnexpectedPropertyNameError = 1026,
+ ICU4XError_FixedDecimalLimitError = 1280,
+ ICU4XError_FixedDecimalSyntaxError = 1281,
+ ICU4XError_PluralsParserError = 1536,
+ ICU4XError_CalendarParseError = 1792,
+ ICU4XError_CalendarOverflowError = 1793,
+ ICU4XError_CalendarUnderflowError = 1794,
+ ICU4XError_CalendarOutOfRangeError = 1795,
+ ICU4XError_CalendarUnknownEraError = 1796,
+ ICU4XError_CalendarUnknownMonthCodeError = 1797,
+ ICU4XError_CalendarMissingInputError = 1798,
+ ICU4XError_CalendarUnknownKindError = 1799,
+ ICU4XError_CalendarMissingError = 1800,
+ ICU4XError_DateTimePatternError = 2048,
+ ICU4XError_DateTimeMissingInputFieldError = 2049,
+ ICU4XError_DateTimeSkeletonError = 2050,
+ ICU4XError_DateTimeUnsupportedFieldError = 2051,
+ ICU4XError_DateTimeUnsupportedOptionsError = 2052,
+ ICU4XError_DateTimeMissingWeekdaySymbolError = 2053,
+ ICU4XError_DateTimeMissingMonthSymbolError = 2054,
+ ICU4XError_DateTimeFixedDecimalError = 2055,
+ ICU4XError_DateTimeMismatchedCalendarError = 2056,
+ ICU4XError_TinyStrTooLargeError = 2304,
+ ICU4XError_TinyStrContainsNullError = 2305,
+ ICU4XError_TinyStrNonAsciiError = 2306,
+ ICU4XError_TimeZoneOffsetOutOfBoundsError = 2560,
+ ICU4XError_TimeZoneInvalidOffsetError = 2561,
+ ICU4XError_TimeZoneMissingInputError = 2562,
+ ICU4XError_TimeZoneInvalidIdError = 2563,
+ ICU4XError_NormalizerFutureExtensionError = 2816,
+ ICU4XError_NormalizerValidationError = 2817,
+} ICU4XError;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XError_destroy(ICU4XError* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XError.hpp b/intl/icu_capi/cpp/include/ICU4XError.hpp
new file mode 100644
index 0000000000..1a306ca2b5
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XError.hpp
@@ -0,0 +1,104 @@
+#ifndef ICU4XError_HPP
+#define ICU4XError_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XError.h"
+
+
+
+/**
+ * A common enum for errors that ICU4X may return, organized by API
+ *
+ * The error names are stable and can be checked against as strings in the JS API
+ *
+ * Additional information: [1](https://docs.rs/fixed_decimal/latest/fixed_decimal/enum.FixedDecimalError.html), [2](https://docs.rs/icu/latest/icu/calendar/enum.CalendarError.html), [3](https://docs.rs/icu/latest/icu/collator/enum.CollatorError.html), [4](https://docs.rs/icu/latest/icu/datetime/enum.DateTimeError.html), [5](https://docs.rs/icu/latest/icu/decimal/enum.DecimalError.html), [6](https://docs.rs/icu/latest/icu/list/enum.ListError.html), [7](https://docs.rs/icu/latest/icu/locid/enum.ParserError.html), [8](https://docs.rs/icu/latest/icu/locid_transform/enum.LocaleTransformError.html), [9](https://docs.rs/icu/latest/icu/normalizer/enum.NormalizerError.html), [10](https://docs.rs/icu/latest/icu/plurals/enum.PluralsError.html), [11](https://docs.rs/icu/latest/icu/properties/enum.PropertiesError.html), [12](https://docs.rs/icu/latest/icu/provider/struct.DataError.html), [13](https://docs.rs/icu/latest/icu/provider/enum.DataErrorKind.html), [14](https://docs.rs/icu/latest/icu/segmenter/enum.SegmenterError.html), [15](https://docs.rs/icu/latest/icu/timezone/enum.TimeZoneError.html)
+ */
+enum struct ICU4XError {
+
+ /**
+ * The error is not currently categorized as ICU4XError.
+ * Please file a bug
+ */
+ UnknownError = 0,
+
+ /**
+ * An error arising from writing to a string
+ * Typically found when not enough space is allocated
+ * Most APIs that return a string may return this error
+ */
+ WriteableError = 1,
+ OutOfBoundsError = 2,
+ DataMissingDataKeyError = 256,
+ DataMissingVariantError = 257,
+ DataMissingLocaleError = 258,
+ DataNeedsVariantError = 259,
+ DataNeedsLocaleError = 260,
+ DataExtraneousLocaleError = 261,
+ DataFilteredResourceError = 262,
+ DataMismatchedTypeError = 263,
+ DataMissingPayloadError = 264,
+ DataInvalidStateError = 265,
+ DataCustomError = 266,
+ DataIoError = 267,
+ DataUnavailableBufferFormatError = 268,
+ DataMismatchedAnyBufferError = 269,
+
+ /**
+ * The subtag being requested was not set
+ */
+ LocaleUndefinedSubtagError = 512,
+
+ /**
+ * The locale or subtag string failed to parse
+ */
+ LocaleParserLanguageError = 513,
+ LocaleParserSubtagError = 514,
+ LocaleParserExtensionError = 515,
+
+ /**
+ * Attempted to construct an invalid data struct
+ */
+ DataStructValidityError = 768,
+ PropertyUnknownScriptIdError = 1024,
+ PropertyUnknownGeneralCategoryGroupError = 1025,
+ PropertyUnexpectedPropertyNameError = 1026,
+ FixedDecimalLimitError = 1280,
+ FixedDecimalSyntaxError = 1281,
+ PluralsParserError = 1536,
+ CalendarParseError = 1792,
+ CalendarOverflowError = 1793,
+ CalendarUnderflowError = 1794,
+ CalendarOutOfRangeError = 1795,
+ CalendarUnknownEraError = 1796,
+ CalendarUnknownMonthCodeError = 1797,
+ CalendarMissingInputError = 1798,
+ CalendarUnknownKindError = 1799,
+ CalendarMissingError = 1800,
+ DateTimePatternError = 2048,
+ DateTimeMissingInputFieldError = 2049,
+ DateTimeSkeletonError = 2050,
+ DateTimeUnsupportedFieldError = 2051,
+ DateTimeUnsupportedOptionsError = 2052,
+ DateTimeMissingWeekdaySymbolError = 2053,
+ DateTimeMissingMonthSymbolError = 2054,
+ DateTimeFixedDecimalError = 2055,
+ DateTimeMismatchedCalendarError = 2056,
+ TinyStrTooLargeError = 2304,
+ TinyStrContainsNullError = 2305,
+ TinyStrNonAsciiError = 2306,
+ TimeZoneOffsetOutOfBoundsError = 2560,
+ TimeZoneInvalidOffsetError = 2561,
+ TimeZoneMissingInputError = 2562,
+ TimeZoneInvalidIdError = 2563,
+ NormalizerFutureExtensionError = 2816,
+ NormalizerValidationError = 2817,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XFixedDecimal.h b/intl/icu_capi/cpp/include/ICU4XFixedDecimal.h
new file mode 100644
index 0000000000..361294b687
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XFixedDecimal.h
@@ -0,0 +1,101 @@
+#ifndef ICU4XFixedDecimal_H
+#define ICU4XFixedDecimal_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XFixedDecimal ICU4XFixedDecimal;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "diplomat_result_box_ICU4XFixedDecimal_ICU4XError.h"
+#include "ICU4XFixedDecimalSign.h"
+#include "ICU4XFixedDecimalSignDisplay.h"
+#include "diplomat_result_void_void.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+ICU4XFixedDecimal* ICU4XFixedDecimal_create_from_i32(int32_t v);
+
+ICU4XFixedDecimal* ICU4XFixedDecimal_create_from_u32(uint32_t v);
+
+ICU4XFixedDecimal* ICU4XFixedDecimal_create_from_i64(int64_t v);
+
+ICU4XFixedDecimal* ICU4XFixedDecimal_create_from_u64(uint64_t v);
+
+diplomat_result_box_ICU4XFixedDecimal_ICU4XError ICU4XFixedDecimal_create_from_f64_with_integer_precision(double f);
+
+diplomat_result_box_ICU4XFixedDecimal_ICU4XError ICU4XFixedDecimal_create_from_f64_with_lower_magnitude(double f, int16_t magnitude);
+
+diplomat_result_box_ICU4XFixedDecimal_ICU4XError ICU4XFixedDecimal_create_from_f64_with_significant_digits(double f, uint8_t digits);
+
+diplomat_result_box_ICU4XFixedDecimal_ICU4XError ICU4XFixedDecimal_create_from_f64_with_floating_precision(double f);
+
+diplomat_result_box_ICU4XFixedDecimal_ICU4XError ICU4XFixedDecimal_create_from_string(const char* v_data, size_t v_len);
+
+uint8_t ICU4XFixedDecimal_digit_at(const ICU4XFixedDecimal* self, int16_t magnitude);
+
+int16_t ICU4XFixedDecimal_magnitude_start(const ICU4XFixedDecimal* self);
+
+int16_t ICU4XFixedDecimal_magnitude_end(const ICU4XFixedDecimal* self);
+
+int16_t ICU4XFixedDecimal_nonzero_magnitude_start(const ICU4XFixedDecimal* self);
+
+int16_t ICU4XFixedDecimal_nonzero_magnitude_end(const ICU4XFixedDecimal* self);
+
+bool ICU4XFixedDecimal_is_zero(const ICU4XFixedDecimal* self);
+
+void ICU4XFixedDecimal_multiply_pow10(ICU4XFixedDecimal* self, int16_t power);
+
+ICU4XFixedDecimalSign ICU4XFixedDecimal_sign(const ICU4XFixedDecimal* self);
+
+void ICU4XFixedDecimal_set_sign(ICU4XFixedDecimal* self, ICU4XFixedDecimalSign sign);
+
+void ICU4XFixedDecimal_apply_sign_display(ICU4XFixedDecimal* self, ICU4XFixedDecimalSignDisplay sign_display);
+
+void ICU4XFixedDecimal_trim_start(ICU4XFixedDecimal* self);
+
+void ICU4XFixedDecimal_trim_end(ICU4XFixedDecimal* self);
+
+void ICU4XFixedDecimal_pad_start(ICU4XFixedDecimal* self, int16_t position);
+
+void ICU4XFixedDecimal_pad_end(ICU4XFixedDecimal* self, int16_t position);
+
+void ICU4XFixedDecimal_set_max_position(ICU4XFixedDecimal* self, int16_t position);
+
+void ICU4XFixedDecimal_trunc(ICU4XFixedDecimal* self, int16_t position);
+
+void ICU4XFixedDecimal_half_trunc(ICU4XFixedDecimal* self, int16_t position);
+
+void ICU4XFixedDecimal_expand(ICU4XFixedDecimal* self, int16_t position);
+
+void ICU4XFixedDecimal_half_expand(ICU4XFixedDecimal* self, int16_t position);
+
+void ICU4XFixedDecimal_ceil(ICU4XFixedDecimal* self, int16_t position);
+
+void ICU4XFixedDecimal_half_ceil(ICU4XFixedDecimal* self, int16_t position);
+
+void ICU4XFixedDecimal_floor(ICU4XFixedDecimal* self, int16_t position);
+
+void ICU4XFixedDecimal_half_floor(ICU4XFixedDecimal* self, int16_t position);
+
+void ICU4XFixedDecimal_half_even(ICU4XFixedDecimal* self, int16_t position);
+
+diplomat_result_void_void ICU4XFixedDecimal_concatenate_end(ICU4XFixedDecimal* self, ICU4XFixedDecimal* other);
+
+void ICU4XFixedDecimal_to_string(const ICU4XFixedDecimal* self, DiplomatWriteable* to);
+void ICU4XFixedDecimal_destroy(ICU4XFixedDecimal* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XFixedDecimal.hpp b/intl/icu_capi/cpp/include/ICU4XFixedDecimal.hpp
new file mode 100644
index 0000000000..fed2ac629a
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XFixedDecimal.hpp
@@ -0,0 +1,426 @@
+#ifndef ICU4XFixedDecimal_HPP
+#define ICU4XFixedDecimal_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XFixedDecimal.h"
+
+class ICU4XFixedDecimal;
+#include "ICU4XError.hpp"
+#include "ICU4XFixedDecimalSign.hpp"
+#include "ICU4XFixedDecimalSignDisplay.hpp"
+
+/**
+ * A destruction policy for using ICU4XFixedDecimal with std::unique_ptr.
+ */
+struct ICU4XFixedDecimalDeleter {
+ void operator()(capi::ICU4XFixedDecimal* l) const noexcept {
+ capi::ICU4XFixedDecimal_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `FixedDecimal`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html) for more information.
+ */
+class ICU4XFixedDecimal {
+ public:
+
+ /**
+ * Construct an [`ICU4XFixedDecimal`] from an integer.
+ *
+ * See the [Rust documentation for `FixedDecimal`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html) for more information.
+ */
+ static ICU4XFixedDecimal create_from_i32(int32_t v);
+
+ /**
+ * Construct an [`ICU4XFixedDecimal`] from an integer.
+ *
+ * See the [Rust documentation for `FixedDecimal`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html) for more information.
+ */
+ static ICU4XFixedDecimal create_from_u32(uint32_t v);
+
+ /**
+ * Construct an [`ICU4XFixedDecimal`] from an integer.
+ *
+ * See the [Rust documentation for `FixedDecimal`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html) for more information.
+ */
+ static ICU4XFixedDecimal create_from_i64(int64_t v);
+
+ /**
+ * Construct an [`ICU4XFixedDecimal`] from an integer.
+ *
+ * See the [Rust documentation for `FixedDecimal`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html) for more information.
+ */
+ static ICU4XFixedDecimal create_from_u64(uint64_t v);
+
+ /**
+ * Construct an [`ICU4XFixedDecimal`] from an integer-valued float
+ *
+ * See the [Rust documentation for `try_from_f64`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.try_from_f64) for more information.
+ *
+ * See the [Rust documentation for `FloatPrecision`](https://docs.rs/fixed_decimal/latest/fixed_decimal/enum.FloatPrecision.html) for more information.
+ */
+ static diplomat::result<ICU4XFixedDecimal, ICU4XError> create_from_f64_with_integer_precision(double f);
+
+ /**
+ * Construct an [`ICU4XFixedDecimal`] from an float, with a given power of 10 for the lower magnitude
+ *
+ * See the [Rust documentation for `try_from_f64`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.try_from_f64) for more information.
+ *
+ * See the [Rust documentation for `FloatPrecision`](https://docs.rs/fixed_decimal/latest/fixed_decimal/enum.FloatPrecision.html) for more information.
+ */
+ static diplomat::result<ICU4XFixedDecimal, ICU4XError> create_from_f64_with_lower_magnitude(double f, int16_t magnitude);
+
+ /**
+ * Construct an [`ICU4XFixedDecimal`] from an float, for a given number of significant digits
+ *
+ * See the [Rust documentation for `try_from_f64`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.try_from_f64) for more information.
+ *
+ * See the [Rust documentation for `FloatPrecision`](https://docs.rs/fixed_decimal/latest/fixed_decimal/enum.FloatPrecision.html) for more information.
+ */
+ static diplomat::result<ICU4XFixedDecimal, ICU4XError> create_from_f64_with_significant_digits(double f, uint8_t digits);
+
+ /**
+ * Construct an [`ICU4XFixedDecimal`] from an float, with enough digits to recover
+ * the original floating point in IEEE 754 without needing trailing zeros
+ *
+ * See the [Rust documentation for `try_from_f64`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.try_from_f64) for more information.
+ *
+ * See the [Rust documentation for `FloatPrecision`](https://docs.rs/fixed_decimal/latest/fixed_decimal/enum.FloatPrecision.html) for more information.
+ */
+ static diplomat::result<ICU4XFixedDecimal, ICU4XError> create_from_f64_with_floating_precision(double f);
+
+ /**
+ * Construct an [`ICU4XFixedDecimal`] from a string.
+ *
+ * See the [Rust documentation for `from_str`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.from_str) for more information.
+ */
+ static diplomat::result<ICU4XFixedDecimal, ICU4XError> create_from_string(const std::string_view v);
+
+ /**
+ * See the [Rust documentation for `digit_at`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.digit_at) for more information.
+ */
+ uint8_t digit_at(int16_t magnitude) const;
+
+ /**
+ * See the [Rust documentation for `magnitude_range`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.magnitude_range) for more information.
+ */
+ int16_t magnitude_start() const;
+
+ /**
+ * See the [Rust documentation for `magnitude_range`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.magnitude_range) for more information.
+ */
+ int16_t magnitude_end() const;
+
+ /**
+ * See the [Rust documentation for `nonzero_magnitude_start`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.nonzero_magnitude_start) for more information.
+ */
+ int16_t nonzero_magnitude_start() const;
+
+ /**
+ * See the [Rust documentation for `nonzero_magnitude_end`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.nonzero_magnitude_end) for more information.
+ */
+ int16_t nonzero_magnitude_end() const;
+
+ /**
+ * See the [Rust documentation for `is_zero`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.is_zero) for more information.
+ */
+ bool is_zero() const;
+
+ /**
+ * Multiply the [`ICU4XFixedDecimal`] by a given power of ten.
+ *
+ * See the [Rust documentation for `multiply_pow10`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.multiply_pow10) for more information.
+ */
+ void multiply_pow10(int16_t power);
+
+ /**
+ * See the [Rust documentation for `sign`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.sign) for more information.
+ */
+ ICU4XFixedDecimalSign sign() const;
+
+ /**
+ * Set the sign of the [`ICU4XFixedDecimal`].
+ *
+ * See the [Rust documentation for `set_sign`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.set_sign) for more information.
+ */
+ void set_sign(ICU4XFixedDecimalSign sign);
+
+ /**
+ * See the [Rust documentation for `apply_sign_display`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.apply_sign_display) for more information.
+ */
+ void apply_sign_display(ICU4XFixedDecimalSignDisplay sign_display);
+
+ /**
+ * See the [Rust documentation for `trim_start`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.trim_start) for more information.
+ */
+ void trim_start();
+
+ /**
+ * See the [Rust documentation for `trim_end`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.trim_end) for more information.
+ */
+ void trim_end();
+
+ /**
+ * Zero-pad the [`ICU4XFixedDecimal`] on the left to a particular position
+ *
+ * See the [Rust documentation for `pad_start`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.pad_start) for more information.
+ */
+ void pad_start(int16_t position);
+
+ /**
+ * Zero-pad the [`ICU4XFixedDecimal`] on the right to a particular position
+ *
+ * See the [Rust documentation for `pad_end`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.pad_end) for more information.
+ */
+ void pad_end(int16_t position);
+
+ /**
+ * Truncate the [`ICU4XFixedDecimal`] on the left to a particular position, deleting digits if necessary. This is useful for, e.g. abbreviating years
+ * ("2022" -> "22")
+ *
+ * See the [Rust documentation for `set_max_position`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.set_max_position) for more information.
+ */
+ void set_max_position(int16_t position);
+
+ /**
+ * See the [Rust documentation for `trunc`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.trunc) for more information.
+ */
+ void trunc(int16_t position);
+
+ /**
+ * See the [Rust documentation for `half_trunc`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.half_trunc) for more information.
+ */
+ void half_trunc(int16_t position);
+
+ /**
+ * See the [Rust documentation for `expand`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.expand) for more information.
+ */
+ void expand(int16_t position);
+
+ /**
+ * See the [Rust documentation for `half_expand`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.half_expand) for more information.
+ */
+ void half_expand(int16_t position);
+
+ /**
+ * See the [Rust documentation for `ceil`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.ceil) for more information.
+ */
+ void ceil(int16_t position);
+
+ /**
+ * See the [Rust documentation for `half_ceil`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.half_ceil) for more information.
+ */
+ void half_ceil(int16_t position);
+
+ /**
+ * See the [Rust documentation for `floor`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.floor) for more information.
+ */
+ void floor(int16_t position);
+
+ /**
+ * See the [Rust documentation for `half_floor`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.half_floor) for more information.
+ */
+ void half_floor(int16_t position);
+
+ /**
+ * See the [Rust documentation for `half_even`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.half_even) for more information.
+ */
+ void half_even(int16_t position);
+
+ /**
+ * Concatenates `other` to the end of `self`.
+ *
+ * If successful, `other` will be set to 0 and a successful status is returned.
+ *
+ * If not successful, `other` will be unchanged and an error is returned.
+ *
+ * See the [Rust documentation for `concatenate_end`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.concatenate_end) for more information.
+ */
+ diplomat::result<std::monostate, std::monostate> concatenate_end(ICU4XFixedDecimal& other);
+
+ /**
+ * Format the [`ICU4XFixedDecimal`] as a string.
+ *
+ * See the [Rust documentation for `write_to`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.write_to) for more information.
+ */
+ template<typename W> void to_string_to_writeable(W& to) const;
+
+ /**
+ * Format the [`ICU4XFixedDecimal`] as a string.
+ *
+ * See the [Rust documentation for `write_to`](https://docs.rs/fixed_decimal/latest/fixed_decimal/struct.FixedDecimal.html#method.write_to) for more information.
+ */
+ std::string to_string() const;
+ inline const capi::ICU4XFixedDecimal* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XFixedDecimal* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XFixedDecimal(capi::ICU4XFixedDecimal* i) : inner(i) {}
+ ICU4XFixedDecimal() = default;
+ ICU4XFixedDecimal(ICU4XFixedDecimal&&) noexcept = default;
+ ICU4XFixedDecimal& operator=(ICU4XFixedDecimal&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XFixedDecimal, ICU4XFixedDecimalDeleter> inner;
+};
+
+
+inline ICU4XFixedDecimal ICU4XFixedDecimal::create_from_i32(int32_t v) {
+ return ICU4XFixedDecimal(capi::ICU4XFixedDecimal_create_from_i32(v));
+}
+inline ICU4XFixedDecimal ICU4XFixedDecimal::create_from_u32(uint32_t v) {
+ return ICU4XFixedDecimal(capi::ICU4XFixedDecimal_create_from_u32(v));
+}
+inline ICU4XFixedDecimal ICU4XFixedDecimal::create_from_i64(int64_t v) {
+ return ICU4XFixedDecimal(capi::ICU4XFixedDecimal_create_from_i64(v));
+}
+inline ICU4XFixedDecimal ICU4XFixedDecimal::create_from_u64(uint64_t v) {
+ return ICU4XFixedDecimal(capi::ICU4XFixedDecimal_create_from_u64(v));
+}
+inline diplomat::result<ICU4XFixedDecimal, ICU4XError> ICU4XFixedDecimal::create_from_f64_with_integer_precision(double f) {
+ auto diplomat_result_raw_out_value = capi::ICU4XFixedDecimal_create_from_f64_with_integer_precision(f);
+ diplomat::result<ICU4XFixedDecimal, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XFixedDecimal>(ICU4XFixedDecimal(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XFixedDecimal, ICU4XError> ICU4XFixedDecimal::create_from_f64_with_lower_magnitude(double f, int16_t magnitude) {
+ auto diplomat_result_raw_out_value = capi::ICU4XFixedDecimal_create_from_f64_with_lower_magnitude(f, magnitude);
+ diplomat::result<ICU4XFixedDecimal, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XFixedDecimal>(ICU4XFixedDecimal(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XFixedDecimal, ICU4XError> ICU4XFixedDecimal::create_from_f64_with_significant_digits(double f, uint8_t digits) {
+ auto diplomat_result_raw_out_value = capi::ICU4XFixedDecimal_create_from_f64_with_significant_digits(f, digits);
+ diplomat::result<ICU4XFixedDecimal, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XFixedDecimal>(ICU4XFixedDecimal(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XFixedDecimal, ICU4XError> ICU4XFixedDecimal::create_from_f64_with_floating_precision(double f) {
+ auto diplomat_result_raw_out_value = capi::ICU4XFixedDecimal_create_from_f64_with_floating_precision(f);
+ diplomat::result<ICU4XFixedDecimal, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XFixedDecimal>(ICU4XFixedDecimal(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XFixedDecimal, ICU4XError> ICU4XFixedDecimal::create_from_string(const std::string_view v) {
+ auto diplomat_result_raw_out_value = capi::ICU4XFixedDecimal_create_from_string(v.data(), v.size());
+ diplomat::result<ICU4XFixedDecimal, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XFixedDecimal>(ICU4XFixedDecimal(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline uint8_t ICU4XFixedDecimal::digit_at(int16_t magnitude) const {
+ return capi::ICU4XFixedDecimal_digit_at(this->inner.get(), magnitude);
+}
+inline int16_t ICU4XFixedDecimal::magnitude_start() const {
+ return capi::ICU4XFixedDecimal_magnitude_start(this->inner.get());
+}
+inline int16_t ICU4XFixedDecimal::magnitude_end() const {
+ return capi::ICU4XFixedDecimal_magnitude_end(this->inner.get());
+}
+inline int16_t ICU4XFixedDecimal::nonzero_magnitude_start() const {
+ return capi::ICU4XFixedDecimal_nonzero_magnitude_start(this->inner.get());
+}
+inline int16_t ICU4XFixedDecimal::nonzero_magnitude_end() const {
+ return capi::ICU4XFixedDecimal_nonzero_magnitude_end(this->inner.get());
+}
+inline bool ICU4XFixedDecimal::is_zero() const {
+ return capi::ICU4XFixedDecimal_is_zero(this->inner.get());
+}
+inline void ICU4XFixedDecimal::multiply_pow10(int16_t power) {
+ capi::ICU4XFixedDecimal_multiply_pow10(this->inner.get(), power);
+}
+inline ICU4XFixedDecimalSign ICU4XFixedDecimal::sign() const {
+ return static_cast<ICU4XFixedDecimalSign>(capi::ICU4XFixedDecimal_sign(this->inner.get()));
+}
+inline void ICU4XFixedDecimal::set_sign(ICU4XFixedDecimalSign sign) {
+ capi::ICU4XFixedDecimal_set_sign(this->inner.get(), static_cast<capi::ICU4XFixedDecimalSign>(sign));
+}
+inline void ICU4XFixedDecimal::apply_sign_display(ICU4XFixedDecimalSignDisplay sign_display) {
+ capi::ICU4XFixedDecimal_apply_sign_display(this->inner.get(), static_cast<capi::ICU4XFixedDecimalSignDisplay>(sign_display));
+}
+inline void ICU4XFixedDecimal::trim_start() {
+ capi::ICU4XFixedDecimal_trim_start(this->inner.get());
+}
+inline void ICU4XFixedDecimal::trim_end() {
+ capi::ICU4XFixedDecimal_trim_end(this->inner.get());
+}
+inline void ICU4XFixedDecimal::pad_start(int16_t position) {
+ capi::ICU4XFixedDecimal_pad_start(this->inner.get(), position);
+}
+inline void ICU4XFixedDecimal::pad_end(int16_t position) {
+ capi::ICU4XFixedDecimal_pad_end(this->inner.get(), position);
+}
+inline void ICU4XFixedDecimal::set_max_position(int16_t position) {
+ capi::ICU4XFixedDecimal_set_max_position(this->inner.get(), position);
+}
+inline void ICU4XFixedDecimal::trunc(int16_t position) {
+ capi::ICU4XFixedDecimal_trunc(this->inner.get(), position);
+}
+inline void ICU4XFixedDecimal::half_trunc(int16_t position) {
+ capi::ICU4XFixedDecimal_half_trunc(this->inner.get(), position);
+}
+inline void ICU4XFixedDecimal::expand(int16_t position) {
+ capi::ICU4XFixedDecimal_expand(this->inner.get(), position);
+}
+inline void ICU4XFixedDecimal::half_expand(int16_t position) {
+ capi::ICU4XFixedDecimal_half_expand(this->inner.get(), position);
+}
+inline void ICU4XFixedDecimal::ceil(int16_t position) {
+ capi::ICU4XFixedDecimal_ceil(this->inner.get(), position);
+}
+inline void ICU4XFixedDecimal::half_ceil(int16_t position) {
+ capi::ICU4XFixedDecimal_half_ceil(this->inner.get(), position);
+}
+inline void ICU4XFixedDecimal::floor(int16_t position) {
+ capi::ICU4XFixedDecimal_floor(this->inner.get(), position);
+}
+inline void ICU4XFixedDecimal::half_floor(int16_t position) {
+ capi::ICU4XFixedDecimal_half_floor(this->inner.get(), position);
+}
+inline void ICU4XFixedDecimal::half_even(int16_t position) {
+ capi::ICU4XFixedDecimal_half_even(this->inner.get(), position);
+}
+inline diplomat::result<std::monostate, std::monostate> ICU4XFixedDecimal::concatenate_end(ICU4XFixedDecimal& other) {
+ auto diplomat_result_raw_out_value = capi::ICU4XFixedDecimal_concatenate_end(this->inner.get(), other.AsFFIMut());
+ diplomat::result<std::monostate, std::monostate> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err(std::monostate());
+ }
+ return diplomat_result_out_value;
+}
+template<typename W> inline void ICU4XFixedDecimal::to_string_to_writeable(W& to) const {
+ capi::DiplomatWriteable to_writer = diplomat::WriteableTrait<W>::Construct(to);
+ capi::ICU4XFixedDecimal_to_string(this->inner.get(), &to_writer);
+}
+inline std::string ICU4XFixedDecimal::to_string() const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ capi::ICU4XFixedDecimal_to_string(this->inner.get(), &diplomat_writeable_out);
+ return diplomat_writeable_string;
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XFixedDecimalFormatter.h b/intl/icu_capi/cpp/include/ICU4XFixedDecimalFormatter.h
new file mode 100644
index 0000000000..aa1cfd6a48
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XFixedDecimalFormatter.h
@@ -0,0 +1,40 @@
+#ifndef ICU4XFixedDecimalFormatter_H
+#define ICU4XFixedDecimalFormatter_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XFixedDecimalFormatter ICU4XFixedDecimalFormatter;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "ICU4XLocale.h"
+#include "ICU4XFixedDecimalGroupingStrategy.h"
+#include "diplomat_result_box_ICU4XFixedDecimalFormatter_ICU4XError.h"
+#include "ICU4XDataStruct.h"
+#include "ICU4XFixedDecimal.h"
+#include "diplomat_result_void_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XFixedDecimalFormatter_ICU4XError ICU4XFixedDecimalFormatter_create_with_grouping_strategy(const ICU4XDataProvider* provider, const ICU4XLocale* locale, ICU4XFixedDecimalGroupingStrategy grouping_strategy);
+
+diplomat_result_box_ICU4XFixedDecimalFormatter_ICU4XError ICU4XFixedDecimalFormatter_create_with_decimal_symbols_v1(const ICU4XDataStruct* data_struct, ICU4XFixedDecimalGroupingStrategy grouping_strategy);
+
+diplomat_result_void_ICU4XError ICU4XFixedDecimalFormatter_format(const ICU4XFixedDecimalFormatter* self, const ICU4XFixedDecimal* value, DiplomatWriteable* write);
+void ICU4XFixedDecimalFormatter_destroy(ICU4XFixedDecimalFormatter* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XFixedDecimalFormatter.hpp b/intl/icu_capi/cpp/include/ICU4XFixedDecimalFormatter.hpp
new file mode 100644
index 0000000000..9ba29490e7
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XFixedDecimalFormatter.hpp
@@ -0,0 +1,126 @@
+#ifndef ICU4XFixedDecimalFormatter_HPP
+#define ICU4XFixedDecimalFormatter_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XFixedDecimalFormatter.h"
+
+class ICU4XDataProvider;
+class ICU4XLocale;
+#include "ICU4XFixedDecimalGroupingStrategy.hpp"
+class ICU4XFixedDecimalFormatter;
+#include "ICU4XError.hpp"
+class ICU4XDataStruct;
+class ICU4XFixedDecimal;
+
+/**
+ * A destruction policy for using ICU4XFixedDecimalFormatter with std::unique_ptr.
+ */
+struct ICU4XFixedDecimalFormatterDeleter {
+ void operator()(capi::ICU4XFixedDecimalFormatter* l) const noexcept {
+ capi::ICU4XFixedDecimalFormatter_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X Fixed Decimal Format object, capable of formatting a [`ICU4XFixedDecimal`] as a string.
+ *
+ * See the [Rust documentation for `FixedDecimalFormatter`](https://docs.rs/icu/latest/icu/decimal/struct.FixedDecimalFormatter.html) for more information.
+ */
+class ICU4XFixedDecimalFormatter {
+ public:
+
+ /**
+ * Creates a new [`ICU4XFixedDecimalFormatter`] from locale data.
+ *
+ * See the [Rust documentation for `try_new`](https://docs.rs/icu/latest/icu/decimal/struct.FixedDecimalFormatter.html#method.try_new) for more information.
+ */
+ static diplomat::result<ICU4XFixedDecimalFormatter, ICU4XError> create_with_grouping_strategy(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XFixedDecimalGroupingStrategy grouping_strategy);
+
+ /**
+ * Creates a new [`ICU4XFixedDecimalFormatter`] from preconstructed locale data in the form of an [`ICU4XDataStruct`]
+ * constructed from `ICU4XDataStruct::create_decimal_symbols()`.
+ *
+ * The contents of the data struct will be consumed: if you wish to use the struct again it will have to be reconstructed.
+ * Passing a consumed struct to this method will return an error.
+ */
+ static diplomat::result<ICU4XFixedDecimalFormatter, ICU4XError> create_with_decimal_symbols_v1(const ICU4XDataStruct& data_struct, ICU4XFixedDecimalGroupingStrategy grouping_strategy);
+
+ /**
+ * Formats a [`ICU4XFixedDecimal`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/decimal/struct.FixedDecimalFormatter.html#method.format) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> format_to_writeable(const ICU4XFixedDecimal& value, W& write) const;
+
+ /**
+ * Formats a [`ICU4XFixedDecimal`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/decimal/struct.FixedDecimalFormatter.html#method.format) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> format(const ICU4XFixedDecimal& value) const;
+ inline const capi::ICU4XFixedDecimalFormatter* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XFixedDecimalFormatter* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XFixedDecimalFormatter(capi::ICU4XFixedDecimalFormatter* i) : inner(i) {}
+ ICU4XFixedDecimalFormatter() = default;
+ ICU4XFixedDecimalFormatter(ICU4XFixedDecimalFormatter&&) noexcept = default;
+ ICU4XFixedDecimalFormatter& operator=(ICU4XFixedDecimalFormatter&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XFixedDecimalFormatter, ICU4XFixedDecimalFormatterDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocale.hpp"
+#include "ICU4XDataStruct.hpp"
+#include "ICU4XFixedDecimal.hpp"
+
+inline diplomat::result<ICU4XFixedDecimalFormatter, ICU4XError> ICU4XFixedDecimalFormatter::create_with_grouping_strategy(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XFixedDecimalGroupingStrategy grouping_strategy) {
+ auto diplomat_result_raw_out_value = capi::ICU4XFixedDecimalFormatter_create_with_grouping_strategy(provider.AsFFI(), locale.AsFFI(), static_cast<capi::ICU4XFixedDecimalGroupingStrategy>(grouping_strategy));
+ diplomat::result<ICU4XFixedDecimalFormatter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XFixedDecimalFormatter>(ICU4XFixedDecimalFormatter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XFixedDecimalFormatter, ICU4XError> ICU4XFixedDecimalFormatter::create_with_decimal_symbols_v1(const ICU4XDataStruct& data_struct, ICU4XFixedDecimalGroupingStrategy grouping_strategy) {
+ auto diplomat_result_raw_out_value = capi::ICU4XFixedDecimalFormatter_create_with_decimal_symbols_v1(data_struct.AsFFI(), static_cast<capi::ICU4XFixedDecimalGroupingStrategy>(grouping_strategy));
+ diplomat::result<ICU4XFixedDecimalFormatter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XFixedDecimalFormatter>(ICU4XFixedDecimalFormatter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XFixedDecimalFormatter::format_to_writeable(const ICU4XFixedDecimal& value, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XFixedDecimalFormatter_format(this->inner.get(), value.AsFFI(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XFixedDecimalFormatter::format(const ICU4XFixedDecimal& value) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XFixedDecimalFormatter_format(this->inner.get(), value.AsFFI(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XFixedDecimalGroupingStrategy.h b/intl/icu_capi/cpp/include/ICU4XFixedDecimalGroupingStrategy.h
new file mode 100644
index 0000000000..7648892cc5
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XFixedDecimalGroupingStrategy.h
@@ -0,0 +1,33 @@
+#ifndef ICU4XFixedDecimalGroupingStrategy_H
+#define ICU4XFixedDecimalGroupingStrategy_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XFixedDecimalGroupingStrategy {
+ ICU4XFixedDecimalGroupingStrategy_Auto = 0,
+ ICU4XFixedDecimalGroupingStrategy_Never = 1,
+ ICU4XFixedDecimalGroupingStrategy_Always = 2,
+ ICU4XFixedDecimalGroupingStrategy_Min2 = 3,
+} ICU4XFixedDecimalGroupingStrategy;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XFixedDecimalGroupingStrategy_destroy(ICU4XFixedDecimalGroupingStrategy* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XFixedDecimalGroupingStrategy.hpp b/intl/icu_capi/cpp/include/ICU4XFixedDecimalGroupingStrategy.hpp
new file mode 100644
index 0000000000..85effe2fc5
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XFixedDecimalGroupingStrategy.hpp
@@ -0,0 +1,26 @@
+#ifndef ICU4XFixedDecimalGroupingStrategy_HPP
+#define ICU4XFixedDecimalGroupingStrategy_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XFixedDecimalGroupingStrategy.h"
+
+
+
+/**
+ * See the [Rust documentation for `GroupingStrategy`](https://docs.rs/icu/latest/icu/decimal/options/enum.GroupingStrategy.html) for more information.
+ */
+enum struct ICU4XFixedDecimalGroupingStrategy {
+ Auto = 0,
+ Never = 1,
+ Always = 2,
+ Min2 = 3,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XFixedDecimalSign.h b/intl/icu_capi/cpp/include/ICU4XFixedDecimalSign.h
new file mode 100644
index 0000000000..12fff3cf1c
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XFixedDecimalSign.h
@@ -0,0 +1,32 @@
+#ifndef ICU4XFixedDecimalSign_H
+#define ICU4XFixedDecimalSign_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XFixedDecimalSign {
+ ICU4XFixedDecimalSign_None = 0,
+ ICU4XFixedDecimalSign_Negative = 1,
+ ICU4XFixedDecimalSign_Positive = 2,
+} ICU4XFixedDecimalSign;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XFixedDecimalSign_destroy(ICU4XFixedDecimalSign* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XFixedDecimalSign.hpp b/intl/icu_capi/cpp/include/ICU4XFixedDecimalSign.hpp
new file mode 100644
index 0000000000..b56cdfc4b6
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XFixedDecimalSign.hpp
@@ -0,0 +1,39 @@
+#ifndef ICU4XFixedDecimalSign_HPP
+#define ICU4XFixedDecimalSign_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XFixedDecimalSign.h"
+
+
+
+/**
+ * The sign of a FixedDecimal, as shown in formatting.
+ *
+ * See the [Rust documentation for `Sign`](https://docs.rs/fixed_decimal/latest/fixed_decimal/enum.Sign.html) for more information.
+ */
+enum struct ICU4XFixedDecimalSign {
+
+ /**
+ * No sign (implicitly positive, e.g., 1729).
+ */
+ None = 0,
+
+ /**
+ * A negative sign, e.g., -1729.
+ */
+ Negative = 1,
+
+ /**
+ * An explicit positive sign, e.g., +1729.
+ */
+ Positive = 2,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XFixedDecimalSignDisplay.h b/intl/icu_capi/cpp/include/ICU4XFixedDecimalSignDisplay.h
new file mode 100644
index 0000000000..8c2612e516
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XFixedDecimalSignDisplay.h
@@ -0,0 +1,34 @@
+#ifndef ICU4XFixedDecimalSignDisplay_H
+#define ICU4XFixedDecimalSignDisplay_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XFixedDecimalSignDisplay {
+ ICU4XFixedDecimalSignDisplay_Auto = 0,
+ ICU4XFixedDecimalSignDisplay_Never = 1,
+ ICU4XFixedDecimalSignDisplay_Always = 2,
+ ICU4XFixedDecimalSignDisplay_ExceptZero = 3,
+ ICU4XFixedDecimalSignDisplay_Negative = 4,
+} ICU4XFixedDecimalSignDisplay;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XFixedDecimalSignDisplay_destroy(ICU4XFixedDecimalSignDisplay* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XFixedDecimalSignDisplay.hpp b/intl/icu_capi/cpp/include/ICU4XFixedDecimalSignDisplay.hpp
new file mode 100644
index 0000000000..6261edacea
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XFixedDecimalSignDisplay.hpp
@@ -0,0 +1,29 @@
+#ifndef ICU4XFixedDecimalSignDisplay_HPP
+#define ICU4XFixedDecimalSignDisplay_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XFixedDecimalSignDisplay.h"
+
+
+
+/**
+ * ECMA-402 compatible sign display preference.
+ *
+ * See the [Rust documentation for `SignDisplay`](https://docs.rs/fixed_decimal/latest/fixed_decimal/enum.SignDisplay.html) for more information.
+ */
+enum struct ICU4XFixedDecimalSignDisplay {
+ Auto = 0,
+ Never = 1,
+ Always = 2,
+ ExceptZero = 3,
+ Negative = 4,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XGeneralCategoryNameToMaskMapper.h b/intl/icu_capi/cpp/include/ICU4XGeneralCategoryNameToMaskMapper.h
new file mode 100644
index 0000000000..3a4e2d4d13
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XGeneralCategoryNameToMaskMapper.h
@@ -0,0 +1,35 @@
+#ifndef ICU4XGeneralCategoryNameToMaskMapper_H
+#define ICU4XGeneralCategoryNameToMaskMapper_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XGeneralCategoryNameToMaskMapper ICU4XGeneralCategoryNameToMaskMapper;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XGeneralCategoryNameToMaskMapper_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+uint32_t ICU4XGeneralCategoryNameToMaskMapper_get_strict(const ICU4XGeneralCategoryNameToMaskMapper* self, const char* name_data, size_t name_len);
+
+uint32_t ICU4XGeneralCategoryNameToMaskMapper_get_loose(const ICU4XGeneralCategoryNameToMaskMapper* self, const char* name_data, size_t name_len);
+
+diplomat_result_box_ICU4XGeneralCategoryNameToMaskMapper_ICU4XError ICU4XGeneralCategoryNameToMaskMapper_load(const ICU4XDataProvider* provider);
+void ICU4XGeneralCategoryNameToMaskMapper_destroy(ICU4XGeneralCategoryNameToMaskMapper* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XGeneralCategoryNameToMaskMapper.hpp b/intl/icu_capi/cpp/include/ICU4XGeneralCategoryNameToMaskMapper.hpp
new file mode 100644
index 0000000000..0a7fe54be0
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XGeneralCategoryNameToMaskMapper.hpp
@@ -0,0 +1,83 @@
+#ifndef ICU4XGeneralCategoryNameToMaskMapper_HPP
+#define ICU4XGeneralCategoryNameToMaskMapper_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XGeneralCategoryNameToMaskMapper.h"
+
+class ICU4XDataProvider;
+class ICU4XGeneralCategoryNameToMaskMapper;
+#include "ICU4XError.hpp"
+
+/**
+ * A destruction policy for using ICU4XGeneralCategoryNameToMaskMapper with std::unique_ptr.
+ */
+struct ICU4XGeneralCategoryNameToMaskMapperDeleter {
+ void operator()(capi::ICU4XGeneralCategoryNameToMaskMapper* l) const noexcept {
+ capi::ICU4XGeneralCategoryNameToMaskMapper_destroy(l);
+ }
+};
+
+/**
+ * A type capable of looking up General Category mask values from a string name.
+ *
+ * See the [Rust documentation for `get_name_to_enum_mapper`](https://docs.rs/icu/latest/icu/properties/struct.GeneralCategoryGroup.html#method.get_name_to_enum_mapper) for more information.
+ *
+ * See the [Rust documentation for `PropertyValueNameToEnumMapper`](https://docs.rs/icu/latest/icu/properties/names/struct.PropertyValueNameToEnumMapper.html) for more information.
+ */
+class ICU4XGeneralCategoryNameToMaskMapper {
+ public:
+
+ /**
+ * Get the mask value matching the given name, using strict matching
+ *
+ * Returns 0 if the name is unknown for this property
+ */
+ uint32_t get_strict(const std::string_view name) const;
+
+ /**
+ * Get the mask value matching the given name, using loose matching
+ *
+ * Returns 0 if the name is unknown for this property
+ */
+ uint32_t get_loose(const std::string_view name) const;
+
+ /**
+ * See the [Rust documentation for `get_name_to_enum_mapper`](https://docs.rs/icu/latest/icu/properties/struct.GeneralCategoryGroup.html#method.get_name_to_enum_mapper) for more information.
+ */
+ static diplomat::result<ICU4XGeneralCategoryNameToMaskMapper, ICU4XError> load(const ICU4XDataProvider& provider);
+ inline const capi::ICU4XGeneralCategoryNameToMaskMapper* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XGeneralCategoryNameToMaskMapper* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XGeneralCategoryNameToMaskMapper(capi::ICU4XGeneralCategoryNameToMaskMapper* i) : inner(i) {}
+ ICU4XGeneralCategoryNameToMaskMapper() = default;
+ ICU4XGeneralCategoryNameToMaskMapper(ICU4XGeneralCategoryNameToMaskMapper&&) noexcept = default;
+ ICU4XGeneralCategoryNameToMaskMapper& operator=(ICU4XGeneralCategoryNameToMaskMapper&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XGeneralCategoryNameToMaskMapper, ICU4XGeneralCategoryNameToMaskMapperDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+
+inline uint32_t ICU4XGeneralCategoryNameToMaskMapper::get_strict(const std::string_view name) const {
+ return capi::ICU4XGeneralCategoryNameToMaskMapper_get_strict(this->inner.get(), name.data(), name.size());
+}
+inline uint32_t ICU4XGeneralCategoryNameToMaskMapper::get_loose(const std::string_view name) const {
+ return capi::ICU4XGeneralCategoryNameToMaskMapper_get_loose(this->inner.get(), name.data(), name.size());
+}
+inline diplomat::result<ICU4XGeneralCategoryNameToMaskMapper, ICU4XError> ICU4XGeneralCategoryNameToMaskMapper::load(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XGeneralCategoryNameToMaskMapper_load(provider.AsFFI());
+ diplomat::result<ICU4XGeneralCategoryNameToMaskMapper, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XGeneralCategoryNameToMaskMapper>(ICU4XGeneralCategoryNameToMaskMapper(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorLatin1.h b/intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorLatin1.h
new file mode 100644
index 0000000000..9e23489fd3
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorLatin1.h
@@ -0,0 +1,29 @@
+#ifndef ICU4XGraphemeClusterBreakIteratorLatin1_H
+#define ICU4XGraphemeClusterBreakIteratorLatin1_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XGraphemeClusterBreakIteratorLatin1 ICU4XGraphemeClusterBreakIteratorLatin1;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+int32_t ICU4XGraphemeClusterBreakIteratorLatin1_next(ICU4XGraphemeClusterBreakIteratorLatin1* self);
+void ICU4XGraphemeClusterBreakIteratorLatin1_destroy(ICU4XGraphemeClusterBreakIteratorLatin1* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorLatin1.hpp b/intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorLatin1.hpp
new file mode 100644
index 0000000000..3948a6e00b
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorLatin1.hpp
@@ -0,0 +1,51 @@
+#ifndef ICU4XGraphemeClusterBreakIteratorLatin1_HPP
+#define ICU4XGraphemeClusterBreakIteratorLatin1_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XGraphemeClusterBreakIteratorLatin1.h"
+
+
+/**
+ * A destruction policy for using ICU4XGraphemeClusterBreakIteratorLatin1 with std::unique_ptr.
+ */
+struct ICU4XGraphemeClusterBreakIteratorLatin1Deleter {
+ void operator()(capi::ICU4XGraphemeClusterBreakIteratorLatin1* l) const noexcept {
+ capi::ICU4XGraphemeClusterBreakIteratorLatin1_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `GraphemeClusterBreakIterator`](https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterBreakIterator.html) for more information.
+ */
+class ICU4XGraphemeClusterBreakIteratorLatin1 {
+ public:
+
+ /**
+ * Finds the next breakpoint. Returns -1 if at the end of the string or if the index is
+ * out of range of a 32-bit signed integer.
+ *
+ * See the [Rust documentation for `next`](https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterBreakIterator.html#method.next) for more information.
+ */
+ int32_t next();
+ inline const capi::ICU4XGraphemeClusterBreakIteratorLatin1* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XGraphemeClusterBreakIteratorLatin1* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XGraphemeClusterBreakIteratorLatin1(capi::ICU4XGraphemeClusterBreakIteratorLatin1* i) : inner(i) {}
+ ICU4XGraphemeClusterBreakIteratorLatin1() = default;
+ ICU4XGraphemeClusterBreakIteratorLatin1(ICU4XGraphemeClusterBreakIteratorLatin1&&) noexcept = default;
+ ICU4XGraphemeClusterBreakIteratorLatin1& operator=(ICU4XGraphemeClusterBreakIteratorLatin1&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XGraphemeClusterBreakIteratorLatin1, ICU4XGraphemeClusterBreakIteratorLatin1Deleter> inner;
+};
+
+
+inline int32_t ICU4XGraphemeClusterBreakIteratorLatin1::next() {
+ return capi::ICU4XGraphemeClusterBreakIteratorLatin1_next(this->inner.get());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorUtf16.h b/intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorUtf16.h
new file mode 100644
index 0000000000..f0de4c0214
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorUtf16.h
@@ -0,0 +1,29 @@
+#ifndef ICU4XGraphemeClusterBreakIteratorUtf16_H
+#define ICU4XGraphemeClusterBreakIteratorUtf16_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XGraphemeClusterBreakIteratorUtf16 ICU4XGraphemeClusterBreakIteratorUtf16;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+int32_t ICU4XGraphemeClusterBreakIteratorUtf16_next(ICU4XGraphemeClusterBreakIteratorUtf16* self);
+void ICU4XGraphemeClusterBreakIteratorUtf16_destroy(ICU4XGraphemeClusterBreakIteratorUtf16* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorUtf16.hpp b/intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorUtf16.hpp
new file mode 100644
index 0000000000..3c16a0c53c
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorUtf16.hpp
@@ -0,0 +1,51 @@
+#ifndef ICU4XGraphemeClusterBreakIteratorUtf16_HPP
+#define ICU4XGraphemeClusterBreakIteratorUtf16_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XGraphemeClusterBreakIteratorUtf16.h"
+
+
+/**
+ * A destruction policy for using ICU4XGraphemeClusterBreakIteratorUtf16 with std::unique_ptr.
+ */
+struct ICU4XGraphemeClusterBreakIteratorUtf16Deleter {
+ void operator()(capi::ICU4XGraphemeClusterBreakIteratorUtf16* l) const noexcept {
+ capi::ICU4XGraphemeClusterBreakIteratorUtf16_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `GraphemeClusterBreakIterator`](https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterBreakIterator.html) for more information.
+ */
+class ICU4XGraphemeClusterBreakIteratorUtf16 {
+ public:
+
+ /**
+ * Finds the next breakpoint. Returns -1 if at the end of the string or if the index is
+ * out of range of a 32-bit signed integer.
+ *
+ * See the [Rust documentation for `next`](https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterBreakIterator.html#method.next) for more information.
+ */
+ int32_t next();
+ inline const capi::ICU4XGraphemeClusterBreakIteratorUtf16* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XGraphemeClusterBreakIteratorUtf16* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XGraphemeClusterBreakIteratorUtf16(capi::ICU4XGraphemeClusterBreakIteratorUtf16* i) : inner(i) {}
+ ICU4XGraphemeClusterBreakIteratorUtf16() = default;
+ ICU4XGraphemeClusterBreakIteratorUtf16(ICU4XGraphemeClusterBreakIteratorUtf16&&) noexcept = default;
+ ICU4XGraphemeClusterBreakIteratorUtf16& operator=(ICU4XGraphemeClusterBreakIteratorUtf16&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XGraphemeClusterBreakIteratorUtf16, ICU4XGraphemeClusterBreakIteratorUtf16Deleter> inner;
+};
+
+
+inline int32_t ICU4XGraphemeClusterBreakIteratorUtf16::next() {
+ return capi::ICU4XGraphemeClusterBreakIteratorUtf16_next(this->inner.get());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorUtf8.h b/intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorUtf8.h
new file mode 100644
index 0000000000..331b17eac7
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorUtf8.h
@@ -0,0 +1,29 @@
+#ifndef ICU4XGraphemeClusterBreakIteratorUtf8_H
+#define ICU4XGraphemeClusterBreakIteratorUtf8_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XGraphemeClusterBreakIteratorUtf8 ICU4XGraphemeClusterBreakIteratorUtf8;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+int32_t ICU4XGraphemeClusterBreakIteratorUtf8_next(ICU4XGraphemeClusterBreakIteratorUtf8* self);
+void ICU4XGraphemeClusterBreakIteratorUtf8_destroy(ICU4XGraphemeClusterBreakIteratorUtf8* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorUtf8.hpp b/intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorUtf8.hpp
new file mode 100644
index 0000000000..6e7bdcc0bd
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XGraphemeClusterBreakIteratorUtf8.hpp
@@ -0,0 +1,51 @@
+#ifndef ICU4XGraphemeClusterBreakIteratorUtf8_HPP
+#define ICU4XGraphemeClusterBreakIteratorUtf8_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XGraphemeClusterBreakIteratorUtf8.h"
+
+
+/**
+ * A destruction policy for using ICU4XGraphemeClusterBreakIteratorUtf8 with std::unique_ptr.
+ */
+struct ICU4XGraphemeClusterBreakIteratorUtf8Deleter {
+ void operator()(capi::ICU4XGraphemeClusterBreakIteratorUtf8* l) const noexcept {
+ capi::ICU4XGraphemeClusterBreakIteratorUtf8_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `GraphemeClusterBreakIterator`](https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterBreakIterator.html) for more information.
+ */
+class ICU4XGraphemeClusterBreakIteratorUtf8 {
+ public:
+
+ /**
+ * Finds the next breakpoint. Returns -1 if at the end of the string or if the index is
+ * out of range of a 32-bit signed integer.
+ *
+ * See the [Rust documentation for `next`](https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterBreakIterator.html#method.next) for more information.
+ */
+ int32_t next();
+ inline const capi::ICU4XGraphemeClusterBreakIteratorUtf8* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XGraphemeClusterBreakIteratorUtf8* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XGraphemeClusterBreakIteratorUtf8(capi::ICU4XGraphemeClusterBreakIteratorUtf8* i) : inner(i) {}
+ ICU4XGraphemeClusterBreakIteratorUtf8() = default;
+ ICU4XGraphemeClusterBreakIteratorUtf8(ICU4XGraphemeClusterBreakIteratorUtf8&&) noexcept = default;
+ ICU4XGraphemeClusterBreakIteratorUtf8& operator=(ICU4XGraphemeClusterBreakIteratorUtf8&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XGraphemeClusterBreakIteratorUtf8, ICU4XGraphemeClusterBreakIteratorUtf8Deleter> inner;
+};
+
+
+inline int32_t ICU4XGraphemeClusterBreakIteratorUtf8::next() {
+ return capi::ICU4XGraphemeClusterBreakIteratorUtf8_next(this->inner.get());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XGraphemeClusterSegmenter.h b/intl/icu_capi/cpp/include/ICU4XGraphemeClusterSegmenter.h
new file mode 100644
index 0000000000..1805090bfb
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XGraphemeClusterSegmenter.h
@@ -0,0 +1,40 @@
+#ifndef ICU4XGraphemeClusterSegmenter_H
+#define ICU4XGraphemeClusterSegmenter_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XGraphemeClusterSegmenter ICU4XGraphemeClusterSegmenter;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XGraphemeClusterSegmenter_ICU4XError.h"
+#include "ICU4XGraphemeClusterBreakIteratorUtf8.h"
+#include "ICU4XGraphemeClusterBreakIteratorUtf16.h"
+#include "ICU4XGraphemeClusterBreakIteratorLatin1.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XGraphemeClusterSegmenter_ICU4XError ICU4XGraphemeClusterSegmenter_create(const ICU4XDataProvider* provider);
+
+ICU4XGraphemeClusterBreakIteratorUtf8* ICU4XGraphemeClusterSegmenter_segment_utf8(const ICU4XGraphemeClusterSegmenter* self, const char* input_data, size_t input_len);
+
+ICU4XGraphemeClusterBreakIteratorUtf16* ICU4XGraphemeClusterSegmenter_segment_utf16(const ICU4XGraphemeClusterSegmenter* self, const uint16_t* input_data, size_t input_len);
+
+ICU4XGraphemeClusterBreakIteratorLatin1* ICU4XGraphemeClusterSegmenter_segment_latin1(const ICU4XGraphemeClusterSegmenter* self, const uint8_t* input_data, size_t input_len);
+void ICU4XGraphemeClusterSegmenter_destroy(ICU4XGraphemeClusterSegmenter* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XGraphemeClusterSegmenter.hpp b/intl/icu_capi/cpp/include/ICU4XGraphemeClusterSegmenter.hpp
new file mode 100644
index 0000000000..76941847e1
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XGraphemeClusterSegmenter.hpp
@@ -0,0 +1,106 @@
+#ifndef ICU4XGraphemeClusterSegmenter_HPP
+#define ICU4XGraphemeClusterSegmenter_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XGraphemeClusterSegmenter.h"
+
+class ICU4XDataProvider;
+class ICU4XGraphemeClusterSegmenter;
+#include "ICU4XError.hpp"
+class ICU4XGraphemeClusterBreakIteratorUtf8;
+class ICU4XGraphemeClusterBreakIteratorUtf16;
+class ICU4XGraphemeClusterBreakIteratorLatin1;
+
+/**
+ * A destruction policy for using ICU4XGraphemeClusterSegmenter with std::unique_ptr.
+ */
+struct ICU4XGraphemeClusterSegmenterDeleter {
+ void operator()(capi::ICU4XGraphemeClusterSegmenter* l) const noexcept {
+ capi::ICU4XGraphemeClusterSegmenter_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X grapheme-cluster-break segmenter, capable of finding grapheme cluster breakpoints
+ * in strings.
+ *
+ * See the [Rust documentation for `GraphemeClusterSegmenter`](https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterSegmenter.html) for more information.
+ */
+class ICU4XGraphemeClusterSegmenter {
+ public:
+
+ /**
+ * Construct an [`ICU4XGraphemeClusterSegmenter`].
+ *
+ * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterSegmenter.html#method.new) for more information.
+ */
+ static diplomat::result<ICU4XGraphemeClusterSegmenter, ICU4XError> create(const ICU4XDataProvider& provider);
+
+ /**
+ * Segments a (potentially ill-formed) UTF-8 string.
+ *
+ * See the [Rust documentation for `segment_utf8`](https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterSegmenter.html#method.segment_utf8) for more information.
+ *
+ * Lifetimes: `this`, `input` must live at least as long as the output.
+ */
+ ICU4XGraphemeClusterBreakIteratorUtf8 segment_utf8(const std::string_view input) const;
+
+ /**
+ * Segments a UTF-16 string.
+ *
+ * See the [Rust documentation for `segment_utf16`](https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterSegmenter.html#method.segment_utf16) for more information.
+ *
+ * Lifetimes: `this`, `input` must live at least as long as the output.
+ */
+ ICU4XGraphemeClusterBreakIteratorUtf16 segment_utf16(const diplomat::span<const uint16_t> input) const;
+
+ /**
+ * Segments a Latin-1 string.
+ *
+ * See the [Rust documentation for `segment_latin1`](https://docs.rs/icu/latest/icu/segmenter/struct.GraphemeClusterSegmenter.html#method.segment_latin1) for more information.
+ *
+ * Lifetimes: `this`, `input` must live at least as long as the output.
+ */
+ ICU4XGraphemeClusterBreakIteratorLatin1 segment_latin1(const diplomat::span<const uint8_t> input) const;
+ inline const capi::ICU4XGraphemeClusterSegmenter* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XGraphemeClusterSegmenter* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XGraphemeClusterSegmenter(capi::ICU4XGraphemeClusterSegmenter* i) : inner(i) {}
+ ICU4XGraphemeClusterSegmenter() = default;
+ ICU4XGraphemeClusterSegmenter(ICU4XGraphemeClusterSegmenter&&) noexcept = default;
+ ICU4XGraphemeClusterSegmenter& operator=(ICU4XGraphemeClusterSegmenter&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XGraphemeClusterSegmenter, ICU4XGraphemeClusterSegmenterDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XGraphemeClusterBreakIteratorUtf8.hpp"
+#include "ICU4XGraphemeClusterBreakIteratorUtf16.hpp"
+#include "ICU4XGraphemeClusterBreakIteratorLatin1.hpp"
+
+inline diplomat::result<ICU4XGraphemeClusterSegmenter, ICU4XError> ICU4XGraphemeClusterSegmenter::create(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XGraphemeClusterSegmenter_create(provider.AsFFI());
+ diplomat::result<ICU4XGraphemeClusterSegmenter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XGraphemeClusterSegmenter>(ICU4XGraphemeClusterSegmenter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XGraphemeClusterBreakIteratorUtf8 ICU4XGraphemeClusterSegmenter::segment_utf8(const std::string_view input) const {
+ return ICU4XGraphemeClusterBreakIteratorUtf8(capi::ICU4XGraphemeClusterSegmenter_segment_utf8(this->inner.get(), input.data(), input.size()));
+}
+inline ICU4XGraphemeClusterBreakIteratorUtf16 ICU4XGraphemeClusterSegmenter::segment_utf16(const diplomat::span<const uint16_t> input) const {
+ return ICU4XGraphemeClusterBreakIteratorUtf16(capi::ICU4XGraphemeClusterSegmenter_segment_utf16(this->inner.get(), input.data(), input.size()));
+}
+inline ICU4XGraphemeClusterBreakIteratorLatin1 ICU4XGraphemeClusterSegmenter::segment_latin1(const diplomat::span<const uint8_t> input) const {
+ return ICU4XGraphemeClusterBreakIteratorLatin1(capi::ICU4XGraphemeClusterSegmenter_segment_latin1(this->inner.get(), input.data(), input.size()));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XGregorianDateFormatter.h b/intl/icu_capi/cpp/include/ICU4XGregorianDateFormatter.h
new file mode 100644
index 0000000000..cf3ad9e9f4
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XGregorianDateFormatter.h
@@ -0,0 +1,40 @@
+#ifndef ICU4XGregorianDateFormatter_H
+#define ICU4XGregorianDateFormatter_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XGregorianDateFormatter ICU4XGregorianDateFormatter;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "ICU4XLocale.h"
+#include "ICU4XDateLength.h"
+#include "diplomat_result_box_ICU4XGregorianDateFormatter_ICU4XError.h"
+#include "ICU4XIsoDate.h"
+#include "diplomat_result_void_ICU4XError.h"
+#include "ICU4XIsoDateTime.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XGregorianDateFormatter_ICU4XError ICU4XGregorianDateFormatter_create_with_length(const ICU4XDataProvider* provider, const ICU4XLocale* locale, ICU4XDateLength length);
+
+diplomat_result_void_ICU4XError ICU4XGregorianDateFormatter_format_iso_date(const ICU4XGregorianDateFormatter* self, const ICU4XIsoDate* value, DiplomatWriteable* write);
+
+diplomat_result_void_ICU4XError ICU4XGregorianDateFormatter_format_iso_datetime(const ICU4XGregorianDateFormatter* self, const ICU4XIsoDateTime* value, DiplomatWriteable* write);
+void ICU4XGregorianDateFormatter_destroy(ICU4XGregorianDateFormatter* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XGregorianDateFormatter.hpp b/intl/icu_capi/cpp/include/ICU4XGregorianDateFormatter.hpp
new file mode 100644
index 0000000000..01b8c95015
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XGregorianDateFormatter.hpp
@@ -0,0 +1,145 @@
+#ifndef ICU4XGregorianDateFormatter_HPP
+#define ICU4XGregorianDateFormatter_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XGregorianDateFormatter.h"
+
+class ICU4XDataProvider;
+class ICU4XLocale;
+#include "ICU4XDateLength.hpp"
+class ICU4XGregorianDateFormatter;
+#include "ICU4XError.hpp"
+class ICU4XIsoDate;
+class ICU4XIsoDateTime;
+
+/**
+ * A destruction policy for using ICU4XGregorianDateFormatter with std::unique_ptr.
+ */
+struct ICU4XGregorianDateFormatterDeleter {
+ void operator()(capi::ICU4XGregorianDateFormatter* l) const noexcept {
+ capi::ICU4XGregorianDateFormatter_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X TypedDateFormatter object capable of formatting a [`ICU4XIsoDateTime`] as a string,
+ * using the Gregorian Calendar.
+ *
+ * See the [Rust documentation for `TypedDateFormatter`](https://docs.rs/icu/latest/icu/datetime/struct.TypedDateFormatter.html) for more information.
+ */
+class ICU4XGregorianDateFormatter {
+ public:
+
+ /**
+ * Creates a new [`ICU4XGregorianDateFormatter`] from locale data.
+ *
+ * See the [Rust documentation for `try_new_with_length`](https://docs.rs/icu/latest/icu/datetime/struct.TypedDateFormatter.html#method.try_new_with_length) for more information.
+ */
+ static diplomat::result<ICU4XGregorianDateFormatter, ICU4XError> create_with_length(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength length);
+
+ /**
+ * Formats a [`ICU4XIsoDate`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.TypedDateFormatter.html#method.format) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> format_iso_date_to_writeable(const ICU4XIsoDate& value, W& write) const;
+
+ /**
+ * Formats a [`ICU4XIsoDate`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.TypedDateFormatter.html#method.format) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> format_iso_date(const ICU4XIsoDate& value) const;
+
+ /**
+ * Formats a [`ICU4XIsoDateTime`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.TypedDateFormatter.html#method.format) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> format_iso_datetime_to_writeable(const ICU4XIsoDateTime& value, W& write) const;
+
+ /**
+ * Formats a [`ICU4XIsoDateTime`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.TypedDateFormatter.html#method.format) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> format_iso_datetime(const ICU4XIsoDateTime& value) const;
+ inline const capi::ICU4XGregorianDateFormatter* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XGregorianDateFormatter* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XGregorianDateFormatter(capi::ICU4XGregorianDateFormatter* i) : inner(i) {}
+ ICU4XGregorianDateFormatter() = default;
+ ICU4XGregorianDateFormatter(ICU4XGregorianDateFormatter&&) noexcept = default;
+ ICU4XGregorianDateFormatter& operator=(ICU4XGregorianDateFormatter&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XGregorianDateFormatter, ICU4XGregorianDateFormatterDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocale.hpp"
+#include "ICU4XIsoDate.hpp"
+#include "ICU4XIsoDateTime.hpp"
+
+inline diplomat::result<ICU4XGregorianDateFormatter, ICU4XError> ICU4XGregorianDateFormatter::create_with_length(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength length) {
+ auto diplomat_result_raw_out_value = capi::ICU4XGregorianDateFormatter_create_with_length(provider.AsFFI(), locale.AsFFI(), static_cast<capi::ICU4XDateLength>(length));
+ diplomat::result<ICU4XGregorianDateFormatter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XGregorianDateFormatter>(ICU4XGregorianDateFormatter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XGregorianDateFormatter::format_iso_date_to_writeable(const ICU4XIsoDate& value, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XGregorianDateFormatter_format_iso_date(this->inner.get(), value.AsFFI(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XGregorianDateFormatter::format_iso_date(const ICU4XIsoDate& value) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XGregorianDateFormatter_format_iso_date(this->inner.get(), value.AsFFI(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XGregorianDateFormatter::format_iso_datetime_to_writeable(const ICU4XIsoDateTime& value, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XGregorianDateFormatter_format_iso_datetime(this->inner.get(), value.AsFFI(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XGregorianDateFormatter::format_iso_datetime(const ICU4XIsoDateTime& value) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XGregorianDateFormatter_format_iso_datetime(this->inner.get(), value.AsFFI(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XGregorianDateTimeFormatter.h b/intl/icu_capi/cpp/include/ICU4XGregorianDateTimeFormatter.h
new file mode 100644
index 0000000000..0b56ddc393
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XGregorianDateTimeFormatter.h
@@ -0,0 +1,38 @@
+#ifndef ICU4XGregorianDateTimeFormatter_H
+#define ICU4XGregorianDateTimeFormatter_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XGregorianDateTimeFormatter ICU4XGregorianDateTimeFormatter;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "ICU4XLocale.h"
+#include "ICU4XDateLength.h"
+#include "ICU4XTimeLength.h"
+#include "diplomat_result_box_ICU4XGregorianDateTimeFormatter_ICU4XError.h"
+#include "ICU4XIsoDateTime.h"
+#include "diplomat_result_void_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XGregorianDateTimeFormatter_ICU4XError ICU4XGregorianDateTimeFormatter_create_with_lengths(const ICU4XDataProvider* provider, const ICU4XLocale* locale, ICU4XDateLength date_length, ICU4XTimeLength time_length);
+
+diplomat_result_void_ICU4XError ICU4XGregorianDateTimeFormatter_format_iso_datetime(const ICU4XGregorianDateTimeFormatter* self, const ICU4XIsoDateTime* value, DiplomatWriteable* write);
+void ICU4XGregorianDateTimeFormatter_destroy(ICU4XGregorianDateTimeFormatter* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XGregorianDateTimeFormatter.hpp b/intl/icu_capi/cpp/include/ICU4XGregorianDateTimeFormatter.hpp
new file mode 100644
index 0000000000..ce0fbc6704
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XGregorianDateTimeFormatter.hpp
@@ -0,0 +1,107 @@
+#ifndef ICU4XGregorianDateTimeFormatter_HPP
+#define ICU4XGregorianDateTimeFormatter_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XGregorianDateTimeFormatter.h"
+
+class ICU4XDataProvider;
+class ICU4XLocale;
+#include "ICU4XDateLength.hpp"
+#include "ICU4XTimeLength.hpp"
+class ICU4XGregorianDateTimeFormatter;
+#include "ICU4XError.hpp"
+class ICU4XIsoDateTime;
+
+/**
+ * A destruction policy for using ICU4XGregorianDateTimeFormatter with std::unique_ptr.
+ */
+struct ICU4XGregorianDateTimeFormatterDeleter {
+ void operator()(capi::ICU4XGregorianDateTimeFormatter* l) const noexcept {
+ capi::ICU4XGregorianDateTimeFormatter_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X TypedDateTimeFormatter object capable of formatting a [`ICU4XIsoDateTime`] as a string,
+ * using the Gregorian Calendar.
+ *
+ * See the [Rust documentation for `TypedDateTimeFormatter`](https://docs.rs/icu/latest/icu/datetime/struct.TypedDateTimeFormatter.html) for more information.
+ */
+class ICU4XGregorianDateTimeFormatter {
+ public:
+
+ /**
+ * Creates a new [`ICU4XGregorianDateFormatter`] from locale data.
+ *
+ * See the [Rust documentation for `try_new`](https://docs.rs/icu/latest/icu/datetime/struct.TypedDateTimeFormatter.html#method.try_new) for more information.
+ */
+ static diplomat::result<ICU4XGregorianDateTimeFormatter, ICU4XError> create_with_lengths(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength date_length, ICU4XTimeLength time_length);
+
+ /**
+ * Formats a [`ICU4XIsoDateTime`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.TypedDateTimeFormatter.html#method.format) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> format_iso_datetime_to_writeable(const ICU4XIsoDateTime& value, W& write) const;
+
+ /**
+ * Formats a [`ICU4XIsoDateTime`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.TypedDateTimeFormatter.html#method.format) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> format_iso_datetime(const ICU4XIsoDateTime& value) const;
+ inline const capi::ICU4XGregorianDateTimeFormatter* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XGregorianDateTimeFormatter* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XGregorianDateTimeFormatter(capi::ICU4XGregorianDateTimeFormatter* i) : inner(i) {}
+ ICU4XGregorianDateTimeFormatter() = default;
+ ICU4XGregorianDateTimeFormatter(ICU4XGregorianDateTimeFormatter&&) noexcept = default;
+ ICU4XGregorianDateTimeFormatter& operator=(ICU4XGregorianDateTimeFormatter&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XGregorianDateTimeFormatter, ICU4XGregorianDateTimeFormatterDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocale.hpp"
+#include "ICU4XIsoDateTime.hpp"
+
+inline diplomat::result<ICU4XGregorianDateTimeFormatter, ICU4XError> ICU4XGregorianDateTimeFormatter::create_with_lengths(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength date_length, ICU4XTimeLength time_length) {
+ auto diplomat_result_raw_out_value = capi::ICU4XGregorianDateTimeFormatter_create_with_lengths(provider.AsFFI(), locale.AsFFI(), static_cast<capi::ICU4XDateLength>(date_length), static_cast<capi::ICU4XTimeLength>(time_length));
+ diplomat::result<ICU4XGregorianDateTimeFormatter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XGregorianDateTimeFormatter>(ICU4XGregorianDateTimeFormatter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XGregorianDateTimeFormatter::format_iso_datetime_to_writeable(const ICU4XIsoDateTime& value, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XGregorianDateTimeFormatter_format_iso_datetime(this->inner.get(), value.AsFFI(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XGregorianDateTimeFormatter::format_iso_datetime(const ICU4XIsoDateTime& value) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XGregorianDateTimeFormatter_format_iso_datetime(this->inner.get(), value.AsFFI(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XGregorianZonedDateTimeFormatter.h b/intl/icu_capi/cpp/include/ICU4XGregorianZonedDateTimeFormatter.h
new file mode 100644
index 0000000000..4be60c2b0b
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XGregorianZonedDateTimeFormatter.h
@@ -0,0 +1,42 @@
+#ifndef ICU4XGregorianZonedDateTimeFormatter_H
+#define ICU4XGregorianZonedDateTimeFormatter_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XGregorianZonedDateTimeFormatter ICU4XGregorianZonedDateTimeFormatter;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "ICU4XLocale.h"
+#include "ICU4XDateLength.h"
+#include "ICU4XTimeLength.h"
+#include "diplomat_result_box_ICU4XGregorianZonedDateTimeFormatter_ICU4XError.h"
+#include "ICU4XIsoTimeZoneOptions.h"
+#include "ICU4XIsoDateTime.h"
+#include "ICU4XCustomTimeZone.h"
+#include "diplomat_result_void_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XGregorianZonedDateTimeFormatter_ICU4XError ICU4XGregorianZonedDateTimeFormatter_create_with_lengths(const ICU4XDataProvider* provider, const ICU4XLocale* locale, ICU4XDateLength date_length, ICU4XTimeLength time_length);
+
+diplomat_result_box_ICU4XGregorianZonedDateTimeFormatter_ICU4XError ICU4XGregorianZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback(const ICU4XDataProvider* provider, const ICU4XLocale* locale, ICU4XDateLength date_length, ICU4XTimeLength time_length, ICU4XIsoTimeZoneOptions zone_options);
+
+diplomat_result_void_ICU4XError ICU4XGregorianZonedDateTimeFormatter_format_iso_datetime_with_custom_time_zone(const ICU4XGregorianZonedDateTimeFormatter* self, const ICU4XIsoDateTime* datetime, const ICU4XCustomTimeZone* time_zone, DiplomatWriteable* write);
+void ICU4XGregorianZonedDateTimeFormatter_destroy(ICU4XGregorianZonedDateTimeFormatter* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XGregorianZonedDateTimeFormatter.hpp b/intl/icu_capi/cpp/include/ICU4XGregorianZonedDateTimeFormatter.hpp
new file mode 100644
index 0000000000..9f86f4bfda
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XGregorianZonedDateTimeFormatter.hpp
@@ -0,0 +1,134 @@
+#ifndef ICU4XGregorianZonedDateTimeFormatter_HPP
+#define ICU4XGregorianZonedDateTimeFormatter_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XGregorianZonedDateTimeFormatter.h"
+
+class ICU4XDataProvider;
+class ICU4XLocale;
+#include "ICU4XDateLength.hpp"
+#include "ICU4XTimeLength.hpp"
+class ICU4XGregorianZonedDateTimeFormatter;
+#include "ICU4XError.hpp"
+struct ICU4XIsoTimeZoneOptions;
+class ICU4XIsoDateTime;
+class ICU4XCustomTimeZone;
+
+/**
+ * A destruction policy for using ICU4XGregorianZonedDateTimeFormatter with std::unique_ptr.
+ */
+struct ICU4XGregorianZonedDateTimeFormatterDeleter {
+ void operator()(capi::ICU4XGregorianZonedDateTimeFormatter* l) const noexcept {
+ capi::ICU4XGregorianZonedDateTimeFormatter_destroy(l);
+ }
+};
+
+/**
+ * An object capable of formatting a date time with time zone to a string.
+ *
+ * See the [Rust documentation for `TypedZonedDateTimeFormatter`](https://docs.rs/icu/latest/icu/datetime/struct.TypedZonedDateTimeFormatter.html) for more information.
+ */
+class ICU4XGregorianZonedDateTimeFormatter {
+ public:
+
+ /**
+ * Creates a new [`ICU4XGregorianZonedDateTimeFormatter`] from locale data.
+ *
+ * This function has `date_length` and `time_length` arguments and uses default options
+ * for the time zone.
+ *
+ * See the [Rust documentation for `try_new`](https://docs.rs/icu/latest/icu/datetime/struct.TypedZonedDateTimeFormatter.html#method.try_new) for more information.
+ */
+ static diplomat::result<ICU4XGregorianZonedDateTimeFormatter, ICU4XError> create_with_lengths(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength date_length, ICU4XTimeLength time_length);
+
+ /**
+ * Creates a new [`ICU4XGregorianZonedDateTimeFormatter`] from locale data.
+ *
+ * This function has `date_length` and `time_length` arguments and uses an ISO-8601 style
+ * fallback for the time zone with the given configurations.
+ *
+ * See the [Rust documentation for `try_new`](https://docs.rs/icu/latest/icu/datetime/struct.TypedZonedDateTimeFormatter.html#method.try_new) for more information.
+ */
+ static diplomat::result<ICU4XGregorianZonedDateTimeFormatter, ICU4XError> create_with_lengths_and_iso_8601_time_zone_fallback(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength date_length, ICU4XTimeLength time_length, ICU4XIsoTimeZoneOptions zone_options);
+
+ /**
+ * Formats a [`ICU4XIsoDateTime`] and [`ICU4XCustomTimeZone`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.TypedZonedDateTimeFormatter.html#method.format) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> format_iso_datetime_with_custom_time_zone_to_writeable(const ICU4XIsoDateTime& datetime, const ICU4XCustomTimeZone& time_zone, W& write) const;
+
+ /**
+ * Formats a [`ICU4XIsoDateTime`] and [`ICU4XCustomTimeZone`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.TypedZonedDateTimeFormatter.html#method.format) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> format_iso_datetime_with_custom_time_zone(const ICU4XIsoDateTime& datetime, const ICU4XCustomTimeZone& time_zone) const;
+ inline const capi::ICU4XGregorianZonedDateTimeFormatter* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XGregorianZonedDateTimeFormatter* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XGregorianZonedDateTimeFormatter(capi::ICU4XGregorianZonedDateTimeFormatter* i) : inner(i) {}
+ ICU4XGregorianZonedDateTimeFormatter() = default;
+ ICU4XGregorianZonedDateTimeFormatter(ICU4XGregorianZonedDateTimeFormatter&&) noexcept = default;
+ ICU4XGregorianZonedDateTimeFormatter& operator=(ICU4XGregorianZonedDateTimeFormatter&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XGregorianZonedDateTimeFormatter, ICU4XGregorianZonedDateTimeFormatterDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocale.hpp"
+#include "ICU4XIsoTimeZoneOptions.hpp"
+#include "ICU4XIsoDateTime.hpp"
+#include "ICU4XCustomTimeZone.hpp"
+
+inline diplomat::result<ICU4XGregorianZonedDateTimeFormatter, ICU4XError> ICU4XGregorianZonedDateTimeFormatter::create_with_lengths(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength date_length, ICU4XTimeLength time_length) {
+ auto diplomat_result_raw_out_value = capi::ICU4XGregorianZonedDateTimeFormatter_create_with_lengths(provider.AsFFI(), locale.AsFFI(), static_cast<capi::ICU4XDateLength>(date_length), static_cast<capi::ICU4XTimeLength>(time_length));
+ diplomat::result<ICU4XGregorianZonedDateTimeFormatter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XGregorianZonedDateTimeFormatter>(ICU4XGregorianZonedDateTimeFormatter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XGregorianZonedDateTimeFormatter, ICU4XError> ICU4XGregorianZonedDateTimeFormatter::create_with_lengths_and_iso_8601_time_zone_fallback(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength date_length, ICU4XTimeLength time_length, ICU4XIsoTimeZoneOptions zone_options) {
+ ICU4XIsoTimeZoneOptions diplomat_wrapped_struct_zone_options = zone_options;
+ auto diplomat_result_raw_out_value = capi::ICU4XGregorianZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback(provider.AsFFI(), locale.AsFFI(), static_cast<capi::ICU4XDateLength>(date_length), static_cast<capi::ICU4XTimeLength>(time_length), capi::ICU4XIsoTimeZoneOptions{ .format = static_cast<capi::ICU4XIsoTimeZoneFormat>(diplomat_wrapped_struct_zone_options.format), .minutes = static_cast<capi::ICU4XIsoTimeZoneMinuteDisplay>(diplomat_wrapped_struct_zone_options.minutes), .seconds = static_cast<capi::ICU4XIsoTimeZoneSecondDisplay>(diplomat_wrapped_struct_zone_options.seconds) });
+ diplomat::result<ICU4XGregorianZonedDateTimeFormatter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XGregorianZonedDateTimeFormatter>(ICU4XGregorianZonedDateTimeFormatter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XGregorianZonedDateTimeFormatter::format_iso_datetime_with_custom_time_zone_to_writeable(const ICU4XIsoDateTime& datetime, const ICU4XCustomTimeZone& time_zone, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XGregorianZonedDateTimeFormatter_format_iso_datetime_with_custom_time_zone(this->inner.get(), datetime.AsFFI(), time_zone.AsFFI(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XGregorianZonedDateTimeFormatter::format_iso_datetime_with_custom_time_zone(const ICU4XIsoDateTime& datetime, const ICU4XCustomTimeZone& time_zone) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XGregorianZonedDateTimeFormatter_format_iso_datetime_with_custom_time_zone(this->inner.get(), datetime.AsFFI(), time_zone.AsFFI(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XIanaToBcp47Mapper.h b/intl/icu_capi/cpp/include/ICU4XIanaToBcp47Mapper.h
new file mode 100644
index 0000000000..e06433b6d0
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XIanaToBcp47Mapper.h
@@ -0,0 +1,31 @@
+#ifndef ICU4XIanaToBcp47Mapper_H
+#define ICU4XIanaToBcp47Mapper_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XIanaToBcp47Mapper ICU4XIanaToBcp47Mapper;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XIanaToBcp47Mapper_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XIanaToBcp47Mapper_ICU4XError ICU4XIanaToBcp47Mapper_create(const ICU4XDataProvider* provider);
+void ICU4XIanaToBcp47Mapper_destroy(ICU4XIanaToBcp47Mapper* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XIanaToBcp47Mapper.hpp b/intl/icu_capi/cpp/include/ICU4XIanaToBcp47Mapper.hpp
new file mode 100644
index 0000000000..69b4d691fd
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XIanaToBcp47Mapper.hpp
@@ -0,0 +1,65 @@
+#ifndef ICU4XIanaToBcp47Mapper_HPP
+#define ICU4XIanaToBcp47Mapper_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XIanaToBcp47Mapper.h"
+
+class ICU4XDataProvider;
+class ICU4XIanaToBcp47Mapper;
+#include "ICU4XError.hpp"
+
+/**
+ * A destruction policy for using ICU4XIanaToBcp47Mapper with std::unique_ptr.
+ */
+struct ICU4XIanaToBcp47MapperDeleter {
+ void operator()(capi::ICU4XIanaToBcp47Mapper* l) const noexcept {
+ capi::ICU4XIanaToBcp47Mapper_destroy(l);
+ }
+};
+
+/**
+ * An object capable of mapping from an IANA time zone ID to a BCP-47 ID.
+ *
+ * This can be used via `try_set_iana_time_zone_id()` on [`ICU4XCustomTimeZone`].
+ *
+ * [`ICU4XCustomTimeZone`]: crate::timezone::ffi::ICU4XCustomTimeZone
+ *
+ * See the [Rust documentation for `IanaToBcp47Mapper`](https://docs.rs/icu/latest/icu/timezone/struct.IanaToBcp47Mapper.html) for more information.
+ */
+class ICU4XIanaToBcp47Mapper {
+ public:
+
+ /**
+ * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/timezone/struct.IanaToBcp47Mapper.html#method.new) for more information.
+ */
+ static diplomat::result<ICU4XIanaToBcp47Mapper, ICU4XError> create(const ICU4XDataProvider& provider);
+ inline const capi::ICU4XIanaToBcp47Mapper* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XIanaToBcp47Mapper* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XIanaToBcp47Mapper(capi::ICU4XIanaToBcp47Mapper* i) : inner(i) {}
+ ICU4XIanaToBcp47Mapper() = default;
+ ICU4XIanaToBcp47Mapper(ICU4XIanaToBcp47Mapper&&) noexcept = default;
+ ICU4XIanaToBcp47Mapper& operator=(ICU4XIanaToBcp47Mapper&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XIanaToBcp47Mapper, ICU4XIanaToBcp47MapperDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+
+inline diplomat::result<ICU4XIanaToBcp47Mapper, ICU4XError> ICU4XIanaToBcp47Mapper::create(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XIanaToBcp47Mapper_create(provider.AsFFI());
+ diplomat::result<ICU4XIanaToBcp47Mapper, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XIanaToBcp47Mapper>(ICU4XIanaToBcp47Mapper(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XIsoDate.h b/intl/icu_capi/cpp/include/ICU4XIsoDate.h
new file mode 100644
index 0000000000..d7a018244a
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XIsoDate.h
@@ -0,0 +1,61 @@
+#ifndef ICU4XIsoDate_H
+#define ICU4XIsoDate_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XIsoDate ICU4XIsoDate;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "diplomat_result_box_ICU4XIsoDate_ICU4XError.h"
+#include "ICU4XCalendar.h"
+#include "ICU4XDate.h"
+#include "ICU4XIsoWeekday.h"
+#include "ICU4XWeekCalculator.h"
+#include "diplomat_result_ICU4XWeekOf_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XIsoDate_ICU4XError ICU4XIsoDate_create(int32_t year, uint8_t month, uint8_t day);
+
+ICU4XIsoDate* ICU4XIsoDate_create_for_unix_epoch();
+
+ICU4XDate* ICU4XIsoDate_to_calendar(const ICU4XIsoDate* self, const ICU4XCalendar* calendar);
+
+ICU4XDate* ICU4XIsoDate_to_any(const ICU4XIsoDate* self);
+
+uint32_t ICU4XIsoDate_day_of_month(const ICU4XIsoDate* self);
+
+ICU4XIsoWeekday ICU4XIsoDate_day_of_week(const ICU4XIsoDate* self);
+
+uint32_t ICU4XIsoDate_week_of_month(const ICU4XIsoDate* self, ICU4XIsoWeekday first_weekday);
+
+diplomat_result_ICU4XWeekOf_ICU4XError ICU4XIsoDate_week_of_year(const ICU4XIsoDate* self, const ICU4XWeekCalculator* calculator);
+
+uint32_t ICU4XIsoDate_month(const ICU4XIsoDate* self);
+
+int32_t ICU4XIsoDate_year(const ICU4XIsoDate* self);
+
+bool ICU4XIsoDate_is_in_leap_year(const ICU4XIsoDate* self);
+
+uint8_t ICU4XIsoDate_months_in_year(const ICU4XIsoDate* self);
+
+uint8_t ICU4XIsoDate_days_in_month(const ICU4XIsoDate* self);
+
+uint16_t ICU4XIsoDate_days_in_year(const ICU4XIsoDate* self);
+void ICU4XIsoDate_destroy(ICU4XIsoDate* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XIsoDate.hpp b/intl/icu_capi/cpp/include/ICU4XIsoDate.hpp
new file mode 100644
index 0000000000..ba91918f6d
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XIsoDate.hpp
@@ -0,0 +1,209 @@
+#ifndef ICU4XIsoDate_HPP
+#define ICU4XIsoDate_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XIsoDate.h"
+
+class ICU4XIsoDate;
+#include "ICU4XError.hpp"
+class ICU4XCalendar;
+class ICU4XDate;
+#include "ICU4XIsoWeekday.hpp"
+class ICU4XWeekCalculator;
+struct ICU4XWeekOf;
+
+/**
+ * A destruction policy for using ICU4XIsoDate with std::unique_ptr.
+ */
+struct ICU4XIsoDateDeleter {
+ void operator()(capi::ICU4XIsoDate* l) const noexcept {
+ capi::ICU4XIsoDate_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X Date object capable of containing a ISO-8601 date
+ *
+ * See the [Rust documentation for `Date`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html) for more information.
+ */
+class ICU4XIsoDate {
+ public:
+
+ /**
+ * Creates a new [`ICU4XIsoDate`] from the specified date and time.
+ *
+ * See the [Rust documentation for `try_new_iso_date`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.try_new_iso_date) for more information.
+ */
+ static diplomat::result<ICU4XIsoDate, ICU4XError> create(int32_t year, uint8_t month, uint8_t day);
+
+ /**
+ * Creates a new [`ICU4XIsoDate`] representing January 1, 1970.
+ *
+ * See the [Rust documentation for `unix_epoch`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.unix_epoch) for more information.
+ */
+ static ICU4XIsoDate create_for_unix_epoch();
+
+ /**
+ * Convert this date to one in a different calendar
+ *
+ * See the [Rust documentation for `to_calendar`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.to_calendar) for more information.
+ */
+ ICU4XDate to_calendar(const ICU4XCalendar& calendar) const;
+
+ /**
+ * See the [Rust documentation for `to_any`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.to_any) for more information.
+ */
+ ICU4XDate to_any() const;
+
+ /**
+ * Returns the 1-indexed day in the month for this date
+ *
+ * See the [Rust documentation for `day_of_month`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.day_of_month) for more information.
+ */
+ uint32_t day_of_month() const;
+
+ /**
+ * Returns the day in the week for this day
+ *
+ * See the [Rust documentation for `day_of_week`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.day_of_week) for more information.
+ */
+ ICU4XIsoWeekday day_of_week() const;
+
+ /**
+ * Returns the week number in this month, 1-indexed, based on what
+ * is considered the first day of the week (often a locale preference).
+ *
+ * `first_weekday` can be obtained via `first_weekday()` on [`ICU4XWeekCalculator`]
+ *
+ * See the [Rust documentation for `week_of_month`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.week_of_month) for more information.
+ */
+ uint32_t week_of_month(ICU4XIsoWeekday first_weekday) const;
+
+ /**
+ * Returns the week number in this year, using week data
+ *
+ * See the [Rust documentation for `week_of_year`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.week_of_year) for more information.
+ */
+ diplomat::result<ICU4XWeekOf, ICU4XError> week_of_year(const ICU4XWeekCalculator& calculator) const;
+
+ /**
+ * Returns 1-indexed number of the month of this date in its year
+ *
+ * See the [Rust documentation for `month`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.month) for more information.
+ */
+ uint32_t month() const;
+
+ /**
+ * Returns the year number for this date
+ *
+ * See the [Rust documentation for `year`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.year) for more information.
+ */
+ int32_t year() const;
+
+ /**
+ * Returns if the year is a leap year for this date
+ *
+ * See the [Rust documentation for `is_in_leap_year`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.is_in_leap_year) for more information.
+ */
+ bool is_in_leap_year() const;
+
+ /**
+ * Returns the number of months in the year represented by this date
+ *
+ * See the [Rust documentation for `months_in_year`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.months_in_year) for more information.
+ */
+ uint8_t months_in_year() const;
+
+ /**
+ * Returns the number of days in the month represented by this date
+ *
+ * See the [Rust documentation for `days_in_month`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.days_in_month) for more information.
+ */
+ uint8_t days_in_month() const;
+
+ /**
+ * Returns the number of days in the year represented by this date
+ *
+ * See the [Rust documentation for `days_in_year`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.days_in_year) for more information.
+ */
+ uint16_t days_in_year() const;
+ inline const capi::ICU4XIsoDate* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XIsoDate* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XIsoDate(capi::ICU4XIsoDate* i) : inner(i) {}
+ ICU4XIsoDate() = default;
+ ICU4XIsoDate(ICU4XIsoDate&&) noexcept = default;
+ ICU4XIsoDate& operator=(ICU4XIsoDate&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XIsoDate, ICU4XIsoDateDeleter> inner;
+};
+
+#include "ICU4XCalendar.hpp"
+#include "ICU4XDate.hpp"
+#include "ICU4XWeekCalculator.hpp"
+#include "ICU4XWeekOf.hpp"
+
+inline diplomat::result<ICU4XIsoDate, ICU4XError> ICU4XIsoDate::create(int32_t year, uint8_t month, uint8_t day) {
+ auto diplomat_result_raw_out_value = capi::ICU4XIsoDate_create(year, month, day);
+ diplomat::result<ICU4XIsoDate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XIsoDate>(ICU4XIsoDate(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XIsoDate ICU4XIsoDate::create_for_unix_epoch() {
+ return ICU4XIsoDate(capi::ICU4XIsoDate_create_for_unix_epoch());
+}
+inline ICU4XDate ICU4XIsoDate::to_calendar(const ICU4XCalendar& calendar) const {
+ return ICU4XDate(capi::ICU4XIsoDate_to_calendar(this->inner.get(), calendar.AsFFI()));
+}
+inline ICU4XDate ICU4XIsoDate::to_any() const {
+ return ICU4XDate(capi::ICU4XIsoDate_to_any(this->inner.get()));
+}
+inline uint32_t ICU4XIsoDate::day_of_month() const {
+ return capi::ICU4XIsoDate_day_of_month(this->inner.get());
+}
+inline ICU4XIsoWeekday ICU4XIsoDate::day_of_week() const {
+ return static_cast<ICU4XIsoWeekday>(capi::ICU4XIsoDate_day_of_week(this->inner.get()));
+}
+inline uint32_t ICU4XIsoDate::week_of_month(ICU4XIsoWeekday first_weekday) const {
+ return capi::ICU4XIsoDate_week_of_month(this->inner.get(), static_cast<capi::ICU4XIsoWeekday>(first_weekday));
+}
+inline diplomat::result<ICU4XWeekOf, ICU4XError> ICU4XIsoDate::week_of_year(const ICU4XWeekCalculator& calculator) const {
+ auto diplomat_result_raw_out_value = capi::ICU4XIsoDate_week_of_year(this->inner.get(), calculator.AsFFI());
+ diplomat::result<ICU4XWeekOf, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ capi::ICU4XWeekOf diplomat_raw_struct_out_value = diplomat_result_raw_out_value.ok;
+ diplomat_result_out_value = diplomat::Ok<ICU4XWeekOf>(ICU4XWeekOf{ .week = std::move(diplomat_raw_struct_out_value.week), .unit = std::move(static_cast<ICU4XWeekRelativeUnit>(diplomat_raw_struct_out_value.unit)) });
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline uint32_t ICU4XIsoDate::month() const {
+ return capi::ICU4XIsoDate_month(this->inner.get());
+}
+inline int32_t ICU4XIsoDate::year() const {
+ return capi::ICU4XIsoDate_year(this->inner.get());
+}
+inline bool ICU4XIsoDate::is_in_leap_year() const {
+ return capi::ICU4XIsoDate_is_in_leap_year(this->inner.get());
+}
+inline uint8_t ICU4XIsoDate::months_in_year() const {
+ return capi::ICU4XIsoDate_months_in_year(this->inner.get());
+}
+inline uint8_t ICU4XIsoDate::days_in_month() const {
+ return capi::ICU4XIsoDate_days_in_month(this->inner.get());
+}
+inline uint16_t ICU4XIsoDate::days_in_year() const {
+ return capi::ICU4XIsoDate_days_in_year(this->inner.get());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XIsoDateTime.h b/intl/icu_capi/cpp/include/ICU4XIsoDateTime.h
new file mode 100644
index 0000000000..404cbfedc8
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XIsoDateTime.h
@@ -0,0 +1,79 @@
+#ifndef ICU4XIsoDateTime_H
+#define ICU4XIsoDateTime_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XIsoDateTime ICU4XIsoDateTime;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "diplomat_result_box_ICU4XIsoDateTime_ICU4XError.h"
+#include "ICU4XIsoDate.h"
+#include "ICU4XTime.h"
+#include "ICU4XDateTime.h"
+#include "ICU4XCalendar.h"
+#include "ICU4XIsoWeekday.h"
+#include "ICU4XWeekCalculator.h"
+#include "diplomat_result_ICU4XWeekOf_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XIsoDateTime_ICU4XError ICU4XIsoDateTime_create(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond);
+
+ICU4XIsoDateTime* ICU4XIsoDateTime_crate_from_date_and_time(const ICU4XIsoDate* date, const ICU4XTime* time);
+
+ICU4XIsoDateTime* ICU4XIsoDateTime_create_from_minutes_since_local_unix_epoch(int32_t minutes);
+
+ICU4XIsoDate* ICU4XIsoDateTime_date(const ICU4XIsoDateTime* self);
+
+ICU4XTime* ICU4XIsoDateTime_time(const ICU4XIsoDateTime* self);
+
+ICU4XDateTime* ICU4XIsoDateTime_to_any(const ICU4XIsoDateTime* self);
+
+int32_t ICU4XIsoDateTime_minutes_since_local_unix_epoch(const ICU4XIsoDateTime* self);
+
+ICU4XDateTime* ICU4XIsoDateTime_to_calendar(const ICU4XIsoDateTime* self, const ICU4XCalendar* calendar);
+
+uint8_t ICU4XIsoDateTime_hour(const ICU4XIsoDateTime* self);
+
+uint8_t ICU4XIsoDateTime_minute(const ICU4XIsoDateTime* self);
+
+uint8_t ICU4XIsoDateTime_second(const ICU4XIsoDateTime* self);
+
+uint32_t ICU4XIsoDateTime_nanosecond(const ICU4XIsoDateTime* self);
+
+uint32_t ICU4XIsoDateTime_day_of_month(const ICU4XIsoDateTime* self);
+
+ICU4XIsoWeekday ICU4XIsoDateTime_day_of_week(const ICU4XIsoDateTime* self);
+
+uint32_t ICU4XIsoDateTime_week_of_month(const ICU4XIsoDateTime* self, ICU4XIsoWeekday first_weekday);
+
+diplomat_result_ICU4XWeekOf_ICU4XError ICU4XIsoDateTime_week_of_year(const ICU4XIsoDateTime* self, const ICU4XWeekCalculator* calculator);
+
+uint32_t ICU4XIsoDateTime_month(const ICU4XIsoDateTime* self);
+
+int32_t ICU4XIsoDateTime_year(const ICU4XIsoDateTime* self);
+
+bool ICU4XIsoDateTime_is_in_leap_year(const ICU4XIsoDateTime* self);
+
+uint8_t ICU4XIsoDateTime_months_in_year(const ICU4XIsoDateTime* self);
+
+uint8_t ICU4XIsoDateTime_days_in_month(const ICU4XIsoDateTime* self);
+
+uint16_t ICU4XIsoDateTime_days_in_year(const ICU4XIsoDateTime* self);
+void ICU4XIsoDateTime_destroy(ICU4XIsoDateTime* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XIsoDateTime.hpp b/intl/icu_capi/cpp/include/ICU4XIsoDateTime.hpp
new file mode 100644
index 0000000000..62d45a8747
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XIsoDateTime.hpp
@@ -0,0 +1,296 @@
+#ifndef ICU4XIsoDateTime_HPP
+#define ICU4XIsoDateTime_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XIsoDateTime.h"
+
+class ICU4XIsoDateTime;
+#include "ICU4XError.hpp"
+class ICU4XIsoDate;
+class ICU4XTime;
+class ICU4XDateTime;
+class ICU4XCalendar;
+#include "ICU4XIsoWeekday.hpp"
+class ICU4XWeekCalculator;
+struct ICU4XWeekOf;
+
+/**
+ * A destruction policy for using ICU4XIsoDateTime with std::unique_ptr.
+ */
+struct ICU4XIsoDateTimeDeleter {
+ void operator()(capi::ICU4XIsoDateTime* l) const noexcept {
+ capi::ICU4XIsoDateTime_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X DateTime object capable of containing a ISO-8601 date and time.
+ *
+ * See the [Rust documentation for `DateTime`](https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html) for more information.
+ */
+class ICU4XIsoDateTime {
+ public:
+
+ /**
+ * Creates a new [`ICU4XIsoDateTime`] from the specified date and time.
+ *
+ * See the [Rust documentation for `try_new_iso_datetime`](https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.try_new_iso_datetime) for more information.
+ */
+ static diplomat::result<ICU4XIsoDateTime, ICU4XError> create(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond);
+
+ /**
+ * Creates a new [`ICU4XIsoDateTime`] from an [`ICU4XIsoDate`] and [`ICU4XTime`] object
+ *
+ * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.new) for more information.
+ */
+ static ICU4XIsoDateTime crate_from_date_and_time(const ICU4XIsoDate& date, const ICU4XTime& time);
+
+ /**
+ * Construct from the minutes since the local unix epoch for this date (Jan 1 1970, 00:00)
+ *
+ * See the [Rust documentation for `from_minutes_since_local_unix_epoch`](https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.from_minutes_since_local_unix_epoch) for more information.
+ */
+ static ICU4XIsoDateTime create_from_minutes_since_local_unix_epoch(int32_t minutes);
+
+ /**
+ * Gets the date contained in this object
+ *
+ * See the [Rust documentation for `date`](https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#structfield.date) for more information.
+ */
+ ICU4XIsoDate date() const;
+
+ /**
+ * Gets the time contained in this object
+ *
+ * See the [Rust documentation for `time`](https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#structfield.time) for more information.
+ */
+ ICU4XTime time() const;
+
+ /**
+ * Converts this to an [`ICU4XDateTime`] capable of being mixed with dates of
+ * other calendars
+ *
+ * See the [Rust documentation for `to_any`](https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.to_any) for more information.
+ */
+ ICU4XDateTime to_any() const;
+
+ /**
+ * Gets the minutes since the local unix epoch for this date (Jan 1 1970, 00:00)
+ *
+ * See the [Rust documentation for `minutes_since_local_unix_epoch`](https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.minutes_since_local_unix_epoch) for more information.
+ */
+ int32_t minutes_since_local_unix_epoch() const;
+
+ /**
+ * Convert this datetime to one in a different calendar
+ *
+ * See the [Rust documentation for `to_calendar`](https://docs.rs/icu/latest/icu/calendar/struct.DateTime.html#method.to_calendar) for more information.
+ */
+ ICU4XDateTime to_calendar(const ICU4XCalendar& calendar) const;
+
+ /**
+ * Returns the hour in this time
+ *
+ * See the [Rust documentation for `hour`](https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.hour) for more information.
+ */
+ uint8_t hour() const;
+
+ /**
+ * Returns the minute in this time
+ *
+ * See the [Rust documentation for `minute`](https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.minute) for more information.
+ */
+ uint8_t minute() const;
+
+ /**
+ * Returns the second in this time
+ *
+ * See the [Rust documentation for `second`](https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.second) for more information.
+ */
+ uint8_t second() const;
+
+ /**
+ * Returns the nanosecond in this time
+ *
+ * See the [Rust documentation for `nanosecond`](https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.nanosecond) for more information.
+ */
+ uint32_t nanosecond() const;
+
+ /**
+ * Returns the 1-indexed day in the month for this date
+ *
+ * See the [Rust documentation for `day_of_month`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.day_of_month) for more information.
+ */
+ uint32_t day_of_month() const;
+
+ /**
+ * Returns the day in the week for this day
+ *
+ * See the [Rust documentation for `day_of_week`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.day_of_week) for more information.
+ */
+ ICU4XIsoWeekday day_of_week() const;
+
+ /**
+ * Returns the week number in this month, 1-indexed, based on what
+ * is considered the first day of the week (often a locale preference).
+ *
+ * `first_weekday` can be obtained via `first_weekday()` on [`ICU4XWeekCalculator`]
+ *
+ * See the [Rust documentation for `week_of_month`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.week_of_month) for more information.
+ */
+ uint32_t week_of_month(ICU4XIsoWeekday first_weekday) const;
+
+ /**
+ * Returns the week number in this year, using week data
+ *
+ * See the [Rust documentation for `week_of_year`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.week_of_year) for more information.
+ */
+ diplomat::result<ICU4XWeekOf, ICU4XError> week_of_year(const ICU4XWeekCalculator& calculator) const;
+
+ /**
+ * Returns 1-indexed number of the month of this date in its year
+ *
+ * See the [Rust documentation for `month`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.month) for more information.
+ */
+ uint32_t month() const;
+
+ /**
+ * Returns the year number for this date
+ *
+ * See the [Rust documentation for `year`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.year) for more information.
+ */
+ int32_t year() const;
+
+ /**
+ * Returns whether this date is in a leap year
+ *
+ * See the [Rust documentation for `is_in_leap_year`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.is_in_leap_year) for more information.
+ */
+ bool is_in_leap_year() const;
+
+ /**
+ * Returns the number of months in the year represented by this date
+ *
+ * See the [Rust documentation for `months_in_year`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.months_in_year) for more information.
+ */
+ uint8_t months_in_year() const;
+
+ /**
+ * Returns the number of days in the month represented by this date
+ *
+ * See the [Rust documentation for `days_in_month`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.days_in_month) for more information.
+ */
+ uint8_t days_in_month() const;
+
+ /**
+ * Returns the number of days in the year represented by this date
+ *
+ * See the [Rust documentation for `days_in_year`](https://docs.rs/icu/latest/icu/calendar/struct.Date.html#method.days_in_year) for more information.
+ */
+ uint16_t days_in_year() const;
+ inline const capi::ICU4XIsoDateTime* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XIsoDateTime* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XIsoDateTime(capi::ICU4XIsoDateTime* i) : inner(i) {}
+ ICU4XIsoDateTime() = default;
+ ICU4XIsoDateTime(ICU4XIsoDateTime&&) noexcept = default;
+ ICU4XIsoDateTime& operator=(ICU4XIsoDateTime&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XIsoDateTime, ICU4XIsoDateTimeDeleter> inner;
+};
+
+#include "ICU4XIsoDate.hpp"
+#include "ICU4XTime.hpp"
+#include "ICU4XDateTime.hpp"
+#include "ICU4XCalendar.hpp"
+#include "ICU4XWeekCalculator.hpp"
+#include "ICU4XWeekOf.hpp"
+
+inline diplomat::result<ICU4XIsoDateTime, ICU4XError> ICU4XIsoDateTime::create(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond) {
+ auto diplomat_result_raw_out_value = capi::ICU4XIsoDateTime_create(year, month, day, hour, minute, second, nanosecond);
+ diplomat::result<ICU4XIsoDateTime, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XIsoDateTime>(ICU4XIsoDateTime(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XIsoDateTime ICU4XIsoDateTime::crate_from_date_and_time(const ICU4XIsoDate& date, const ICU4XTime& time) {
+ return ICU4XIsoDateTime(capi::ICU4XIsoDateTime_crate_from_date_and_time(date.AsFFI(), time.AsFFI()));
+}
+inline ICU4XIsoDateTime ICU4XIsoDateTime::create_from_minutes_since_local_unix_epoch(int32_t minutes) {
+ return ICU4XIsoDateTime(capi::ICU4XIsoDateTime_create_from_minutes_since_local_unix_epoch(minutes));
+}
+inline ICU4XIsoDate ICU4XIsoDateTime::date() const {
+ return ICU4XIsoDate(capi::ICU4XIsoDateTime_date(this->inner.get()));
+}
+inline ICU4XTime ICU4XIsoDateTime::time() const {
+ return ICU4XTime(capi::ICU4XIsoDateTime_time(this->inner.get()));
+}
+inline ICU4XDateTime ICU4XIsoDateTime::to_any() const {
+ return ICU4XDateTime(capi::ICU4XIsoDateTime_to_any(this->inner.get()));
+}
+inline int32_t ICU4XIsoDateTime::minutes_since_local_unix_epoch() const {
+ return capi::ICU4XIsoDateTime_minutes_since_local_unix_epoch(this->inner.get());
+}
+inline ICU4XDateTime ICU4XIsoDateTime::to_calendar(const ICU4XCalendar& calendar) const {
+ return ICU4XDateTime(capi::ICU4XIsoDateTime_to_calendar(this->inner.get(), calendar.AsFFI()));
+}
+inline uint8_t ICU4XIsoDateTime::hour() const {
+ return capi::ICU4XIsoDateTime_hour(this->inner.get());
+}
+inline uint8_t ICU4XIsoDateTime::minute() const {
+ return capi::ICU4XIsoDateTime_minute(this->inner.get());
+}
+inline uint8_t ICU4XIsoDateTime::second() const {
+ return capi::ICU4XIsoDateTime_second(this->inner.get());
+}
+inline uint32_t ICU4XIsoDateTime::nanosecond() const {
+ return capi::ICU4XIsoDateTime_nanosecond(this->inner.get());
+}
+inline uint32_t ICU4XIsoDateTime::day_of_month() const {
+ return capi::ICU4XIsoDateTime_day_of_month(this->inner.get());
+}
+inline ICU4XIsoWeekday ICU4XIsoDateTime::day_of_week() const {
+ return static_cast<ICU4XIsoWeekday>(capi::ICU4XIsoDateTime_day_of_week(this->inner.get()));
+}
+inline uint32_t ICU4XIsoDateTime::week_of_month(ICU4XIsoWeekday first_weekday) const {
+ return capi::ICU4XIsoDateTime_week_of_month(this->inner.get(), static_cast<capi::ICU4XIsoWeekday>(first_weekday));
+}
+inline diplomat::result<ICU4XWeekOf, ICU4XError> ICU4XIsoDateTime::week_of_year(const ICU4XWeekCalculator& calculator) const {
+ auto diplomat_result_raw_out_value = capi::ICU4XIsoDateTime_week_of_year(this->inner.get(), calculator.AsFFI());
+ diplomat::result<ICU4XWeekOf, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ capi::ICU4XWeekOf diplomat_raw_struct_out_value = diplomat_result_raw_out_value.ok;
+ diplomat_result_out_value = diplomat::Ok<ICU4XWeekOf>(ICU4XWeekOf{ .week = std::move(diplomat_raw_struct_out_value.week), .unit = std::move(static_cast<ICU4XWeekRelativeUnit>(diplomat_raw_struct_out_value.unit)) });
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline uint32_t ICU4XIsoDateTime::month() const {
+ return capi::ICU4XIsoDateTime_month(this->inner.get());
+}
+inline int32_t ICU4XIsoDateTime::year() const {
+ return capi::ICU4XIsoDateTime_year(this->inner.get());
+}
+inline bool ICU4XIsoDateTime::is_in_leap_year() const {
+ return capi::ICU4XIsoDateTime_is_in_leap_year(this->inner.get());
+}
+inline uint8_t ICU4XIsoDateTime::months_in_year() const {
+ return capi::ICU4XIsoDateTime_months_in_year(this->inner.get());
+}
+inline uint8_t ICU4XIsoDateTime::days_in_month() const {
+ return capi::ICU4XIsoDateTime_days_in_month(this->inner.get());
+}
+inline uint16_t ICU4XIsoDateTime::days_in_year() const {
+ return capi::ICU4XIsoDateTime_days_in_year(this->inner.get());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneFormat.h b/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneFormat.h
new file mode 100644
index 0000000000..e48a1142f2
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneFormat.h
@@ -0,0 +1,33 @@
+#ifndef ICU4XIsoTimeZoneFormat_H
+#define ICU4XIsoTimeZoneFormat_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XIsoTimeZoneFormat {
+ ICU4XIsoTimeZoneFormat_Basic = 0,
+ ICU4XIsoTimeZoneFormat_Extended = 1,
+ ICU4XIsoTimeZoneFormat_UtcBasic = 2,
+ ICU4XIsoTimeZoneFormat_UtcExtended = 3,
+} ICU4XIsoTimeZoneFormat;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XIsoTimeZoneFormat_destroy(ICU4XIsoTimeZoneFormat* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneFormat.hpp b/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneFormat.hpp
new file mode 100644
index 0000000000..7ede2d2ca8
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneFormat.hpp
@@ -0,0 +1,26 @@
+#ifndef ICU4XIsoTimeZoneFormat_HPP
+#define ICU4XIsoTimeZoneFormat_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XIsoTimeZoneFormat.h"
+
+
+
+/**
+ * See the [Rust documentation for `IsoFormat`](https://docs.rs/icu/latest/icu/datetime/time_zone/enum.IsoFormat.html) for more information.
+ */
+enum struct ICU4XIsoTimeZoneFormat {
+ Basic = 0,
+ Extended = 1,
+ UtcBasic = 2,
+ UtcExtended = 3,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneMinuteDisplay.h b/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneMinuteDisplay.h
new file mode 100644
index 0000000000..edeee97019
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneMinuteDisplay.h
@@ -0,0 +1,31 @@
+#ifndef ICU4XIsoTimeZoneMinuteDisplay_H
+#define ICU4XIsoTimeZoneMinuteDisplay_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XIsoTimeZoneMinuteDisplay {
+ ICU4XIsoTimeZoneMinuteDisplay_Required = 0,
+ ICU4XIsoTimeZoneMinuteDisplay_Optional = 1,
+} ICU4XIsoTimeZoneMinuteDisplay;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XIsoTimeZoneMinuteDisplay_destroy(ICU4XIsoTimeZoneMinuteDisplay* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneMinuteDisplay.hpp b/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneMinuteDisplay.hpp
new file mode 100644
index 0000000000..6b3e653b1d
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneMinuteDisplay.hpp
@@ -0,0 +1,24 @@
+#ifndef ICU4XIsoTimeZoneMinuteDisplay_HPP
+#define ICU4XIsoTimeZoneMinuteDisplay_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XIsoTimeZoneMinuteDisplay.h"
+
+
+
+/**
+ * See the [Rust documentation for `IsoMinutes`](https://docs.rs/icu/latest/icu/datetime/time_zone/enum.IsoMinutes.html) for more information.
+ */
+enum struct ICU4XIsoTimeZoneMinuteDisplay {
+ Required = 0,
+ Optional = 1,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneOptions.h b/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneOptions.h
new file mode 100644
index 0000000000..7ba051c3e6
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneOptions.h
@@ -0,0 +1,38 @@
+#ifndef ICU4XIsoTimeZoneOptions_H
+#define ICU4XIsoTimeZoneOptions_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#include "ICU4XIsoTimeZoneFormat.h"
+#include "ICU4XIsoTimeZoneMinuteDisplay.h"
+#include "ICU4XIsoTimeZoneSecondDisplay.h"
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XIsoTimeZoneOptions {
+ ICU4XIsoTimeZoneFormat format;
+ ICU4XIsoTimeZoneMinuteDisplay minutes;
+ ICU4XIsoTimeZoneSecondDisplay seconds;
+} ICU4XIsoTimeZoneOptions;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XIsoTimeZoneFormat.h"
+#include "ICU4XIsoTimeZoneMinuteDisplay.h"
+#include "ICU4XIsoTimeZoneSecondDisplay.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XIsoTimeZoneOptions_destroy(ICU4XIsoTimeZoneOptions* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneOptions.hpp b/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneOptions.hpp
new file mode 100644
index 0000000000..5082683329
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneOptions.hpp
@@ -0,0 +1,26 @@
+#ifndef ICU4XIsoTimeZoneOptions_HPP
+#define ICU4XIsoTimeZoneOptions_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XIsoTimeZoneOptions.h"
+
+#include "ICU4XIsoTimeZoneFormat.hpp"
+#include "ICU4XIsoTimeZoneMinuteDisplay.hpp"
+#include "ICU4XIsoTimeZoneSecondDisplay.hpp"
+
+struct ICU4XIsoTimeZoneOptions {
+ public:
+ ICU4XIsoTimeZoneFormat format;
+ ICU4XIsoTimeZoneMinuteDisplay minutes;
+ ICU4XIsoTimeZoneSecondDisplay seconds;
+};
+
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneSecondDisplay.h b/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneSecondDisplay.h
new file mode 100644
index 0000000000..487a248f95
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneSecondDisplay.h
@@ -0,0 +1,31 @@
+#ifndef ICU4XIsoTimeZoneSecondDisplay_H
+#define ICU4XIsoTimeZoneSecondDisplay_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XIsoTimeZoneSecondDisplay {
+ ICU4XIsoTimeZoneSecondDisplay_Optional = 0,
+ ICU4XIsoTimeZoneSecondDisplay_Never = 1,
+} ICU4XIsoTimeZoneSecondDisplay;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XIsoTimeZoneSecondDisplay_destroy(ICU4XIsoTimeZoneSecondDisplay* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneSecondDisplay.hpp b/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneSecondDisplay.hpp
new file mode 100644
index 0000000000..23a0a3a85e
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XIsoTimeZoneSecondDisplay.hpp
@@ -0,0 +1,24 @@
+#ifndef ICU4XIsoTimeZoneSecondDisplay_HPP
+#define ICU4XIsoTimeZoneSecondDisplay_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XIsoTimeZoneSecondDisplay.h"
+
+
+
+/**
+ * See the [Rust documentation for `IsoSeconds`](https://docs.rs/icu/latest/icu/datetime/time_zone/enum.IsoSeconds.html) for more information.
+ */
+enum struct ICU4XIsoTimeZoneSecondDisplay {
+ Optional = 0,
+ Never = 1,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XIsoWeekday.h b/intl/icu_capi/cpp/include/ICU4XIsoWeekday.h
new file mode 100644
index 0000000000..a23d0a3b9e
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XIsoWeekday.h
@@ -0,0 +1,36 @@
+#ifndef ICU4XIsoWeekday_H
+#define ICU4XIsoWeekday_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XIsoWeekday {
+ ICU4XIsoWeekday_Monday = 1,
+ ICU4XIsoWeekday_Tuesday = 2,
+ ICU4XIsoWeekday_Wednesday = 3,
+ ICU4XIsoWeekday_Thursday = 4,
+ ICU4XIsoWeekday_Friday = 5,
+ ICU4XIsoWeekday_Saturday = 6,
+ ICU4XIsoWeekday_Sunday = 7,
+} ICU4XIsoWeekday;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XIsoWeekday_destroy(ICU4XIsoWeekday* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XIsoWeekday.hpp b/intl/icu_capi/cpp/include/ICU4XIsoWeekday.hpp
new file mode 100644
index 0000000000..ec33e4a80e
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XIsoWeekday.hpp
@@ -0,0 +1,25 @@
+#ifndef ICU4XIsoWeekday_HPP
+#define ICU4XIsoWeekday_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XIsoWeekday.h"
+
+
+enum struct ICU4XIsoWeekday {
+ Monday = 1,
+ Tuesday = 2,
+ Wednesday = 3,
+ Thursday = 4,
+ Friday = 5,
+ Saturday = 6,
+ Sunday = 7,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLanguageDisplay.h b/intl/icu_capi/cpp/include/ICU4XLanguageDisplay.h
new file mode 100644
index 0000000000..0b921351fe
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLanguageDisplay.h
@@ -0,0 +1,31 @@
+#ifndef ICU4XLanguageDisplay_H
+#define ICU4XLanguageDisplay_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XLanguageDisplay {
+ ICU4XLanguageDisplay_Dialect = 0,
+ ICU4XLanguageDisplay_Standard = 1,
+} ICU4XLanguageDisplay;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XLanguageDisplay_destroy(ICU4XLanguageDisplay* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLanguageDisplay.hpp b/intl/icu_capi/cpp/include/ICU4XLanguageDisplay.hpp
new file mode 100644
index 0000000000..6914e4671e
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLanguageDisplay.hpp
@@ -0,0 +1,24 @@
+#ifndef ICU4XLanguageDisplay_HPP
+#define ICU4XLanguageDisplay_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLanguageDisplay.h"
+
+
+
+/**
+ * See the [Rust documentation for `LanguageDisplay`](https://docs.rs/icu/latest/icu/displaynames/options/enum.LanguageDisplay.html) for more information.
+ */
+enum struct ICU4XLanguageDisplay {
+ Dialect = 0,
+ Standard = 1,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLeadingAdjustment.h b/intl/icu_capi/cpp/include/ICU4XLeadingAdjustment.h
new file mode 100644
index 0000000000..91647188ed
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLeadingAdjustment.h
@@ -0,0 +1,32 @@
+#ifndef ICU4XLeadingAdjustment_H
+#define ICU4XLeadingAdjustment_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XLeadingAdjustment {
+ ICU4XLeadingAdjustment_Auto = 0,
+ ICU4XLeadingAdjustment_None = 1,
+ ICU4XLeadingAdjustment_ToCased = 2,
+} ICU4XLeadingAdjustment;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XLeadingAdjustment_destroy(ICU4XLeadingAdjustment* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLeadingAdjustment.hpp b/intl/icu_capi/cpp/include/ICU4XLeadingAdjustment.hpp
new file mode 100644
index 0000000000..17ba8dc33a
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLeadingAdjustment.hpp
@@ -0,0 +1,25 @@
+#ifndef ICU4XLeadingAdjustment_HPP
+#define ICU4XLeadingAdjustment_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLeadingAdjustment.h"
+
+
+
+/**
+ * See the [Rust documentation for `LeadingAdjustment`](https://docs.rs/icu/latest/icu/casemap/titlecase/enum.LeadingAdjustment.html) for more information.
+ */
+enum struct ICU4XLeadingAdjustment {
+ Auto = 0,
+ None = 1,
+ ToCased = 2,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLineBreakIteratorLatin1.h b/intl/icu_capi/cpp/include/ICU4XLineBreakIteratorLatin1.h
new file mode 100644
index 0000000000..c1a4c39131
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLineBreakIteratorLatin1.h
@@ -0,0 +1,29 @@
+#ifndef ICU4XLineBreakIteratorLatin1_H
+#define ICU4XLineBreakIteratorLatin1_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XLineBreakIteratorLatin1 ICU4XLineBreakIteratorLatin1;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+int32_t ICU4XLineBreakIteratorLatin1_next(ICU4XLineBreakIteratorLatin1* self);
+void ICU4XLineBreakIteratorLatin1_destroy(ICU4XLineBreakIteratorLatin1* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLineBreakIteratorLatin1.hpp b/intl/icu_capi/cpp/include/ICU4XLineBreakIteratorLatin1.hpp
new file mode 100644
index 0000000000..566ed7f49b
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLineBreakIteratorLatin1.hpp
@@ -0,0 +1,53 @@
+#ifndef ICU4XLineBreakIteratorLatin1_HPP
+#define ICU4XLineBreakIteratorLatin1_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLineBreakIteratorLatin1.h"
+
+
+/**
+ * A destruction policy for using ICU4XLineBreakIteratorLatin1 with std::unique_ptr.
+ */
+struct ICU4XLineBreakIteratorLatin1Deleter {
+ void operator()(capi::ICU4XLineBreakIteratorLatin1* l) const noexcept {
+ capi::ICU4XLineBreakIteratorLatin1_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `LineBreakIterator`](https://docs.rs/icu/latest/icu/segmenter/struct.LineBreakIterator.html) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/segmenter/type.LineBreakIteratorLatin1.html)
+ */
+class ICU4XLineBreakIteratorLatin1 {
+ public:
+
+ /**
+ * Finds the next breakpoint. Returns -1 if at the end of the string or if the index is
+ * out of range of a 32-bit signed integer.
+ *
+ * See the [Rust documentation for `next`](https://docs.rs/icu/latest/icu/segmenter/struct.LineBreakIterator.html#method.next) for more information.
+ */
+ int32_t next();
+ inline const capi::ICU4XLineBreakIteratorLatin1* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XLineBreakIteratorLatin1* AsFFIMut() { return this->inner.get(); }
+ inline explicit ICU4XLineBreakIteratorLatin1(capi::ICU4XLineBreakIteratorLatin1* i) : inner(i) {}
+ ICU4XLineBreakIteratorLatin1() = default;
+ ICU4XLineBreakIteratorLatin1(ICU4XLineBreakIteratorLatin1&&) noexcept = default;
+ ICU4XLineBreakIteratorLatin1& operator=(ICU4XLineBreakIteratorLatin1&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XLineBreakIteratorLatin1, ICU4XLineBreakIteratorLatin1Deleter> inner;
+};
+
+
+inline int32_t ICU4XLineBreakIteratorLatin1::next() {
+ return capi::ICU4XLineBreakIteratorLatin1_next(this->inner.get());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLineBreakIteratorUtf16.h b/intl/icu_capi/cpp/include/ICU4XLineBreakIteratorUtf16.h
new file mode 100644
index 0000000000..78ae12c7e4
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLineBreakIteratorUtf16.h
@@ -0,0 +1,29 @@
+#ifndef ICU4XLineBreakIteratorUtf16_H
+#define ICU4XLineBreakIteratorUtf16_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XLineBreakIteratorUtf16 ICU4XLineBreakIteratorUtf16;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+int32_t ICU4XLineBreakIteratorUtf16_next(ICU4XLineBreakIteratorUtf16* self);
+void ICU4XLineBreakIteratorUtf16_destroy(ICU4XLineBreakIteratorUtf16* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLineBreakIteratorUtf16.hpp b/intl/icu_capi/cpp/include/ICU4XLineBreakIteratorUtf16.hpp
new file mode 100644
index 0000000000..656b806bee
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLineBreakIteratorUtf16.hpp
@@ -0,0 +1,53 @@
+#ifndef ICU4XLineBreakIteratorUtf16_HPP
+#define ICU4XLineBreakIteratorUtf16_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLineBreakIteratorUtf16.h"
+
+
+/**
+ * A destruction policy for using ICU4XLineBreakIteratorUtf16 with std::unique_ptr.
+ */
+struct ICU4XLineBreakIteratorUtf16Deleter {
+ void operator()(capi::ICU4XLineBreakIteratorUtf16* l) const noexcept {
+ capi::ICU4XLineBreakIteratorUtf16_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `LineBreakIterator`](https://docs.rs/icu/latest/icu/segmenter/struct.LineBreakIterator.html) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/segmenter/type.LineBreakIteratorUtf16.html)
+ */
+class ICU4XLineBreakIteratorUtf16 {
+ public:
+
+ /**
+ * Finds the next breakpoint. Returns -1 if at the end of the string or if the index is
+ * out of range of a 32-bit signed integer.
+ *
+ * See the [Rust documentation for `next`](https://docs.rs/icu/latest/icu/segmenter/struct.LineBreakIterator.html#method.next) for more information.
+ */
+ int32_t next();
+ inline const capi::ICU4XLineBreakIteratorUtf16* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XLineBreakIteratorUtf16* AsFFIMut() { return this->inner.get(); }
+ inline explicit ICU4XLineBreakIteratorUtf16(capi::ICU4XLineBreakIteratorUtf16* i) : inner(i) {}
+ ICU4XLineBreakIteratorUtf16() = default;
+ ICU4XLineBreakIteratorUtf16(ICU4XLineBreakIteratorUtf16&&) noexcept = default;
+ ICU4XLineBreakIteratorUtf16& operator=(ICU4XLineBreakIteratorUtf16&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XLineBreakIteratorUtf16, ICU4XLineBreakIteratorUtf16Deleter> inner;
+};
+
+
+inline int32_t ICU4XLineBreakIteratorUtf16::next() {
+ return capi::ICU4XLineBreakIteratorUtf16_next(this->inner.get());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLineBreakIteratorUtf8.h b/intl/icu_capi/cpp/include/ICU4XLineBreakIteratorUtf8.h
new file mode 100644
index 0000000000..3a08c5ad23
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLineBreakIteratorUtf8.h
@@ -0,0 +1,29 @@
+#ifndef ICU4XLineBreakIteratorUtf8_H
+#define ICU4XLineBreakIteratorUtf8_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XLineBreakIteratorUtf8 ICU4XLineBreakIteratorUtf8;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+int32_t ICU4XLineBreakIteratorUtf8_next(ICU4XLineBreakIteratorUtf8* self);
+void ICU4XLineBreakIteratorUtf8_destroy(ICU4XLineBreakIteratorUtf8* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLineBreakIteratorUtf8.hpp b/intl/icu_capi/cpp/include/ICU4XLineBreakIteratorUtf8.hpp
new file mode 100644
index 0000000000..e24e4a706a
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLineBreakIteratorUtf8.hpp
@@ -0,0 +1,53 @@
+#ifndef ICU4XLineBreakIteratorUtf8_HPP
+#define ICU4XLineBreakIteratorUtf8_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLineBreakIteratorUtf8.h"
+
+
+/**
+ * A destruction policy for using ICU4XLineBreakIteratorUtf8 with std::unique_ptr.
+ */
+struct ICU4XLineBreakIteratorUtf8Deleter {
+ void operator()(capi::ICU4XLineBreakIteratorUtf8* l) const noexcept {
+ capi::ICU4XLineBreakIteratorUtf8_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `LineBreakIterator`](https://docs.rs/icu/latest/icu/segmenter/struct.LineBreakIterator.html) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/segmenter/type.LineBreakIteratorPotentiallyIllFormedUtf8.html)
+ */
+class ICU4XLineBreakIteratorUtf8 {
+ public:
+
+ /**
+ * Finds the next breakpoint. Returns -1 if at the end of the string or if the index is
+ * out of range of a 32-bit signed integer.
+ *
+ * See the [Rust documentation for `next`](https://docs.rs/icu/latest/icu/segmenter/struct.LineBreakIterator.html#method.next) for more information.
+ */
+ int32_t next();
+ inline const capi::ICU4XLineBreakIteratorUtf8* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XLineBreakIteratorUtf8* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XLineBreakIteratorUtf8(capi::ICU4XLineBreakIteratorUtf8* i) : inner(i) {}
+ ICU4XLineBreakIteratorUtf8() = default;
+ ICU4XLineBreakIteratorUtf8(ICU4XLineBreakIteratorUtf8&&) noexcept = default;
+ ICU4XLineBreakIteratorUtf8& operator=(ICU4XLineBreakIteratorUtf8&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XLineBreakIteratorUtf8, ICU4XLineBreakIteratorUtf8Deleter> inner;
+};
+
+
+inline int32_t ICU4XLineBreakIteratorUtf8::next() {
+ return capi::ICU4XLineBreakIteratorUtf8_next(this->inner.get());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLineBreakOptionsV1.h b/intl/icu_capi/cpp/include/ICU4XLineBreakOptionsV1.h
new file mode 100644
index 0000000000..5fbf4b5814
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLineBreakOptionsV1.h
@@ -0,0 +1,36 @@
+#ifndef ICU4XLineBreakOptionsV1_H
+#define ICU4XLineBreakOptionsV1_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#include "ICU4XLineBreakStrictness.h"
+#include "ICU4XLineBreakWordOption.h"
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XLineBreakOptionsV1 {
+ ICU4XLineBreakStrictness strictness;
+ ICU4XLineBreakWordOption word_option;
+ bool ja_zh;
+} ICU4XLineBreakOptionsV1;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XLineBreakStrictness.h"
+#include "ICU4XLineBreakWordOption.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XLineBreakOptionsV1_destroy(ICU4XLineBreakOptionsV1* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLineBreakOptionsV1.hpp b/intl/icu_capi/cpp/include/ICU4XLineBreakOptionsV1.hpp
new file mode 100644
index 0000000000..1a60164db4
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLineBreakOptionsV1.hpp
@@ -0,0 +1,29 @@
+#ifndef ICU4XLineBreakOptionsV1_HPP
+#define ICU4XLineBreakOptionsV1_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLineBreakOptionsV1.h"
+
+#include "ICU4XLineBreakStrictness.hpp"
+#include "ICU4XLineBreakWordOption.hpp"
+
+
+/**
+ * See the [Rust documentation for `LineBreakOptions`](https://docs.rs/icu/latest/icu/segmenter/struct.LineBreakOptions.html) for more information.
+ */
+struct ICU4XLineBreakOptionsV1 {
+ public:
+ ICU4XLineBreakStrictness strictness;
+ ICU4XLineBreakWordOption word_option;
+ bool ja_zh;
+};
+
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLineBreakStrictness.h b/intl/icu_capi/cpp/include/ICU4XLineBreakStrictness.h
new file mode 100644
index 0000000000..e3534b7ec7
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLineBreakStrictness.h
@@ -0,0 +1,33 @@
+#ifndef ICU4XLineBreakStrictness_H
+#define ICU4XLineBreakStrictness_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XLineBreakStrictness {
+ ICU4XLineBreakStrictness_Loose = 0,
+ ICU4XLineBreakStrictness_Normal = 1,
+ ICU4XLineBreakStrictness_Strict = 2,
+ ICU4XLineBreakStrictness_Anywhere = 3,
+} ICU4XLineBreakStrictness;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XLineBreakStrictness_destroy(ICU4XLineBreakStrictness* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLineBreakStrictness.hpp b/intl/icu_capi/cpp/include/ICU4XLineBreakStrictness.hpp
new file mode 100644
index 0000000000..d4eac0f43e
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLineBreakStrictness.hpp
@@ -0,0 +1,26 @@
+#ifndef ICU4XLineBreakStrictness_HPP
+#define ICU4XLineBreakStrictness_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLineBreakStrictness.h"
+
+
+
+/**
+ * See the [Rust documentation for `LineBreakStrictness`](https://docs.rs/icu/latest/icu/segmenter/enum.LineBreakStrictness.html) for more information.
+ */
+enum struct ICU4XLineBreakStrictness {
+ Loose = 0,
+ Normal = 1,
+ Strict = 2,
+ Anywhere = 3,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLineBreakWordOption.h b/intl/icu_capi/cpp/include/ICU4XLineBreakWordOption.h
new file mode 100644
index 0000000000..02a6ca6f2d
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLineBreakWordOption.h
@@ -0,0 +1,32 @@
+#ifndef ICU4XLineBreakWordOption_H
+#define ICU4XLineBreakWordOption_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XLineBreakWordOption {
+ ICU4XLineBreakWordOption_Normal = 0,
+ ICU4XLineBreakWordOption_BreakAll = 1,
+ ICU4XLineBreakWordOption_KeepAll = 2,
+} ICU4XLineBreakWordOption;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XLineBreakWordOption_destroy(ICU4XLineBreakWordOption* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLineBreakWordOption.hpp b/intl/icu_capi/cpp/include/ICU4XLineBreakWordOption.hpp
new file mode 100644
index 0000000000..094a938d11
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLineBreakWordOption.hpp
@@ -0,0 +1,25 @@
+#ifndef ICU4XLineBreakWordOption_HPP
+#define ICU4XLineBreakWordOption_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLineBreakWordOption.h"
+
+
+
+/**
+ * See the [Rust documentation for `LineBreakWordOption`](https://docs.rs/icu/latest/icu/segmenter/enum.LineBreakWordOption.html) for more information.
+ */
+enum struct ICU4XLineBreakWordOption {
+ Normal = 0,
+ BreakAll = 1,
+ KeepAll = 2,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLineSegmenter.h b/intl/icu_capi/cpp/include/ICU4XLineSegmenter.h
new file mode 100644
index 0000000000..f734ec78f8
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLineSegmenter.h
@@ -0,0 +1,51 @@
+#ifndef ICU4XLineSegmenter_H
+#define ICU4XLineSegmenter_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XLineSegmenter ICU4XLineSegmenter;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XLineSegmenter_ICU4XError.h"
+#include "ICU4XLineBreakOptionsV1.h"
+#include "ICU4XLineBreakIteratorUtf8.h"
+#include "ICU4XLineBreakIteratorUtf16.h"
+#include "ICU4XLineBreakIteratorLatin1.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XLineSegmenter_ICU4XError ICU4XLineSegmenter_create_auto(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XLineSegmenter_ICU4XError ICU4XLineSegmenter_create_lstm(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XLineSegmenter_ICU4XError ICU4XLineSegmenter_create_dictionary(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XLineSegmenter_ICU4XError ICU4XLineSegmenter_create_auto_with_options_v1(const ICU4XDataProvider* provider, ICU4XLineBreakOptionsV1 options);
+
+diplomat_result_box_ICU4XLineSegmenter_ICU4XError ICU4XLineSegmenter_create_lstm_with_options_v1(const ICU4XDataProvider* provider, ICU4XLineBreakOptionsV1 options);
+
+diplomat_result_box_ICU4XLineSegmenter_ICU4XError ICU4XLineSegmenter_create_dictionary_with_options_v1(const ICU4XDataProvider* provider, ICU4XLineBreakOptionsV1 options);
+
+ICU4XLineBreakIteratorUtf8* ICU4XLineSegmenter_segment_utf8(const ICU4XLineSegmenter* self, const char* input_data, size_t input_len);
+
+ICU4XLineBreakIteratorUtf16* ICU4XLineSegmenter_segment_utf16(const ICU4XLineSegmenter* self, const uint16_t* input_data, size_t input_len);
+
+ICU4XLineBreakIteratorLatin1* ICU4XLineSegmenter_segment_latin1(const ICU4XLineSegmenter* self, const uint8_t* input_data, size_t input_len);
+void ICU4XLineSegmenter_destroy(ICU4XLineSegmenter* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLineSegmenter.hpp b/intl/icu_capi/cpp/include/ICU4XLineSegmenter.hpp
new file mode 100644
index 0000000000..7d94f79e8d
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLineSegmenter.hpp
@@ -0,0 +1,201 @@
+#ifndef ICU4XLineSegmenter_HPP
+#define ICU4XLineSegmenter_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLineSegmenter.h"
+
+class ICU4XDataProvider;
+class ICU4XLineSegmenter;
+#include "ICU4XError.hpp"
+struct ICU4XLineBreakOptionsV1;
+class ICU4XLineBreakIteratorUtf8;
+class ICU4XLineBreakIteratorUtf16;
+class ICU4XLineBreakIteratorLatin1;
+
+/**
+ * A destruction policy for using ICU4XLineSegmenter with std::unique_ptr.
+ */
+struct ICU4XLineSegmenterDeleter {
+ void operator()(capi::ICU4XLineSegmenter* l) const noexcept {
+ capi::ICU4XLineSegmenter_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X line-break segmenter, capable of finding breakpoints in strings.
+ *
+ * See the [Rust documentation for `LineSegmenter`](https://docs.rs/icu/latest/icu/segmenter/struct.LineSegmenter.html) for more information.
+ */
+class ICU4XLineSegmenter {
+ public:
+
+ /**
+ * Construct a [`ICU4XLineSegmenter`] with default options. It automatically loads the best
+ * available payload data for Burmese, Khmer, Lao, and Thai.
+ *
+ * See the [Rust documentation for `new_auto`](https://docs.rs/icu/latest/icu/segmenter/struct.LineSegmenter.html#method.new_auto) for more information.
+ */
+ static diplomat::result<ICU4XLineSegmenter, ICU4XError> create_auto(const ICU4XDataProvider& provider);
+
+ /**
+ * Construct a [`ICU4XLineSegmenter`] with default options and LSTM payload data for
+ * Burmese, Khmer, Lao, and Thai.
+ *
+ * See the [Rust documentation for `new_lstm`](https://docs.rs/icu/latest/icu/segmenter/struct.LineSegmenter.html#method.new_lstm) for more information.
+ */
+ static diplomat::result<ICU4XLineSegmenter, ICU4XError> create_lstm(const ICU4XDataProvider& provider);
+
+ /**
+ * Construct a [`ICU4XLineSegmenter`] with default options and dictionary payload data for
+ * Burmese, Khmer, Lao, and Thai..
+ *
+ * See the [Rust documentation for `new_dictionary`](https://docs.rs/icu/latest/icu/segmenter/struct.LineSegmenter.html#method.new_dictionary) for more information.
+ */
+ static diplomat::result<ICU4XLineSegmenter, ICU4XError> create_dictionary(const ICU4XDataProvider& provider);
+
+ /**
+ * Construct a [`ICU4XLineSegmenter`] with custom options. It automatically loads the best
+ * available payload data for Burmese, Khmer, Lao, and Thai.
+ *
+ * See the [Rust documentation for `new_auto_with_options`](https://docs.rs/icu/latest/icu/segmenter/struct.LineSegmenter.html#method.new_auto_with_options) for more information.
+ */
+ static diplomat::result<ICU4XLineSegmenter, ICU4XError> create_auto_with_options_v1(const ICU4XDataProvider& provider, ICU4XLineBreakOptionsV1 options);
+
+ /**
+ * Construct a [`ICU4XLineSegmenter`] with custom options and LSTM payload data for
+ * Burmese, Khmer, Lao, and Thai.
+ *
+ * See the [Rust documentation for `new_lstm_with_options`](https://docs.rs/icu/latest/icu/segmenter/struct.LineSegmenter.html#method.new_lstm_with_options) for more information.
+ */
+ static diplomat::result<ICU4XLineSegmenter, ICU4XError> create_lstm_with_options_v1(const ICU4XDataProvider& provider, ICU4XLineBreakOptionsV1 options);
+
+ /**
+ * Construct a [`ICU4XLineSegmenter`] with custom options and dictionary payload data for
+ * Burmese, Khmer, Lao, and Thai.
+ *
+ * See the [Rust documentation for `new_dictionary_with_options`](https://docs.rs/icu/latest/icu/segmenter/struct.LineSegmenter.html#method.new_dictionary_with_options) for more information.
+ */
+ static diplomat::result<ICU4XLineSegmenter, ICU4XError> create_dictionary_with_options_v1(const ICU4XDataProvider& provider, ICU4XLineBreakOptionsV1 options);
+
+ /**
+ * Segments a (potentially ill-formed) UTF-8 string.
+ *
+ * See the [Rust documentation for `segment_utf8`](https://docs.rs/icu/latest/icu/segmenter/struct.LineSegmenter.html#method.segment_utf8) for more information.
+ *
+ * Lifetimes: `this`, `input` must live at least as long as the output.
+ */
+ ICU4XLineBreakIteratorUtf8 segment_utf8(const std::string_view input) const;
+
+ /**
+ * Segments a UTF-16 string.
+ *
+ * See the [Rust documentation for `segment_utf16`](https://docs.rs/icu/latest/icu/segmenter/struct.LineSegmenter.html#method.segment_utf16) for more information.
+ *
+ * Lifetimes: `this`, `input` must live at least as long as the output.
+ */
+ ICU4XLineBreakIteratorUtf16 segment_utf16(const diplomat::span<const uint16_t> input) const;
+
+ /**
+ * Segments a Latin-1 string.
+ *
+ * See the [Rust documentation for `segment_latin1`](https://docs.rs/icu/latest/icu/segmenter/struct.LineSegmenter.html#method.segment_latin1) for more information.
+ *
+ * Lifetimes: `this`, `input` must live at least as long as the output.
+ */
+ ICU4XLineBreakIteratorLatin1 segment_latin1(const diplomat::span<const uint8_t> input) const;
+ inline const capi::ICU4XLineSegmenter* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XLineSegmenter* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XLineSegmenter(capi::ICU4XLineSegmenter* i) : inner(i) {}
+ ICU4XLineSegmenter() = default;
+ ICU4XLineSegmenter(ICU4XLineSegmenter&&) noexcept = default;
+ ICU4XLineSegmenter& operator=(ICU4XLineSegmenter&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XLineSegmenter, ICU4XLineSegmenterDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLineBreakOptionsV1.hpp"
+#include "ICU4XLineBreakIteratorUtf8.hpp"
+#include "ICU4XLineBreakIteratorUtf16.hpp"
+#include "ICU4XLineBreakIteratorLatin1.hpp"
+
+inline diplomat::result<ICU4XLineSegmenter, ICU4XError> ICU4XLineSegmenter::create_auto(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XLineSegmenter_create_auto(provider.AsFFI());
+ diplomat::result<ICU4XLineSegmenter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XLineSegmenter>(ICU4XLineSegmenter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XLineSegmenter, ICU4XError> ICU4XLineSegmenter::create_lstm(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XLineSegmenter_create_lstm(provider.AsFFI());
+ diplomat::result<ICU4XLineSegmenter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XLineSegmenter>(ICU4XLineSegmenter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XLineSegmenter, ICU4XError> ICU4XLineSegmenter::create_dictionary(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XLineSegmenter_create_dictionary(provider.AsFFI());
+ diplomat::result<ICU4XLineSegmenter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XLineSegmenter>(ICU4XLineSegmenter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XLineSegmenter, ICU4XError> ICU4XLineSegmenter::create_auto_with_options_v1(const ICU4XDataProvider& provider, ICU4XLineBreakOptionsV1 options) {
+ ICU4XLineBreakOptionsV1 diplomat_wrapped_struct_options = options;
+ auto diplomat_result_raw_out_value = capi::ICU4XLineSegmenter_create_auto_with_options_v1(provider.AsFFI(), capi::ICU4XLineBreakOptionsV1{ .strictness = static_cast<capi::ICU4XLineBreakStrictness>(diplomat_wrapped_struct_options.strictness), .word_option = static_cast<capi::ICU4XLineBreakWordOption>(diplomat_wrapped_struct_options.word_option), .ja_zh = diplomat_wrapped_struct_options.ja_zh });
+ diplomat::result<ICU4XLineSegmenter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XLineSegmenter>(ICU4XLineSegmenter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XLineSegmenter, ICU4XError> ICU4XLineSegmenter::create_lstm_with_options_v1(const ICU4XDataProvider& provider, ICU4XLineBreakOptionsV1 options) {
+ ICU4XLineBreakOptionsV1 diplomat_wrapped_struct_options = options;
+ auto diplomat_result_raw_out_value = capi::ICU4XLineSegmenter_create_lstm_with_options_v1(provider.AsFFI(), capi::ICU4XLineBreakOptionsV1{ .strictness = static_cast<capi::ICU4XLineBreakStrictness>(diplomat_wrapped_struct_options.strictness), .word_option = static_cast<capi::ICU4XLineBreakWordOption>(diplomat_wrapped_struct_options.word_option), .ja_zh = diplomat_wrapped_struct_options.ja_zh });
+ diplomat::result<ICU4XLineSegmenter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XLineSegmenter>(ICU4XLineSegmenter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XLineSegmenter, ICU4XError> ICU4XLineSegmenter::create_dictionary_with_options_v1(const ICU4XDataProvider& provider, ICU4XLineBreakOptionsV1 options) {
+ ICU4XLineBreakOptionsV1 diplomat_wrapped_struct_options = options;
+ auto diplomat_result_raw_out_value = capi::ICU4XLineSegmenter_create_dictionary_with_options_v1(provider.AsFFI(), capi::ICU4XLineBreakOptionsV1{ .strictness = static_cast<capi::ICU4XLineBreakStrictness>(diplomat_wrapped_struct_options.strictness), .word_option = static_cast<capi::ICU4XLineBreakWordOption>(diplomat_wrapped_struct_options.word_option), .ja_zh = diplomat_wrapped_struct_options.ja_zh });
+ diplomat::result<ICU4XLineSegmenter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XLineSegmenter>(ICU4XLineSegmenter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XLineBreakIteratorUtf8 ICU4XLineSegmenter::segment_utf8(const std::string_view input) const {
+ return ICU4XLineBreakIteratorUtf8(capi::ICU4XLineSegmenter_segment_utf8(this->inner.get(), input.data(), input.size()));
+}
+inline ICU4XLineBreakIteratorUtf16 ICU4XLineSegmenter::segment_utf16(const diplomat::span<const uint16_t> input) const {
+ return ICU4XLineBreakIteratorUtf16(capi::ICU4XLineSegmenter_segment_utf16(this->inner.get(), input.data(), input.size()));
+}
+inline ICU4XLineBreakIteratorLatin1 ICU4XLineSegmenter::segment_latin1(const diplomat::span<const uint8_t> input) const {
+ return ICU4XLineBreakIteratorLatin1(capi::ICU4XLineSegmenter_segment_latin1(this->inner.get(), input.data(), input.size()));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XList.h b/intl/icu_capi/cpp/include/ICU4XList.h
new file mode 100644
index 0000000000..6549561c37
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XList.h
@@ -0,0 +1,35 @@
+#ifndef ICU4XList_H
+#define ICU4XList_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XList ICU4XList;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+ICU4XList* ICU4XList_create();
+
+ICU4XList* ICU4XList_create_with_capacity(size_t capacity);
+
+void ICU4XList_push(ICU4XList* self, const char* val_data, size_t val_len);
+
+size_t ICU4XList_len(const ICU4XList* self);
+void ICU4XList_destroy(ICU4XList* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XList.hpp b/intl/icu_capi/cpp/include/ICU4XList.hpp
new file mode 100644
index 0000000000..e2212c021a
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XList.hpp
@@ -0,0 +1,77 @@
+#ifndef ICU4XList_HPP
+#define ICU4XList_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XList.h"
+
+class ICU4XList;
+
+/**
+ * A destruction policy for using ICU4XList with std::unique_ptr.
+ */
+struct ICU4XListDeleter {
+ void operator()(capi::ICU4XList* l) const noexcept {
+ capi::ICU4XList_destroy(l);
+ }
+};
+
+/**
+ * A list of strings
+ */
+class ICU4XList {
+ public:
+
+ /**
+ * Create a new list of strings
+ */
+ static ICU4XList create();
+
+ /**
+ * Create a new list of strings with preallocated space to hold
+ * at least `capacity` elements
+ */
+ static ICU4XList create_with_capacity(size_t capacity);
+
+ /**
+ * Push a string to the list
+ *
+ * For C++ users, potentially invalid UTF8 will be handled via
+ * REPLACEMENT CHARACTERs
+ */
+ void push(const std::string_view val);
+
+ /**
+ * The number of elements in this list
+ */
+ size_t len() const;
+ inline const capi::ICU4XList* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XList* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XList(capi::ICU4XList* i) : inner(i) {}
+ ICU4XList() = default;
+ ICU4XList(ICU4XList&&) noexcept = default;
+ ICU4XList& operator=(ICU4XList&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XList, ICU4XListDeleter> inner;
+};
+
+
+inline ICU4XList ICU4XList::create() {
+ return ICU4XList(capi::ICU4XList_create());
+}
+inline ICU4XList ICU4XList::create_with_capacity(size_t capacity) {
+ return ICU4XList(capi::ICU4XList_create_with_capacity(capacity));
+}
+inline void ICU4XList::push(const std::string_view val) {
+ capi::ICU4XList_push(this->inner.get(), val.data(), val.size());
+}
+inline size_t ICU4XList::len() const {
+ return capi::ICU4XList_len(this->inner.get());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XListFormatter.h b/intl/icu_capi/cpp/include/ICU4XListFormatter.h
new file mode 100644
index 0000000000..ee358dc254
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XListFormatter.h
@@ -0,0 +1,41 @@
+#ifndef ICU4XListFormatter_H
+#define ICU4XListFormatter_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XListFormatter ICU4XListFormatter;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "ICU4XLocale.h"
+#include "ICU4XListLength.h"
+#include "diplomat_result_box_ICU4XListFormatter_ICU4XError.h"
+#include "ICU4XList.h"
+#include "diplomat_result_void_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XListFormatter_ICU4XError ICU4XListFormatter_create_and_with_length(const ICU4XDataProvider* provider, const ICU4XLocale* locale, ICU4XListLength length);
+
+diplomat_result_box_ICU4XListFormatter_ICU4XError ICU4XListFormatter_create_or_with_length(const ICU4XDataProvider* provider, const ICU4XLocale* locale, ICU4XListLength length);
+
+diplomat_result_box_ICU4XListFormatter_ICU4XError ICU4XListFormatter_create_unit_with_length(const ICU4XDataProvider* provider, const ICU4XLocale* locale, ICU4XListLength length);
+
+diplomat_result_void_ICU4XError ICU4XListFormatter_format(const ICU4XListFormatter* self, const ICU4XList* list, DiplomatWriteable* write);
+void ICU4XListFormatter_destroy(ICU4XListFormatter* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XListFormatter.hpp b/intl/icu_capi/cpp/include/ICU4XListFormatter.hpp
new file mode 100644
index 0000000000..73be39bcf7
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XListFormatter.hpp
@@ -0,0 +1,133 @@
+#ifndef ICU4XListFormatter_HPP
+#define ICU4XListFormatter_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XListFormatter.h"
+
+class ICU4XDataProvider;
+class ICU4XLocale;
+#include "ICU4XListLength.hpp"
+class ICU4XListFormatter;
+#include "ICU4XError.hpp"
+class ICU4XList;
+
+/**
+ * A destruction policy for using ICU4XListFormatter with std::unique_ptr.
+ */
+struct ICU4XListFormatterDeleter {
+ void operator()(capi::ICU4XListFormatter* l) const noexcept {
+ capi::ICU4XListFormatter_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `ListFormatter`](https://docs.rs/icu/latest/icu/list/struct.ListFormatter.html) for more information.
+ */
+class ICU4XListFormatter {
+ public:
+
+ /**
+ * Construct a new ICU4XListFormatter instance for And patterns
+ *
+ * See the [Rust documentation for `try_new_and_with_length`](https://docs.rs/icu/latest/icu/list/struct.ListFormatter.html#method.try_new_and_with_length) for more information.
+ */
+ static diplomat::result<ICU4XListFormatter, ICU4XError> create_and_with_length(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XListLength length);
+
+ /**
+ * Construct a new ICU4XListFormatter instance for And patterns
+ *
+ * See the [Rust documentation for `try_new_or_with_length`](https://docs.rs/icu/latest/icu/list/struct.ListFormatter.html#method.try_new_or_with_length) for more information.
+ */
+ static diplomat::result<ICU4XListFormatter, ICU4XError> create_or_with_length(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XListLength length);
+
+ /**
+ * Construct a new ICU4XListFormatter instance for And patterns
+ *
+ * See the [Rust documentation for `try_new_unit_with_length`](https://docs.rs/icu/latest/icu/list/struct.ListFormatter.html#method.try_new_unit_with_length) for more information.
+ */
+ static diplomat::result<ICU4XListFormatter, ICU4XError> create_unit_with_length(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XListLength length);
+
+ /**
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/list/struct.ListFormatter.html#method.format) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> format_to_writeable(const ICU4XList& list, W& write) const;
+
+ /**
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/list/struct.ListFormatter.html#method.format) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> format(const ICU4XList& list) const;
+ inline const capi::ICU4XListFormatter* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XListFormatter* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XListFormatter(capi::ICU4XListFormatter* i) : inner(i) {}
+ ICU4XListFormatter() = default;
+ ICU4XListFormatter(ICU4XListFormatter&&) noexcept = default;
+ ICU4XListFormatter& operator=(ICU4XListFormatter&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XListFormatter, ICU4XListFormatterDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocale.hpp"
+#include "ICU4XList.hpp"
+
+inline diplomat::result<ICU4XListFormatter, ICU4XError> ICU4XListFormatter::create_and_with_length(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XListLength length) {
+ auto diplomat_result_raw_out_value = capi::ICU4XListFormatter_create_and_with_length(provider.AsFFI(), locale.AsFFI(), static_cast<capi::ICU4XListLength>(length));
+ diplomat::result<ICU4XListFormatter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XListFormatter>(ICU4XListFormatter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XListFormatter, ICU4XError> ICU4XListFormatter::create_or_with_length(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XListLength length) {
+ auto diplomat_result_raw_out_value = capi::ICU4XListFormatter_create_or_with_length(provider.AsFFI(), locale.AsFFI(), static_cast<capi::ICU4XListLength>(length));
+ diplomat::result<ICU4XListFormatter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XListFormatter>(ICU4XListFormatter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XListFormatter, ICU4XError> ICU4XListFormatter::create_unit_with_length(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XListLength length) {
+ auto diplomat_result_raw_out_value = capi::ICU4XListFormatter_create_unit_with_length(provider.AsFFI(), locale.AsFFI(), static_cast<capi::ICU4XListLength>(length));
+ diplomat::result<ICU4XListFormatter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XListFormatter>(ICU4XListFormatter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XListFormatter::format_to_writeable(const ICU4XList& list, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XListFormatter_format(this->inner.get(), list.AsFFI(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XListFormatter::format(const ICU4XList& list) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XListFormatter_format(this->inner.get(), list.AsFFI(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XListLength.h b/intl/icu_capi/cpp/include/ICU4XListLength.h
new file mode 100644
index 0000000000..7092f6d9df
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XListLength.h
@@ -0,0 +1,32 @@
+#ifndef ICU4XListLength_H
+#define ICU4XListLength_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XListLength {
+ ICU4XListLength_Wide = 0,
+ ICU4XListLength_Short = 1,
+ ICU4XListLength_Narrow = 2,
+} ICU4XListLength;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XListLength_destroy(ICU4XListLength* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XListLength.hpp b/intl/icu_capi/cpp/include/ICU4XListLength.hpp
new file mode 100644
index 0000000000..a9bd4372d0
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XListLength.hpp
@@ -0,0 +1,25 @@
+#ifndef ICU4XListLength_HPP
+#define ICU4XListLength_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XListLength.h"
+
+
+
+/**
+ * See the [Rust documentation for `ListLength`](https://docs.rs/icu/latest/icu/list/enum.ListLength.html) for more information.
+ */
+enum struct ICU4XListLength {
+ Wide = 0,
+ Short = 1,
+ Narrow = 2,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocale.h b/intl/icu_capi/cpp/include/ICU4XLocale.h
new file mode 100644
index 0000000000..dea8d196b5
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocale.h
@@ -0,0 +1,64 @@
+#ifndef ICU4XLocale_H
+#define ICU4XLocale_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XLocale ICU4XLocale;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "diplomat_result_box_ICU4XLocale_ICU4XError.h"
+#include "diplomat_result_void_ICU4XError.h"
+#include "ICU4XOrdering.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XLocale_ICU4XError ICU4XLocale_create_from_string(const char* name_data, size_t name_len);
+
+ICU4XLocale* ICU4XLocale_create_und();
+
+ICU4XLocale* ICU4XLocale_clone(const ICU4XLocale* self);
+
+diplomat_result_void_ICU4XError ICU4XLocale_basename(const ICU4XLocale* self, DiplomatWriteable* write);
+
+diplomat_result_void_ICU4XError ICU4XLocale_get_unicode_extension(const ICU4XLocale* self, const char* bytes_data, size_t bytes_len, DiplomatWriteable* write);
+
+diplomat_result_void_ICU4XError ICU4XLocale_language(const ICU4XLocale* self, DiplomatWriteable* write);
+
+diplomat_result_void_ICU4XError ICU4XLocale_set_language(ICU4XLocale* self, const char* bytes_data, size_t bytes_len);
+
+diplomat_result_void_ICU4XError ICU4XLocale_region(const ICU4XLocale* self, DiplomatWriteable* write);
+
+diplomat_result_void_ICU4XError ICU4XLocale_set_region(ICU4XLocale* self, const char* bytes_data, size_t bytes_len);
+
+diplomat_result_void_ICU4XError ICU4XLocale_script(const ICU4XLocale* self, DiplomatWriteable* write);
+
+diplomat_result_void_ICU4XError ICU4XLocale_set_script(ICU4XLocale* self, const char* bytes_data, size_t bytes_len);
+
+diplomat_result_void_ICU4XError ICU4XLocale_canonicalize(const char* bytes_data, size_t bytes_len, DiplomatWriteable* write);
+
+diplomat_result_void_ICU4XError ICU4XLocale_to_string(const ICU4XLocale* self, DiplomatWriteable* write);
+
+bool ICU4XLocale_normalizing_eq(const ICU4XLocale* self, const char* other_data, size_t other_len);
+
+ICU4XOrdering ICU4XLocale_strict_cmp(const ICU4XLocale* self, const char* other_data, size_t other_len);
+
+ICU4XLocale* ICU4XLocale_create_en();
+
+ICU4XLocale* ICU4XLocale_create_bn();
+void ICU4XLocale_destroy(ICU4XLocale* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocale.hpp b/intl/icu_capi/cpp/include/ICU4XLocale.hpp
new file mode 100644
index 0000000000..578f6e1df3
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocale.hpp
@@ -0,0 +1,438 @@
+#ifndef ICU4XLocale_HPP
+#define ICU4XLocale_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLocale.h"
+
+class ICU4XLocale;
+#include "ICU4XError.hpp"
+#include "ICU4XOrdering.hpp"
+
+/**
+ * A destruction policy for using ICU4XLocale with std::unique_ptr.
+ */
+struct ICU4XLocaleDeleter {
+ void operator()(capi::ICU4XLocale* l) const noexcept {
+ capi::ICU4XLocale_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X Locale, capable of representing strings like `"en-US"`.
+ *
+ * See the [Rust documentation for `Locale`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html) for more information.
+ */
+class ICU4XLocale {
+ public:
+
+ /**
+ * Construct an [`ICU4XLocale`] from an locale identifier.
+ *
+ * This will run the complete locale parsing algorithm. If code size and
+ * performance are critical and the locale is of a known shape (such as
+ * `aa-BB`) use `create_und`, `set_language`, `set_script`, and `set_region`.
+ *
+ * See the [Rust documentation for `try_from_bytes`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html#method.try_from_bytes) for more information.
+ */
+ static diplomat::result<ICU4XLocale, ICU4XError> create_from_string(const std::string_view name);
+
+ /**
+ * Construct a default undefined [`ICU4XLocale`] "und".
+ *
+ * See the [Rust documentation for `UND`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html#associatedconstant.UND) for more information.
+ */
+ static ICU4XLocale create_und();
+
+ /**
+ * Clones the [`ICU4XLocale`].
+ *
+ * See the [Rust documentation for `Locale`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html) for more information.
+ */
+ ICU4XLocale clone() const;
+
+ /**
+ * Write a string representation of the `LanguageIdentifier` part of
+ * [`ICU4XLocale`] to `write`.
+ *
+ * See the [Rust documentation for `id`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html#structfield.id) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> basename_to_writeable(W& write) const;
+
+ /**
+ * Write a string representation of the `LanguageIdentifier` part of
+ * [`ICU4XLocale`] to `write`.
+ *
+ * See the [Rust documentation for `id`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html#structfield.id) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> basename() const;
+
+ /**
+ * Write a string representation of the unicode extension to `write`
+ *
+ * See the [Rust documentation for `extensions`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html#structfield.extensions) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> get_unicode_extension_to_writeable(const std::string_view bytes, W& write) const;
+
+ /**
+ * Write a string representation of the unicode extension to `write`
+ *
+ * See the [Rust documentation for `extensions`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html#structfield.extensions) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> get_unicode_extension(const std::string_view bytes) const;
+
+ /**
+ * Write a string representation of [`ICU4XLocale`] language to `write`
+ *
+ * See the [Rust documentation for `id`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html#structfield.id) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> language_to_writeable(W& write) const;
+
+ /**
+ * Write a string representation of [`ICU4XLocale`] language to `write`
+ *
+ * See the [Rust documentation for `id`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html#structfield.id) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> language() const;
+
+ /**
+ * Set the language part of the [`ICU4XLocale`].
+ *
+ * See the [Rust documentation for `try_from_bytes`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html#method.try_from_bytes) for more information.
+ */
+ diplomat::result<std::monostate, ICU4XError> set_language(const std::string_view bytes);
+
+ /**
+ * Write a string representation of [`ICU4XLocale`] region to `write`
+ *
+ * See the [Rust documentation for `id`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html#structfield.id) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> region_to_writeable(W& write) const;
+
+ /**
+ * Write a string representation of [`ICU4XLocale`] region to `write`
+ *
+ * See the [Rust documentation for `id`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html#structfield.id) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> region() const;
+
+ /**
+ * Set the region part of the [`ICU4XLocale`].
+ *
+ * See the [Rust documentation for `try_from_bytes`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html#method.try_from_bytes) for more information.
+ */
+ diplomat::result<std::monostate, ICU4XError> set_region(const std::string_view bytes);
+
+ /**
+ * Write a string representation of [`ICU4XLocale`] script to `write`
+ *
+ * See the [Rust documentation for `id`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html#structfield.id) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> script_to_writeable(W& write) const;
+
+ /**
+ * Write a string representation of [`ICU4XLocale`] script to `write`
+ *
+ * See the [Rust documentation for `id`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html#structfield.id) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> script() const;
+
+ /**
+ * Set the script part of the [`ICU4XLocale`]. Pass an empty string to remove the script.
+ *
+ * See the [Rust documentation for `try_from_bytes`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html#method.try_from_bytes) for more information.
+ */
+ diplomat::result<std::monostate, ICU4XError> set_script(const std::string_view bytes);
+
+ /**
+ * Best effort locale canonicalizer that doesn't need any data
+ *
+ * Use ICU4XLocaleCanonicalizer for better control and functionality
+ *
+ * See the [Rust documentation for `canonicalize`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html#method.canonicalize) for more information.
+ */
+ template<typename W> static diplomat::result<std::monostate, ICU4XError> canonicalize_to_writeable(const std::string_view bytes, W& write);
+
+ /**
+ * Best effort locale canonicalizer that doesn't need any data
+ *
+ * Use ICU4XLocaleCanonicalizer for better control and functionality
+ *
+ * See the [Rust documentation for `canonicalize`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html#method.canonicalize) for more information.
+ */
+ static diplomat::result<std::string, ICU4XError> canonicalize(const std::string_view bytes);
+
+ /**
+ * Write a string representation of [`ICU4XLocale`] to `write`
+ *
+ * See the [Rust documentation for `write_to`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html#method.write_to) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> to_string_to_writeable(W& write) const;
+
+ /**
+ * Write a string representation of [`ICU4XLocale`] to `write`
+ *
+ * See the [Rust documentation for `write_to`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html#method.write_to) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> to_string() const;
+
+ /**
+ * See the [Rust documentation for `normalizing_eq`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html#method.normalizing_eq) for more information.
+ */
+ bool normalizing_eq(const std::string_view other) const;
+
+ /**
+ * See the [Rust documentation for `strict_cmp`](https://docs.rs/icu/latest/icu/locid/struct.Locale.html#method.strict_cmp) for more information.
+ */
+ ICU4XOrdering strict_cmp(const std::string_view other) const;
+
+ /**
+ * Deprecated
+ *
+ * Use `create_from_string("en").
+ */
+ static ICU4XLocale create_en();
+
+ /**
+ * Deprecated
+ *
+ * Use `create_from_string("bn").
+ */
+ static ICU4XLocale create_bn();
+ inline const capi::ICU4XLocale* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XLocale* AsFFIMut() { return this->inner.get(); }
+ inline explicit ICU4XLocale(capi::ICU4XLocale* i) : inner(i) {}
+ ICU4XLocale() = default;
+ ICU4XLocale(ICU4XLocale&&) noexcept = default;
+ ICU4XLocale& operator=(ICU4XLocale&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XLocale, ICU4XLocaleDeleter> inner;
+};
+
+
+inline diplomat::result<ICU4XLocale, ICU4XError> ICU4XLocale::create_from_string(const std::string_view name) {
+ auto diplomat_result_raw_out_value = capi::ICU4XLocale_create_from_string(name.data(), name.size());
+ diplomat::result<ICU4XLocale, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XLocale>(ICU4XLocale(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XLocale ICU4XLocale::create_und() {
+ return ICU4XLocale(capi::ICU4XLocale_create_und());
+}
+inline ICU4XLocale ICU4XLocale::clone() const {
+ return ICU4XLocale(capi::ICU4XLocale_clone(this->inner.get()));
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XLocale::basename_to_writeable(W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XLocale_basename(this->inner.get(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XLocale::basename() const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XLocale_basename(this->inner.get(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XLocale::get_unicode_extension_to_writeable(const std::string_view bytes, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XLocale_get_unicode_extension(this->inner.get(), bytes.data(), bytes.size(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XLocale::get_unicode_extension(const std::string_view bytes) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XLocale_get_unicode_extension(this->inner.get(), bytes.data(), bytes.size(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XLocale::language_to_writeable(W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XLocale_language(this->inner.get(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XLocale::language() const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XLocale_language(this->inner.get(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+inline diplomat::result<std::monostate, ICU4XError> ICU4XLocale::set_language(const std::string_view bytes) {
+ auto diplomat_result_raw_out_value = capi::ICU4XLocale_set_language(this->inner.get(), bytes.data(), bytes.size());
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XLocale::region_to_writeable(W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XLocale_region(this->inner.get(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XLocale::region() const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XLocale_region(this->inner.get(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+inline diplomat::result<std::monostate, ICU4XError> ICU4XLocale::set_region(const std::string_view bytes) {
+ auto diplomat_result_raw_out_value = capi::ICU4XLocale_set_region(this->inner.get(), bytes.data(), bytes.size());
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XLocale::script_to_writeable(W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XLocale_script(this->inner.get(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XLocale::script() const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XLocale_script(this->inner.get(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+inline diplomat::result<std::monostate, ICU4XError> ICU4XLocale::set_script(const std::string_view bytes) {
+ auto diplomat_result_raw_out_value = capi::ICU4XLocale_set_script(this->inner.get(), bytes.data(), bytes.size());
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XLocale::canonicalize_to_writeable(const std::string_view bytes, W& write) {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XLocale_canonicalize(bytes.data(), bytes.size(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XLocale::canonicalize(const std::string_view bytes) {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XLocale_canonicalize(bytes.data(), bytes.size(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XLocale::to_string_to_writeable(W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XLocale_to_string(this->inner.get(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XLocale::to_string() const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XLocale_to_string(this->inner.get(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+inline bool ICU4XLocale::normalizing_eq(const std::string_view other) const {
+ return capi::ICU4XLocale_normalizing_eq(this->inner.get(), other.data(), other.size());
+}
+inline ICU4XOrdering ICU4XLocale::strict_cmp(const std::string_view other) const {
+ return static_cast<ICU4XOrdering>(capi::ICU4XLocale_strict_cmp(this->inner.get(), other.data(), other.size()));
+}
+inline ICU4XLocale ICU4XLocale::create_en() {
+ return ICU4XLocale(capi::ICU4XLocale_create_en());
+}
+inline ICU4XLocale ICU4XLocale::create_bn() {
+ return ICU4XLocale(capi::ICU4XLocale_create_bn());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleCanonicalizer.h b/intl/icu_capi/cpp/include/ICU4XLocaleCanonicalizer.h
new file mode 100644
index 0000000000..8b48ad8bb6
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleCanonicalizer.h
@@ -0,0 +1,37 @@
+#ifndef ICU4XLocaleCanonicalizer_H
+#define ICU4XLocaleCanonicalizer_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XLocaleCanonicalizer ICU4XLocaleCanonicalizer;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XLocaleCanonicalizer_ICU4XError.h"
+#include "ICU4XLocale.h"
+#include "ICU4XTransformResult.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XLocaleCanonicalizer_ICU4XError ICU4XLocaleCanonicalizer_create(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XLocaleCanonicalizer_ICU4XError ICU4XLocaleCanonicalizer_create_extended(const ICU4XDataProvider* provider);
+
+ICU4XTransformResult ICU4XLocaleCanonicalizer_canonicalize(const ICU4XLocaleCanonicalizer* self, ICU4XLocale* locale);
+void ICU4XLocaleCanonicalizer_destroy(ICU4XLocaleCanonicalizer* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleCanonicalizer.hpp b/intl/icu_capi/cpp/include/ICU4XLocaleCanonicalizer.hpp
new file mode 100644
index 0000000000..76116cbf50
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleCanonicalizer.hpp
@@ -0,0 +1,93 @@
+#ifndef ICU4XLocaleCanonicalizer_HPP
+#define ICU4XLocaleCanonicalizer_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLocaleCanonicalizer.h"
+
+class ICU4XDataProvider;
+class ICU4XLocaleCanonicalizer;
+#include "ICU4XError.hpp"
+class ICU4XLocale;
+#include "ICU4XTransformResult.hpp"
+
+/**
+ * A destruction policy for using ICU4XLocaleCanonicalizer with std::unique_ptr.
+ */
+struct ICU4XLocaleCanonicalizerDeleter {
+ void operator()(capi::ICU4XLocaleCanonicalizer* l) const noexcept {
+ capi::ICU4XLocaleCanonicalizer_destroy(l);
+ }
+};
+
+/**
+ * A locale canonicalizer.
+ *
+ * See the [Rust documentation for `LocaleCanonicalizer`](https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleCanonicalizer.html) for more information.
+ */
+class ICU4XLocaleCanonicalizer {
+ public:
+
+ /**
+ * Create a new [`ICU4XLocaleCanonicalizer`].
+ *
+ * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleCanonicalizer.html#method.new) for more information.
+ */
+ static diplomat::result<ICU4XLocaleCanonicalizer, ICU4XError> create(const ICU4XDataProvider& provider);
+
+ /**
+ * Create a new [`ICU4XLocaleCanonicalizer`] with extended data.
+ *
+ * See the [Rust documentation for `new_with_expander`](https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleCanonicalizer.html#method.new_with_expander) for more information.
+ */
+ static diplomat::result<ICU4XLocaleCanonicalizer, ICU4XError> create_extended(const ICU4XDataProvider& provider);
+
+ /**
+ * FFI version of `LocaleCanonicalizer::canonicalize()`.
+ *
+ * See the [Rust documentation for `canonicalize`](https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleCanonicalizer.html#method.canonicalize) for more information.
+ */
+ ICU4XTransformResult canonicalize(ICU4XLocale& locale) const;
+ inline const capi::ICU4XLocaleCanonicalizer* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XLocaleCanonicalizer* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XLocaleCanonicalizer(capi::ICU4XLocaleCanonicalizer* i) : inner(i) {}
+ ICU4XLocaleCanonicalizer() = default;
+ ICU4XLocaleCanonicalizer(ICU4XLocaleCanonicalizer&&) noexcept = default;
+ ICU4XLocaleCanonicalizer& operator=(ICU4XLocaleCanonicalizer&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XLocaleCanonicalizer, ICU4XLocaleCanonicalizerDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocale.hpp"
+
+inline diplomat::result<ICU4XLocaleCanonicalizer, ICU4XError> ICU4XLocaleCanonicalizer::create(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XLocaleCanonicalizer_create(provider.AsFFI());
+ diplomat::result<ICU4XLocaleCanonicalizer, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XLocaleCanonicalizer>(ICU4XLocaleCanonicalizer(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XLocaleCanonicalizer, ICU4XError> ICU4XLocaleCanonicalizer::create_extended(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XLocaleCanonicalizer_create_extended(provider.AsFFI());
+ diplomat::result<ICU4XLocaleCanonicalizer, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XLocaleCanonicalizer>(ICU4XLocaleCanonicalizer(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XTransformResult ICU4XLocaleCanonicalizer::canonicalize(ICU4XLocale& locale) const {
+ return static_cast<ICU4XTransformResult>(capi::ICU4XLocaleCanonicalizer_canonicalize(this->inner.get(), locale.AsFFIMut()));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleDirection.h b/intl/icu_capi/cpp/include/ICU4XLocaleDirection.h
new file mode 100644
index 0000000000..688f04c98c
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleDirection.h
@@ -0,0 +1,32 @@
+#ifndef ICU4XLocaleDirection_H
+#define ICU4XLocaleDirection_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XLocaleDirection {
+ ICU4XLocaleDirection_LeftToRight = 0,
+ ICU4XLocaleDirection_RightToLeft = 1,
+ ICU4XLocaleDirection_Unknown = 2,
+} ICU4XLocaleDirection;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XLocaleDirection_destroy(ICU4XLocaleDirection* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleDirection.hpp b/intl/icu_capi/cpp/include/ICU4XLocaleDirection.hpp
new file mode 100644
index 0000000000..25c04e5ff8
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleDirection.hpp
@@ -0,0 +1,25 @@
+#ifndef ICU4XLocaleDirection_HPP
+#define ICU4XLocaleDirection_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLocaleDirection.h"
+
+
+
+/**
+ * See the [Rust documentation for `Direction`](https://docs.rs/icu/latest/icu/locid_transform/enum.Direction.html) for more information.
+ */
+enum struct ICU4XLocaleDirection {
+ LeftToRight = 0,
+ RightToLeft = 1,
+ Unknown = 2,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleDirectionality.h b/intl/icu_capi/cpp/include/ICU4XLocaleDirectionality.h
new file mode 100644
index 0000000000..9271b078c7
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleDirectionality.h
@@ -0,0 +1,42 @@
+#ifndef ICU4XLocaleDirectionality_H
+#define ICU4XLocaleDirectionality_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XLocaleDirectionality ICU4XLocaleDirectionality;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XLocaleDirectionality_ICU4XError.h"
+#include "ICU4XLocaleExpander.h"
+#include "ICU4XLocale.h"
+#include "ICU4XLocaleDirection.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XLocaleDirectionality_ICU4XError ICU4XLocaleDirectionality_create(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XLocaleDirectionality_ICU4XError ICU4XLocaleDirectionality_create_with_expander(const ICU4XDataProvider* provider, const ICU4XLocaleExpander* expander);
+
+ICU4XLocaleDirection ICU4XLocaleDirectionality_get(const ICU4XLocaleDirectionality* self, const ICU4XLocale* locale);
+
+bool ICU4XLocaleDirectionality_is_left_to_right(const ICU4XLocaleDirectionality* self, const ICU4XLocale* locale);
+
+bool ICU4XLocaleDirectionality_is_right_to_left(const ICU4XLocaleDirectionality* self, const ICU4XLocale* locale);
+void ICU4XLocaleDirectionality_destroy(ICU4XLocaleDirectionality* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleDirectionality.hpp b/intl/icu_capi/cpp/include/ICU4XLocaleDirectionality.hpp
new file mode 100644
index 0000000000..5bc295d172
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleDirectionality.hpp
@@ -0,0 +1,107 @@
+#ifndef ICU4XLocaleDirectionality_HPP
+#define ICU4XLocaleDirectionality_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLocaleDirectionality.h"
+
+class ICU4XDataProvider;
+class ICU4XLocaleDirectionality;
+#include "ICU4XError.hpp"
+class ICU4XLocaleExpander;
+class ICU4XLocale;
+#include "ICU4XLocaleDirection.hpp"
+
+/**
+ * A destruction policy for using ICU4XLocaleDirectionality with std::unique_ptr.
+ */
+struct ICU4XLocaleDirectionalityDeleter {
+ void operator()(capi::ICU4XLocaleDirectionality* l) const noexcept {
+ capi::ICU4XLocaleDirectionality_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `LocaleDirectionality`](https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleDirectionality.html) for more information.
+ */
+class ICU4XLocaleDirectionality {
+ public:
+
+ /**
+ * Construct a new ICU4XLocaleDirectionality instance
+ *
+ * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleDirectionality.html#method.new) for more information.
+ */
+ static diplomat::result<ICU4XLocaleDirectionality, ICU4XError> create(const ICU4XDataProvider& provider);
+
+ /**
+ * Construct a new ICU4XLocaleDirectionality instance with a custom expander
+ *
+ * See the [Rust documentation for `new_with_expander`](https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleDirectionality.html#method.new_with_expander) for more information.
+ */
+ static diplomat::result<ICU4XLocaleDirectionality, ICU4XError> create_with_expander(const ICU4XDataProvider& provider, const ICU4XLocaleExpander& expander);
+
+ /**
+ * See the [Rust documentation for `get`](https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleDirectionality.html#method.get) for more information.
+ */
+ ICU4XLocaleDirection get(const ICU4XLocale& locale) const;
+
+ /**
+ * See the [Rust documentation for `is_left_to_right`](https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleDirectionality.html#method.is_left_to_right) for more information.
+ */
+ bool is_left_to_right(const ICU4XLocale& locale) const;
+
+ /**
+ * See the [Rust documentation for `is_right_to_left`](https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleDirectionality.html#method.is_right_to_left) for more information.
+ */
+ bool is_right_to_left(const ICU4XLocale& locale) const;
+ inline const capi::ICU4XLocaleDirectionality* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XLocaleDirectionality* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XLocaleDirectionality(capi::ICU4XLocaleDirectionality* i) : inner(i) {}
+ ICU4XLocaleDirectionality() = default;
+ ICU4XLocaleDirectionality(ICU4XLocaleDirectionality&&) noexcept = default;
+ ICU4XLocaleDirectionality& operator=(ICU4XLocaleDirectionality&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XLocaleDirectionality, ICU4XLocaleDirectionalityDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocaleExpander.hpp"
+#include "ICU4XLocale.hpp"
+
+inline diplomat::result<ICU4XLocaleDirectionality, ICU4XError> ICU4XLocaleDirectionality::create(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XLocaleDirectionality_create(provider.AsFFI());
+ diplomat::result<ICU4XLocaleDirectionality, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XLocaleDirectionality>(ICU4XLocaleDirectionality(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XLocaleDirectionality, ICU4XError> ICU4XLocaleDirectionality::create_with_expander(const ICU4XDataProvider& provider, const ICU4XLocaleExpander& expander) {
+ auto diplomat_result_raw_out_value = capi::ICU4XLocaleDirectionality_create_with_expander(provider.AsFFI(), expander.AsFFI());
+ diplomat::result<ICU4XLocaleDirectionality, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XLocaleDirectionality>(ICU4XLocaleDirectionality(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XLocaleDirection ICU4XLocaleDirectionality::get(const ICU4XLocale& locale) const {
+ return static_cast<ICU4XLocaleDirection>(capi::ICU4XLocaleDirectionality_get(this->inner.get(), locale.AsFFI()));
+}
+inline bool ICU4XLocaleDirectionality::is_left_to_right(const ICU4XLocale& locale) const {
+ return capi::ICU4XLocaleDirectionality_is_left_to_right(this->inner.get(), locale.AsFFI());
+}
+inline bool ICU4XLocaleDirectionality::is_right_to_left(const ICU4XLocale& locale) const {
+ return capi::ICU4XLocaleDirectionality_is_right_to_left(this->inner.get(), locale.AsFFI());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleDisplayNamesFormatter.h b/intl/icu_capi/cpp/include/ICU4XLocaleDisplayNamesFormatter.h
new file mode 100644
index 0000000000..bfed8ec411
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleDisplayNamesFormatter.h
@@ -0,0 +1,36 @@
+#ifndef ICU4XLocaleDisplayNamesFormatter_H
+#define ICU4XLocaleDisplayNamesFormatter_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XLocaleDisplayNamesFormatter ICU4XLocaleDisplayNamesFormatter;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "ICU4XLocale.h"
+#include "ICU4XDisplayNamesOptionsV1.h"
+#include "diplomat_result_box_ICU4XLocaleDisplayNamesFormatter_ICU4XError.h"
+#include "diplomat_result_void_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XLocaleDisplayNamesFormatter_ICU4XError ICU4XLocaleDisplayNamesFormatter_create(const ICU4XDataProvider* provider, const ICU4XLocale* locale, ICU4XDisplayNamesOptionsV1 options);
+
+diplomat_result_void_ICU4XError ICU4XLocaleDisplayNamesFormatter_of(const ICU4XLocaleDisplayNamesFormatter* self, const ICU4XLocale* locale, DiplomatWriteable* write);
+void ICU4XLocaleDisplayNamesFormatter_destroy(ICU4XLocaleDisplayNamesFormatter* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleDisplayNamesFormatter.hpp b/intl/icu_capi/cpp/include/ICU4XLocaleDisplayNamesFormatter.hpp
new file mode 100644
index 0000000000..06eac9a3ab
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleDisplayNamesFormatter.hpp
@@ -0,0 +1,103 @@
+#ifndef ICU4XLocaleDisplayNamesFormatter_HPP
+#define ICU4XLocaleDisplayNamesFormatter_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLocaleDisplayNamesFormatter.h"
+
+class ICU4XDataProvider;
+class ICU4XLocale;
+struct ICU4XDisplayNamesOptionsV1;
+class ICU4XLocaleDisplayNamesFormatter;
+#include "ICU4XError.hpp"
+
+/**
+ * A destruction policy for using ICU4XLocaleDisplayNamesFormatter with std::unique_ptr.
+ */
+struct ICU4XLocaleDisplayNamesFormatterDeleter {
+ void operator()(capi::ICU4XLocaleDisplayNamesFormatter* l) const noexcept {
+ capi::ICU4XLocaleDisplayNamesFormatter_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `LocaleDisplayNamesFormatter`](https://docs.rs/icu/latest/icu/displaynames/struct.LocaleDisplayNamesFormatter.html) for more information.
+ */
+class ICU4XLocaleDisplayNamesFormatter {
+ public:
+
+ /**
+ * Creates a new `LocaleDisplayNamesFormatter` from locale data and an options bag.
+ *
+ * See the [Rust documentation for `try_new`](https://docs.rs/icu/latest/icu/displaynames/struct.LocaleDisplayNamesFormatter.html#method.try_new) for more information.
+ */
+ static diplomat::result<ICU4XLocaleDisplayNamesFormatter, ICU4XError> create(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDisplayNamesOptionsV1 options);
+
+ /**
+ * Returns the locale-specific display name of a locale.
+ *
+ * See the [Rust documentation for `of`](https://docs.rs/icu/latest/icu/displaynames/struct.LocaleDisplayNamesFormatter.html#method.of) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> of_to_writeable(const ICU4XLocale& locale, W& write) const;
+
+ /**
+ * Returns the locale-specific display name of a locale.
+ *
+ * See the [Rust documentation for `of`](https://docs.rs/icu/latest/icu/displaynames/struct.LocaleDisplayNamesFormatter.html#method.of) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> of(const ICU4XLocale& locale) const;
+ inline const capi::ICU4XLocaleDisplayNamesFormatter* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XLocaleDisplayNamesFormatter* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XLocaleDisplayNamesFormatter(capi::ICU4XLocaleDisplayNamesFormatter* i) : inner(i) {}
+ ICU4XLocaleDisplayNamesFormatter() = default;
+ ICU4XLocaleDisplayNamesFormatter(ICU4XLocaleDisplayNamesFormatter&&) noexcept = default;
+ ICU4XLocaleDisplayNamesFormatter& operator=(ICU4XLocaleDisplayNamesFormatter&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XLocaleDisplayNamesFormatter, ICU4XLocaleDisplayNamesFormatterDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocale.hpp"
+#include "ICU4XDisplayNamesOptionsV1.hpp"
+
+inline diplomat::result<ICU4XLocaleDisplayNamesFormatter, ICU4XError> ICU4XLocaleDisplayNamesFormatter::create(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDisplayNamesOptionsV1 options) {
+ ICU4XDisplayNamesOptionsV1 diplomat_wrapped_struct_options = options;
+ auto diplomat_result_raw_out_value = capi::ICU4XLocaleDisplayNamesFormatter_create(provider.AsFFI(), locale.AsFFI(), capi::ICU4XDisplayNamesOptionsV1{ .style = static_cast<capi::ICU4XDisplayNamesStyle>(diplomat_wrapped_struct_options.style), .fallback = static_cast<capi::ICU4XDisplayNamesFallback>(diplomat_wrapped_struct_options.fallback), .language_display = static_cast<capi::ICU4XLanguageDisplay>(diplomat_wrapped_struct_options.language_display) });
+ diplomat::result<ICU4XLocaleDisplayNamesFormatter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XLocaleDisplayNamesFormatter>(ICU4XLocaleDisplayNamesFormatter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XLocaleDisplayNamesFormatter::of_to_writeable(const ICU4XLocale& locale, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XLocaleDisplayNamesFormatter_of(this->inner.get(), locale.AsFFI(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XLocaleDisplayNamesFormatter::of(const ICU4XLocale& locale) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XLocaleDisplayNamesFormatter_of(this->inner.get(), locale.AsFFI(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleExpander.h b/intl/icu_capi/cpp/include/ICU4XLocaleExpander.h
new file mode 100644
index 0000000000..a7de7be16b
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleExpander.h
@@ -0,0 +1,39 @@
+#ifndef ICU4XLocaleExpander_H
+#define ICU4XLocaleExpander_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XLocaleExpander ICU4XLocaleExpander;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XLocaleExpander_ICU4XError.h"
+#include "ICU4XLocale.h"
+#include "ICU4XTransformResult.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XLocaleExpander_ICU4XError ICU4XLocaleExpander_create(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XLocaleExpander_ICU4XError ICU4XLocaleExpander_create_extended(const ICU4XDataProvider* provider);
+
+ICU4XTransformResult ICU4XLocaleExpander_maximize(const ICU4XLocaleExpander* self, ICU4XLocale* locale);
+
+ICU4XTransformResult ICU4XLocaleExpander_minimize(const ICU4XLocaleExpander* self, ICU4XLocale* locale);
+void ICU4XLocaleExpander_destroy(ICU4XLocaleExpander* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleExpander.hpp b/intl/icu_capi/cpp/include/ICU4XLocaleExpander.hpp
new file mode 100644
index 0000000000..d63cf92b82
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleExpander.hpp
@@ -0,0 +1,103 @@
+#ifndef ICU4XLocaleExpander_HPP
+#define ICU4XLocaleExpander_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLocaleExpander.h"
+
+class ICU4XDataProvider;
+class ICU4XLocaleExpander;
+#include "ICU4XError.hpp"
+class ICU4XLocale;
+#include "ICU4XTransformResult.hpp"
+
+/**
+ * A destruction policy for using ICU4XLocaleExpander with std::unique_ptr.
+ */
+struct ICU4XLocaleExpanderDeleter {
+ void operator()(capi::ICU4XLocaleExpander* l) const noexcept {
+ capi::ICU4XLocaleExpander_destroy(l);
+ }
+};
+
+/**
+ * A locale expander.
+ *
+ * See the [Rust documentation for `LocaleExpander`](https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleExpander.html) for more information.
+ */
+class ICU4XLocaleExpander {
+ public:
+
+ /**
+ * Create a new [`ICU4XLocaleExpander`].
+ *
+ * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleExpander.html#method.new) for more information.
+ */
+ static diplomat::result<ICU4XLocaleExpander, ICU4XError> create(const ICU4XDataProvider& provider);
+
+ /**
+ * Create a new [`ICU4XLocaleExpander`] with extended data.
+ *
+ * See the [Rust documentation for `new_extended`](https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleExpander.html#method.new_extended) for more information.
+ */
+ static diplomat::result<ICU4XLocaleExpander, ICU4XError> create_extended(const ICU4XDataProvider& provider);
+
+ /**
+ * FFI version of `LocaleExpander::maximize()`.
+ *
+ * See the [Rust documentation for `maximize`](https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleExpander.html#method.maximize) for more information.
+ */
+ ICU4XTransformResult maximize(ICU4XLocale& locale) const;
+
+ /**
+ * FFI version of `LocaleExpander::minimize()`.
+ *
+ * See the [Rust documentation for `minimize`](https://docs.rs/icu/latest/icu/locid_transform/struct.LocaleExpander.html#method.minimize) for more information.
+ */
+ ICU4XTransformResult minimize(ICU4XLocale& locale) const;
+ inline const capi::ICU4XLocaleExpander* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XLocaleExpander* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XLocaleExpander(capi::ICU4XLocaleExpander* i) : inner(i) {}
+ ICU4XLocaleExpander() = default;
+ ICU4XLocaleExpander(ICU4XLocaleExpander&&) noexcept = default;
+ ICU4XLocaleExpander& operator=(ICU4XLocaleExpander&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XLocaleExpander, ICU4XLocaleExpanderDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocale.hpp"
+
+inline diplomat::result<ICU4XLocaleExpander, ICU4XError> ICU4XLocaleExpander::create(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XLocaleExpander_create(provider.AsFFI());
+ diplomat::result<ICU4XLocaleExpander, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XLocaleExpander>(ICU4XLocaleExpander(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XLocaleExpander, ICU4XError> ICU4XLocaleExpander::create_extended(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XLocaleExpander_create_extended(provider.AsFFI());
+ diplomat::result<ICU4XLocaleExpander, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XLocaleExpander>(ICU4XLocaleExpander(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XTransformResult ICU4XLocaleExpander::maximize(ICU4XLocale& locale) const {
+ return static_cast<ICU4XTransformResult>(capi::ICU4XLocaleExpander_maximize(this->inner.get(), locale.AsFFIMut()));
+}
+inline ICU4XTransformResult ICU4XLocaleExpander::minimize(ICU4XLocale& locale) const {
+ return static_cast<ICU4XTransformResult>(capi::ICU4XLocaleExpander_minimize(this->inner.get(), locale.AsFFIMut()));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleFallbackConfig.h b/intl/icu_capi/cpp/include/ICU4XLocaleFallbackConfig.h
new file mode 100644
index 0000000000..b40d115418
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleFallbackConfig.h
@@ -0,0 +1,36 @@
+#ifndef ICU4XLocaleFallbackConfig_H
+#define ICU4XLocaleFallbackConfig_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#include "ICU4XLocaleFallbackPriority.h"
+#include "ICU4XLocaleFallbackSupplement.h"
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XLocaleFallbackConfig {
+ ICU4XLocaleFallbackPriority priority;
+ DiplomatStringView extension_key;
+ ICU4XLocaleFallbackSupplement fallback_supplement;
+} ICU4XLocaleFallbackConfig;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XLocaleFallbackPriority.h"
+#include "ICU4XLocaleFallbackSupplement.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XLocaleFallbackConfig_destroy(ICU4XLocaleFallbackConfig* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleFallbackConfig.hpp b/intl/icu_capi/cpp/include/ICU4XLocaleFallbackConfig.hpp
new file mode 100644
index 0000000000..8c177d718a
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleFallbackConfig.hpp
@@ -0,0 +1,43 @@
+#ifndef ICU4XLocaleFallbackConfig_HPP
+#define ICU4XLocaleFallbackConfig_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLocaleFallbackConfig.h"
+
+#include "ICU4XLocaleFallbackPriority.hpp"
+#include "ICU4XLocaleFallbackSupplement.hpp"
+
+
+/**
+ * Collection of configurations for the ICU4X fallback algorithm.
+ *
+ * See the [Rust documentation for `LocaleFallbackConfig`](https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbackConfig.html) for more information.
+ */
+struct ICU4XLocaleFallbackConfig {
+ public:
+
+ /**
+ * Choice of priority mode.
+ */
+ ICU4XLocaleFallbackPriority priority;
+
+ /**
+ * An empty string is considered `None`.
+ */
+ std::string_view extension_key;
+
+ /**
+ * Fallback supplement data key to customize fallback rules.
+ */
+ ICU4XLocaleFallbackSupplement fallback_supplement;
+};
+
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleFallbackIterator.h b/intl/icu_capi/cpp/include/ICU4XLocaleFallbackIterator.h
new file mode 100644
index 0000000000..e2dd7a1a3b
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleFallbackIterator.h
@@ -0,0 +1,32 @@
+#ifndef ICU4XLocaleFallbackIterator_H
+#define ICU4XLocaleFallbackIterator_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XLocaleFallbackIterator ICU4XLocaleFallbackIterator;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XLocale.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+ICU4XLocale* ICU4XLocaleFallbackIterator_get(const ICU4XLocaleFallbackIterator* self);
+
+void ICU4XLocaleFallbackIterator_step(ICU4XLocaleFallbackIterator* self);
+void ICU4XLocaleFallbackIterator_destroy(ICU4XLocaleFallbackIterator* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleFallbackIterator.hpp b/intl/icu_capi/cpp/include/ICU4XLocaleFallbackIterator.hpp
new file mode 100644
index 0000000000..93c47eb01e
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleFallbackIterator.hpp
@@ -0,0 +1,64 @@
+#ifndef ICU4XLocaleFallbackIterator_HPP
+#define ICU4XLocaleFallbackIterator_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLocaleFallbackIterator.h"
+
+class ICU4XLocale;
+
+/**
+ * A destruction policy for using ICU4XLocaleFallbackIterator with std::unique_ptr.
+ */
+struct ICU4XLocaleFallbackIteratorDeleter {
+ void operator()(capi::ICU4XLocaleFallbackIterator* l) const noexcept {
+ capi::ICU4XLocaleFallbackIterator_destroy(l);
+ }
+};
+
+/**
+ * An iterator over the locale under fallback.
+ *
+ * See the [Rust documentation for `LocaleFallbackIterator`](https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbackIterator.html) for more information.
+ */
+class ICU4XLocaleFallbackIterator {
+ public:
+
+ /**
+ * Gets a snapshot of the current state of the locale.
+ *
+ * See the [Rust documentation for `get`](https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbackIterator.html#method.get) for more information.
+ */
+ ICU4XLocale get() const;
+
+ /**
+ * Performs one step of the fallback algorithm, mutating the locale.
+ *
+ * See the [Rust documentation for `step`](https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbackIterator.html#method.step) for more information.
+ */
+ void step();
+ inline const capi::ICU4XLocaleFallbackIterator* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XLocaleFallbackIterator* AsFFIMut() { return this->inner.get(); }
+ inline explicit ICU4XLocaleFallbackIterator(capi::ICU4XLocaleFallbackIterator* i) : inner(i) {}
+ ICU4XLocaleFallbackIterator() = default;
+ ICU4XLocaleFallbackIterator(ICU4XLocaleFallbackIterator&&) noexcept = default;
+ ICU4XLocaleFallbackIterator& operator=(ICU4XLocaleFallbackIterator&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XLocaleFallbackIterator, ICU4XLocaleFallbackIteratorDeleter> inner;
+};
+
+#include "ICU4XLocale.hpp"
+
+inline ICU4XLocale ICU4XLocaleFallbackIterator::get() const {
+ return ICU4XLocale(capi::ICU4XLocaleFallbackIterator_get(this->inner.get()));
+}
+inline void ICU4XLocaleFallbackIterator::step() {
+ capi::ICU4XLocaleFallbackIterator_step(this->inner.get());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleFallbackPriority.h b/intl/icu_capi/cpp/include/ICU4XLocaleFallbackPriority.h
new file mode 100644
index 0000000000..e4ab748065
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleFallbackPriority.h
@@ -0,0 +1,32 @@
+#ifndef ICU4XLocaleFallbackPriority_H
+#define ICU4XLocaleFallbackPriority_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XLocaleFallbackPriority {
+ ICU4XLocaleFallbackPriority_Language = 0,
+ ICU4XLocaleFallbackPriority_Region = 1,
+ ICU4XLocaleFallbackPriority_Collation = 2,
+} ICU4XLocaleFallbackPriority;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XLocaleFallbackPriority_destroy(ICU4XLocaleFallbackPriority* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleFallbackPriority.hpp b/intl/icu_capi/cpp/include/ICU4XLocaleFallbackPriority.hpp
new file mode 100644
index 0000000000..19d52ae7a3
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleFallbackPriority.hpp
@@ -0,0 +1,27 @@
+#ifndef ICU4XLocaleFallbackPriority_HPP
+#define ICU4XLocaleFallbackPriority_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLocaleFallbackPriority.h"
+
+
+
+/**
+ * Priority mode for the ICU4X fallback algorithm.
+ *
+ * See the [Rust documentation for `LocaleFallbackPriority`](https://docs.rs/icu/latest/icu/locid_transform/fallback/enum.LocaleFallbackPriority.html) for more information.
+ */
+enum struct ICU4XLocaleFallbackPriority {
+ Language = 0,
+ Region = 1,
+ Collation = 2,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleFallbackSupplement.h b/intl/icu_capi/cpp/include/ICU4XLocaleFallbackSupplement.h
new file mode 100644
index 0000000000..952483c724
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleFallbackSupplement.h
@@ -0,0 +1,31 @@
+#ifndef ICU4XLocaleFallbackSupplement_H
+#define ICU4XLocaleFallbackSupplement_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XLocaleFallbackSupplement {
+ ICU4XLocaleFallbackSupplement_None = 0,
+ ICU4XLocaleFallbackSupplement_Collation = 1,
+} ICU4XLocaleFallbackSupplement;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XLocaleFallbackSupplement_destroy(ICU4XLocaleFallbackSupplement* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleFallbackSupplement.hpp b/intl/icu_capi/cpp/include/ICU4XLocaleFallbackSupplement.hpp
new file mode 100644
index 0000000000..a357bb4929
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleFallbackSupplement.hpp
@@ -0,0 +1,26 @@
+#ifndef ICU4XLocaleFallbackSupplement_HPP
+#define ICU4XLocaleFallbackSupplement_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLocaleFallbackSupplement.h"
+
+
+
+/**
+ * What additional data is required to load when performing fallback.
+ *
+ * See the [Rust documentation for `LocaleFallbackSupplement`](https://docs.rs/icu/latest/icu/locid_transform/fallback/enum.LocaleFallbackSupplement.html) for more information.
+ */
+enum struct ICU4XLocaleFallbackSupplement {
+ None = 0,
+ Collation = 1,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleFallbacker.h b/intl/icu_capi/cpp/include/ICU4XLocaleFallbacker.h
new file mode 100644
index 0000000000..24efb0602f
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleFallbacker.h
@@ -0,0 +1,37 @@
+#ifndef ICU4XLocaleFallbacker_H
+#define ICU4XLocaleFallbacker_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XLocaleFallbacker ICU4XLocaleFallbacker;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XLocaleFallbacker_ICU4XError.h"
+#include "ICU4XLocaleFallbackConfig.h"
+#include "diplomat_result_box_ICU4XLocaleFallbackerWithConfig_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XLocaleFallbacker_ICU4XError ICU4XLocaleFallbacker_create(const ICU4XDataProvider* provider);
+
+ICU4XLocaleFallbacker* ICU4XLocaleFallbacker_create_without_data();
+
+diplomat_result_box_ICU4XLocaleFallbackerWithConfig_ICU4XError ICU4XLocaleFallbacker_for_config(const ICU4XLocaleFallbacker* self, ICU4XLocaleFallbackConfig config);
+void ICU4XLocaleFallbacker_destroy(ICU4XLocaleFallbacker* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleFallbacker.hpp b/intl/icu_capi/cpp/include/ICU4XLocaleFallbacker.hpp
new file mode 100644
index 0000000000..707ddce386
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleFallbacker.hpp
@@ -0,0 +1,97 @@
+#ifndef ICU4XLocaleFallbacker_HPP
+#define ICU4XLocaleFallbacker_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLocaleFallbacker.h"
+
+class ICU4XDataProvider;
+class ICU4XLocaleFallbacker;
+#include "ICU4XError.hpp"
+struct ICU4XLocaleFallbackConfig;
+class ICU4XLocaleFallbackerWithConfig;
+
+/**
+ * A destruction policy for using ICU4XLocaleFallbacker with std::unique_ptr.
+ */
+struct ICU4XLocaleFallbackerDeleter {
+ void operator()(capi::ICU4XLocaleFallbacker* l) const noexcept {
+ capi::ICU4XLocaleFallbacker_destroy(l);
+ }
+};
+
+/**
+ * An object that runs the ICU4X locale fallback algorithm.
+ *
+ * See the [Rust documentation for `LocaleFallbacker`](https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbacker.html) for more information.
+ */
+class ICU4XLocaleFallbacker {
+ public:
+
+ /**
+ * Creates a new `ICU4XLocaleFallbacker` from a data provider.
+ *
+ * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbacker.html#method.new) for more information.
+ */
+ static diplomat::result<ICU4XLocaleFallbacker, ICU4XError> create(const ICU4XDataProvider& provider);
+
+ /**
+ * Creates a new `ICU4XLocaleFallbacker` without data for limited functionality.
+ *
+ * See the [Rust documentation for `new_without_data`](https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbacker.html#method.new_without_data) for more information.
+ */
+ static ICU4XLocaleFallbacker create_without_data();
+
+ /**
+ * Associates this `ICU4XLocaleFallbacker` with configuration options.
+ *
+ * See the [Rust documentation for `for_config`](https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbacker.html#method.for_config) for more information.
+ *
+ * Lifetimes: `this` must live at least as long as the output.
+ */
+ diplomat::result<ICU4XLocaleFallbackerWithConfig, ICU4XError> for_config(ICU4XLocaleFallbackConfig config) const;
+ inline const capi::ICU4XLocaleFallbacker* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XLocaleFallbacker* AsFFIMut() { return this->inner.get(); }
+ inline explicit ICU4XLocaleFallbacker(capi::ICU4XLocaleFallbacker* i) : inner(i) {}
+ ICU4XLocaleFallbacker() = default;
+ ICU4XLocaleFallbacker(ICU4XLocaleFallbacker&&) noexcept = default;
+ ICU4XLocaleFallbacker& operator=(ICU4XLocaleFallbacker&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XLocaleFallbacker, ICU4XLocaleFallbackerDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocaleFallbackConfig.hpp"
+#include "ICU4XLocaleFallbackerWithConfig.hpp"
+
+inline diplomat::result<ICU4XLocaleFallbacker, ICU4XError> ICU4XLocaleFallbacker::create(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XLocaleFallbacker_create(provider.AsFFI());
+ diplomat::result<ICU4XLocaleFallbacker, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XLocaleFallbacker>(ICU4XLocaleFallbacker(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XLocaleFallbacker ICU4XLocaleFallbacker::create_without_data() {
+ return ICU4XLocaleFallbacker(capi::ICU4XLocaleFallbacker_create_without_data());
+}
+inline diplomat::result<ICU4XLocaleFallbackerWithConfig, ICU4XError> ICU4XLocaleFallbacker::for_config(ICU4XLocaleFallbackConfig config) const {
+ ICU4XLocaleFallbackConfig diplomat_wrapped_struct_config = config;
+ auto diplomat_result_raw_out_value = capi::ICU4XLocaleFallbacker_for_config(this->inner.get(), capi::ICU4XLocaleFallbackConfig{ .priority = static_cast<capi::ICU4XLocaleFallbackPriority>(diplomat_wrapped_struct_config.priority), .extension_key = { diplomat_wrapped_struct_config.extension_key.data(), diplomat_wrapped_struct_config.extension_key.size() }, .fallback_supplement = static_cast<capi::ICU4XLocaleFallbackSupplement>(diplomat_wrapped_struct_config.fallback_supplement) });
+ diplomat::result<ICU4XLocaleFallbackerWithConfig, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XLocaleFallbackerWithConfig>(ICU4XLocaleFallbackerWithConfig(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleFallbackerWithConfig.h b/intl/icu_capi/cpp/include/ICU4XLocaleFallbackerWithConfig.h
new file mode 100644
index 0000000000..e8baa9563e
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleFallbackerWithConfig.h
@@ -0,0 +1,31 @@
+#ifndef ICU4XLocaleFallbackerWithConfig_H
+#define ICU4XLocaleFallbackerWithConfig_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XLocaleFallbackerWithConfig ICU4XLocaleFallbackerWithConfig;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XLocale.h"
+#include "ICU4XLocaleFallbackIterator.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+ICU4XLocaleFallbackIterator* ICU4XLocaleFallbackerWithConfig_fallback_for_locale(const ICU4XLocaleFallbackerWithConfig* self, const ICU4XLocale* locale);
+void ICU4XLocaleFallbackerWithConfig_destroy(ICU4XLocaleFallbackerWithConfig* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLocaleFallbackerWithConfig.hpp b/intl/icu_capi/cpp/include/ICU4XLocaleFallbackerWithConfig.hpp
new file mode 100644
index 0000000000..41f23cd0b0
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLocaleFallbackerWithConfig.hpp
@@ -0,0 +1,60 @@
+#ifndef ICU4XLocaleFallbackerWithConfig_HPP
+#define ICU4XLocaleFallbackerWithConfig_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLocaleFallbackerWithConfig.h"
+
+class ICU4XLocale;
+class ICU4XLocaleFallbackIterator;
+
+/**
+ * A destruction policy for using ICU4XLocaleFallbackerWithConfig with std::unique_ptr.
+ */
+struct ICU4XLocaleFallbackerWithConfigDeleter {
+ void operator()(capi::ICU4XLocaleFallbackerWithConfig* l) const noexcept {
+ capi::ICU4XLocaleFallbackerWithConfig_destroy(l);
+ }
+};
+
+/**
+ * An object that runs the ICU4X locale fallback algorithm with specific configurations.
+ *
+ * See the [Rust documentation for `LocaleFallbacker`](https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbacker.html) for more information.
+ *
+ * See the [Rust documentation for `LocaleFallbackerWithConfig`](https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbackerWithConfig.html) for more information.
+ */
+class ICU4XLocaleFallbackerWithConfig {
+ public:
+
+ /**
+ * Creates an iterator from a locale with each step of fallback.
+ *
+ * See the [Rust documentation for `fallback_for`](https://docs.rs/icu/latest/icu/locid_transform/fallback/struct.LocaleFallbacker.html#method.fallback_for) for more information.
+ *
+ * Lifetimes: `this` must live at least as long as the output.
+ */
+ ICU4XLocaleFallbackIterator fallback_for_locale(const ICU4XLocale& locale) const;
+ inline const capi::ICU4XLocaleFallbackerWithConfig* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XLocaleFallbackerWithConfig* AsFFIMut() { return this->inner.get(); }
+ inline explicit ICU4XLocaleFallbackerWithConfig(capi::ICU4XLocaleFallbackerWithConfig* i) : inner(i) {}
+ ICU4XLocaleFallbackerWithConfig() = default;
+ ICU4XLocaleFallbackerWithConfig(ICU4XLocaleFallbackerWithConfig&&) noexcept = default;
+ ICU4XLocaleFallbackerWithConfig& operator=(ICU4XLocaleFallbackerWithConfig&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XLocaleFallbackerWithConfig, ICU4XLocaleFallbackerWithConfigDeleter> inner;
+};
+
+#include "ICU4XLocale.hpp"
+#include "ICU4XLocaleFallbackIterator.hpp"
+
+inline ICU4XLocaleFallbackIterator ICU4XLocaleFallbackerWithConfig::fallback_for_locale(const ICU4XLocale& locale) const {
+ return ICU4XLocaleFallbackIterator(capi::ICU4XLocaleFallbackerWithConfig_fallback_for_locale(this->inner.get(), locale.AsFFI()));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLogger.h b/intl/icu_capi/cpp/include/ICU4XLogger.h
new file mode 100644
index 0000000000..0aa1d0b1f9
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLogger.h
@@ -0,0 +1,31 @@
+#ifndef ICU4XLogger_H
+#define ICU4XLogger_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XLogger ICU4XLogger;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+bool ICU4XLogger_init_simple_logger();
+
+bool ICU4XLogger_init_console_logger();
+void ICU4XLogger_destroy(ICU4XLogger* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XLogger.hpp b/intl/icu_capi/cpp/include/ICU4XLogger.hpp
new file mode 100644
index 0000000000..4a15424673
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XLogger.hpp
@@ -0,0 +1,60 @@
+#ifndef ICU4XLogger_HPP
+#define ICU4XLogger_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XLogger.h"
+
+
+/**
+ * A destruction policy for using ICU4XLogger with std::unique_ptr.
+ */
+struct ICU4XLoggerDeleter {
+ void operator()(capi::ICU4XLogger* l) const noexcept {
+ capi::ICU4XLogger_destroy(l);
+ }
+};
+
+/**
+ * An object allowing control over the logging used
+ */
+class ICU4XLogger {
+ public:
+
+ /**
+ * Initialize the logger using `simple_logger`
+ *
+ * Requires the `simple_logger` Cargo feature.
+ *
+ * Returns `false` if there was already a logger set.
+ */
+ static bool init_simple_logger();
+
+ /**
+ * Deprecated: since ICU4X 1.4, this now happens automatically if the `log` feature is enabled.
+ */
+ static bool init_console_logger();
+ inline const capi::ICU4XLogger* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XLogger* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XLogger(capi::ICU4XLogger* i) : inner(i) {}
+ ICU4XLogger() = default;
+ ICU4XLogger(ICU4XLogger&&) noexcept = default;
+ ICU4XLogger& operator=(ICU4XLogger&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XLogger, ICU4XLoggerDeleter> inner;
+};
+
+
+inline bool ICU4XLogger::init_simple_logger() {
+ return capi::ICU4XLogger_init_simple_logger();
+}
+inline bool ICU4XLogger::init_console_logger() {
+ return capi::ICU4XLogger_init_console_logger();
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XMetazoneCalculator.h b/intl/icu_capi/cpp/include/ICU4XMetazoneCalculator.h
new file mode 100644
index 0000000000..9c66754e90
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XMetazoneCalculator.h
@@ -0,0 +1,31 @@
+#ifndef ICU4XMetazoneCalculator_H
+#define ICU4XMetazoneCalculator_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XMetazoneCalculator ICU4XMetazoneCalculator;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XMetazoneCalculator_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XMetazoneCalculator_ICU4XError ICU4XMetazoneCalculator_create(const ICU4XDataProvider* provider);
+void ICU4XMetazoneCalculator_destroy(ICU4XMetazoneCalculator* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XMetazoneCalculator.hpp b/intl/icu_capi/cpp/include/ICU4XMetazoneCalculator.hpp
new file mode 100644
index 0000000000..263219d07f
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XMetazoneCalculator.hpp
@@ -0,0 +1,65 @@
+#ifndef ICU4XMetazoneCalculator_HPP
+#define ICU4XMetazoneCalculator_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XMetazoneCalculator.h"
+
+class ICU4XDataProvider;
+class ICU4XMetazoneCalculator;
+#include "ICU4XError.hpp"
+
+/**
+ * A destruction policy for using ICU4XMetazoneCalculator with std::unique_ptr.
+ */
+struct ICU4XMetazoneCalculatorDeleter {
+ void operator()(capi::ICU4XMetazoneCalculator* l) const noexcept {
+ capi::ICU4XMetazoneCalculator_destroy(l);
+ }
+};
+
+/**
+ * An object capable of computing the metazone from a timezone.
+ *
+ * This can be used via `maybe_calculate_metazone()` on [`ICU4XCustomTimeZone`].
+ *
+ * [`ICU4XCustomTimeZone`]: crate::timezone::ffi::ICU4XCustomTimeZone
+ *
+ * See the [Rust documentation for `MetazoneCalculator`](https://docs.rs/icu/latest/icu/timezone/struct.MetazoneCalculator.html) for more information.
+ */
+class ICU4XMetazoneCalculator {
+ public:
+
+ /**
+ * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/timezone/struct.MetazoneCalculator.html#method.new) for more information.
+ */
+ static diplomat::result<ICU4XMetazoneCalculator, ICU4XError> create(const ICU4XDataProvider& provider);
+ inline const capi::ICU4XMetazoneCalculator* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XMetazoneCalculator* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XMetazoneCalculator(capi::ICU4XMetazoneCalculator* i) : inner(i) {}
+ ICU4XMetazoneCalculator() = default;
+ ICU4XMetazoneCalculator(ICU4XMetazoneCalculator&&) noexcept = default;
+ ICU4XMetazoneCalculator& operator=(ICU4XMetazoneCalculator&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XMetazoneCalculator, ICU4XMetazoneCalculatorDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+
+inline diplomat::result<ICU4XMetazoneCalculator, ICU4XError> ICU4XMetazoneCalculator::create(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XMetazoneCalculator_create(provider.AsFFI());
+ diplomat::result<ICU4XMetazoneCalculator, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XMetazoneCalculator>(ICU4XMetazoneCalculator(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XOrdering.h b/intl/icu_capi/cpp/include/ICU4XOrdering.h
new file mode 100644
index 0000000000..2c1885f43e
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XOrdering.h
@@ -0,0 +1,32 @@
+#ifndef ICU4XOrdering_H
+#define ICU4XOrdering_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XOrdering {
+ ICU4XOrdering_Less = -1,
+ ICU4XOrdering_Equal = 0,
+ ICU4XOrdering_Greater = 1,
+} ICU4XOrdering;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XOrdering_destroy(ICU4XOrdering* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XOrdering.hpp b/intl/icu_capi/cpp/include/ICU4XOrdering.hpp
new file mode 100644
index 0000000000..77421325d0
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XOrdering.hpp
@@ -0,0 +1,25 @@
+#ifndef ICU4XOrdering_HPP
+#define ICU4XOrdering_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XOrdering.h"
+
+
+
+/**
+ * See the [Rust documentation for `Ordering`](https://docs.rs/core/latest/core/cmp/enum.Ordering.html) for more information.
+ */
+enum struct ICU4XOrdering {
+ Less = -1,
+ Equal = 0,
+ Greater = 1,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XPluralCategories.h b/intl/icu_capi/cpp/include/ICU4XPluralCategories.h
new file mode 100644
index 0000000000..931ea2daa7
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XPluralCategories.h
@@ -0,0 +1,35 @@
+#ifndef ICU4XPluralCategories_H
+#define ICU4XPluralCategories_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XPluralCategories {
+ bool zero;
+ bool one;
+ bool two;
+ bool few;
+ bool many;
+ bool other;
+} ICU4XPluralCategories;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XPluralCategories_destroy(ICU4XPluralCategories* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XPluralCategories.hpp b/intl/icu_capi/cpp/include/ICU4XPluralCategories.hpp
new file mode 100644
index 0000000000..c8b4a767a4
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XPluralCategories.hpp
@@ -0,0 +1,30 @@
+#ifndef ICU4XPluralCategories_HPP
+#define ICU4XPluralCategories_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XPluralCategories.h"
+
+
+
+/**
+ * FFI version of `PluralRules::categories()` data.
+ */
+struct ICU4XPluralCategories {
+ public:
+ bool zero;
+ bool one;
+ bool two;
+ bool few;
+ bool many;
+ bool other;
+};
+
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XPluralCategory.h b/intl/icu_capi/cpp/include/ICU4XPluralCategory.h
new file mode 100644
index 0000000000..543681c746
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XPluralCategory.h
@@ -0,0 +1,37 @@
+#ifndef ICU4XPluralCategory_H
+#define ICU4XPluralCategory_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XPluralCategory {
+ ICU4XPluralCategory_Zero = 0,
+ ICU4XPluralCategory_One = 1,
+ ICU4XPluralCategory_Two = 2,
+ ICU4XPluralCategory_Few = 3,
+ ICU4XPluralCategory_Many = 4,
+ ICU4XPluralCategory_Other = 5,
+} ICU4XPluralCategory;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "diplomat_result_ICU4XPluralCategory_void.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_ICU4XPluralCategory_void ICU4XPluralCategory_get_for_cldr_string(const char* s_data, size_t s_len);
+void ICU4XPluralCategory_destroy(ICU4XPluralCategory* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XPluralCategory.hpp b/intl/icu_capi/cpp/include/ICU4XPluralCategory.hpp
new file mode 100644
index 0000000000..24db42ec21
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XPluralCategory.hpp
@@ -0,0 +1,30 @@
+#ifndef ICU4XPluralCategory_HPP
+#define ICU4XPluralCategory_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XPluralCategory.h"
+
+
+
+/**
+ * FFI version of `PluralCategory`.
+ *
+ * See the [Rust documentation for `PluralCategory`](https://docs.rs/icu/latest/icu/plurals/enum.PluralCategory.html) for more information.
+ */
+enum struct ICU4XPluralCategory {
+ Zero = 0,
+ One = 1,
+ Two = 2,
+ Few = 3,
+ Many = 4,
+ Other = 5,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XPluralOperands.h b/intl/icu_capi/cpp/include/ICU4XPluralOperands.h
new file mode 100644
index 0000000000..14d997555f
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XPluralOperands.h
@@ -0,0 +1,30 @@
+#ifndef ICU4XPluralOperands_H
+#define ICU4XPluralOperands_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XPluralOperands ICU4XPluralOperands;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "diplomat_result_box_ICU4XPluralOperands_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XPluralOperands_ICU4XError ICU4XPluralOperands_create_from_string(const char* s_data, size_t s_len);
+void ICU4XPluralOperands_destroy(ICU4XPluralOperands* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XPluralOperands.hpp b/intl/icu_capi/cpp/include/ICU4XPluralOperands.hpp
new file mode 100644
index 0000000000..635011f14f
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XPluralOperands.hpp
@@ -0,0 +1,61 @@
+#ifndef ICU4XPluralOperands_HPP
+#define ICU4XPluralOperands_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XPluralOperands.h"
+
+class ICU4XPluralOperands;
+#include "ICU4XError.hpp"
+
+/**
+ * A destruction policy for using ICU4XPluralOperands with std::unique_ptr.
+ */
+struct ICU4XPluralOperandsDeleter {
+ void operator()(capi::ICU4XPluralOperands* l) const noexcept {
+ capi::ICU4XPluralOperands_destroy(l);
+ }
+};
+
+/**
+ * FFI version of `PluralOperands`.
+ *
+ * See the [Rust documentation for `PluralOperands`](https://docs.rs/icu/latest/icu/plurals/struct.PluralOperands.html) for more information.
+ */
+class ICU4XPluralOperands {
+ public:
+
+ /**
+ * Construct for a given string representing a number
+ *
+ * See the [Rust documentation for `from_str`](https://docs.rs/icu/latest/icu/plurals/struct.PluralOperands.html#method.from_str) for more information.
+ */
+ static diplomat::result<ICU4XPluralOperands, ICU4XError> create_from_string(const std::string_view s);
+ inline const capi::ICU4XPluralOperands* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XPluralOperands* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XPluralOperands(capi::ICU4XPluralOperands* i) : inner(i) {}
+ ICU4XPluralOperands() = default;
+ ICU4XPluralOperands(ICU4XPluralOperands&&) noexcept = default;
+ ICU4XPluralOperands& operator=(ICU4XPluralOperands&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XPluralOperands, ICU4XPluralOperandsDeleter> inner;
+};
+
+
+inline diplomat::result<ICU4XPluralOperands, ICU4XError> ICU4XPluralOperands::create_from_string(const std::string_view s) {
+ auto diplomat_result_raw_out_value = capi::ICU4XPluralOperands_create_from_string(s.data(), s.size());
+ diplomat::result<ICU4XPluralOperands, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XPluralOperands>(ICU4XPluralOperands(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XPluralRules.h b/intl/icu_capi/cpp/include/ICU4XPluralRules.h
new file mode 100644
index 0000000000..0794a7ac8e
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XPluralRules.h
@@ -0,0 +1,41 @@
+#ifndef ICU4XPluralRules_H
+#define ICU4XPluralRules_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XPluralRules ICU4XPluralRules;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "ICU4XLocale.h"
+#include "diplomat_result_box_ICU4XPluralRules_ICU4XError.h"
+#include "ICU4XPluralOperands.h"
+#include "ICU4XPluralCategory.h"
+#include "ICU4XPluralCategories.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XPluralRules_ICU4XError ICU4XPluralRules_create_cardinal(const ICU4XDataProvider* provider, const ICU4XLocale* locale);
+
+diplomat_result_box_ICU4XPluralRules_ICU4XError ICU4XPluralRules_create_ordinal(const ICU4XDataProvider* provider, const ICU4XLocale* locale);
+
+ICU4XPluralCategory ICU4XPluralRules_category_for(const ICU4XPluralRules* self, const ICU4XPluralOperands* op);
+
+ICU4XPluralCategories ICU4XPluralRules_categories(const ICU4XPluralRules* self);
+void ICU4XPluralRules_destroy(ICU4XPluralRules* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XPluralRules.hpp b/intl/icu_capi/cpp/include/ICU4XPluralRules.hpp
new file mode 100644
index 0000000000..adab9ba4a1
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XPluralRules.hpp
@@ -0,0 +1,108 @@
+#ifndef ICU4XPluralRules_HPP
+#define ICU4XPluralRules_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XPluralRules.h"
+
+class ICU4XDataProvider;
+class ICU4XLocale;
+class ICU4XPluralRules;
+#include "ICU4XError.hpp"
+class ICU4XPluralOperands;
+#include "ICU4XPluralCategory.hpp"
+struct ICU4XPluralCategories;
+
+/**
+ * A destruction policy for using ICU4XPluralRules with std::unique_ptr.
+ */
+struct ICU4XPluralRulesDeleter {
+ void operator()(capi::ICU4XPluralRules* l) const noexcept {
+ capi::ICU4XPluralRules_destroy(l);
+ }
+};
+
+/**
+ * FFI version of `PluralRules`.
+ *
+ * See the [Rust documentation for `PluralRules`](https://docs.rs/icu/latest/icu/plurals/struct.PluralRules.html) for more information.
+ */
+class ICU4XPluralRules {
+ public:
+
+ /**
+ * Construct an [`ICU4XPluralRules`] for the given locale, for cardinal numbers
+ *
+ * See the [Rust documentation for `try_new_cardinal`](https://docs.rs/icu/latest/icu/plurals/struct.PluralRules.html#method.try_new_cardinal) for more information.
+ */
+ static diplomat::result<ICU4XPluralRules, ICU4XError> create_cardinal(const ICU4XDataProvider& provider, const ICU4XLocale& locale);
+
+ /**
+ * Construct an [`ICU4XPluralRules`] for the given locale, for ordinal numbers
+ *
+ * See the [Rust documentation for `try_new_ordinal`](https://docs.rs/icu/latest/icu/plurals/struct.PluralRules.html#method.try_new_ordinal) for more information.
+ */
+ static diplomat::result<ICU4XPluralRules, ICU4XError> create_ordinal(const ICU4XDataProvider& provider, const ICU4XLocale& locale);
+
+ /**
+ * Get the category for a given number represented as operands
+ *
+ * See the [Rust documentation for `category_for`](https://docs.rs/icu/latest/icu/plurals/struct.PluralRules.html#method.category_for) for more information.
+ */
+ ICU4XPluralCategory category_for(const ICU4XPluralOperands& op) const;
+
+ /**
+ * Get all of the categories needed in the current locale
+ *
+ * See the [Rust documentation for `categories`](https://docs.rs/icu/latest/icu/plurals/struct.PluralRules.html#method.categories) for more information.
+ */
+ ICU4XPluralCategories categories() const;
+ inline const capi::ICU4XPluralRules* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XPluralRules* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XPluralRules(capi::ICU4XPluralRules* i) : inner(i) {}
+ ICU4XPluralRules() = default;
+ ICU4XPluralRules(ICU4XPluralRules&&) noexcept = default;
+ ICU4XPluralRules& operator=(ICU4XPluralRules&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XPluralRules, ICU4XPluralRulesDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocale.hpp"
+#include "ICU4XPluralOperands.hpp"
+#include "ICU4XPluralCategories.hpp"
+
+inline diplomat::result<ICU4XPluralRules, ICU4XError> ICU4XPluralRules::create_cardinal(const ICU4XDataProvider& provider, const ICU4XLocale& locale) {
+ auto diplomat_result_raw_out_value = capi::ICU4XPluralRules_create_cardinal(provider.AsFFI(), locale.AsFFI());
+ diplomat::result<ICU4XPluralRules, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XPluralRules>(ICU4XPluralRules(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XPluralRules, ICU4XError> ICU4XPluralRules::create_ordinal(const ICU4XDataProvider& provider, const ICU4XLocale& locale) {
+ auto diplomat_result_raw_out_value = capi::ICU4XPluralRules_create_ordinal(provider.AsFFI(), locale.AsFFI());
+ diplomat::result<ICU4XPluralRules, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XPluralRules>(ICU4XPluralRules(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XPluralCategory ICU4XPluralRules::category_for(const ICU4XPluralOperands& op) const {
+ return static_cast<ICU4XPluralCategory>(capi::ICU4XPluralRules_category_for(this->inner.get(), op.AsFFI()));
+}
+inline ICU4XPluralCategories ICU4XPluralRules::categories() const {
+ capi::ICU4XPluralCategories diplomat_raw_struct_out_value = capi::ICU4XPluralRules_categories(this->inner.get());
+ return ICU4XPluralCategories{ .zero = std::move(diplomat_raw_struct_out_value.zero), .one = std::move(diplomat_raw_struct_out_value.one), .two = std::move(diplomat_raw_struct_out_value.two), .few = std::move(diplomat_raw_struct_out_value.few), .many = std::move(diplomat_raw_struct_out_value.many), .other = std::move(diplomat_raw_struct_out_value.other) };
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XPropertyValueNameToEnumMapper.h b/intl/icu_capi/cpp/include/ICU4XPropertyValueNameToEnumMapper.h
new file mode 100644
index 0000000000..54000ce338
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XPropertyValueNameToEnumMapper.h
@@ -0,0 +1,51 @@
+#ifndef ICU4XPropertyValueNameToEnumMapper_H
+#define ICU4XPropertyValueNameToEnumMapper_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XPropertyValueNameToEnumMapper ICU4XPropertyValueNameToEnumMapper;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XPropertyValueNameToEnumMapper_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+int16_t ICU4XPropertyValueNameToEnumMapper_get_strict(const ICU4XPropertyValueNameToEnumMapper* self, const char* name_data, size_t name_len);
+
+int16_t ICU4XPropertyValueNameToEnumMapper_get_loose(const ICU4XPropertyValueNameToEnumMapper* self, const char* name_data, size_t name_len);
+
+diplomat_result_box_ICU4XPropertyValueNameToEnumMapper_ICU4XError ICU4XPropertyValueNameToEnumMapper_load_general_category(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XPropertyValueNameToEnumMapper_ICU4XError ICU4XPropertyValueNameToEnumMapper_load_bidi_class(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XPropertyValueNameToEnumMapper_ICU4XError ICU4XPropertyValueNameToEnumMapper_load_east_asian_width(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XPropertyValueNameToEnumMapper_ICU4XError ICU4XPropertyValueNameToEnumMapper_load_indic_syllabic_category(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XPropertyValueNameToEnumMapper_ICU4XError ICU4XPropertyValueNameToEnumMapper_load_line_break(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XPropertyValueNameToEnumMapper_ICU4XError ICU4XPropertyValueNameToEnumMapper_load_grapheme_cluster_break(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XPropertyValueNameToEnumMapper_ICU4XError ICU4XPropertyValueNameToEnumMapper_load_word_break(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XPropertyValueNameToEnumMapper_ICU4XError ICU4XPropertyValueNameToEnumMapper_load_sentence_break(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XPropertyValueNameToEnumMapper_ICU4XError ICU4XPropertyValueNameToEnumMapper_load_script(const ICU4XDataProvider* provider);
+void ICU4XPropertyValueNameToEnumMapper_destroy(ICU4XPropertyValueNameToEnumMapper* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XPropertyValueNameToEnumMapper.hpp b/intl/icu_capi/cpp/include/ICU4XPropertyValueNameToEnumMapper.hpp
new file mode 100644
index 0000000000..b690dee096
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XPropertyValueNameToEnumMapper.hpp
@@ -0,0 +1,207 @@
+#ifndef ICU4XPropertyValueNameToEnumMapper_HPP
+#define ICU4XPropertyValueNameToEnumMapper_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XPropertyValueNameToEnumMapper.h"
+
+class ICU4XDataProvider;
+class ICU4XPropertyValueNameToEnumMapper;
+#include "ICU4XError.hpp"
+
+/**
+ * A destruction policy for using ICU4XPropertyValueNameToEnumMapper with std::unique_ptr.
+ */
+struct ICU4XPropertyValueNameToEnumMapperDeleter {
+ void operator()(capi::ICU4XPropertyValueNameToEnumMapper* l) const noexcept {
+ capi::ICU4XPropertyValueNameToEnumMapper_destroy(l);
+ }
+};
+
+/**
+ * A type capable of looking up a property value from a string name.
+ *
+ * See the [Rust documentation for `PropertyValueNameToEnumMapper`](https://docs.rs/icu/latest/icu/properties/names/struct.PropertyValueNameToEnumMapper.html) for more information.
+ *
+ * See the [Rust documentation for `PropertyValueNameToEnumMapperBorrowed`](https://docs.rs/icu/latest/icu/properties/names/struct.PropertyValueNameToEnumMapperBorrowed.html) for more information.
+ */
+class ICU4XPropertyValueNameToEnumMapper {
+ public:
+
+ /**
+ * Get the property value matching the given name, using strict matching
+ *
+ * Returns -1 if the name is unknown for this property
+ *
+ * See the [Rust documentation for `get_strict`](https://docs.rs/icu/latest/icu/properties/names/struct.PropertyValueNameToEnumMapperBorrowed.html#method.get_strict) for more information.
+ */
+ int16_t get_strict(const std::string_view name) const;
+
+ /**
+ * Get the property value matching the given name, using loose matching
+ *
+ * Returns -1 if the name is unknown for this property
+ *
+ * See the [Rust documentation for `get_loose`](https://docs.rs/icu/latest/icu/properties/names/struct.PropertyValueNameToEnumMapperBorrowed.html#method.get_loose) for more information.
+ */
+ int16_t get_loose(const std::string_view name) const;
+
+ /**
+ * See the [Rust documentation for `get_name_to_enum_mapper`](https://docs.rs/icu/latest/icu/properties/struct.GeneralCategory.html#method.get_name_to_enum_mapper) for more information.
+ */
+ static diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> load_general_category(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `name_to_enum_mapper`](https://docs.rs/icu/latest/icu/properties/struct.BidiClass.html#method.name_to_enum_mapper) for more information.
+ */
+ static diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> load_bidi_class(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `name_to_enum_mapper`](https://docs.rs/icu/latest/icu/properties/struct.EastAsianWidth.html#method.name_to_enum_mapper) for more information.
+ */
+ static diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> load_east_asian_width(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `name_to_enum_mapper`](https://docs.rs/icu/latest/icu/properties/struct.IndicSyllabicCategory.html#method.name_to_enum_mapper) for more information.
+ */
+ static diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> load_indic_syllabic_category(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `name_to_enum_mapper`](https://docs.rs/icu/latest/icu/properties/struct.LineBreak.html#method.name_to_enum_mapper) for more information.
+ */
+ static diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> load_line_break(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `get_name_to_enum_mapper`](https://docs.rs/icu/latest/icu/properties/struct.GraphemeClusterBreak.html#method.get_name_to_enum_mapper) for more information.
+ */
+ static diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> load_grapheme_cluster_break(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `name_to_enum_mapper`](https://docs.rs/icu/latest/icu/properties/struct.WordBreak.html#method.name_to_enum_mapper) for more information.
+ */
+ static diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> load_word_break(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `name_to_enum_mapper`](https://docs.rs/icu/latest/icu/properties/struct.SentenceBreak.html#method.name_to_enum_mapper) for more information.
+ */
+ static diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> load_sentence_break(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `name_to_enum_mapper`](https://docs.rs/icu/latest/icu/properties/struct.Script.html#method.name_to_enum_mapper) for more information.
+ */
+ static diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> load_script(const ICU4XDataProvider& provider);
+ inline const capi::ICU4XPropertyValueNameToEnumMapper* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XPropertyValueNameToEnumMapper* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XPropertyValueNameToEnumMapper(capi::ICU4XPropertyValueNameToEnumMapper* i) : inner(i) {}
+ ICU4XPropertyValueNameToEnumMapper() = default;
+ ICU4XPropertyValueNameToEnumMapper(ICU4XPropertyValueNameToEnumMapper&&) noexcept = default;
+ ICU4XPropertyValueNameToEnumMapper& operator=(ICU4XPropertyValueNameToEnumMapper&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XPropertyValueNameToEnumMapper, ICU4XPropertyValueNameToEnumMapperDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+
+inline int16_t ICU4XPropertyValueNameToEnumMapper::get_strict(const std::string_view name) const {
+ return capi::ICU4XPropertyValueNameToEnumMapper_get_strict(this->inner.get(), name.data(), name.size());
+}
+inline int16_t ICU4XPropertyValueNameToEnumMapper::get_loose(const std::string_view name) const {
+ return capi::ICU4XPropertyValueNameToEnumMapper_get_loose(this->inner.get(), name.data(), name.size());
+}
+inline diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> ICU4XPropertyValueNameToEnumMapper::load_general_category(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XPropertyValueNameToEnumMapper_load_general_category(provider.AsFFI());
+ diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XPropertyValueNameToEnumMapper>(ICU4XPropertyValueNameToEnumMapper(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> ICU4XPropertyValueNameToEnumMapper::load_bidi_class(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XPropertyValueNameToEnumMapper_load_bidi_class(provider.AsFFI());
+ diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XPropertyValueNameToEnumMapper>(ICU4XPropertyValueNameToEnumMapper(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> ICU4XPropertyValueNameToEnumMapper::load_east_asian_width(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XPropertyValueNameToEnumMapper_load_east_asian_width(provider.AsFFI());
+ diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XPropertyValueNameToEnumMapper>(ICU4XPropertyValueNameToEnumMapper(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> ICU4XPropertyValueNameToEnumMapper::load_indic_syllabic_category(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XPropertyValueNameToEnumMapper_load_indic_syllabic_category(provider.AsFFI());
+ diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XPropertyValueNameToEnumMapper>(ICU4XPropertyValueNameToEnumMapper(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> ICU4XPropertyValueNameToEnumMapper::load_line_break(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XPropertyValueNameToEnumMapper_load_line_break(provider.AsFFI());
+ diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XPropertyValueNameToEnumMapper>(ICU4XPropertyValueNameToEnumMapper(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> ICU4XPropertyValueNameToEnumMapper::load_grapheme_cluster_break(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XPropertyValueNameToEnumMapper_load_grapheme_cluster_break(provider.AsFFI());
+ diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XPropertyValueNameToEnumMapper>(ICU4XPropertyValueNameToEnumMapper(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> ICU4XPropertyValueNameToEnumMapper::load_word_break(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XPropertyValueNameToEnumMapper_load_word_break(provider.AsFFI());
+ diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XPropertyValueNameToEnumMapper>(ICU4XPropertyValueNameToEnumMapper(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> ICU4XPropertyValueNameToEnumMapper::load_sentence_break(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XPropertyValueNameToEnumMapper_load_sentence_break(provider.AsFFI());
+ diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XPropertyValueNameToEnumMapper>(ICU4XPropertyValueNameToEnumMapper(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> ICU4XPropertyValueNameToEnumMapper::load_script(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XPropertyValueNameToEnumMapper_load_script(provider.AsFFI());
+ diplomat::result<ICU4XPropertyValueNameToEnumMapper, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XPropertyValueNameToEnumMapper>(ICU4XPropertyValueNameToEnumMapper(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XRegionDisplayNames.h b/intl/icu_capi/cpp/include/ICU4XRegionDisplayNames.h
new file mode 100644
index 0000000000..a78ec64865
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XRegionDisplayNames.h
@@ -0,0 +1,35 @@
+#ifndef ICU4XRegionDisplayNames_H
+#define ICU4XRegionDisplayNames_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XRegionDisplayNames ICU4XRegionDisplayNames;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "ICU4XLocale.h"
+#include "diplomat_result_box_ICU4XRegionDisplayNames_ICU4XError.h"
+#include "diplomat_result_void_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XRegionDisplayNames_ICU4XError ICU4XRegionDisplayNames_create(const ICU4XDataProvider* provider, const ICU4XLocale* locale);
+
+diplomat_result_void_ICU4XError ICU4XRegionDisplayNames_of(const ICU4XRegionDisplayNames* self, const char* region_data, size_t region_len, DiplomatWriteable* write);
+void ICU4XRegionDisplayNames_destroy(ICU4XRegionDisplayNames* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XRegionDisplayNames.hpp b/intl/icu_capi/cpp/include/ICU4XRegionDisplayNames.hpp
new file mode 100644
index 0000000000..b8ab50e0c1
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XRegionDisplayNames.hpp
@@ -0,0 +1,104 @@
+#ifndef ICU4XRegionDisplayNames_HPP
+#define ICU4XRegionDisplayNames_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XRegionDisplayNames.h"
+
+class ICU4XDataProvider;
+class ICU4XLocale;
+class ICU4XRegionDisplayNames;
+#include "ICU4XError.hpp"
+
+/**
+ * A destruction policy for using ICU4XRegionDisplayNames with std::unique_ptr.
+ */
+struct ICU4XRegionDisplayNamesDeleter {
+ void operator()(capi::ICU4XRegionDisplayNames* l) const noexcept {
+ capi::ICU4XRegionDisplayNames_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `RegionDisplayNames`](https://docs.rs/icu/latest/icu/displaynames/struct.RegionDisplayNames.html) for more information.
+ */
+class ICU4XRegionDisplayNames {
+ public:
+
+ /**
+ * Creates a new `RegionDisplayNames` from locale data and an options bag.
+ *
+ * See the [Rust documentation for `try_new`](https://docs.rs/icu/latest/icu/displaynames/struct.RegionDisplayNames.html#method.try_new) for more information.
+ */
+ static diplomat::result<ICU4XRegionDisplayNames, ICU4XError> create(const ICU4XDataProvider& provider, const ICU4XLocale& locale);
+
+ /**
+ * Returns the locale specific display name of a region.
+ * Note that the funtion returns an empty string in case the display name for a given
+ * region code is not found.
+ *
+ * See the [Rust documentation for `of`](https://docs.rs/icu/latest/icu/displaynames/struct.RegionDisplayNames.html#method.of) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> of_to_writeable(const std::string_view region, W& write) const;
+
+ /**
+ * Returns the locale specific display name of a region.
+ * Note that the funtion returns an empty string in case the display name for a given
+ * region code is not found.
+ *
+ * See the [Rust documentation for `of`](https://docs.rs/icu/latest/icu/displaynames/struct.RegionDisplayNames.html#method.of) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> of(const std::string_view region) const;
+ inline const capi::ICU4XRegionDisplayNames* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XRegionDisplayNames* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XRegionDisplayNames(capi::ICU4XRegionDisplayNames* i) : inner(i) {}
+ ICU4XRegionDisplayNames() = default;
+ ICU4XRegionDisplayNames(ICU4XRegionDisplayNames&&) noexcept = default;
+ ICU4XRegionDisplayNames& operator=(ICU4XRegionDisplayNames&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XRegionDisplayNames, ICU4XRegionDisplayNamesDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocale.hpp"
+
+inline diplomat::result<ICU4XRegionDisplayNames, ICU4XError> ICU4XRegionDisplayNames::create(const ICU4XDataProvider& provider, const ICU4XLocale& locale) {
+ auto diplomat_result_raw_out_value = capi::ICU4XRegionDisplayNames_create(provider.AsFFI(), locale.AsFFI());
+ diplomat::result<ICU4XRegionDisplayNames, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XRegionDisplayNames>(ICU4XRegionDisplayNames(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XRegionDisplayNames::of_to_writeable(const std::string_view region, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XRegionDisplayNames_of(this->inner.get(), region.data(), region.size(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XRegionDisplayNames::of(const std::string_view region) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XRegionDisplayNames_of(this->inner.get(), region.data(), region.size(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XReorderedIndexMap.h b/intl/icu_capi/cpp/include/ICU4XReorderedIndexMap.h
new file mode 100644
index 0000000000..f5507a7217
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XReorderedIndexMap.h
@@ -0,0 +1,33 @@
+#ifndef ICU4XReorderedIndexMap_H
+#define ICU4XReorderedIndexMap_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XReorderedIndexMap ICU4XReorderedIndexMap;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+DiplomatUsizeView ICU4XReorderedIndexMap_as_slice(const ICU4XReorderedIndexMap* self);
+
+size_t ICU4XReorderedIndexMap_len(const ICU4XReorderedIndexMap* self);
+
+size_t ICU4XReorderedIndexMap_get(const ICU4XReorderedIndexMap* self, size_t index);
+void ICU4XReorderedIndexMap_destroy(ICU4XReorderedIndexMap* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XReorderedIndexMap.hpp b/intl/icu_capi/cpp/include/ICU4XReorderedIndexMap.hpp
new file mode 100644
index 0000000000..1fe4270baa
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XReorderedIndexMap.hpp
@@ -0,0 +1,74 @@
+#ifndef ICU4XReorderedIndexMap_HPP
+#define ICU4XReorderedIndexMap_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XReorderedIndexMap.h"
+
+
+/**
+ * A destruction policy for using ICU4XReorderedIndexMap with std::unique_ptr.
+ */
+struct ICU4XReorderedIndexMapDeleter {
+ void operator()(capi::ICU4XReorderedIndexMap* l) const noexcept {
+ capi::ICU4XReorderedIndexMap_destroy(l);
+ }
+};
+
+/**
+ * Thin wrapper around a vector that maps visual indices to source indices
+ *
+ * `map[visualIndex] = sourceIndex`
+ *
+ * Produced by `reorder_visual()` on [`ICU4XBidi`].
+ */
+class ICU4XReorderedIndexMap {
+ public:
+
+ /**
+ * Get this as a slice/array of indices
+ *
+ * Lifetimes: `this` must live at least as long as the output.
+ */
+ const diplomat::span<const size_t> as_slice() const;
+
+ /**
+ * The length of this map
+ */
+ size_t len() const;
+
+ /**
+ * Get element at `index`. Returns 0 when out of bounds
+ * (note that 0 is also a valid in-bounds value, please use `len()`
+ * to avoid out-of-bounds)
+ */
+ size_t get(size_t index) const;
+ inline const capi::ICU4XReorderedIndexMap* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XReorderedIndexMap* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XReorderedIndexMap(capi::ICU4XReorderedIndexMap* i) : inner(i) {}
+ ICU4XReorderedIndexMap() = default;
+ ICU4XReorderedIndexMap(ICU4XReorderedIndexMap&&) noexcept = default;
+ ICU4XReorderedIndexMap& operator=(ICU4XReorderedIndexMap&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XReorderedIndexMap, ICU4XReorderedIndexMapDeleter> inner;
+};
+
+
+inline const diplomat::span<const size_t> ICU4XReorderedIndexMap::as_slice() const {
+ capi::DiplomatUsizeView diplomat_slice_raw_out_value = capi::ICU4XReorderedIndexMap_as_slice(this->inner.get());
+ diplomat::span<const size_t> slice(diplomat_slice_raw_out_value.data, diplomat_slice_raw_out_value.len);
+ return slice;
+}
+inline size_t ICU4XReorderedIndexMap::len() const {
+ return capi::ICU4XReorderedIndexMap_len(this->inner.get());
+}
+inline size_t ICU4XReorderedIndexMap::get(size_t index) const {
+ return capi::ICU4XReorderedIndexMap_get(this->inner.get(), index);
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XRoundingIncrement.h b/intl/icu_capi/cpp/include/ICU4XRoundingIncrement.h
new file mode 100644
index 0000000000..c4b0666bef
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XRoundingIncrement.h
@@ -0,0 +1,33 @@
+#ifndef ICU4XRoundingIncrement_H
+#define ICU4XRoundingIncrement_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XRoundingIncrement {
+ ICU4XRoundingIncrement_MultiplesOf1 = 0,
+ ICU4XRoundingIncrement_MultiplesOf2 = 1,
+ ICU4XRoundingIncrement_MultiplesOf5 = 2,
+ ICU4XRoundingIncrement_MultiplesOf25 = 3,
+} ICU4XRoundingIncrement;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XRoundingIncrement_destroy(ICU4XRoundingIncrement* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XRoundingIncrement.hpp b/intl/icu_capi/cpp/include/ICU4XRoundingIncrement.hpp
new file mode 100644
index 0000000000..be93aa0401
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XRoundingIncrement.hpp
@@ -0,0 +1,28 @@
+#ifndef ICU4XRoundingIncrement_HPP
+#define ICU4XRoundingIncrement_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XRoundingIncrement.h"
+
+
+
+/**
+ * Increment used in a rounding operation.
+ *
+ * See the [Rust documentation for `RoundingIncrement`](https://docs.rs/fixed_decimal/latest/fixed_decimal/enum.RoundingIncrement.html) for more information.
+ */
+enum struct ICU4XRoundingIncrement {
+ MultiplesOf1 = 0,
+ MultiplesOf2 = 1,
+ MultiplesOf5 = 2,
+ MultiplesOf25 = 3,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XScriptExtensionsSet.h b/intl/icu_capi/cpp/include/ICU4XScriptExtensionsSet.h
new file mode 100644
index 0000000000..b4982dc22c
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XScriptExtensionsSet.h
@@ -0,0 +1,34 @@
+#ifndef ICU4XScriptExtensionsSet_H
+#define ICU4XScriptExtensionsSet_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XScriptExtensionsSet ICU4XScriptExtensionsSet;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "diplomat_result_uint16_t_void.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+bool ICU4XScriptExtensionsSet_contains(const ICU4XScriptExtensionsSet* self, uint16_t script);
+
+size_t ICU4XScriptExtensionsSet_count(const ICU4XScriptExtensionsSet* self);
+
+diplomat_result_uint16_t_void ICU4XScriptExtensionsSet_script_at(const ICU4XScriptExtensionsSet* self, size_t index);
+void ICU4XScriptExtensionsSet_destroy(ICU4XScriptExtensionsSet* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XScriptExtensionsSet.hpp b/intl/icu_capi/cpp/include/ICU4XScriptExtensionsSet.hpp
new file mode 100644
index 0000000000..fb2893634d
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XScriptExtensionsSet.hpp
@@ -0,0 +1,79 @@
+#ifndef ICU4XScriptExtensionsSet_HPP
+#define ICU4XScriptExtensionsSet_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XScriptExtensionsSet.h"
+
+
+/**
+ * A destruction policy for using ICU4XScriptExtensionsSet with std::unique_ptr.
+ */
+struct ICU4XScriptExtensionsSetDeleter {
+ void operator()(capi::ICU4XScriptExtensionsSet* l) const noexcept {
+ capi::ICU4XScriptExtensionsSet_destroy(l);
+ }
+};
+
+/**
+ * An object that represents the Script_Extensions property for a single character
+ *
+ * See the [Rust documentation for `ScriptExtensionsSet`](https://docs.rs/icu/latest/icu/properties/script/struct.ScriptExtensionsSet.html) for more information.
+ */
+class ICU4XScriptExtensionsSet {
+ public:
+
+ /**
+ * Check if the Script_Extensions property of the given code point covers the given script
+ *
+ * See the [Rust documentation for `contains`](https://docs.rs/icu/latest/icu/properties/script/struct.ScriptExtensionsSet.html#method.contains) for more information.
+ */
+ bool contains(uint16_t script) const;
+
+ /**
+ * Get the number of scripts contained in here
+ *
+ * See the [Rust documentation for `iter`](https://docs.rs/icu/latest/icu/properties/script/struct.ScriptExtensionsSet.html#method.iter) for more information.
+ */
+ size_t count() const;
+
+ /**
+ * Get script at index, returning an error if out of bounds
+ *
+ * See the [Rust documentation for `iter`](https://docs.rs/icu/latest/icu/properties/script/struct.ScriptExtensionsSet.html#method.iter) for more information.
+ */
+ diplomat::result<uint16_t, std::monostate> script_at(size_t index) const;
+ inline const capi::ICU4XScriptExtensionsSet* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XScriptExtensionsSet* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XScriptExtensionsSet(capi::ICU4XScriptExtensionsSet* i) : inner(i) {}
+ ICU4XScriptExtensionsSet() = default;
+ ICU4XScriptExtensionsSet(ICU4XScriptExtensionsSet&&) noexcept = default;
+ ICU4XScriptExtensionsSet& operator=(ICU4XScriptExtensionsSet&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XScriptExtensionsSet, ICU4XScriptExtensionsSetDeleter> inner;
+};
+
+
+inline bool ICU4XScriptExtensionsSet::contains(uint16_t script) const {
+ return capi::ICU4XScriptExtensionsSet_contains(this->inner.get(), script);
+}
+inline size_t ICU4XScriptExtensionsSet::count() const {
+ return capi::ICU4XScriptExtensionsSet_count(this->inner.get());
+}
+inline diplomat::result<uint16_t, std::monostate> ICU4XScriptExtensionsSet::script_at(size_t index) const {
+ auto diplomat_result_raw_out_value = capi::ICU4XScriptExtensionsSet_script_at(this->inner.get(), index);
+ diplomat::result<uint16_t, std::monostate> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<uint16_t>(diplomat_result_raw_out_value.ok);
+ } else {
+ diplomat_result_out_value = diplomat::Err(std::monostate());
+ }
+ return diplomat_result_out_value;
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XScriptWithExtensions.h b/intl/icu_capi/cpp/include/ICU4XScriptWithExtensions.h
new file mode 100644
index 0000000000..df2dd53946
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XScriptWithExtensions.h
@@ -0,0 +1,41 @@
+#ifndef ICU4XScriptWithExtensions_H
+#define ICU4XScriptWithExtensions_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XScriptWithExtensions ICU4XScriptWithExtensions;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XScriptWithExtensions_ICU4XError.h"
+#include "ICU4XScriptWithExtensionsBorrowed.h"
+#include "CodePointRangeIterator.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XScriptWithExtensions_ICU4XError ICU4XScriptWithExtensions_create(const ICU4XDataProvider* provider);
+
+uint16_t ICU4XScriptWithExtensions_get_script_val(const ICU4XScriptWithExtensions* self, uint32_t code_point);
+
+bool ICU4XScriptWithExtensions_has_script(const ICU4XScriptWithExtensions* self, uint32_t code_point, uint16_t script);
+
+ICU4XScriptWithExtensionsBorrowed* ICU4XScriptWithExtensions_as_borrowed(const ICU4XScriptWithExtensions* self);
+
+CodePointRangeIterator* ICU4XScriptWithExtensions_iter_ranges_for_script(const ICU4XScriptWithExtensions* self, uint16_t script);
+void ICU4XScriptWithExtensions_destroy(ICU4XScriptWithExtensions* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XScriptWithExtensions.hpp b/intl/icu_capi/cpp/include/ICU4XScriptWithExtensions.hpp
new file mode 100644
index 0000000000..ffce554c3d
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XScriptWithExtensions.hpp
@@ -0,0 +1,109 @@
+#ifndef ICU4XScriptWithExtensions_HPP
+#define ICU4XScriptWithExtensions_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XScriptWithExtensions.h"
+
+class ICU4XDataProvider;
+class ICU4XScriptWithExtensions;
+#include "ICU4XError.hpp"
+class ICU4XScriptWithExtensionsBorrowed;
+class CodePointRangeIterator;
+
+/**
+ * A destruction policy for using ICU4XScriptWithExtensions with std::unique_ptr.
+ */
+struct ICU4XScriptWithExtensionsDeleter {
+ void operator()(capi::ICU4XScriptWithExtensions* l) const noexcept {
+ capi::ICU4XScriptWithExtensions_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X ScriptWithExtensions map object, capable of holding a map of codepoints to scriptextensions values
+ *
+ * See the [Rust documentation for `ScriptWithExtensions`](https://docs.rs/icu/latest/icu/properties/script/struct.ScriptWithExtensions.html) for more information.
+ */
+class ICU4XScriptWithExtensions {
+ public:
+
+ /**
+ * See the [Rust documentation for `script_with_extensions`](https://docs.rs/icu/latest/icu/properties/script/fn.script_with_extensions.html) for more information.
+ */
+ static diplomat::result<ICU4XScriptWithExtensions, ICU4XError> create(const ICU4XDataProvider& provider);
+
+ /**
+ * Get the Script property value for a code point
+ *
+ * See the [Rust documentation for `get_script_val`](https://docs.rs/icu/latest/icu/properties/script/struct.ScriptWithExtensionsBorrowed.html#method.get_script_val) for more information.
+ */
+ uint16_t get_script_val(uint32_t code_point) const;
+
+ /**
+ * Check if the Script_Extensions property of the given code point covers the given script
+ *
+ * See the [Rust documentation for `has_script`](https://docs.rs/icu/latest/icu/properties/script/struct.ScriptWithExtensionsBorrowed.html#method.has_script) for more information.
+ */
+ bool has_script(uint32_t code_point, uint16_t script) const;
+
+ /**
+ * Borrow this object for a slightly faster variant with more operations
+ *
+ * See the [Rust documentation for `as_borrowed`](https://docs.rs/icu/latest/icu/properties/script/struct.ScriptWithExtensions.html#method.as_borrowed) for more information.
+ *
+ * Lifetimes: `this` must live at least as long as the output.
+ */
+ ICU4XScriptWithExtensionsBorrowed as_borrowed() const;
+
+ /**
+ * Get a list of ranges of code points that contain this script in their Script_Extensions values
+ *
+ * See the [Rust documentation for `get_script_extensions_ranges`](https://docs.rs/icu/latest/icu/properties/script/struct.ScriptWithExtensionsBorrowed.html#method.get_script_extensions_ranges) for more information.
+ *
+ * Lifetimes: `this` must live at least as long as the output.
+ */
+ CodePointRangeIterator iter_ranges_for_script(uint16_t script) const;
+ inline const capi::ICU4XScriptWithExtensions* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XScriptWithExtensions* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XScriptWithExtensions(capi::ICU4XScriptWithExtensions* i) : inner(i) {}
+ ICU4XScriptWithExtensions() = default;
+ ICU4XScriptWithExtensions(ICU4XScriptWithExtensions&&) noexcept = default;
+ ICU4XScriptWithExtensions& operator=(ICU4XScriptWithExtensions&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XScriptWithExtensions, ICU4XScriptWithExtensionsDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XScriptWithExtensionsBorrowed.hpp"
+#include "CodePointRangeIterator.hpp"
+
+inline diplomat::result<ICU4XScriptWithExtensions, ICU4XError> ICU4XScriptWithExtensions::create(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XScriptWithExtensions_create(provider.AsFFI());
+ diplomat::result<ICU4XScriptWithExtensions, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XScriptWithExtensions>(ICU4XScriptWithExtensions(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline uint16_t ICU4XScriptWithExtensions::get_script_val(uint32_t code_point) const {
+ return capi::ICU4XScriptWithExtensions_get_script_val(this->inner.get(), code_point);
+}
+inline bool ICU4XScriptWithExtensions::has_script(uint32_t code_point, uint16_t script) const {
+ return capi::ICU4XScriptWithExtensions_has_script(this->inner.get(), code_point, script);
+}
+inline ICU4XScriptWithExtensionsBorrowed ICU4XScriptWithExtensions::as_borrowed() const {
+ return ICU4XScriptWithExtensionsBorrowed(capi::ICU4XScriptWithExtensions_as_borrowed(this->inner.get()));
+}
+inline CodePointRangeIterator ICU4XScriptWithExtensions::iter_ranges_for_script(uint16_t script) const {
+ return CodePointRangeIterator(capi::ICU4XScriptWithExtensions_iter_ranges_for_script(this->inner.get(), script));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XScriptWithExtensionsBorrowed.h b/intl/icu_capi/cpp/include/ICU4XScriptWithExtensionsBorrowed.h
new file mode 100644
index 0000000000..82faeec178
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XScriptWithExtensionsBorrowed.h
@@ -0,0 +1,37 @@
+#ifndef ICU4XScriptWithExtensionsBorrowed_H
+#define ICU4XScriptWithExtensionsBorrowed_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XScriptWithExtensionsBorrowed ICU4XScriptWithExtensionsBorrowed;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XScriptExtensionsSet.h"
+#include "ICU4XCodePointSetData.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+uint16_t ICU4XScriptWithExtensionsBorrowed_get_script_val(const ICU4XScriptWithExtensionsBorrowed* self, uint32_t code_point);
+
+ICU4XScriptExtensionsSet* ICU4XScriptWithExtensionsBorrowed_get_script_extensions_val(const ICU4XScriptWithExtensionsBorrowed* self, uint32_t code_point);
+
+bool ICU4XScriptWithExtensionsBorrowed_has_script(const ICU4XScriptWithExtensionsBorrowed* self, uint32_t code_point, uint16_t script);
+
+ICU4XCodePointSetData* ICU4XScriptWithExtensionsBorrowed_get_script_extensions_set(const ICU4XScriptWithExtensionsBorrowed* self, uint16_t script);
+void ICU4XScriptWithExtensionsBorrowed_destroy(ICU4XScriptWithExtensionsBorrowed* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XScriptWithExtensionsBorrowed.hpp b/intl/icu_capi/cpp/include/ICU4XScriptWithExtensionsBorrowed.hpp
new file mode 100644
index 0000000000..7793146bd2
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XScriptWithExtensionsBorrowed.hpp
@@ -0,0 +1,89 @@
+#ifndef ICU4XScriptWithExtensionsBorrowed_HPP
+#define ICU4XScriptWithExtensionsBorrowed_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XScriptWithExtensionsBorrowed.h"
+
+class ICU4XScriptExtensionsSet;
+class ICU4XCodePointSetData;
+
+/**
+ * A destruction policy for using ICU4XScriptWithExtensionsBorrowed with std::unique_ptr.
+ */
+struct ICU4XScriptWithExtensionsBorrowedDeleter {
+ void operator()(capi::ICU4XScriptWithExtensionsBorrowed* l) const noexcept {
+ capi::ICU4XScriptWithExtensionsBorrowed_destroy(l);
+ }
+};
+
+/**
+ * A slightly faster ICU4XScriptWithExtensions object
+ *
+ * See the [Rust documentation for `ScriptWithExtensionsBorrowed`](https://docs.rs/icu/latest/icu/properties/script/struct.ScriptWithExtensionsBorrowed.html) for more information.
+ */
+class ICU4XScriptWithExtensionsBorrowed {
+ public:
+
+ /**
+ * Get the Script property value for a code point
+ *
+ * See the [Rust documentation for `get_script_val`](https://docs.rs/icu/latest/icu/properties/script/struct.ScriptWithExtensionsBorrowed.html#method.get_script_val) for more information.
+ */
+ uint16_t get_script_val(uint32_t code_point) const;
+
+ /**
+ * Get the Script property value for a code point
+ *
+ * See the [Rust documentation for `get_script_extensions_val`](https://docs.rs/icu/latest/icu/properties/script/struct.ScriptWithExtensionsBorrowed.html#method.get_script_extensions_val) for more information.
+ *
+ * Lifetimes: `this` must live at least as long as the output.
+ */
+ ICU4XScriptExtensionsSet get_script_extensions_val(uint32_t code_point) const;
+
+ /**
+ * Check if the Script_Extensions property of the given code point covers the given script
+ *
+ * See the [Rust documentation for `has_script`](https://docs.rs/icu/latest/icu/properties/script/struct.ScriptWithExtensionsBorrowed.html#method.has_script) for more information.
+ */
+ bool has_script(uint32_t code_point, uint16_t script) const;
+
+ /**
+ * Build the CodePointSetData corresponding to a codepoints matching a particular script
+ * in their Script_Extensions
+ *
+ * See the [Rust documentation for `get_script_extensions_set`](https://docs.rs/icu/latest/icu/properties/script/struct.ScriptWithExtensionsBorrowed.html#method.get_script_extensions_set) for more information.
+ */
+ ICU4XCodePointSetData get_script_extensions_set(uint16_t script) const;
+ inline const capi::ICU4XScriptWithExtensionsBorrowed* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XScriptWithExtensionsBorrowed* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XScriptWithExtensionsBorrowed(capi::ICU4XScriptWithExtensionsBorrowed* i) : inner(i) {}
+ ICU4XScriptWithExtensionsBorrowed() = default;
+ ICU4XScriptWithExtensionsBorrowed(ICU4XScriptWithExtensionsBorrowed&&) noexcept = default;
+ ICU4XScriptWithExtensionsBorrowed& operator=(ICU4XScriptWithExtensionsBorrowed&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XScriptWithExtensionsBorrowed, ICU4XScriptWithExtensionsBorrowedDeleter> inner;
+};
+
+#include "ICU4XScriptExtensionsSet.hpp"
+#include "ICU4XCodePointSetData.hpp"
+
+inline uint16_t ICU4XScriptWithExtensionsBorrowed::get_script_val(uint32_t code_point) const {
+ return capi::ICU4XScriptWithExtensionsBorrowed_get_script_val(this->inner.get(), code_point);
+}
+inline ICU4XScriptExtensionsSet ICU4XScriptWithExtensionsBorrowed::get_script_extensions_val(uint32_t code_point) const {
+ return ICU4XScriptExtensionsSet(capi::ICU4XScriptWithExtensionsBorrowed_get_script_extensions_val(this->inner.get(), code_point));
+}
+inline bool ICU4XScriptWithExtensionsBorrowed::has_script(uint32_t code_point, uint16_t script) const {
+ return capi::ICU4XScriptWithExtensionsBorrowed_has_script(this->inner.get(), code_point, script);
+}
+inline ICU4XCodePointSetData ICU4XScriptWithExtensionsBorrowed::get_script_extensions_set(uint16_t script) const {
+ return ICU4XCodePointSetData(capi::ICU4XScriptWithExtensionsBorrowed_get_script_extensions_set(this->inner.get(), script));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XSegmenterWordType.h b/intl/icu_capi/cpp/include/ICU4XSegmenterWordType.h
new file mode 100644
index 0000000000..9f4f81cf10
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XSegmenterWordType.h
@@ -0,0 +1,32 @@
+#ifndef ICU4XSegmenterWordType_H
+#define ICU4XSegmenterWordType_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XSegmenterWordType {
+ ICU4XSegmenterWordType_None = 0,
+ ICU4XSegmenterWordType_Number = 1,
+ ICU4XSegmenterWordType_Letter = 2,
+} ICU4XSegmenterWordType;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XSegmenterWordType_destroy(ICU4XSegmenterWordType* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XSegmenterWordType.hpp b/intl/icu_capi/cpp/include/ICU4XSegmenterWordType.hpp
new file mode 100644
index 0000000000..8a61504b70
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XSegmenterWordType.hpp
@@ -0,0 +1,25 @@
+#ifndef ICU4XSegmenterWordType_HPP
+#define ICU4XSegmenterWordType_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XSegmenterWordType.h"
+
+
+
+/**
+ * See the [Rust documentation for `WordType`](https://docs.rs/icu/latest/icu/segmenter/enum.WordType.html) for more information.
+ */
+enum struct ICU4XSegmenterWordType {
+ None = 0,
+ Number = 1,
+ Letter = 2,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorLatin1.h b/intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorLatin1.h
new file mode 100644
index 0000000000..6dd7b132dc
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorLatin1.h
@@ -0,0 +1,29 @@
+#ifndef ICU4XSentenceBreakIteratorLatin1_H
+#define ICU4XSentenceBreakIteratorLatin1_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XSentenceBreakIteratorLatin1 ICU4XSentenceBreakIteratorLatin1;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+int32_t ICU4XSentenceBreakIteratorLatin1_next(ICU4XSentenceBreakIteratorLatin1* self);
+void ICU4XSentenceBreakIteratorLatin1_destroy(ICU4XSentenceBreakIteratorLatin1* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorLatin1.hpp b/intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorLatin1.hpp
new file mode 100644
index 0000000000..6c2a2a372f
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorLatin1.hpp
@@ -0,0 +1,51 @@
+#ifndef ICU4XSentenceBreakIteratorLatin1_HPP
+#define ICU4XSentenceBreakIteratorLatin1_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XSentenceBreakIteratorLatin1.h"
+
+
+/**
+ * A destruction policy for using ICU4XSentenceBreakIteratorLatin1 with std::unique_ptr.
+ */
+struct ICU4XSentenceBreakIteratorLatin1Deleter {
+ void operator()(capi::ICU4XSentenceBreakIteratorLatin1* l) const noexcept {
+ capi::ICU4XSentenceBreakIteratorLatin1_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `SentenceBreakIterator`](https://docs.rs/icu/latest/icu/segmenter/struct.SentenceBreakIterator.html) for more information.
+ */
+class ICU4XSentenceBreakIteratorLatin1 {
+ public:
+
+ /**
+ * Finds the next breakpoint. Returns -1 if at the end of the string or if the index is
+ * out of range of a 32-bit signed integer.
+ *
+ * See the [Rust documentation for `next`](https://docs.rs/icu/latest/icu/segmenter/struct.SentenceBreakIterator.html#method.next) for more information.
+ */
+ int32_t next();
+ inline const capi::ICU4XSentenceBreakIteratorLatin1* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XSentenceBreakIteratorLatin1* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XSentenceBreakIteratorLatin1(capi::ICU4XSentenceBreakIteratorLatin1* i) : inner(i) {}
+ ICU4XSentenceBreakIteratorLatin1() = default;
+ ICU4XSentenceBreakIteratorLatin1(ICU4XSentenceBreakIteratorLatin1&&) noexcept = default;
+ ICU4XSentenceBreakIteratorLatin1& operator=(ICU4XSentenceBreakIteratorLatin1&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XSentenceBreakIteratorLatin1, ICU4XSentenceBreakIteratorLatin1Deleter> inner;
+};
+
+
+inline int32_t ICU4XSentenceBreakIteratorLatin1::next() {
+ return capi::ICU4XSentenceBreakIteratorLatin1_next(this->inner.get());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorUtf16.h b/intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorUtf16.h
new file mode 100644
index 0000000000..3ed0dc18c3
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorUtf16.h
@@ -0,0 +1,29 @@
+#ifndef ICU4XSentenceBreakIteratorUtf16_H
+#define ICU4XSentenceBreakIteratorUtf16_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XSentenceBreakIteratorUtf16 ICU4XSentenceBreakIteratorUtf16;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+int32_t ICU4XSentenceBreakIteratorUtf16_next(ICU4XSentenceBreakIteratorUtf16* self);
+void ICU4XSentenceBreakIteratorUtf16_destroy(ICU4XSentenceBreakIteratorUtf16* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorUtf16.hpp b/intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorUtf16.hpp
new file mode 100644
index 0000000000..6b98df79a1
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorUtf16.hpp
@@ -0,0 +1,51 @@
+#ifndef ICU4XSentenceBreakIteratorUtf16_HPP
+#define ICU4XSentenceBreakIteratorUtf16_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XSentenceBreakIteratorUtf16.h"
+
+
+/**
+ * A destruction policy for using ICU4XSentenceBreakIteratorUtf16 with std::unique_ptr.
+ */
+struct ICU4XSentenceBreakIteratorUtf16Deleter {
+ void operator()(capi::ICU4XSentenceBreakIteratorUtf16* l) const noexcept {
+ capi::ICU4XSentenceBreakIteratorUtf16_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `SentenceBreakIterator`](https://docs.rs/icu/latest/icu/segmenter/struct.SentenceBreakIterator.html) for more information.
+ */
+class ICU4XSentenceBreakIteratorUtf16 {
+ public:
+
+ /**
+ * Finds the next breakpoint. Returns -1 if at the end of the string or if the index is
+ * out of range of a 32-bit signed integer.
+ *
+ * See the [Rust documentation for `next`](https://docs.rs/icu/latest/icu/segmenter/struct.SentenceBreakIterator.html#method.next) for more information.
+ */
+ int32_t next();
+ inline const capi::ICU4XSentenceBreakIteratorUtf16* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XSentenceBreakIteratorUtf16* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XSentenceBreakIteratorUtf16(capi::ICU4XSentenceBreakIteratorUtf16* i) : inner(i) {}
+ ICU4XSentenceBreakIteratorUtf16() = default;
+ ICU4XSentenceBreakIteratorUtf16(ICU4XSentenceBreakIteratorUtf16&&) noexcept = default;
+ ICU4XSentenceBreakIteratorUtf16& operator=(ICU4XSentenceBreakIteratorUtf16&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XSentenceBreakIteratorUtf16, ICU4XSentenceBreakIteratorUtf16Deleter> inner;
+};
+
+
+inline int32_t ICU4XSentenceBreakIteratorUtf16::next() {
+ return capi::ICU4XSentenceBreakIteratorUtf16_next(this->inner.get());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorUtf8.h b/intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorUtf8.h
new file mode 100644
index 0000000000..655cb67b6c
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorUtf8.h
@@ -0,0 +1,29 @@
+#ifndef ICU4XSentenceBreakIteratorUtf8_H
+#define ICU4XSentenceBreakIteratorUtf8_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XSentenceBreakIteratorUtf8 ICU4XSentenceBreakIteratorUtf8;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+int32_t ICU4XSentenceBreakIteratorUtf8_next(ICU4XSentenceBreakIteratorUtf8* self);
+void ICU4XSentenceBreakIteratorUtf8_destroy(ICU4XSentenceBreakIteratorUtf8* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorUtf8.hpp b/intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorUtf8.hpp
new file mode 100644
index 0000000000..6f02a9e40c
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XSentenceBreakIteratorUtf8.hpp
@@ -0,0 +1,51 @@
+#ifndef ICU4XSentenceBreakIteratorUtf8_HPP
+#define ICU4XSentenceBreakIteratorUtf8_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XSentenceBreakIteratorUtf8.h"
+
+
+/**
+ * A destruction policy for using ICU4XSentenceBreakIteratorUtf8 with std::unique_ptr.
+ */
+struct ICU4XSentenceBreakIteratorUtf8Deleter {
+ void operator()(capi::ICU4XSentenceBreakIteratorUtf8* l) const noexcept {
+ capi::ICU4XSentenceBreakIteratorUtf8_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `SentenceBreakIterator`](https://docs.rs/icu/latest/icu/segmenter/struct.SentenceBreakIterator.html) for more information.
+ */
+class ICU4XSentenceBreakIteratorUtf8 {
+ public:
+
+ /**
+ * Finds the next breakpoint. Returns -1 if at the end of the string or if the index is
+ * out of range of a 32-bit signed integer.
+ *
+ * See the [Rust documentation for `next`](https://docs.rs/icu/latest/icu/segmenter/struct.SentenceBreakIterator.html#method.next) for more information.
+ */
+ int32_t next();
+ inline const capi::ICU4XSentenceBreakIteratorUtf8* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XSentenceBreakIteratorUtf8* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XSentenceBreakIteratorUtf8(capi::ICU4XSentenceBreakIteratorUtf8* i) : inner(i) {}
+ ICU4XSentenceBreakIteratorUtf8() = default;
+ ICU4XSentenceBreakIteratorUtf8(ICU4XSentenceBreakIteratorUtf8&&) noexcept = default;
+ ICU4XSentenceBreakIteratorUtf8& operator=(ICU4XSentenceBreakIteratorUtf8&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XSentenceBreakIteratorUtf8, ICU4XSentenceBreakIteratorUtf8Deleter> inner;
+};
+
+
+inline int32_t ICU4XSentenceBreakIteratorUtf8::next() {
+ return capi::ICU4XSentenceBreakIteratorUtf8_next(this->inner.get());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XSentenceSegmenter.h b/intl/icu_capi/cpp/include/ICU4XSentenceSegmenter.h
new file mode 100644
index 0000000000..7701c9f042
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XSentenceSegmenter.h
@@ -0,0 +1,40 @@
+#ifndef ICU4XSentenceSegmenter_H
+#define ICU4XSentenceSegmenter_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XSentenceSegmenter ICU4XSentenceSegmenter;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XSentenceSegmenter_ICU4XError.h"
+#include "ICU4XSentenceBreakIteratorUtf8.h"
+#include "ICU4XSentenceBreakIteratorUtf16.h"
+#include "ICU4XSentenceBreakIteratorLatin1.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XSentenceSegmenter_ICU4XError ICU4XSentenceSegmenter_create(const ICU4XDataProvider* provider);
+
+ICU4XSentenceBreakIteratorUtf8* ICU4XSentenceSegmenter_segment_utf8(const ICU4XSentenceSegmenter* self, const char* input_data, size_t input_len);
+
+ICU4XSentenceBreakIteratorUtf16* ICU4XSentenceSegmenter_segment_utf16(const ICU4XSentenceSegmenter* self, const uint16_t* input_data, size_t input_len);
+
+ICU4XSentenceBreakIteratorLatin1* ICU4XSentenceSegmenter_segment_latin1(const ICU4XSentenceSegmenter* self, const uint8_t* input_data, size_t input_len);
+void ICU4XSentenceSegmenter_destroy(ICU4XSentenceSegmenter* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XSentenceSegmenter.hpp b/intl/icu_capi/cpp/include/ICU4XSentenceSegmenter.hpp
new file mode 100644
index 0000000000..25790199f3
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XSentenceSegmenter.hpp
@@ -0,0 +1,105 @@
+#ifndef ICU4XSentenceSegmenter_HPP
+#define ICU4XSentenceSegmenter_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XSentenceSegmenter.h"
+
+class ICU4XDataProvider;
+class ICU4XSentenceSegmenter;
+#include "ICU4XError.hpp"
+class ICU4XSentenceBreakIteratorUtf8;
+class ICU4XSentenceBreakIteratorUtf16;
+class ICU4XSentenceBreakIteratorLatin1;
+
+/**
+ * A destruction policy for using ICU4XSentenceSegmenter with std::unique_ptr.
+ */
+struct ICU4XSentenceSegmenterDeleter {
+ void operator()(capi::ICU4XSentenceSegmenter* l) const noexcept {
+ capi::ICU4XSentenceSegmenter_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X sentence-break segmenter, capable of finding sentence breakpoints in strings.
+ *
+ * See the [Rust documentation for `SentenceSegmenter`](https://docs.rs/icu/latest/icu/segmenter/struct.SentenceSegmenter.html) for more information.
+ */
+class ICU4XSentenceSegmenter {
+ public:
+
+ /**
+ * Construct an [`ICU4XSentenceSegmenter`].
+ *
+ * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/segmenter/struct.SentenceSegmenter.html#method.new) for more information.
+ */
+ static diplomat::result<ICU4XSentenceSegmenter, ICU4XError> create(const ICU4XDataProvider& provider);
+
+ /**
+ * Segments a (potentially ill-formed) UTF-8 string.
+ *
+ * See the [Rust documentation for `segment_utf8`](https://docs.rs/icu/latest/icu/segmenter/struct.SentenceSegmenter.html#method.segment_utf8) for more information.
+ *
+ * Lifetimes: `this`, `input` must live at least as long as the output.
+ */
+ ICU4XSentenceBreakIteratorUtf8 segment_utf8(const std::string_view input) const;
+
+ /**
+ * Segments a UTF-16 string.
+ *
+ * See the [Rust documentation for `segment_utf16`](https://docs.rs/icu/latest/icu/segmenter/struct.SentenceSegmenter.html#method.segment_utf16) for more information.
+ *
+ * Lifetimes: `this`, `input` must live at least as long as the output.
+ */
+ ICU4XSentenceBreakIteratorUtf16 segment_utf16(const diplomat::span<const uint16_t> input) const;
+
+ /**
+ * Segments a Latin-1 string.
+ *
+ * See the [Rust documentation for `segment_latin1`](https://docs.rs/icu/latest/icu/segmenter/struct.SentenceSegmenter.html#method.segment_latin1) for more information.
+ *
+ * Lifetimes: `this`, `input` must live at least as long as the output.
+ */
+ ICU4XSentenceBreakIteratorLatin1 segment_latin1(const diplomat::span<const uint8_t> input) const;
+ inline const capi::ICU4XSentenceSegmenter* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XSentenceSegmenter* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XSentenceSegmenter(capi::ICU4XSentenceSegmenter* i) : inner(i) {}
+ ICU4XSentenceSegmenter() = default;
+ ICU4XSentenceSegmenter(ICU4XSentenceSegmenter&&) noexcept = default;
+ ICU4XSentenceSegmenter& operator=(ICU4XSentenceSegmenter&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XSentenceSegmenter, ICU4XSentenceSegmenterDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XSentenceBreakIteratorUtf8.hpp"
+#include "ICU4XSentenceBreakIteratorUtf16.hpp"
+#include "ICU4XSentenceBreakIteratorLatin1.hpp"
+
+inline diplomat::result<ICU4XSentenceSegmenter, ICU4XError> ICU4XSentenceSegmenter::create(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XSentenceSegmenter_create(provider.AsFFI());
+ diplomat::result<ICU4XSentenceSegmenter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XSentenceSegmenter>(ICU4XSentenceSegmenter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XSentenceBreakIteratorUtf8 ICU4XSentenceSegmenter::segment_utf8(const std::string_view input) const {
+ return ICU4XSentenceBreakIteratorUtf8(capi::ICU4XSentenceSegmenter_segment_utf8(this->inner.get(), input.data(), input.size()));
+}
+inline ICU4XSentenceBreakIteratorUtf16 ICU4XSentenceSegmenter::segment_utf16(const diplomat::span<const uint16_t> input) const {
+ return ICU4XSentenceBreakIteratorUtf16(capi::ICU4XSentenceSegmenter_segment_utf16(this->inner.get(), input.data(), input.size()));
+}
+inline ICU4XSentenceBreakIteratorLatin1 ICU4XSentenceSegmenter::segment_latin1(const diplomat::span<const uint8_t> input) const {
+ return ICU4XSentenceBreakIteratorLatin1(capi::ICU4XSentenceSegmenter_segment_latin1(this->inner.get(), input.data(), input.size()));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XTime.h b/intl/icu_capi/cpp/include/ICU4XTime.h
new file mode 100644
index 0000000000..2f3a9967fa
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XTime.h
@@ -0,0 +1,40 @@
+#ifndef ICU4XTime_H
+#define ICU4XTime_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XTime ICU4XTime;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "diplomat_result_box_ICU4XTime_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XTime_ICU4XError ICU4XTime_create(uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond);
+
+diplomat_result_box_ICU4XTime_ICU4XError ICU4XTime_create_midnight();
+
+uint8_t ICU4XTime_hour(const ICU4XTime* self);
+
+uint8_t ICU4XTime_minute(const ICU4XTime* self);
+
+uint8_t ICU4XTime_second(const ICU4XTime* self);
+
+uint32_t ICU4XTime_nanosecond(const ICU4XTime* self);
+void ICU4XTime_destroy(ICU4XTime* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XTime.hpp b/intl/icu_capi/cpp/include/ICU4XTime.hpp
new file mode 100644
index 0000000000..facac6ade7
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XTime.hpp
@@ -0,0 +1,118 @@
+#ifndef ICU4XTime_HPP
+#define ICU4XTime_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XTime.h"
+
+class ICU4XTime;
+#include "ICU4XError.hpp"
+
+/**
+ * A destruction policy for using ICU4XTime with std::unique_ptr.
+ */
+struct ICU4XTimeDeleter {
+ void operator()(capi::ICU4XTime* l) const noexcept {
+ capi::ICU4XTime_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X Time object representing a time in terms of hour, minute, second, nanosecond
+ *
+ * See the [Rust documentation for `Time`](https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html) for more information.
+ */
+class ICU4XTime {
+ public:
+
+ /**
+ * Creates a new [`ICU4XTime`] given field values
+ *
+ * See the [Rust documentation for `Time`](https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html) for more information.
+ */
+ static diplomat::result<ICU4XTime, ICU4XError> create(uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond);
+
+ /**
+ * Creates a new [`ICU4XTime`] representing midnight (00:00.000).
+ *
+ * See the [Rust documentation for `Time`](https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html) for more information.
+ */
+ static diplomat::result<ICU4XTime, ICU4XError> create_midnight();
+
+ /**
+ * Returns the hour in this time
+ *
+ * See the [Rust documentation for `hour`](https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.hour) for more information.
+ */
+ uint8_t hour() const;
+
+ /**
+ * Returns the minute in this time
+ *
+ * See the [Rust documentation for `minute`](https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.minute) for more information.
+ */
+ uint8_t minute() const;
+
+ /**
+ * Returns the second in this time
+ *
+ * See the [Rust documentation for `second`](https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.second) for more information.
+ */
+ uint8_t second() const;
+
+ /**
+ * Returns the nanosecond in this time
+ *
+ * See the [Rust documentation for `nanosecond`](https://docs.rs/icu/latest/icu/calendar/types/struct.Time.html#structfield.nanosecond) for more information.
+ */
+ uint32_t nanosecond() const;
+ inline const capi::ICU4XTime* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XTime* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XTime(capi::ICU4XTime* i) : inner(i) {}
+ ICU4XTime() = default;
+ ICU4XTime(ICU4XTime&&) noexcept = default;
+ ICU4XTime& operator=(ICU4XTime&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XTime, ICU4XTimeDeleter> inner;
+};
+
+
+inline diplomat::result<ICU4XTime, ICU4XError> ICU4XTime::create(uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond) {
+ auto diplomat_result_raw_out_value = capi::ICU4XTime_create(hour, minute, second, nanosecond);
+ diplomat::result<ICU4XTime, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XTime>(ICU4XTime(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XTime, ICU4XError> ICU4XTime::create_midnight() {
+ auto diplomat_result_raw_out_value = capi::ICU4XTime_create_midnight();
+ diplomat::result<ICU4XTime, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XTime>(ICU4XTime(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline uint8_t ICU4XTime::hour() const {
+ return capi::ICU4XTime_hour(this->inner.get());
+}
+inline uint8_t ICU4XTime::minute() const {
+ return capi::ICU4XTime_minute(this->inner.get());
+}
+inline uint8_t ICU4XTime::second() const {
+ return capi::ICU4XTime_second(this->inner.get());
+}
+inline uint32_t ICU4XTime::nanosecond() const {
+ return capi::ICU4XTime_nanosecond(this->inner.get());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XTimeFormatter.h b/intl/icu_capi/cpp/include/ICU4XTimeFormatter.h
new file mode 100644
index 0000000000..d200881399
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XTimeFormatter.h
@@ -0,0 +1,43 @@
+#ifndef ICU4XTimeFormatter_H
+#define ICU4XTimeFormatter_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XTimeFormatter ICU4XTimeFormatter;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "ICU4XLocale.h"
+#include "ICU4XTimeLength.h"
+#include "diplomat_result_box_ICU4XTimeFormatter_ICU4XError.h"
+#include "ICU4XTime.h"
+#include "diplomat_result_void_ICU4XError.h"
+#include "ICU4XDateTime.h"
+#include "ICU4XIsoDateTime.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XTimeFormatter_ICU4XError ICU4XTimeFormatter_create_with_length(const ICU4XDataProvider* provider, const ICU4XLocale* locale, ICU4XTimeLength length);
+
+diplomat_result_void_ICU4XError ICU4XTimeFormatter_format_time(const ICU4XTimeFormatter* self, const ICU4XTime* value, DiplomatWriteable* write);
+
+diplomat_result_void_ICU4XError ICU4XTimeFormatter_format_datetime(const ICU4XTimeFormatter* self, const ICU4XDateTime* value, DiplomatWriteable* write);
+
+diplomat_result_void_ICU4XError ICU4XTimeFormatter_format_iso_datetime(const ICU4XTimeFormatter* self, const ICU4XIsoDateTime* value, DiplomatWriteable* write);
+void ICU4XTimeFormatter_destroy(ICU4XTimeFormatter* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XTimeFormatter.hpp b/intl/icu_capi/cpp/include/ICU4XTimeFormatter.hpp
new file mode 100644
index 0000000000..3800ee5d16
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XTimeFormatter.hpp
@@ -0,0 +1,183 @@
+#ifndef ICU4XTimeFormatter_HPP
+#define ICU4XTimeFormatter_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XTimeFormatter.h"
+
+class ICU4XDataProvider;
+class ICU4XLocale;
+#include "ICU4XTimeLength.hpp"
+class ICU4XTimeFormatter;
+#include "ICU4XError.hpp"
+class ICU4XTime;
+class ICU4XDateTime;
+class ICU4XIsoDateTime;
+
+/**
+ * A destruction policy for using ICU4XTimeFormatter with std::unique_ptr.
+ */
+struct ICU4XTimeFormatterDeleter {
+ void operator()(capi::ICU4XTimeFormatter* l) const noexcept {
+ capi::ICU4XTimeFormatter_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X TimeFormatter object capable of formatting an [`ICU4XTime`] type (and others) as a string
+ *
+ * See the [Rust documentation for `TimeFormatter`](https://docs.rs/icu/latest/icu/datetime/struct.TimeFormatter.html) for more information.
+ */
+class ICU4XTimeFormatter {
+ public:
+
+ /**
+ * Creates a new [`ICU4XTimeFormatter`] from locale data.
+ *
+ * See the [Rust documentation for `try_new_with_length`](https://docs.rs/icu/latest/icu/datetime/struct.TimeFormatter.html#method.try_new_with_length) for more information.
+ */
+ static diplomat::result<ICU4XTimeFormatter, ICU4XError> create_with_length(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XTimeLength length);
+
+ /**
+ * Formats a [`ICU4XTime`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.TimeFormatter.html#method.format) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> format_time_to_writeable(const ICU4XTime& value, W& write) const;
+
+ /**
+ * Formats a [`ICU4XTime`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.TimeFormatter.html#method.format) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> format_time(const ICU4XTime& value) const;
+
+ /**
+ * Formats a [`ICU4XDateTime`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.TimeFormatter.html#method.format) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> format_datetime_to_writeable(const ICU4XDateTime& value, W& write) const;
+
+ /**
+ * Formats a [`ICU4XDateTime`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.TimeFormatter.html#method.format) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> format_datetime(const ICU4XDateTime& value) const;
+
+ /**
+ * Formats a [`ICU4XIsoDateTime`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.TimeFormatter.html#method.format) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> format_iso_datetime_to_writeable(const ICU4XIsoDateTime& value, W& write) const;
+
+ /**
+ * Formats a [`ICU4XIsoDateTime`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.TimeFormatter.html#method.format) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> format_iso_datetime(const ICU4XIsoDateTime& value) const;
+ inline const capi::ICU4XTimeFormatter* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XTimeFormatter* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XTimeFormatter(capi::ICU4XTimeFormatter* i) : inner(i) {}
+ ICU4XTimeFormatter() = default;
+ ICU4XTimeFormatter(ICU4XTimeFormatter&&) noexcept = default;
+ ICU4XTimeFormatter& operator=(ICU4XTimeFormatter&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XTimeFormatter, ICU4XTimeFormatterDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocale.hpp"
+#include "ICU4XTime.hpp"
+#include "ICU4XDateTime.hpp"
+#include "ICU4XIsoDateTime.hpp"
+
+inline diplomat::result<ICU4XTimeFormatter, ICU4XError> ICU4XTimeFormatter::create_with_length(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XTimeLength length) {
+ auto diplomat_result_raw_out_value = capi::ICU4XTimeFormatter_create_with_length(provider.AsFFI(), locale.AsFFI(), static_cast<capi::ICU4XTimeLength>(length));
+ diplomat::result<ICU4XTimeFormatter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XTimeFormatter>(ICU4XTimeFormatter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XTimeFormatter::format_time_to_writeable(const ICU4XTime& value, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XTimeFormatter_format_time(this->inner.get(), value.AsFFI(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XTimeFormatter::format_time(const ICU4XTime& value) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XTimeFormatter_format_time(this->inner.get(), value.AsFFI(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XTimeFormatter::format_datetime_to_writeable(const ICU4XDateTime& value, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XTimeFormatter_format_datetime(this->inner.get(), value.AsFFI(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XTimeFormatter::format_datetime(const ICU4XDateTime& value) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XTimeFormatter_format_datetime(this->inner.get(), value.AsFFI(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XTimeFormatter::format_iso_datetime_to_writeable(const ICU4XIsoDateTime& value, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XTimeFormatter_format_iso_datetime(this->inner.get(), value.AsFFI(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XTimeFormatter::format_iso_datetime(const ICU4XIsoDateTime& value) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XTimeFormatter_format_iso_datetime(this->inner.get(), value.AsFFI(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XTimeLength.h b/intl/icu_capi/cpp/include/ICU4XTimeLength.h
new file mode 100644
index 0000000000..6d98bc8ccb
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XTimeLength.h
@@ -0,0 +1,33 @@
+#ifndef ICU4XTimeLength_H
+#define ICU4XTimeLength_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XTimeLength {
+ ICU4XTimeLength_Full = 0,
+ ICU4XTimeLength_Long = 1,
+ ICU4XTimeLength_Medium = 2,
+ ICU4XTimeLength_Short = 3,
+} ICU4XTimeLength;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XTimeLength_destroy(ICU4XTimeLength* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XTimeLength.hpp b/intl/icu_capi/cpp/include/ICU4XTimeLength.hpp
new file mode 100644
index 0000000000..a7035d0900
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XTimeLength.hpp
@@ -0,0 +1,26 @@
+#ifndef ICU4XTimeLength_HPP
+#define ICU4XTimeLength_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XTimeLength.h"
+
+
+
+/**
+ * See the [Rust documentation for `Time`](https://docs.rs/icu/latest/icu/datetime/options/length/enum.Time.html) for more information.
+ */
+enum struct ICU4XTimeLength {
+ Full = 0,
+ Long = 1,
+ Medium = 2,
+ Short = 3,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XTimeZoneFormatter.h b/intl/icu_capi/cpp/include/ICU4XTimeZoneFormatter.h
new file mode 100644
index 0000000000..5eb1299543
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XTimeZoneFormatter.h
@@ -0,0 +1,53 @@
+#ifndef ICU4XTimeZoneFormatter_H
+#define ICU4XTimeZoneFormatter_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XTimeZoneFormatter ICU4XTimeZoneFormatter;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "ICU4XLocale.h"
+#include "diplomat_result_box_ICU4XTimeZoneFormatter_ICU4XError.h"
+#include "ICU4XIsoTimeZoneOptions.h"
+#include "diplomat_result_void_ICU4XError.h"
+#include "ICU4XCustomTimeZone.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XTimeZoneFormatter_ICU4XError ICU4XTimeZoneFormatter_create_with_localized_gmt_fallback(const ICU4XDataProvider* provider, const ICU4XLocale* locale);
+
+diplomat_result_box_ICU4XTimeZoneFormatter_ICU4XError ICU4XTimeZoneFormatter_create_with_iso_8601_fallback(const ICU4XDataProvider* provider, const ICU4XLocale* locale, ICU4XIsoTimeZoneOptions options);
+
+diplomat_result_void_ICU4XError ICU4XTimeZoneFormatter_load_generic_non_location_long(ICU4XTimeZoneFormatter* self, const ICU4XDataProvider* provider);
+
+diplomat_result_void_ICU4XError ICU4XTimeZoneFormatter_load_generic_non_location_short(ICU4XTimeZoneFormatter* self, const ICU4XDataProvider* provider);
+
+diplomat_result_void_ICU4XError ICU4XTimeZoneFormatter_load_specific_non_location_long(ICU4XTimeZoneFormatter* self, const ICU4XDataProvider* provider);
+
+diplomat_result_void_ICU4XError ICU4XTimeZoneFormatter_load_specific_non_location_short(ICU4XTimeZoneFormatter* self, const ICU4XDataProvider* provider);
+
+diplomat_result_void_ICU4XError ICU4XTimeZoneFormatter_load_generic_location_format(ICU4XTimeZoneFormatter* self, const ICU4XDataProvider* provider);
+
+diplomat_result_void_ICU4XError ICU4XTimeZoneFormatter_include_localized_gmt_format(ICU4XTimeZoneFormatter* self);
+
+diplomat_result_void_ICU4XError ICU4XTimeZoneFormatter_load_iso_8601_format(ICU4XTimeZoneFormatter* self, ICU4XIsoTimeZoneOptions options);
+
+diplomat_result_void_ICU4XError ICU4XTimeZoneFormatter_format_custom_time_zone(const ICU4XTimeZoneFormatter* self, const ICU4XCustomTimeZone* value, DiplomatWriteable* write);
+void ICU4XTimeZoneFormatter_destroy(ICU4XTimeZoneFormatter* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XTimeZoneFormatter.hpp b/intl/icu_capi/cpp/include/ICU4XTimeZoneFormatter.hpp
new file mode 100644
index 0000000000..5e461ec916
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XTimeZoneFormatter.hpp
@@ -0,0 +1,256 @@
+#ifndef ICU4XTimeZoneFormatter_HPP
+#define ICU4XTimeZoneFormatter_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XTimeZoneFormatter.h"
+
+class ICU4XDataProvider;
+class ICU4XLocale;
+class ICU4XTimeZoneFormatter;
+#include "ICU4XError.hpp"
+struct ICU4XIsoTimeZoneOptions;
+class ICU4XCustomTimeZone;
+
+/**
+ * A destruction policy for using ICU4XTimeZoneFormatter with std::unique_ptr.
+ */
+struct ICU4XTimeZoneFormatterDeleter {
+ void operator()(capi::ICU4XTimeZoneFormatter* l) const noexcept {
+ capi::ICU4XTimeZoneFormatter_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X TimeZoneFormatter object capable of formatting an [`ICU4XCustomTimeZone`] type (and others) as a string
+ *
+ * See the [Rust documentation for `TimeZoneFormatter`](https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html) for more information.
+ */
+class ICU4XTimeZoneFormatter {
+ public:
+
+ /**
+ * Creates a new [`ICU4XTimeZoneFormatter`] from locale data.
+ *
+ * Uses localized GMT as the fallback format.
+ *
+ * See the [Rust documentation for `try_new`](https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.try_new) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/datetime/time_zone/enum.FallbackFormat.html)
+ */
+ static diplomat::result<ICU4XTimeZoneFormatter, ICU4XError> create_with_localized_gmt_fallback(const ICU4XDataProvider& provider, const ICU4XLocale& locale);
+
+ /**
+ * Creates a new [`ICU4XTimeZoneFormatter`] from locale data.
+ *
+ * Uses ISO-8601 as the fallback format.
+ *
+ * See the [Rust documentation for `try_new`](https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.try_new) for more information.
+ *
+ * Additional information: [1](https://docs.rs/icu/latest/icu/datetime/time_zone/enum.FallbackFormat.html)
+ */
+ static diplomat::result<ICU4XTimeZoneFormatter, ICU4XError> create_with_iso_8601_fallback(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XIsoTimeZoneOptions options);
+
+ /**
+ * Loads generic non-location long format. Example: "Pacific Time"
+ *
+ * See the [Rust documentation for `include_generic_non_location_long`](https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.include_generic_non_location_long) for more information.
+ */
+ diplomat::result<std::monostate, ICU4XError> load_generic_non_location_long(const ICU4XDataProvider& provider);
+
+ /**
+ * Loads generic non-location short format. Example: "PT"
+ *
+ * See the [Rust documentation for `include_generic_non_location_short`](https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.include_generic_non_location_short) for more information.
+ */
+ diplomat::result<std::monostate, ICU4XError> load_generic_non_location_short(const ICU4XDataProvider& provider);
+
+ /**
+ * Loads specific non-location long format. Example: "Pacific Standard Time"
+ *
+ * See the [Rust documentation for `include_specific_non_location_long`](https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.include_specific_non_location_long) for more information.
+ */
+ diplomat::result<std::monostate, ICU4XError> load_specific_non_location_long(const ICU4XDataProvider& provider);
+
+ /**
+ * Loads specific non-location short format. Example: "PST"
+ *
+ * See the [Rust documentation for `include_specific_non_location_short`](https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.include_specific_non_location_short) for more information.
+ */
+ diplomat::result<std::monostate, ICU4XError> load_specific_non_location_short(const ICU4XDataProvider& provider);
+
+ /**
+ * Loads generic location format. Example: "Los Angeles Time"
+ *
+ * See the [Rust documentation for `include_generic_location_format`](https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.include_generic_location_format) for more information.
+ */
+ diplomat::result<std::monostate, ICU4XError> load_generic_location_format(const ICU4XDataProvider& provider);
+
+ /**
+ * Loads localized GMT format. Example: "GMT-07:00"
+ *
+ * See the [Rust documentation for `include_localized_gmt_format`](https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.include_localized_gmt_format) for more information.
+ */
+ diplomat::result<std::monostate, ICU4XError> include_localized_gmt_format();
+
+ /**
+ * Loads ISO-8601 format. Example: "-07:00"
+ *
+ * See the [Rust documentation for `include_iso_8601_format`](https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.include_iso_8601_format) for more information.
+ */
+ diplomat::result<std::monostate, ICU4XError> load_iso_8601_format(ICU4XIsoTimeZoneOptions options);
+
+ /**
+ * Formats a [`ICU4XCustomTimeZone`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.format) for more information.
+ *
+ * See the [Rust documentation for `format_to_string`](https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.format_to_string) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> format_custom_time_zone_to_writeable(const ICU4XCustomTimeZone& value, W& write) const;
+
+ /**
+ * Formats a [`ICU4XCustomTimeZone`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.format) for more information.
+ *
+ * See the [Rust documentation for `format_to_string`](https://docs.rs/icu/latest/icu/datetime/time_zone/struct.TimeZoneFormatter.html#method.format_to_string) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> format_custom_time_zone(const ICU4XCustomTimeZone& value) const;
+ inline const capi::ICU4XTimeZoneFormatter* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XTimeZoneFormatter* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XTimeZoneFormatter(capi::ICU4XTimeZoneFormatter* i) : inner(i) {}
+ ICU4XTimeZoneFormatter() = default;
+ ICU4XTimeZoneFormatter(ICU4XTimeZoneFormatter&&) noexcept = default;
+ ICU4XTimeZoneFormatter& operator=(ICU4XTimeZoneFormatter&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XTimeZoneFormatter, ICU4XTimeZoneFormatterDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocale.hpp"
+#include "ICU4XIsoTimeZoneOptions.hpp"
+#include "ICU4XCustomTimeZone.hpp"
+
+inline diplomat::result<ICU4XTimeZoneFormatter, ICU4XError> ICU4XTimeZoneFormatter::create_with_localized_gmt_fallback(const ICU4XDataProvider& provider, const ICU4XLocale& locale) {
+ auto diplomat_result_raw_out_value = capi::ICU4XTimeZoneFormatter_create_with_localized_gmt_fallback(provider.AsFFI(), locale.AsFFI());
+ diplomat::result<ICU4XTimeZoneFormatter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XTimeZoneFormatter>(ICU4XTimeZoneFormatter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XTimeZoneFormatter, ICU4XError> ICU4XTimeZoneFormatter::create_with_iso_8601_fallback(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XIsoTimeZoneOptions options) {
+ ICU4XIsoTimeZoneOptions diplomat_wrapped_struct_options = options;
+ auto diplomat_result_raw_out_value = capi::ICU4XTimeZoneFormatter_create_with_iso_8601_fallback(provider.AsFFI(), locale.AsFFI(), capi::ICU4XIsoTimeZoneOptions{ .format = static_cast<capi::ICU4XIsoTimeZoneFormat>(diplomat_wrapped_struct_options.format), .minutes = static_cast<capi::ICU4XIsoTimeZoneMinuteDisplay>(diplomat_wrapped_struct_options.minutes), .seconds = static_cast<capi::ICU4XIsoTimeZoneSecondDisplay>(diplomat_wrapped_struct_options.seconds) });
+ diplomat::result<ICU4XTimeZoneFormatter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XTimeZoneFormatter>(ICU4XTimeZoneFormatter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::monostate, ICU4XError> ICU4XTimeZoneFormatter::load_generic_non_location_long(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XTimeZoneFormatter_load_generic_non_location_long(this->inner.get(), provider.AsFFI());
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::monostate, ICU4XError> ICU4XTimeZoneFormatter::load_generic_non_location_short(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XTimeZoneFormatter_load_generic_non_location_short(this->inner.get(), provider.AsFFI());
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::monostate, ICU4XError> ICU4XTimeZoneFormatter::load_specific_non_location_long(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XTimeZoneFormatter_load_specific_non_location_long(this->inner.get(), provider.AsFFI());
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::monostate, ICU4XError> ICU4XTimeZoneFormatter::load_specific_non_location_short(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XTimeZoneFormatter_load_specific_non_location_short(this->inner.get(), provider.AsFFI());
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::monostate, ICU4XError> ICU4XTimeZoneFormatter::load_generic_location_format(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XTimeZoneFormatter_load_generic_location_format(this->inner.get(), provider.AsFFI());
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::monostate, ICU4XError> ICU4XTimeZoneFormatter::include_localized_gmt_format() {
+ auto diplomat_result_raw_out_value = capi::ICU4XTimeZoneFormatter_include_localized_gmt_format(this->inner.get());
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::monostate, ICU4XError> ICU4XTimeZoneFormatter::load_iso_8601_format(ICU4XIsoTimeZoneOptions options) {
+ ICU4XIsoTimeZoneOptions diplomat_wrapped_struct_options = options;
+ auto diplomat_result_raw_out_value = capi::ICU4XTimeZoneFormatter_load_iso_8601_format(this->inner.get(), capi::ICU4XIsoTimeZoneOptions{ .format = static_cast<capi::ICU4XIsoTimeZoneFormat>(diplomat_wrapped_struct_options.format), .minutes = static_cast<capi::ICU4XIsoTimeZoneMinuteDisplay>(diplomat_wrapped_struct_options.minutes), .seconds = static_cast<capi::ICU4XIsoTimeZoneSecondDisplay>(diplomat_wrapped_struct_options.seconds) });
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XTimeZoneFormatter::format_custom_time_zone_to_writeable(const ICU4XCustomTimeZone& value, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XTimeZoneFormatter_format_custom_time_zone(this->inner.get(), value.AsFFI(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XTimeZoneFormatter::format_custom_time_zone(const ICU4XCustomTimeZone& value) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XTimeZoneFormatter_format_custom_time_zone(this->inner.get(), value.AsFFI(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XTitlecaseMapper.h b/intl/icu_capi/cpp/include/ICU4XTitlecaseMapper.h
new file mode 100644
index 0000000000..04debefbf9
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XTitlecaseMapper.h
@@ -0,0 +1,36 @@
+#ifndef ICU4XTitlecaseMapper_H
+#define ICU4XTitlecaseMapper_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XTitlecaseMapper ICU4XTitlecaseMapper;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XTitlecaseMapper_ICU4XError.h"
+#include "ICU4XLocale.h"
+#include "ICU4XTitlecaseOptionsV1.h"
+#include "diplomat_result_void_ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XTitlecaseMapper_ICU4XError ICU4XTitlecaseMapper_create(const ICU4XDataProvider* provider);
+
+diplomat_result_void_ICU4XError ICU4XTitlecaseMapper_titlecase_segment_v1(const ICU4XTitlecaseMapper* self, const char* s_data, size_t s_len, const ICU4XLocale* locale, ICU4XTitlecaseOptionsV1 options, DiplomatWriteable* write);
+void ICU4XTitlecaseMapper_destroy(ICU4XTitlecaseMapper* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XTitlecaseMapper.hpp b/intl/icu_capi/cpp/include/ICU4XTitlecaseMapper.hpp
new file mode 100644
index 0000000000..c0138d94b8
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XTitlecaseMapper.hpp
@@ -0,0 +1,108 @@
+#ifndef ICU4XTitlecaseMapper_HPP
+#define ICU4XTitlecaseMapper_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XTitlecaseMapper.h"
+
+class ICU4XDataProvider;
+class ICU4XTitlecaseMapper;
+#include "ICU4XError.hpp"
+class ICU4XLocale;
+struct ICU4XTitlecaseOptionsV1;
+
+/**
+ * A destruction policy for using ICU4XTitlecaseMapper with std::unique_ptr.
+ */
+struct ICU4XTitlecaseMapperDeleter {
+ void operator()(capi::ICU4XTitlecaseMapper* l) const noexcept {
+ capi::ICU4XTitlecaseMapper_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `TitlecaseMapper`](https://docs.rs/icu/latest/icu/casemap/struct.TitlecaseMapper.html) for more information.
+ */
+class ICU4XTitlecaseMapper {
+ public:
+
+ /**
+ * Construct a new `ICU4XTitlecaseMapper` instance
+ *
+ * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/casemap/struct.TitlecaseMapper.html#method.new) for more information.
+ */
+ static diplomat::result<ICU4XTitlecaseMapper, ICU4XError> create(const ICU4XDataProvider& provider);
+
+ /**
+ * Returns the full titlecase mapping of the given string
+ *
+ * The `v1` refers to the version of the options struct, which may change as we add more options
+ *
+ * See the [Rust documentation for `titlecase_segment`](https://docs.rs/icu/latest/icu/casemap/struct.TitlecaseMapper.html#method.titlecase_segment) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> titlecase_segment_v1_to_writeable(const std::string_view s, const ICU4XLocale& locale, ICU4XTitlecaseOptionsV1 options, W& write) const;
+
+ /**
+ * Returns the full titlecase mapping of the given string
+ *
+ * The `v1` refers to the version of the options struct, which may change as we add more options
+ *
+ * See the [Rust documentation for `titlecase_segment`](https://docs.rs/icu/latest/icu/casemap/struct.TitlecaseMapper.html#method.titlecase_segment) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> titlecase_segment_v1(const std::string_view s, const ICU4XLocale& locale, ICU4XTitlecaseOptionsV1 options) const;
+ inline const capi::ICU4XTitlecaseMapper* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XTitlecaseMapper* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XTitlecaseMapper(capi::ICU4XTitlecaseMapper* i) : inner(i) {}
+ ICU4XTitlecaseMapper() = default;
+ ICU4XTitlecaseMapper(ICU4XTitlecaseMapper&&) noexcept = default;
+ ICU4XTitlecaseMapper& operator=(ICU4XTitlecaseMapper&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XTitlecaseMapper, ICU4XTitlecaseMapperDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocale.hpp"
+#include "ICU4XTitlecaseOptionsV1.hpp"
+
+inline diplomat::result<ICU4XTitlecaseMapper, ICU4XError> ICU4XTitlecaseMapper::create(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XTitlecaseMapper_create(provider.AsFFI());
+ diplomat::result<ICU4XTitlecaseMapper, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XTitlecaseMapper>(ICU4XTitlecaseMapper(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XTitlecaseMapper::titlecase_segment_v1_to_writeable(const std::string_view s, const ICU4XLocale& locale, ICU4XTitlecaseOptionsV1 options, W& write) const {
+ ICU4XTitlecaseOptionsV1 diplomat_wrapped_struct_options = options;
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XTitlecaseMapper_titlecase_segment_v1(this->inner.get(), s.data(), s.size(), locale.AsFFI(), capi::ICU4XTitlecaseOptionsV1{ .leading_adjustment = static_cast<capi::ICU4XLeadingAdjustment>(diplomat_wrapped_struct_options.leading_adjustment), .trailing_case = static_cast<capi::ICU4XTrailingCase>(diplomat_wrapped_struct_options.trailing_case) }, &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XTitlecaseMapper::titlecase_segment_v1(const std::string_view s, const ICU4XLocale& locale, ICU4XTitlecaseOptionsV1 options) const {
+ ICU4XTitlecaseOptionsV1 diplomat_wrapped_struct_options = options;
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XTitlecaseMapper_titlecase_segment_v1(this->inner.get(), s.data(), s.size(), locale.AsFFI(), capi::ICU4XTitlecaseOptionsV1{ .leading_adjustment = static_cast<capi::ICU4XLeadingAdjustment>(diplomat_wrapped_struct_options.leading_adjustment), .trailing_case = static_cast<capi::ICU4XTrailingCase>(diplomat_wrapped_struct_options.trailing_case) }, &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XTitlecaseOptionsV1.h b/intl/icu_capi/cpp/include/ICU4XTitlecaseOptionsV1.h
new file mode 100644
index 0000000000..a828188560
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XTitlecaseOptionsV1.h
@@ -0,0 +1,36 @@
+#ifndef ICU4XTitlecaseOptionsV1_H
+#define ICU4XTitlecaseOptionsV1_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#include "ICU4XLeadingAdjustment.h"
+#include "ICU4XTrailingCase.h"
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XTitlecaseOptionsV1 {
+ ICU4XLeadingAdjustment leading_adjustment;
+ ICU4XTrailingCase trailing_case;
+} ICU4XTitlecaseOptionsV1;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XLeadingAdjustment.h"
+#include "ICU4XTrailingCase.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+ICU4XTitlecaseOptionsV1 ICU4XTitlecaseOptionsV1_default_options();
+void ICU4XTitlecaseOptionsV1_destroy(ICU4XTitlecaseOptionsV1* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XTitlecaseOptionsV1.hpp b/intl/icu_capi/cpp/include/ICU4XTitlecaseOptionsV1.hpp
new file mode 100644
index 0000000000..dd8816816b
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XTitlecaseOptionsV1.hpp
@@ -0,0 +1,38 @@
+#ifndef ICU4XTitlecaseOptionsV1_HPP
+#define ICU4XTitlecaseOptionsV1_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XTitlecaseOptionsV1.h"
+
+#include "ICU4XLeadingAdjustment.hpp"
+#include "ICU4XTrailingCase.hpp"
+struct ICU4XTitlecaseOptionsV1;
+
+
+/**
+ * See the [Rust documentation for `TitlecaseOptions`](https://docs.rs/icu/latest/icu/casemap/titlecase/struct.TitlecaseOptions.html) for more information.
+ */
+struct ICU4XTitlecaseOptionsV1 {
+ public:
+ ICU4XLeadingAdjustment leading_adjustment;
+ ICU4XTrailingCase trailing_case;
+
+ /**
+ * See the [Rust documentation for `default`](https://docs.rs/icu/latest/icu/casemap/titlecase/struct.TitlecaseOptions.html#method.default) for more information.
+ */
+ static ICU4XTitlecaseOptionsV1 default_options();
+};
+
+
+inline ICU4XTitlecaseOptionsV1 ICU4XTitlecaseOptionsV1::default_options() {
+ capi::ICU4XTitlecaseOptionsV1 diplomat_raw_struct_out_value = capi::ICU4XTitlecaseOptionsV1_default_options();
+ return ICU4XTitlecaseOptionsV1{ .leading_adjustment = std::move(static_cast<ICU4XLeadingAdjustment>(diplomat_raw_struct_out_value.leading_adjustment)), .trailing_case = std::move(static_cast<ICU4XTrailingCase>(diplomat_raw_struct_out_value.trailing_case)) };
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XTrailingCase.h b/intl/icu_capi/cpp/include/ICU4XTrailingCase.h
new file mode 100644
index 0000000000..d8957e0088
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XTrailingCase.h
@@ -0,0 +1,31 @@
+#ifndef ICU4XTrailingCase_H
+#define ICU4XTrailingCase_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XTrailingCase {
+ ICU4XTrailingCase_Lower = 0,
+ ICU4XTrailingCase_Unchanged = 1,
+} ICU4XTrailingCase;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XTrailingCase_destroy(ICU4XTrailingCase* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XTrailingCase.hpp b/intl/icu_capi/cpp/include/ICU4XTrailingCase.hpp
new file mode 100644
index 0000000000..7124321156
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XTrailingCase.hpp
@@ -0,0 +1,24 @@
+#ifndef ICU4XTrailingCase_HPP
+#define ICU4XTrailingCase_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XTrailingCase.h"
+
+
+
+/**
+ * See the [Rust documentation for `TrailingCase`](https://docs.rs/icu/latest/icu/casemap/titlecase/enum.TrailingCase.html) for more information.
+ */
+enum struct ICU4XTrailingCase {
+ Lower = 0,
+ Unchanged = 1,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XTransformResult.h b/intl/icu_capi/cpp/include/ICU4XTransformResult.h
new file mode 100644
index 0000000000..66b268e266
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XTransformResult.h
@@ -0,0 +1,31 @@
+#ifndef ICU4XTransformResult_H
+#define ICU4XTransformResult_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XTransformResult {
+ ICU4XTransformResult_Modified = 0,
+ ICU4XTransformResult_Unmodified = 1,
+} ICU4XTransformResult;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XTransformResult_destroy(ICU4XTransformResult* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XTransformResult.hpp b/intl/icu_capi/cpp/include/ICU4XTransformResult.hpp
new file mode 100644
index 0000000000..106025313b
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XTransformResult.hpp
@@ -0,0 +1,26 @@
+#ifndef ICU4XTransformResult_HPP
+#define ICU4XTransformResult_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XTransformResult.h"
+
+
+
+/**
+ * FFI version of `TransformResult`.
+ *
+ * See the [Rust documentation for `TransformResult`](https://docs.rs/icu/latest/icu/locid_transform/enum.TransformResult.html) for more information.
+ */
+enum struct ICU4XTransformResult {
+ Modified = 0,
+ Unmodified = 1,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XUnicodeSetData.h b/intl/icu_capi/cpp/include/ICU4XUnicodeSetData.h
new file mode 100644
index 0000000000..3e10e53097
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XUnicodeSetData.h
@@ -0,0 +1,48 @@
+#ifndef ICU4XUnicodeSetData_H
+#define ICU4XUnicodeSetData_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XUnicodeSetData ICU4XUnicodeSetData;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XUnicodeSetData_ICU4XError.h"
+#include "ICU4XLocale.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+bool ICU4XUnicodeSetData_contains(const ICU4XUnicodeSetData* self, const char* s_data, size_t s_len);
+
+bool ICU4XUnicodeSetData_contains_char(const ICU4XUnicodeSetData* self, char32_t cp);
+
+bool ICU4XUnicodeSetData_contains32(const ICU4XUnicodeSetData* self, uint32_t cp);
+
+diplomat_result_box_ICU4XUnicodeSetData_ICU4XError ICU4XUnicodeSetData_load_basic_emoji(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XUnicodeSetData_ICU4XError ICU4XUnicodeSetData_load_exemplars_main(const ICU4XDataProvider* provider, const ICU4XLocale* locale);
+
+diplomat_result_box_ICU4XUnicodeSetData_ICU4XError ICU4XUnicodeSetData_load_exemplars_auxiliary(const ICU4XDataProvider* provider, const ICU4XLocale* locale);
+
+diplomat_result_box_ICU4XUnicodeSetData_ICU4XError ICU4XUnicodeSetData_load_exemplars_punctuation(const ICU4XDataProvider* provider, const ICU4XLocale* locale);
+
+diplomat_result_box_ICU4XUnicodeSetData_ICU4XError ICU4XUnicodeSetData_load_exemplars_numbers(const ICU4XDataProvider* provider, const ICU4XLocale* locale);
+
+diplomat_result_box_ICU4XUnicodeSetData_ICU4XError ICU4XUnicodeSetData_load_exemplars_index(const ICU4XDataProvider* provider, const ICU4XLocale* locale);
+void ICU4XUnicodeSetData_destroy(ICU4XUnicodeSetData* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XUnicodeSetData.hpp b/intl/icu_capi/cpp/include/ICU4XUnicodeSetData.hpp
new file mode 100644
index 0000000000..87bef74eac
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XUnicodeSetData.hpp
@@ -0,0 +1,170 @@
+#ifndef ICU4XUnicodeSetData_HPP
+#define ICU4XUnicodeSetData_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XUnicodeSetData.h"
+
+class ICU4XDataProvider;
+class ICU4XUnicodeSetData;
+#include "ICU4XError.hpp"
+class ICU4XLocale;
+
+/**
+ * A destruction policy for using ICU4XUnicodeSetData with std::unique_ptr.
+ */
+struct ICU4XUnicodeSetDataDeleter {
+ void operator()(capi::ICU4XUnicodeSetData* l) const noexcept {
+ capi::ICU4XUnicodeSetData_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X Unicode Set Property object, capable of querying whether a code point is contained in a set based on a Unicode property.
+ *
+ * See the [Rust documentation for `properties`](https://docs.rs/icu/latest/icu/properties/index.html) for more information.
+ *
+ * See the [Rust documentation for `UnicodeSetData`](https://docs.rs/icu/latest/icu/properties/sets/struct.UnicodeSetData.html) for more information.
+ *
+ * See the [Rust documentation for `UnicodeSetDataBorrowed`](https://docs.rs/icu/latest/icu/properties/sets/struct.UnicodeSetDataBorrowed.html) for more information.
+ */
+class ICU4XUnicodeSetData {
+ public:
+
+ /**
+ * Checks whether the string is in the set.
+ *
+ * See the [Rust documentation for `contains`](https://docs.rs/icu/latest/icu/properties/sets/struct.UnicodeSetDataBorrowed.html#method.contains) for more information.
+ */
+ bool contains(const std::string_view s) const;
+
+ /**
+ * Checks whether the code point is in the set.
+ *
+ * See the [Rust documentation for `contains_char`](https://docs.rs/icu/latest/icu/properties/sets/struct.UnicodeSetDataBorrowed.html#method.contains_char) for more information.
+ */
+ bool contains_char(char32_t cp) const;
+
+ /**
+ * Checks whether the code point (specified as a 32 bit integer, in UTF-32) is in the set.
+ */
+ bool contains32(uint32_t cp) const;
+
+ /**
+ * See the [Rust documentation for `basic_emoji`](https://docs.rs/icu/latest/icu/properties/sets/fn.basic_emoji.html) for more information.
+ */
+ static diplomat::result<ICU4XUnicodeSetData, ICU4XError> load_basic_emoji(const ICU4XDataProvider& provider);
+
+ /**
+ * See the [Rust documentation for `exemplars_main`](https://docs.rs/icu/latest/icu/properties/exemplar_chars/fn.exemplars_main.html) for more information.
+ */
+ static diplomat::result<ICU4XUnicodeSetData, ICU4XError> load_exemplars_main(const ICU4XDataProvider& provider, const ICU4XLocale& locale);
+
+ /**
+ * See the [Rust documentation for `exemplars_auxiliary`](https://docs.rs/icu/latest/icu/properties/exemplar_chars/fn.exemplars_auxiliary.html) for more information.
+ */
+ static diplomat::result<ICU4XUnicodeSetData, ICU4XError> load_exemplars_auxiliary(const ICU4XDataProvider& provider, const ICU4XLocale& locale);
+
+ /**
+ * See the [Rust documentation for `exemplars_punctuation`](https://docs.rs/icu/latest/icu/properties/exemplar_chars/fn.exemplars_punctuation.html) for more information.
+ */
+ static diplomat::result<ICU4XUnicodeSetData, ICU4XError> load_exemplars_punctuation(const ICU4XDataProvider& provider, const ICU4XLocale& locale);
+
+ /**
+ * See the [Rust documentation for `exemplars_numbers`](https://docs.rs/icu/latest/icu/properties/exemplar_chars/fn.exemplars_numbers.html) for more information.
+ */
+ static diplomat::result<ICU4XUnicodeSetData, ICU4XError> load_exemplars_numbers(const ICU4XDataProvider& provider, const ICU4XLocale& locale);
+
+ /**
+ * See the [Rust documentation for `exemplars_index`](https://docs.rs/icu/latest/icu/properties/exemplar_chars/fn.exemplars_index.html) for more information.
+ */
+ static diplomat::result<ICU4XUnicodeSetData, ICU4XError> load_exemplars_index(const ICU4XDataProvider& provider, const ICU4XLocale& locale);
+ inline const capi::ICU4XUnicodeSetData* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XUnicodeSetData* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XUnicodeSetData(capi::ICU4XUnicodeSetData* i) : inner(i) {}
+ ICU4XUnicodeSetData() = default;
+ ICU4XUnicodeSetData(ICU4XUnicodeSetData&&) noexcept = default;
+ ICU4XUnicodeSetData& operator=(ICU4XUnicodeSetData&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XUnicodeSetData, ICU4XUnicodeSetDataDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocale.hpp"
+
+inline bool ICU4XUnicodeSetData::contains(const std::string_view s) const {
+ return capi::ICU4XUnicodeSetData_contains(this->inner.get(), s.data(), s.size());
+}
+inline bool ICU4XUnicodeSetData::contains_char(char32_t cp) const {
+ return capi::ICU4XUnicodeSetData_contains_char(this->inner.get(), cp);
+}
+inline bool ICU4XUnicodeSetData::contains32(uint32_t cp) const {
+ return capi::ICU4XUnicodeSetData_contains32(this->inner.get(), cp);
+}
+inline diplomat::result<ICU4XUnicodeSetData, ICU4XError> ICU4XUnicodeSetData::load_basic_emoji(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XUnicodeSetData_load_basic_emoji(provider.AsFFI());
+ diplomat::result<ICU4XUnicodeSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XUnicodeSetData>(ICU4XUnicodeSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XUnicodeSetData, ICU4XError> ICU4XUnicodeSetData::load_exemplars_main(const ICU4XDataProvider& provider, const ICU4XLocale& locale) {
+ auto diplomat_result_raw_out_value = capi::ICU4XUnicodeSetData_load_exemplars_main(provider.AsFFI(), locale.AsFFI());
+ diplomat::result<ICU4XUnicodeSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XUnicodeSetData>(ICU4XUnicodeSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XUnicodeSetData, ICU4XError> ICU4XUnicodeSetData::load_exemplars_auxiliary(const ICU4XDataProvider& provider, const ICU4XLocale& locale) {
+ auto diplomat_result_raw_out_value = capi::ICU4XUnicodeSetData_load_exemplars_auxiliary(provider.AsFFI(), locale.AsFFI());
+ diplomat::result<ICU4XUnicodeSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XUnicodeSetData>(ICU4XUnicodeSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XUnicodeSetData, ICU4XError> ICU4XUnicodeSetData::load_exemplars_punctuation(const ICU4XDataProvider& provider, const ICU4XLocale& locale) {
+ auto diplomat_result_raw_out_value = capi::ICU4XUnicodeSetData_load_exemplars_punctuation(provider.AsFFI(), locale.AsFFI());
+ diplomat::result<ICU4XUnicodeSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XUnicodeSetData>(ICU4XUnicodeSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XUnicodeSetData, ICU4XError> ICU4XUnicodeSetData::load_exemplars_numbers(const ICU4XDataProvider& provider, const ICU4XLocale& locale) {
+ auto diplomat_result_raw_out_value = capi::ICU4XUnicodeSetData_load_exemplars_numbers(provider.AsFFI(), locale.AsFFI());
+ diplomat::result<ICU4XUnicodeSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XUnicodeSetData>(ICU4XUnicodeSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XUnicodeSetData, ICU4XError> ICU4XUnicodeSetData::load_exemplars_index(const ICU4XDataProvider& provider, const ICU4XLocale& locale) {
+ auto diplomat_result_raw_out_value = capi::ICU4XUnicodeSetData_load_exemplars_index(provider.AsFFI(), locale.AsFFI());
+ diplomat::result<ICU4XUnicodeSetData, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XUnicodeSetData>(ICU4XUnicodeSetData(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XWeekCalculator.h b/intl/icu_capi/cpp/include/ICU4XWeekCalculator.h
new file mode 100644
index 0000000000..02a52c6e87
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XWeekCalculator.h
@@ -0,0 +1,39 @@
+#ifndef ICU4XWeekCalculator_H
+#define ICU4XWeekCalculator_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XWeekCalculator ICU4XWeekCalculator;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "ICU4XLocale.h"
+#include "diplomat_result_box_ICU4XWeekCalculator_ICU4XError.h"
+#include "ICU4XIsoWeekday.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XWeekCalculator_ICU4XError ICU4XWeekCalculator_create(const ICU4XDataProvider* provider, const ICU4XLocale* locale);
+
+ICU4XWeekCalculator* ICU4XWeekCalculator_create_from_first_day_of_week_and_min_week_days(ICU4XIsoWeekday first_weekday, uint8_t min_week_days);
+
+ICU4XIsoWeekday ICU4XWeekCalculator_first_weekday(const ICU4XWeekCalculator* self);
+
+uint8_t ICU4XWeekCalculator_min_week_days(const ICU4XWeekCalculator* self);
+void ICU4XWeekCalculator_destroy(ICU4XWeekCalculator* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XWeekCalculator.hpp b/intl/icu_capi/cpp/include/ICU4XWeekCalculator.hpp
new file mode 100644
index 0000000000..ace3c97c4f
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XWeekCalculator.hpp
@@ -0,0 +1,95 @@
+#ifndef ICU4XWeekCalculator_HPP
+#define ICU4XWeekCalculator_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XWeekCalculator.h"
+
+class ICU4XDataProvider;
+class ICU4XLocale;
+class ICU4XWeekCalculator;
+#include "ICU4XError.hpp"
+#include "ICU4XIsoWeekday.hpp"
+
+/**
+ * A destruction policy for using ICU4XWeekCalculator with std::unique_ptr.
+ */
+struct ICU4XWeekCalculatorDeleter {
+ void operator()(capi::ICU4XWeekCalculator* l) const noexcept {
+ capi::ICU4XWeekCalculator_destroy(l);
+ }
+};
+
+/**
+ * A Week calculator, useful to be passed in to `week_of_year()` on Date and DateTime types
+ *
+ * See the [Rust documentation for `WeekCalculator`](https://docs.rs/icu/latest/icu/calendar/week/struct.WeekCalculator.html) for more information.
+ */
+class ICU4XWeekCalculator {
+ public:
+
+ /**
+ * Creates a new [`ICU4XWeekCalculator`] from locale data.
+ *
+ * See the [Rust documentation for `try_new`](https://docs.rs/icu/latest/icu/calendar/week/struct.WeekCalculator.html#method.try_new) for more information.
+ */
+ static diplomat::result<ICU4XWeekCalculator, ICU4XError> create(const ICU4XDataProvider& provider, const ICU4XLocale& locale);
+
+ /**
+ * Additional information: [1](https://docs.rs/icu/latest/icu/calendar/week/struct.WeekCalculator.html#structfield.first_weekday), [2](https://docs.rs/icu/latest/icu/calendar/week/struct.WeekCalculator.html#structfield.min_week_days)
+ */
+ static ICU4XWeekCalculator create_from_first_day_of_week_and_min_week_days(ICU4XIsoWeekday first_weekday, uint8_t min_week_days);
+
+ /**
+ * Returns the weekday that starts the week for this object's locale
+ *
+ * See the [Rust documentation for `first_weekday`](https://docs.rs/icu/latest/icu/calendar/week/struct.WeekCalculator.html#structfield.first_weekday) for more information.
+ */
+ ICU4XIsoWeekday first_weekday() const;
+
+ /**
+ * The minimum number of days overlapping a year required for a week to be
+ * considered part of that year
+ *
+ * See the [Rust documentation for `min_week_days`](https://docs.rs/icu/latest/icu/calendar/week/struct.WeekCalculator.html#structfield.min_week_days) for more information.
+ */
+ uint8_t min_week_days() const;
+ inline const capi::ICU4XWeekCalculator* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XWeekCalculator* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XWeekCalculator(capi::ICU4XWeekCalculator* i) : inner(i) {}
+ ICU4XWeekCalculator() = default;
+ ICU4XWeekCalculator(ICU4XWeekCalculator&&) noexcept = default;
+ ICU4XWeekCalculator& operator=(ICU4XWeekCalculator&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XWeekCalculator, ICU4XWeekCalculatorDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocale.hpp"
+
+inline diplomat::result<ICU4XWeekCalculator, ICU4XError> ICU4XWeekCalculator::create(const ICU4XDataProvider& provider, const ICU4XLocale& locale) {
+ auto diplomat_result_raw_out_value = capi::ICU4XWeekCalculator_create(provider.AsFFI(), locale.AsFFI());
+ diplomat::result<ICU4XWeekCalculator, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XWeekCalculator>(ICU4XWeekCalculator(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XWeekCalculator ICU4XWeekCalculator::create_from_first_day_of_week_and_min_week_days(ICU4XIsoWeekday first_weekday, uint8_t min_week_days) {
+ return ICU4XWeekCalculator(capi::ICU4XWeekCalculator_create_from_first_day_of_week_and_min_week_days(static_cast<capi::ICU4XIsoWeekday>(first_weekday), min_week_days));
+}
+inline ICU4XIsoWeekday ICU4XWeekCalculator::first_weekday() const {
+ return static_cast<ICU4XIsoWeekday>(capi::ICU4XWeekCalculator_first_weekday(this->inner.get()));
+}
+inline uint8_t ICU4XWeekCalculator::min_week_days() const {
+ return capi::ICU4XWeekCalculator_min_week_days(this->inner.get());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XWeekOf.h b/intl/icu_capi/cpp/include/ICU4XWeekOf.h
new file mode 100644
index 0000000000..5441b943d4
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XWeekOf.h
@@ -0,0 +1,33 @@
+#ifndef ICU4XWeekOf_H
+#define ICU4XWeekOf_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#include "ICU4XWeekRelativeUnit.h"
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XWeekOf {
+ uint16_t week;
+ ICU4XWeekRelativeUnit unit;
+} ICU4XWeekOf;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XWeekRelativeUnit.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XWeekOf_destroy(ICU4XWeekOf* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XWeekOf.hpp b/intl/icu_capi/cpp/include/ICU4XWeekOf.hpp
new file mode 100644
index 0000000000..f0badc2bfb
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XWeekOf.hpp
@@ -0,0 +1,27 @@
+#ifndef ICU4XWeekOf_HPP
+#define ICU4XWeekOf_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XWeekOf.h"
+
+#include "ICU4XWeekRelativeUnit.hpp"
+
+
+/**
+ * See the [Rust documentation for `WeekOf`](https://docs.rs/icu/latest/icu/calendar/week/struct.WeekOf.html) for more information.
+ */
+struct ICU4XWeekOf {
+ public:
+ uint16_t week;
+ ICU4XWeekRelativeUnit unit;
+};
+
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XWeekRelativeUnit.h b/intl/icu_capi/cpp/include/ICU4XWeekRelativeUnit.h
new file mode 100644
index 0000000000..ee6802dc3b
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XWeekRelativeUnit.h
@@ -0,0 +1,32 @@
+#ifndef ICU4XWeekRelativeUnit_H
+#define ICU4XWeekRelativeUnit_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef enum ICU4XWeekRelativeUnit {
+ ICU4XWeekRelativeUnit_Previous = 0,
+ ICU4XWeekRelativeUnit_Current = 1,
+ ICU4XWeekRelativeUnit_Next = 2,
+} ICU4XWeekRelativeUnit;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+void ICU4XWeekRelativeUnit_destroy(ICU4XWeekRelativeUnit* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XWeekRelativeUnit.hpp b/intl/icu_capi/cpp/include/ICU4XWeekRelativeUnit.hpp
new file mode 100644
index 0000000000..f0862f0d32
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XWeekRelativeUnit.hpp
@@ -0,0 +1,25 @@
+#ifndef ICU4XWeekRelativeUnit_HPP
+#define ICU4XWeekRelativeUnit_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XWeekRelativeUnit.h"
+
+
+
+/**
+ * See the [Rust documentation for `RelativeUnit`](https://docs.rs/icu/latest/icu/calendar/week/enum.RelativeUnit.html) for more information.
+ */
+enum struct ICU4XWeekRelativeUnit {
+ Previous = 0,
+ Current = 1,
+ Next = 2,
+};
+
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XWordBreakIteratorLatin1.h b/intl/icu_capi/cpp/include/ICU4XWordBreakIteratorLatin1.h
new file mode 100644
index 0000000000..112025bdf5
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XWordBreakIteratorLatin1.h
@@ -0,0 +1,34 @@
+#ifndef ICU4XWordBreakIteratorLatin1_H
+#define ICU4XWordBreakIteratorLatin1_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XWordBreakIteratorLatin1 ICU4XWordBreakIteratorLatin1;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XSegmenterWordType.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+int32_t ICU4XWordBreakIteratorLatin1_next(ICU4XWordBreakIteratorLatin1* self);
+
+ICU4XSegmenterWordType ICU4XWordBreakIteratorLatin1_word_type(const ICU4XWordBreakIteratorLatin1* self);
+
+bool ICU4XWordBreakIteratorLatin1_is_word_like(const ICU4XWordBreakIteratorLatin1* self);
+void ICU4XWordBreakIteratorLatin1_destroy(ICU4XWordBreakIteratorLatin1* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XWordBreakIteratorLatin1.hpp b/intl/icu_capi/cpp/include/ICU4XWordBreakIteratorLatin1.hpp
new file mode 100644
index 0000000000..83c8f0ef7e
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XWordBreakIteratorLatin1.hpp
@@ -0,0 +1,72 @@
+#ifndef ICU4XWordBreakIteratorLatin1_HPP
+#define ICU4XWordBreakIteratorLatin1_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XWordBreakIteratorLatin1.h"
+
+#include "ICU4XSegmenterWordType.hpp"
+
+/**
+ * A destruction policy for using ICU4XWordBreakIteratorLatin1 with std::unique_ptr.
+ */
+struct ICU4XWordBreakIteratorLatin1Deleter {
+ void operator()(capi::ICU4XWordBreakIteratorLatin1* l) const noexcept {
+ capi::ICU4XWordBreakIteratorLatin1_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `WordBreakIterator`](https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html) for more information.
+ */
+class ICU4XWordBreakIteratorLatin1 {
+ public:
+
+ /**
+ * Finds the next breakpoint. Returns -1 if at the end of the string or if the index is
+ * out of range of a 32-bit signed integer.
+ *
+ * See the [Rust documentation for `next`](https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html#method.next) for more information.
+ */
+ int32_t next();
+
+ /**
+ * Return the status value of break boundary.
+ *
+ * See the [Rust documentation for `word_type`](https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html#method.word_type) for more information.
+ */
+ ICU4XSegmenterWordType word_type() const;
+
+ /**
+ * Return true when break boundary is word-like such as letter/number/CJK
+ *
+ * See the [Rust documentation for `is_word_like`](https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html#method.is_word_like) for more information.
+ */
+ bool is_word_like() const;
+ inline const capi::ICU4XWordBreakIteratorLatin1* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XWordBreakIteratorLatin1* AsFFIMut() { return this->inner.get(); }
+ inline explicit ICU4XWordBreakIteratorLatin1(capi::ICU4XWordBreakIteratorLatin1* i) : inner(i) {}
+ ICU4XWordBreakIteratorLatin1() = default;
+ ICU4XWordBreakIteratorLatin1(ICU4XWordBreakIteratorLatin1&&) noexcept = default;
+ ICU4XWordBreakIteratorLatin1& operator=(ICU4XWordBreakIteratorLatin1&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XWordBreakIteratorLatin1, ICU4XWordBreakIteratorLatin1Deleter> inner;
+};
+
+
+inline int32_t ICU4XWordBreakIteratorLatin1::next() {
+ return capi::ICU4XWordBreakIteratorLatin1_next(this->inner.get());
+}
+inline ICU4XSegmenterWordType ICU4XWordBreakIteratorLatin1::word_type() const {
+ return static_cast<ICU4XSegmenterWordType>(capi::ICU4XWordBreakIteratorLatin1_word_type(this->inner.get()));
+}
+inline bool ICU4XWordBreakIteratorLatin1::is_word_like() const {
+ return capi::ICU4XWordBreakIteratorLatin1_is_word_like(this->inner.get());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XWordBreakIteratorUtf16.h b/intl/icu_capi/cpp/include/ICU4XWordBreakIteratorUtf16.h
new file mode 100644
index 0000000000..676aea3cff
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XWordBreakIteratorUtf16.h
@@ -0,0 +1,34 @@
+#ifndef ICU4XWordBreakIteratorUtf16_H
+#define ICU4XWordBreakIteratorUtf16_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XWordBreakIteratorUtf16 ICU4XWordBreakIteratorUtf16;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XSegmenterWordType.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+int32_t ICU4XWordBreakIteratorUtf16_next(ICU4XWordBreakIteratorUtf16* self);
+
+ICU4XSegmenterWordType ICU4XWordBreakIteratorUtf16_word_type(const ICU4XWordBreakIteratorUtf16* self);
+
+bool ICU4XWordBreakIteratorUtf16_is_word_like(const ICU4XWordBreakIteratorUtf16* self);
+void ICU4XWordBreakIteratorUtf16_destroy(ICU4XWordBreakIteratorUtf16* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XWordBreakIteratorUtf16.hpp b/intl/icu_capi/cpp/include/ICU4XWordBreakIteratorUtf16.hpp
new file mode 100644
index 0000000000..38abe0fe2b
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XWordBreakIteratorUtf16.hpp
@@ -0,0 +1,72 @@
+#ifndef ICU4XWordBreakIteratorUtf16_HPP
+#define ICU4XWordBreakIteratorUtf16_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XWordBreakIteratorUtf16.h"
+
+#include "ICU4XSegmenterWordType.hpp"
+
+/**
+ * A destruction policy for using ICU4XWordBreakIteratorUtf16 with std::unique_ptr.
+ */
+struct ICU4XWordBreakIteratorUtf16Deleter {
+ void operator()(capi::ICU4XWordBreakIteratorUtf16* l) const noexcept {
+ capi::ICU4XWordBreakIteratorUtf16_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `WordBreakIterator`](https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html) for more information.
+ */
+class ICU4XWordBreakIteratorUtf16 {
+ public:
+
+ /**
+ * Finds the next breakpoint. Returns -1 if at the end of the string or if the index is
+ * out of range of a 32-bit signed integer.
+ *
+ * See the [Rust documentation for `next`](https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html#method.next) for more information.
+ */
+ int32_t next();
+
+ /**
+ * Return the status value of break boundary.
+ *
+ * See the [Rust documentation for `word_type`](https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html#method.word_type) for more information.
+ */
+ ICU4XSegmenterWordType word_type() const;
+
+ /**
+ * Return true when break boundary is word-like such as letter/number/CJK
+ *
+ * See the [Rust documentation for `is_word_like`](https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html#method.is_word_like) for more information.
+ */
+ bool is_word_like() const;
+ inline const capi::ICU4XWordBreakIteratorUtf16* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XWordBreakIteratorUtf16* AsFFIMut() { return this->inner.get(); }
+ inline explicit ICU4XWordBreakIteratorUtf16(capi::ICU4XWordBreakIteratorUtf16* i) : inner(i) {}
+ ICU4XWordBreakIteratorUtf16() = default;
+ ICU4XWordBreakIteratorUtf16(ICU4XWordBreakIteratorUtf16&&) noexcept = default;
+ ICU4XWordBreakIteratorUtf16& operator=(ICU4XWordBreakIteratorUtf16&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XWordBreakIteratorUtf16, ICU4XWordBreakIteratorUtf16Deleter> inner;
+};
+
+
+inline int32_t ICU4XWordBreakIteratorUtf16::next() {
+ return capi::ICU4XWordBreakIteratorUtf16_next(this->inner.get());
+}
+inline ICU4XSegmenterWordType ICU4XWordBreakIteratorUtf16::word_type() const {
+ return static_cast<ICU4XSegmenterWordType>(capi::ICU4XWordBreakIteratorUtf16_word_type(this->inner.get()));
+}
+inline bool ICU4XWordBreakIteratorUtf16::is_word_like() const {
+ return capi::ICU4XWordBreakIteratorUtf16_is_word_like(this->inner.get());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XWordBreakIteratorUtf8.h b/intl/icu_capi/cpp/include/ICU4XWordBreakIteratorUtf8.h
new file mode 100644
index 0000000000..d8e98fb9b1
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XWordBreakIteratorUtf8.h
@@ -0,0 +1,34 @@
+#ifndef ICU4XWordBreakIteratorUtf8_H
+#define ICU4XWordBreakIteratorUtf8_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XWordBreakIteratorUtf8 ICU4XWordBreakIteratorUtf8;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XSegmenterWordType.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+int32_t ICU4XWordBreakIteratorUtf8_next(ICU4XWordBreakIteratorUtf8* self);
+
+ICU4XSegmenterWordType ICU4XWordBreakIteratorUtf8_word_type(const ICU4XWordBreakIteratorUtf8* self);
+
+bool ICU4XWordBreakIteratorUtf8_is_word_like(const ICU4XWordBreakIteratorUtf8* self);
+void ICU4XWordBreakIteratorUtf8_destroy(ICU4XWordBreakIteratorUtf8* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XWordBreakIteratorUtf8.hpp b/intl/icu_capi/cpp/include/ICU4XWordBreakIteratorUtf8.hpp
new file mode 100644
index 0000000000..be47dd1b0d
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XWordBreakIteratorUtf8.hpp
@@ -0,0 +1,72 @@
+#ifndef ICU4XWordBreakIteratorUtf8_HPP
+#define ICU4XWordBreakIteratorUtf8_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XWordBreakIteratorUtf8.h"
+
+#include "ICU4XSegmenterWordType.hpp"
+
+/**
+ * A destruction policy for using ICU4XWordBreakIteratorUtf8 with std::unique_ptr.
+ */
+struct ICU4XWordBreakIteratorUtf8Deleter {
+ void operator()(capi::ICU4XWordBreakIteratorUtf8* l) const noexcept {
+ capi::ICU4XWordBreakIteratorUtf8_destroy(l);
+ }
+};
+
+/**
+ * See the [Rust documentation for `WordBreakIterator`](https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html) for more information.
+ */
+class ICU4XWordBreakIteratorUtf8 {
+ public:
+
+ /**
+ * Finds the next breakpoint. Returns -1 if at the end of the string or if the index is
+ * out of range of a 32-bit signed integer.
+ *
+ * See the [Rust documentation for `next`](https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html#method.next) for more information.
+ */
+ int32_t next();
+
+ /**
+ * Return the status value of break boundary.
+ *
+ * See the [Rust documentation for `word_type`](https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html#method.word_type) for more information.
+ */
+ ICU4XSegmenterWordType word_type() const;
+
+ /**
+ * Return true when break boundary is word-like such as letter/number/CJK
+ *
+ * See the [Rust documentation for `is_word_like`](https://docs.rs/icu/latest/icu/segmenter/struct.WordBreakIterator.html#method.is_word_like) for more information.
+ */
+ bool is_word_like() const;
+ inline const capi::ICU4XWordBreakIteratorUtf8* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XWordBreakIteratorUtf8* AsFFIMut() { return this->inner.get(); }
+ inline explicit ICU4XWordBreakIteratorUtf8(capi::ICU4XWordBreakIteratorUtf8* i) : inner(i) {}
+ ICU4XWordBreakIteratorUtf8() = default;
+ ICU4XWordBreakIteratorUtf8(ICU4XWordBreakIteratorUtf8&&) noexcept = default;
+ ICU4XWordBreakIteratorUtf8& operator=(ICU4XWordBreakIteratorUtf8&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XWordBreakIteratorUtf8, ICU4XWordBreakIteratorUtf8Deleter> inner;
+};
+
+
+inline int32_t ICU4XWordBreakIteratorUtf8::next() {
+ return capi::ICU4XWordBreakIteratorUtf8_next(this->inner.get());
+}
+inline ICU4XSegmenterWordType ICU4XWordBreakIteratorUtf8::word_type() const {
+ return static_cast<ICU4XSegmenterWordType>(capi::ICU4XWordBreakIteratorUtf8_word_type(this->inner.get()));
+}
+inline bool ICU4XWordBreakIteratorUtf8::is_word_like() const {
+ return capi::ICU4XWordBreakIteratorUtf8_is_word_like(this->inner.get());
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XWordSegmenter.h b/intl/icu_capi/cpp/include/ICU4XWordSegmenter.h
new file mode 100644
index 0000000000..5bef9437e0
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XWordSegmenter.h
@@ -0,0 +1,44 @@
+#ifndef ICU4XWordSegmenter_H
+#define ICU4XWordSegmenter_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XWordSegmenter ICU4XWordSegmenter;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "diplomat_result_box_ICU4XWordSegmenter_ICU4XError.h"
+#include "ICU4XWordBreakIteratorUtf8.h"
+#include "ICU4XWordBreakIteratorUtf16.h"
+#include "ICU4XWordBreakIteratorLatin1.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XWordSegmenter_ICU4XError ICU4XWordSegmenter_create_auto(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XWordSegmenter_ICU4XError ICU4XWordSegmenter_create_lstm(const ICU4XDataProvider* provider);
+
+diplomat_result_box_ICU4XWordSegmenter_ICU4XError ICU4XWordSegmenter_create_dictionary(const ICU4XDataProvider* provider);
+
+ICU4XWordBreakIteratorUtf8* ICU4XWordSegmenter_segment_utf8(const ICU4XWordSegmenter* self, const char* input_data, size_t input_len);
+
+ICU4XWordBreakIteratorUtf16* ICU4XWordSegmenter_segment_utf16(const ICU4XWordSegmenter* self, const uint16_t* input_data, size_t input_len);
+
+ICU4XWordBreakIteratorLatin1* ICU4XWordSegmenter_segment_latin1(const ICU4XWordSegmenter* self, const uint8_t* input_data, size_t input_len);
+void ICU4XWordSegmenter_destroy(ICU4XWordSegmenter* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XWordSegmenter.hpp b/intl/icu_capi/cpp/include/ICU4XWordSegmenter.hpp
new file mode 100644
index 0000000000..49734b5a4a
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XWordSegmenter.hpp
@@ -0,0 +1,148 @@
+#ifndef ICU4XWordSegmenter_HPP
+#define ICU4XWordSegmenter_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XWordSegmenter.h"
+
+class ICU4XDataProvider;
+class ICU4XWordSegmenter;
+#include "ICU4XError.hpp"
+class ICU4XWordBreakIteratorUtf8;
+class ICU4XWordBreakIteratorUtf16;
+class ICU4XWordBreakIteratorLatin1;
+
+/**
+ * A destruction policy for using ICU4XWordSegmenter with std::unique_ptr.
+ */
+struct ICU4XWordSegmenterDeleter {
+ void operator()(capi::ICU4XWordSegmenter* l) const noexcept {
+ capi::ICU4XWordSegmenter_destroy(l);
+ }
+};
+
+/**
+ * An ICU4X word-break segmenter, capable of finding word breakpoints in strings.
+ *
+ * See the [Rust documentation for `WordSegmenter`](https://docs.rs/icu/latest/icu/segmenter/struct.WordSegmenter.html) for more information.
+ */
+class ICU4XWordSegmenter {
+ public:
+
+ /**
+ * Construct an [`ICU4XWordSegmenter`] with automatically selecting the best available LSTM
+ * or dictionary payload data.
+ *
+ * Note: currently, it uses dictionary for Chinese and Japanese, and LSTM for Burmese,
+ * Khmer, Lao, and Thai.
+ *
+ * See the [Rust documentation for `new_auto`](https://docs.rs/icu/latest/icu/segmenter/struct.WordSegmenter.html#method.new_auto) for more information.
+ */
+ static diplomat::result<ICU4XWordSegmenter, ICU4XError> create_auto(const ICU4XDataProvider& provider);
+
+ /**
+ * Construct an [`ICU4XWordSegmenter`] with LSTM payload data for Burmese, Khmer, Lao, and
+ * Thai.
+ *
+ * Warning: [`ICU4XWordSegmenter`] created by this function doesn't handle Chinese or
+ * Japanese.
+ *
+ * See the [Rust documentation for `new_lstm`](https://docs.rs/icu/latest/icu/segmenter/struct.WordSegmenter.html#method.new_lstm) for more information.
+ */
+ static diplomat::result<ICU4XWordSegmenter, ICU4XError> create_lstm(const ICU4XDataProvider& provider);
+
+ /**
+ * Construct an [`ICU4XWordSegmenter`] with dictionary payload data for Chinese, Japanese,
+ * Burmese, Khmer, Lao, and Thai.
+ *
+ * See the [Rust documentation for `new_dictionary`](https://docs.rs/icu/latest/icu/segmenter/struct.WordSegmenter.html#method.new_dictionary) for more information.
+ */
+ static diplomat::result<ICU4XWordSegmenter, ICU4XError> create_dictionary(const ICU4XDataProvider& provider);
+
+ /**
+ * Segments a (potentially ill-formed) UTF-8 string.
+ *
+ * See the [Rust documentation for `segment_utf8`](https://docs.rs/icu/latest/icu/segmenter/struct.WordSegmenter.html#method.segment_utf8) for more information.
+ *
+ * Lifetimes: `this`, `input` must live at least as long as the output.
+ */
+ ICU4XWordBreakIteratorUtf8 segment_utf8(const std::string_view input) const;
+
+ /**
+ * Segments a UTF-16 string.
+ *
+ * See the [Rust documentation for `segment_utf16`](https://docs.rs/icu/latest/icu/segmenter/struct.WordSegmenter.html#method.segment_utf16) for more information.
+ *
+ * Lifetimes: `this`, `input` must live at least as long as the output.
+ */
+ ICU4XWordBreakIteratorUtf16 segment_utf16(const diplomat::span<const uint16_t> input) const;
+
+ /**
+ * Segments a Latin-1 string.
+ *
+ * See the [Rust documentation for `segment_latin1`](https://docs.rs/icu/latest/icu/segmenter/struct.WordSegmenter.html#method.segment_latin1) for more information.
+ *
+ * Lifetimes: `this`, `input` must live at least as long as the output.
+ */
+ ICU4XWordBreakIteratorLatin1 segment_latin1(const diplomat::span<const uint8_t> input) const;
+ inline const capi::ICU4XWordSegmenter* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XWordSegmenter* AsFFIMut() { return this->inner.get(); }
+ inline explicit ICU4XWordSegmenter(capi::ICU4XWordSegmenter* i) : inner(i) {}
+ ICU4XWordSegmenter() = default;
+ ICU4XWordSegmenter(ICU4XWordSegmenter&&) noexcept = default;
+ ICU4XWordSegmenter& operator=(ICU4XWordSegmenter&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XWordSegmenter, ICU4XWordSegmenterDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XWordBreakIteratorUtf8.hpp"
+#include "ICU4XWordBreakIteratorUtf16.hpp"
+#include "ICU4XWordBreakIteratorLatin1.hpp"
+
+inline diplomat::result<ICU4XWordSegmenter, ICU4XError> ICU4XWordSegmenter::create_auto(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XWordSegmenter_create_auto(provider.AsFFI());
+ diplomat::result<ICU4XWordSegmenter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XWordSegmenter>(ICU4XWordSegmenter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XWordSegmenter, ICU4XError> ICU4XWordSegmenter::create_lstm(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XWordSegmenter_create_lstm(provider.AsFFI());
+ diplomat::result<ICU4XWordSegmenter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XWordSegmenter>(ICU4XWordSegmenter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XWordSegmenter, ICU4XError> ICU4XWordSegmenter::create_dictionary(const ICU4XDataProvider& provider) {
+ auto diplomat_result_raw_out_value = capi::ICU4XWordSegmenter_create_dictionary(provider.AsFFI());
+ diplomat::result<ICU4XWordSegmenter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XWordSegmenter>(ICU4XWordSegmenter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline ICU4XWordBreakIteratorUtf8 ICU4XWordSegmenter::segment_utf8(const std::string_view input) const {
+ return ICU4XWordBreakIteratorUtf8(capi::ICU4XWordSegmenter_segment_utf8(this->inner.get(), input.data(), input.size()));
+}
+inline ICU4XWordBreakIteratorUtf16 ICU4XWordSegmenter::segment_utf16(const diplomat::span<const uint16_t> input) const {
+ return ICU4XWordBreakIteratorUtf16(capi::ICU4XWordSegmenter_segment_utf16(this->inner.get(), input.data(), input.size()));
+}
+inline ICU4XWordBreakIteratorLatin1 ICU4XWordSegmenter::segment_latin1(const diplomat::span<const uint8_t> input) const {
+ return ICU4XWordBreakIteratorLatin1(capi::ICU4XWordSegmenter_segment_latin1(this->inner.get(), input.data(), input.size()));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XZonedDateTimeFormatter.h b/intl/icu_capi/cpp/include/ICU4XZonedDateTimeFormatter.h
new file mode 100644
index 0000000000..77b228a5a2
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XZonedDateTimeFormatter.h
@@ -0,0 +1,45 @@
+#ifndef ICU4XZonedDateTimeFormatter_H
+#define ICU4XZonedDateTimeFormatter_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+#endif
+
+typedef struct ICU4XZonedDateTimeFormatter ICU4XZonedDateTimeFormatter;
+#ifdef __cplusplus
+} // namespace capi
+#endif
+#include "ICU4XDataProvider.h"
+#include "ICU4XLocale.h"
+#include "ICU4XDateLength.h"
+#include "ICU4XTimeLength.h"
+#include "diplomat_result_box_ICU4XZonedDateTimeFormatter_ICU4XError.h"
+#include "ICU4XIsoTimeZoneOptions.h"
+#include "ICU4XDateTime.h"
+#include "ICU4XCustomTimeZone.h"
+#include "diplomat_result_void_ICU4XError.h"
+#include "ICU4XIsoDateTime.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+diplomat_result_box_ICU4XZonedDateTimeFormatter_ICU4XError ICU4XZonedDateTimeFormatter_create_with_lengths(const ICU4XDataProvider* provider, const ICU4XLocale* locale, ICU4XDateLength date_length, ICU4XTimeLength time_length);
+
+diplomat_result_box_ICU4XZonedDateTimeFormatter_ICU4XError ICU4XZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback(const ICU4XDataProvider* provider, const ICU4XLocale* locale, ICU4XDateLength date_length, ICU4XTimeLength time_length, ICU4XIsoTimeZoneOptions zone_options);
+
+diplomat_result_void_ICU4XError ICU4XZonedDateTimeFormatter_format_datetime_with_custom_time_zone(const ICU4XZonedDateTimeFormatter* self, const ICU4XDateTime* datetime, const ICU4XCustomTimeZone* time_zone, DiplomatWriteable* write);
+
+diplomat_result_void_ICU4XError ICU4XZonedDateTimeFormatter_format_iso_datetime_with_custom_time_zone(const ICU4XZonedDateTimeFormatter* self, const ICU4XIsoDateTime* datetime, const ICU4XCustomTimeZone* time_zone, DiplomatWriteable* write);
+void ICU4XZonedDateTimeFormatter_destroy(ICU4XZonedDateTimeFormatter* self);
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/ICU4XZonedDateTimeFormatter.hpp b/intl/icu_capi/cpp/include/ICU4XZonedDateTimeFormatter.hpp
new file mode 100644
index 0000000000..ac0dba0b1e
--- /dev/null
+++ b/intl/icu_capi/cpp/include/ICU4XZonedDateTimeFormatter.hpp
@@ -0,0 +1,173 @@
+#ifndef ICU4XZonedDateTimeFormatter_HPP
+#define ICU4XZonedDateTimeFormatter_HPP
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <algorithm>
+#include <memory>
+#include <variant>
+#include <optional>
+#include "diplomat_runtime.hpp"
+
+#include "ICU4XZonedDateTimeFormatter.h"
+
+class ICU4XDataProvider;
+class ICU4XLocale;
+#include "ICU4XDateLength.hpp"
+#include "ICU4XTimeLength.hpp"
+class ICU4XZonedDateTimeFormatter;
+#include "ICU4XError.hpp"
+struct ICU4XIsoTimeZoneOptions;
+class ICU4XDateTime;
+class ICU4XCustomTimeZone;
+class ICU4XIsoDateTime;
+
+/**
+ * A destruction policy for using ICU4XZonedDateTimeFormatter with std::unique_ptr.
+ */
+struct ICU4XZonedDateTimeFormatterDeleter {
+ void operator()(capi::ICU4XZonedDateTimeFormatter* l) const noexcept {
+ capi::ICU4XZonedDateTimeFormatter_destroy(l);
+ }
+};
+
+/**
+ * An object capable of formatting a date time with time zone to a string.
+ *
+ * See the [Rust documentation for `ZonedDateTimeFormatter`](https://docs.rs/icu/latest/icu/datetime/struct.ZonedDateTimeFormatter.html) for more information.
+ */
+class ICU4XZonedDateTimeFormatter {
+ public:
+
+ /**
+ * Creates a new [`ICU4XZonedDateTimeFormatter`] from locale data.
+ *
+ * This function has `date_length` and `time_length` arguments and uses default options
+ * for the time zone.
+ *
+ * See the [Rust documentation for `try_new`](https://docs.rs/icu/latest/icu/datetime/struct.ZonedDateTimeFormatter.html#method.try_new) for more information.
+ */
+ static diplomat::result<ICU4XZonedDateTimeFormatter, ICU4XError> create_with_lengths(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength date_length, ICU4XTimeLength time_length);
+
+ /**
+ * Creates a new [`ICU4XZonedDateTimeFormatter`] from locale data.
+ *
+ * This function has `date_length` and `time_length` arguments and uses an ISO-8601 style
+ * fallback for the time zone with the given configurations.
+ *
+ * See the [Rust documentation for `try_new`](https://docs.rs/icu/latest/icu/datetime/struct.ZonedDateTimeFormatter.html#method.try_new) for more information.
+ */
+ static diplomat::result<ICU4XZonedDateTimeFormatter, ICU4XError> create_with_lengths_and_iso_8601_time_zone_fallback(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength date_length, ICU4XTimeLength time_length, ICU4XIsoTimeZoneOptions zone_options);
+
+ /**
+ * Formats a [`ICU4XDateTime`] and [`ICU4XCustomTimeZone`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.ZonedDateTimeFormatter.html#method.format) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> format_datetime_with_custom_time_zone_to_writeable(const ICU4XDateTime& datetime, const ICU4XCustomTimeZone& time_zone, W& write) const;
+
+ /**
+ * Formats a [`ICU4XDateTime`] and [`ICU4XCustomTimeZone`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.ZonedDateTimeFormatter.html#method.format) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> format_datetime_with_custom_time_zone(const ICU4XDateTime& datetime, const ICU4XCustomTimeZone& time_zone) const;
+
+ /**
+ * Formats a [`ICU4XIsoDateTime`] and [`ICU4XCustomTimeZone`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.ZonedDateTimeFormatter.html#method.format) for more information.
+ */
+ template<typename W> diplomat::result<std::monostate, ICU4XError> format_iso_datetime_with_custom_time_zone_to_writeable(const ICU4XIsoDateTime& datetime, const ICU4XCustomTimeZone& time_zone, W& write) const;
+
+ /**
+ * Formats a [`ICU4XIsoDateTime`] and [`ICU4XCustomTimeZone`] to a string.
+ *
+ * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/datetime/struct.ZonedDateTimeFormatter.html#method.format) for more information.
+ */
+ diplomat::result<std::string, ICU4XError> format_iso_datetime_with_custom_time_zone(const ICU4XIsoDateTime& datetime, const ICU4XCustomTimeZone& time_zone) const;
+ inline const capi::ICU4XZonedDateTimeFormatter* AsFFI() const { return this->inner.get(); }
+ inline capi::ICU4XZonedDateTimeFormatter* AsFFIMut() { return this->inner.get(); }
+ inline ICU4XZonedDateTimeFormatter(capi::ICU4XZonedDateTimeFormatter* i) : inner(i) {}
+ ICU4XZonedDateTimeFormatter() = default;
+ ICU4XZonedDateTimeFormatter(ICU4XZonedDateTimeFormatter&&) noexcept = default;
+ ICU4XZonedDateTimeFormatter& operator=(ICU4XZonedDateTimeFormatter&& other) noexcept = default;
+ private:
+ std::unique_ptr<capi::ICU4XZonedDateTimeFormatter, ICU4XZonedDateTimeFormatterDeleter> inner;
+};
+
+#include "ICU4XDataProvider.hpp"
+#include "ICU4XLocale.hpp"
+#include "ICU4XIsoTimeZoneOptions.hpp"
+#include "ICU4XDateTime.hpp"
+#include "ICU4XCustomTimeZone.hpp"
+#include "ICU4XIsoDateTime.hpp"
+
+inline diplomat::result<ICU4XZonedDateTimeFormatter, ICU4XError> ICU4XZonedDateTimeFormatter::create_with_lengths(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength date_length, ICU4XTimeLength time_length) {
+ auto diplomat_result_raw_out_value = capi::ICU4XZonedDateTimeFormatter_create_with_lengths(provider.AsFFI(), locale.AsFFI(), static_cast<capi::ICU4XDateLength>(date_length), static_cast<capi::ICU4XTimeLength>(time_length));
+ diplomat::result<ICU4XZonedDateTimeFormatter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XZonedDateTimeFormatter>(ICU4XZonedDateTimeFormatter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<ICU4XZonedDateTimeFormatter, ICU4XError> ICU4XZonedDateTimeFormatter::create_with_lengths_and_iso_8601_time_zone_fallback(const ICU4XDataProvider& provider, const ICU4XLocale& locale, ICU4XDateLength date_length, ICU4XTimeLength time_length, ICU4XIsoTimeZoneOptions zone_options) {
+ ICU4XIsoTimeZoneOptions diplomat_wrapped_struct_zone_options = zone_options;
+ auto diplomat_result_raw_out_value = capi::ICU4XZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback(provider.AsFFI(), locale.AsFFI(), static_cast<capi::ICU4XDateLength>(date_length), static_cast<capi::ICU4XTimeLength>(time_length), capi::ICU4XIsoTimeZoneOptions{ .format = static_cast<capi::ICU4XIsoTimeZoneFormat>(diplomat_wrapped_struct_zone_options.format), .minutes = static_cast<capi::ICU4XIsoTimeZoneMinuteDisplay>(diplomat_wrapped_struct_zone_options.minutes), .seconds = static_cast<capi::ICU4XIsoTimeZoneSecondDisplay>(diplomat_wrapped_struct_zone_options.seconds) });
+ diplomat::result<ICU4XZonedDateTimeFormatter, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok<ICU4XZonedDateTimeFormatter>(ICU4XZonedDateTimeFormatter(diplomat_result_raw_out_value.ok));
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XZonedDateTimeFormatter::format_datetime_with_custom_time_zone_to_writeable(const ICU4XDateTime& datetime, const ICU4XCustomTimeZone& time_zone, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XZonedDateTimeFormatter_format_datetime_with_custom_time_zone(this->inner.get(), datetime.AsFFI(), time_zone.AsFFI(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XZonedDateTimeFormatter::format_datetime_with_custom_time_zone(const ICU4XDateTime& datetime, const ICU4XCustomTimeZone& time_zone) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XZonedDateTimeFormatter_format_datetime_with_custom_time_zone(this->inner.get(), datetime.AsFFI(), time_zone.AsFFI(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+template<typename W> inline diplomat::result<std::monostate, ICU4XError> ICU4XZonedDateTimeFormatter::format_iso_datetime_with_custom_time_zone_to_writeable(const ICU4XIsoDateTime& datetime, const ICU4XCustomTimeZone& time_zone, W& write) const {
+ capi::DiplomatWriteable write_writer = diplomat::WriteableTrait<W>::Construct(write);
+ auto diplomat_result_raw_out_value = capi::ICU4XZonedDateTimeFormatter_format_iso_datetime_with_custom_time_zone(this->inner.get(), datetime.AsFFI(), time_zone.AsFFI(), &write_writer);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value;
+}
+inline diplomat::result<std::string, ICU4XError> ICU4XZonedDateTimeFormatter::format_iso_datetime_with_custom_time_zone(const ICU4XIsoDateTime& datetime, const ICU4XCustomTimeZone& time_zone) const {
+ std::string diplomat_writeable_string;
+ capi::DiplomatWriteable diplomat_writeable_out = diplomat::WriteableFromString(diplomat_writeable_string);
+ auto diplomat_result_raw_out_value = capi::ICU4XZonedDateTimeFormatter_format_iso_datetime_with_custom_time_zone(this->inner.get(), datetime.AsFFI(), time_zone.AsFFI(), &diplomat_writeable_out);
+ diplomat::result<std::monostate, ICU4XError> diplomat_result_out_value;
+ if (diplomat_result_raw_out_value.is_ok) {
+ diplomat_result_out_value = diplomat::Ok(std::monostate());
+ } else {
+ diplomat_result_out_value = diplomat::Err<ICU4XError>(static_cast<ICU4XError>(diplomat_result_raw_out_value.err));
+ }
+ return diplomat_result_out_value.replace_ok(std::move(diplomat_writeable_string));
+}
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_ICU4XAnyCalendarKind_void.h b/intl/icu_capi/cpp/include/diplomat_result_ICU4XAnyCalendarKind_void.h
new file mode 100644
index 0000000000..f67f66ed4d
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_ICU4XAnyCalendarKind_void.h
@@ -0,0 +1,24 @@
+#ifndef diplomat_result_ICU4XAnyCalendarKind_void_H
+#define diplomat_result_ICU4XAnyCalendarKind_void_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#include "ICU4XAnyCalendarKind.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_ICU4XAnyCalendarKind_void {
+ union {
+ ICU4XAnyCalendarKind ok;
+ };
+ bool is_ok;
+} diplomat_result_ICU4XAnyCalendarKind_void;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_ICU4XPluralCategory_void.h b/intl/icu_capi/cpp/include/diplomat_result_ICU4XPluralCategory_void.h
new file mode 100644
index 0000000000..b56ef60acb
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_ICU4XPluralCategory_void.h
@@ -0,0 +1,24 @@
+#ifndef diplomat_result_ICU4XPluralCategory_void_H
+#define diplomat_result_ICU4XPluralCategory_void_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#include "ICU4XPluralCategory.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_ICU4XPluralCategory_void {
+ union {
+ ICU4XPluralCategory ok;
+ };
+ bool is_ok;
+} diplomat_result_ICU4XPluralCategory_void;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_ICU4XWeekOf_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_ICU4XWeekOf_ICU4XError.h
new file mode 100644
index 0000000000..4dee8f941f
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_ICU4XWeekOf_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_ICU4XWeekOf_ICU4XError_H
+#define diplomat_result_ICU4XWeekOf_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#include "ICU4XWeekOf.h"
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_ICU4XWeekOf_ICU4XError {
+ union {
+ ICU4XWeekOf ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_ICU4XWeekOf_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_bool_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_bool_ICU4XError.h
new file mode 100644
index 0000000000..015930214d
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_bool_ICU4XError.h
@@ -0,0 +1,25 @@
+#ifndef diplomat_result_bool_ICU4XError_H
+#define diplomat_result_bool_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_bool_ICU4XError {
+ union {
+ bool ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_bool_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XBcp47ToIanaMapper_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XBcp47ToIanaMapper_ICU4XError.h
new file mode 100644
index 0000000000..0d18fe4076
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XBcp47ToIanaMapper_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XBcp47ToIanaMapper_ICU4XError_H
+#define diplomat_result_box_ICU4XBcp47ToIanaMapper_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XBcp47ToIanaMapper ICU4XBcp47ToIanaMapper;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XBcp47ToIanaMapper_ICU4XError {
+ union {
+ ICU4XBcp47ToIanaMapper* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XBcp47ToIanaMapper_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XBidi_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XBidi_ICU4XError.h
new file mode 100644
index 0000000000..f1cd7ca6a3
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XBidi_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XBidi_ICU4XError_H
+#define diplomat_result_box_ICU4XBidi_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XBidi ICU4XBidi;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XBidi_ICU4XError {
+ union {
+ ICU4XBidi* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XBidi_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCalendar_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCalendar_ICU4XError.h
new file mode 100644
index 0000000000..bffa22c6b0
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCalendar_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XCalendar_ICU4XError_H
+#define diplomat_result_box_ICU4XCalendar_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XCalendar ICU4XCalendar;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XCalendar_ICU4XError {
+ union {
+ ICU4XCalendar* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XCalendar_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCanonicalCombiningClassMap_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCanonicalCombiningClassMap_ICU4XError.h
new file mode 100644
index 0000000000..2c05f79671
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCanonicalCombiningClassMap_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XCanonicalCombiningClassMap_ICU4XError_H
+#define diplomat_result_box_ICU4XCanonicalCombiningClassMap_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XCanonicalCombiningClassMap ICU4XCanonicalCombiningClassMap;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XCanonicalCombiningClassMap_ICU4XError {
+ union {
+ ICU4XCanonicalCombiningClassMap* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XCanonicalCombiningClassMap_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCanonicalComposition_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCanonicalComposition_ICU4XError.h
new file mode 100644
index 0000000000..66d0386ff8
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCanonicalComposition_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XCanonicalComposition_ICU4XError_H
+#define diplomat_result_box_ICU4XCanonicalComposition_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XCanonicalComposition ICU4XCanonicalComposition;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XCanonicalComposition_ICU4XError {
+ union {
+ ICU4XCanonicalComposition* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XCanonicalComposition_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCanonicalDecomposition_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCanonicalDecomposition_ICU4XError.h
new file mode 100644
index 0000000000..cf02637fef
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCanonicalDecomposition_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XCanonicalDecomposition_ICU4XError_H
+#define diplomat_result_box_ICU4XCanonicalDecomposition_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XCanonicalDecomposition ICU4XCanonicalDecomposition;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XCanonicalDecomposition_ICU4XError {
+ union {
+ ICU4XCanonicalDecomposition* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XCanonicalDecomposition_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCaseMapCloser_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCaseMapCloser_ICU4XError.h
new file mode 100644
index 0000000000..7b2a957399
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCaseMapCloser_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XCaseMapCloser_ICU4XError_H
+#define diplomat_result_box_ICU4XCaseMapCloser_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XCaseMapCloser ICU4XCaseMapCloser;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XCaseMapCloser_ICU4XError {
+ union {
+ ICU4XCaseMapCloser* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XCaseMapCloser_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCaseMapper_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCaseMapper_ICU4XError.h
new file mode 100644
index 0000000000..c6e03a748c
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCaseMapper_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XCaseMapper_ICU4XError_H
+#define diplomat_result_box_ICU4XCaseMapper_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XCaseMapper ICU4XCaseMapper;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XCaseMapper_ICU4XError {
+ union {
+ ICU4XCaseMapper* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XCaseMapper_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCodePointMapData16_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCodePointMapData16_ICU4XError.h
new file mode 100644
index 0000000000..fbe11daad2
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCodePointMapData16_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XCodePointMapData16_ICU4XError_H
+#define diplomat_result_box_ICU4XCodePointMapData16_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XCodePointMapData16 ICU4XCodePointMapData16;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XCodePointMapData16_ICU4XError {
+ union {
+ ICU4XCodePointMapData16* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XCodePointMapData16_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCodePointMapData8_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCodePointMapData8_ICU4XError.h
new file mode 100644
index 0000000000..2e203279e3
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCodePointMapData8_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XCodePointMapData8_ICU4XError_H
+#define diplomat_result_box_ICU4XCodePointMapData8_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XCodePointMapData8 ICU4XCodePointMapData8;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XCodePointMapData8_ICU4XError {
+ union {
+ ICU4XCodePointMapData8* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XCodePointMapData8_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCodePointSetData_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCodePointSetData_ICU4XError.h
new file mode 100644
index 0000000000..e70e39ba61
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCodePointSetData_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XCodePointSetData_ICU4XError_H
+#define diplomat_result_box_ICU4XCodePointSetData_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XCodePointSetData ICU4XCodePointSetData;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XCodePointSetData_ICU4XError {
+ union {
+ ICU4XCodePointSetData* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XCodePointSetData_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCollator_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCollator_ICU4XError.h
new file mode 100644
index 0000000000..abb5c8a598
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCollator_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XCollator_ICU4XError_H
+#define diplomat_result_box_ICU4XCollator_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XCollator ICU4XCollator;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XCollator_ICU4XError {
+ union {
+ ICU4XCollator* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XCollator_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XComposingNormalizer_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XComposingNormalizer_ICU4XError.h
new file mode 100644
index 0000000000..d0c381ef03
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XComposingNormalizer_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XComposingNormalizer_ICU4XError_H
+#define diplomat_result_box_ICU4XComposingNormalizer_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XComposingNormalizer ICU4XComposingNormalizer;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XComposingNormalizer_ICU4XError {
+ union {
+ ICU4XComposingNormalizer* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XComposingNormalizer_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCustomTimeZone_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCustomTimeZone_ICU4XError.h
new file mode 100644
index 0000000000..4709a89871
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XCustomTimeZone_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XCustomTimeZone_ICU4XError_H
+#define diplomat_result_box_ICU4XCustomTimeZone_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XCustomTimeZone ICU4XCustomTimeZone;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XCustomTimeZone_ICU4XError {
+ union {
+ ICU4XCustomTimeZone* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XCustomTimeZone_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDataProvider_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDataProvider_ICU4XError.h
new file mode 100644
index 0000000000..a5be844183
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDataProvider_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XDataProvider_ICU4XError_H
+#define diplomat_result_box_ICU4XDataProvider_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XDataProvider ICU4XDataProvider;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XDataProvider_ICU4XError {
+ union {
+ ICU4XDataProvider* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XDataProvider_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDataStruct_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDataStruct_ICU4XError.h
new file mode 100644
index 0000000000..d8c1d33e21
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDataStruct_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XDataStruct_ICU4XError_H
+#define diplomat_result_box_ICU4XDataStruct_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XDataStruct ICU4XDataStruct;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XDataStruct_ICU4XError {
+ union {
+ ICU4XDataStruct* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XDataStruct_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDateFormatter_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDateFormatter_ICU4XError.h
new file mode 100644
index 0000000000..b6d9671434
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDateFormatter_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XDateFormatter_ICU4XError_H
+#define diplomat_result_box_ICU4XDateFormatter_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XDateFormatter ICU4XDateFormatter;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XDateFormatter_ICU4XError {
+ union {
+ ICU4XDateFormatter* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XDateFormatter_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDateTimeFormatter_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDateTimeFormatter_ICU4XError.h
new file mode 100644
index 0000000000..855e74fe6c
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDateTimeFormatter_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XDateTimeFormatter_ICU4XError_H
+#define diplomat_result_box_ICU4XDateTimeFormatter_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XDateTimeFormatter ICU4XDateTimeFormatter;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XDateTimeFormatter_ICU4XError {
+ union {
+ ICU4XDateTimeFormatter* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XDateTimeFormatter_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDateTime_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDateTime_ICU4XError.h
new file mode 100644
index 0000000000..2d4cb2fe48
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDateTime_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XDateTime_ICU4XError_H
+#define diplomat_result_box_ICU4XDateTime_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XDateTime ICU4XDateTime;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XDateTime_ICU4XError {
+ union {
+ ICU4XDateTime* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XDateTime_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDate_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDate_ICU4XError.h
new file mode 100644
index 0000000000..30461b264a
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDate_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XDate_ICU4XError_H
+#define diplomat_result_box_ICU4XDate_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XDate ICU4XDate;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XDate_ICU4XError {
+ union {
+ ICU4XDate* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XDate_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDecomposingNormalizer_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDecomposingNormalizer_ICU4XError.h
new file mode 100644
index 0000000000..c51d9907bc
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XDecomposingNormalizer_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XDecomposingNormalizer_ICU4XError_H
+#define diplomat_result_box_ICU4XDecomposingNormalizer_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XDecomposingNormalizer ICU4XDecomposingNormalizer;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XDecomposingNormalizer_ICU4XError {
+ union {
+ ICU4XDecomposingNormalizer* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XDecomposingNormalizer_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XFixedDecimalFormatter_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XFixedDecimalFormatter_ICU4XError.h
new file mode 100644
index 0000000000..8ee245a093
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XFixedDecimalFormatter_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XFixedDecimalFormatter_ICU4XError_H
+#define diplomat_result_box_ICU4XFixedDecimalFormatter_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XFixedDecimalFormatter ICU4XFixedDecimalFormatter;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XFixedDecimalFormatter_ICU4XError {
+ union {
+ ICU4XFixedDecimalFormatter* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XFixedDecimalFormatter_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XFixedDecimal_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XFixedDecimal_ICU4XError.h
new file mode 100644
index 0000000000..f45cd78fb9
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XFixedDecimal_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XFixedDecimal_ICU4XError_H
+#define diplomat_result_box_ICU4XFixedDecimal_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XFixedDecimal ICU4XFixedDecimal;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XFixedDecimal_ICU4XError {
+ union {
+ ICU4XFixedDecimal* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XFixedDecimal_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XGeneralCategoryNameToMaskMapper_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XGeneralCategoryNameToMaskMapper_ICU4XError.h
new file mode 100644
index 0000000000..98ff137a9a
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XGeneralCategoryNameToMaskMapper_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XGeneralCategoryNameToMaskMapper_ICU4XError_H
+#define diplomat_result_box_ICU4XGeneralCategoryNameToMaskMapper_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XGeneralCategoryNameToMaskMapper ICU4XGeneralCategoryNameToMaskMapper;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XGeneralCategoryNameToMaskMapper_ICU4XError {
+ union {
+ ICU4XGeneralCategoryNameToMaskMapper* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XGeneralCategoryNameToMaskMapper_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XGraphemeClusterSegmenter_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XGraphemeClusterSegmenter_ICU4XError.h
new file mode 100644
index 0000000000..d560b381a5
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XGraphemeClusterSegmenter_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XGraphemeClusterSegmenter_ICU4XError_H
+#define diplomat_result_box_ICU4XGraphemeClusterSegmenter_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XGraphemeClusterSegmenter ICU4XGraphemeClusterSegmenter;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XGraphemeClusterSegmenter_ICU4XError {
+ union {
+ ICU4XGraphemeClusterSegmenter* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XGraphemeClusterSegmenter_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XGregorianDateFormatter_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XGregorianDateFormatter_ICU4XError.h
new file mode 100644
index 0000000000..86b13be912
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XGregorianDateFormatter_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XGregorianDateFormatter_ICU4XError_H
+#define diplomat_result_box_ICU4XGregorianDateFormatter_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XGregorianDateFormatter ICU4XGregorianDateFormatter;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XGregorianDateFormatter_ICU4XError {
+ union {
+ ICU4XGregorianDateFormatter* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XGregorianDateFormatter_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XGregorianDateTimeFormatter_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XGregorianDateTimeFormatter_ICU4XError.h
new file mode 100644
index 0000000000..4393d9ffb0
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XGregorianDateTimeFormatter_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XGregorianDateTimeFormatter_ICU4XError_H
+#define diplomat_result_box_ICU4XGregorianDateTimeFormatter_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XGregorianDateTimeFormatter ICU4XGregorianDateTimeFormatter;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XGregorianDateTimeFormatter_ICU4XError {
+ union {
+ ICU4XGregorianDateTimeFormatter* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XGregorianDateTimeFormatter_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XGregorianZonedDateTimeFormatter_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XGregorianZonedDateTimeFormatter_ICU4XError.h
new file mode 100644
index 0000000000..270b38ba94
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XGregorianZonedDateTimeFormatter_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XGregorianZonedDateTimeFormatter_ICU4XError_H
+#define diplomat_result_box_ICU4XGregorianZonedDateTimeFormatter_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XGregorianZonedDateTimeFormatter ICU4XGregorianZonedDateTimeFormatter;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XGregorianZonedDateTimeFormatter_ICU4XError {
+ union {
+ ICU4XGregorianZonedDateTimeFormatter* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XGregorianZonedDateTimeFormatter_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XIanaToBcp47Mapper_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XIanaToBcp47Mapper_ICU4XError.h
new file mode 100644
index 0000000000..2e05730b0b
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XIanaToBcp47Mapper_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XIanaToBcp47Mapper_ICU4XError_H
+#define diplomat_result_box_ICU4XIanaToBcp47Mapper_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XIanaToBcp47Mapper ICU4XIanaToBcp47Mapper;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XIanaToBcp47Mapper_ICU4XError {
+ union {
+ ICU4XIanaToBcp47Mapper* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XIanaToBcp47Mapper_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XIsoDateTime_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XIsoDateTime_ICU4XError.h
new file mode 100644
index 0000000000..8a55b47a68
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XIsoDateTime_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XIsoDateTime_ICU4XError_H
+#define diplomat_result_box_ICU4XIsoDateTime_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XIsoDateTime ICU4XIsoDateTime;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XIsoDateTime_ICU4XError {
+ union {
+ ICU4XIsoDateTime* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XIsoDateTime_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XIsoDate_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XIsoDate_ICU4XError.h
new file mode 100644
index 0000000000..8528d73b07
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XIsoDate_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XIsoDate_ICU4XError_H
+#define diplomat_result_box_ICU4XIsoDate_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XIsoDate ICU4XIsoDate;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XIsoDate_ICU4XError {
+ union {
+ ICU4XIsoDate* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XIsoDate_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLineSegmenter_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLineSegmenter_ICU4XError.h
new file mode 100644
index 0000000000..004d3494ae
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLineSegmenter_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XLineSegmenter_ICU4XError_H
+#define diplomat_result_box_ICU4XLineSegmenter_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XLineSegmenter ICU4XLineSegmenter;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XLineSegmenter_ICU4XError {
+ union {
+ ICU4XLineSegmenter* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XLineSegmenter_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XListFormatter_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XListFormatter_ICU4XError.h
new file mode 100644
index 0000000000..df40aa2dae
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XListFormatter_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XListFormatter_ICU4XError_H
+#define diplomat_result_box_ICU4XListFormatter_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XListFormatter ICU4XListFormatter;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XListFormatter_ICU4XError {
+ union {
+ ICU4XListFormatter* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XListFormatter_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleCanonicalizer_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleCanonicalizer_ICU4XError.h
new file mode 100644
index 0000000000..a49bb700ca
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleCanonicalizer_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XLocaleCanonicalizer_ICU4XError_H
+#define diplomat_result_box_ICU4XLocaleCanonicalizer_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XLocaleCanonicalizer ICU4XLocaleCanonicalizer;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XLocaleCanonicalizer_ICU4XError {
+ union {
+ ICU4XLocaleCanonicalizer* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XLocaleCanonicalizer_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleDirectionality_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleDirectionality_ICU4XError.h
new file mode 100644
index 0000000000..740f9d99fa
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleDirectionality_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XLocaleDirectionality_ICU4XError_H
+#define diplomat_result_box_ICU4XLocaleDirectionality_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XLocaleDirectionality ICU4XLocaleDirectionality;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XLocaleDirectionality_ICU4XError {
+ union {
+ ICU4XLocaleDirectionality* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XLocaleDirectionality_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleDisplayNamesFormatter_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleDisplayNamesFormatter_ICU4XError.h
new file mode 100644
index 0000000000..6b0f09b2a2
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleDisplayNamesFormatter_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XLocaleDisplayNamesFormatter_ICU4XError_H
+#define diplomat_result_box_ICU4XLocaleDisplayNamesFormatter_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XLocaleDisplayNamesFormatter ICU4XLocaleDisplayNamesFormatter;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XLocaleDisplayNamesFormatter_ICU4XError {
+ union {
+ ICU4XLocaleDisplayNamesFormatter* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XLocaleDisplayNamesFormatter_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleExpander_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleExpander_ICU4XError.h
new file mode 100644
index 0000000000..c7275e699c
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleExpander_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XLocaleExpander_ICU4XError_H
+#define diplomat_result_box_ICU4XLocaleExpander_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XLocaleExpander ICU4XLocaleExpander;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XLocaleExpander_ICU4XError {
+ union {
+ ICU4XLocaleExpander* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XLocaleExpander_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleFallbackerWithConfig_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleFallbackerWithConfig_ICU4XError.h
new file mode 100644
index 0000000000..0dc002718e
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleFallbackerWithConfig_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XLocaleFallbackerWithConfig_ICU4XError_H
+#define diplomat_result_box_ICU4XLocaleFallbackerWithConfig_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XLocaleFallbackerWithConfig ICU4XLocaleFallbackerWithConfig;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XLocaleFallbackerWithConfig_ICU4XError {
+ union {
+ ICU4XLocaleFallbackerWithConfig* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XLocaleFallbackerWithConfig_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleFallbacker_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleFallbacker_ICU4XError.h
new file mode 100644
index 0000000000..3427bf3e3a
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocaleFallbacker_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XLocaleFallbacker_ICU4XError_H
+#define diplomat_result_box_ICU4XLocaleFallbacker_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XLocaleFallbacker ICU4XLocaleFallbacker;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XLocaleFallbacker_ICU4XError {
+ union {
+ ICU4XLocaleFallbacker* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XLocaleFallbacker_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocale_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocale_ICU4XError.h
new file mode 100644
index 0000000000..f5720b612f
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XLocale_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XLocale_ICU4XError_H
+#define diplomat_result_box_ICU4XLocale_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XLocale ICU4XLocale;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XLocale_ICU4XError {
+ union {
+ ICU4XLocale* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XLocale_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XMetazoneCalculator_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XMetazoneCalculator_ICU4XError.h
new file mode 100644
index 0000000000..ebd519e0b5
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XMetazoneCalculator_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XMetazoneCalculator_ICU4XError_H
+#define diplomat_result_box_ICU4XMetazoneCalculator_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XMetazoneCalculator ICU4XMetazoneCalculator;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XMetazoneCalculator_ICU4XError {
+ union {
+ ICU4XMetazoneCalculator* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XMetazoneCalculator_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XPluralOperands_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XPluralOperands_ICU4XError.h
new file mode 100644
index 0000000000..7c068ba4b8
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XPluralOperands_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XPluralOperands_ICU4XError_H
+#define diplomat_result_box_ICU4XPluralOperands_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XPluralOperands ICU4XPluralOperands;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XPluralOperands_ICU4XError {
+ union {
+ ICU4XPluralOperands* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XPluralOperands_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XPluralRules_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XPluralRules_ICU4XError.h
new file mode 100644
index 0000000000..4fa522b850
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XPluralRules_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XPluralRules_ICU4XError_H
+#define diplomat_result_box_ICU4XPluralRules_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XPluralRules ICU4XPluralRules;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XPluralRules_ICU4XError {
+ union {
+ ICU4XPluralRules* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XPluralRules_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XPropertyValueNameToEnumMapper_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XPropertyValueNameToEnumMapper_ICU4XError.h
new file mode 100644
index 0000000000..047ef959b0
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XPropertyValueNameToEnumMapper_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XPropertyValueNameToEnumMapper_ICU4XError_H
+#define diplomat_result_box_ICU4XPropertyValueNameToEnumMapper_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XPropertyValueNameToEnumMapper ICU4XPropertyValueNameToEnumMapper;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XPropertyValueNameToEnumMapper_ICU4XError {
+ union {
+ ICU4XPropertyValueNameToEnumMapper* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XPropertyValueNameToEnumMapper_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XRegionDisplayNames_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XRegionDisplayNames_ICU4XError.h
new file mode 100644
index 0000000000..fcf7e88a23
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XRegionDisplayNames_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XRegionDisplayNames_ICU4XError_H
+#define diplomat_result_box_ICU4XRegionDisplayNames_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XRegionDisplayNames ICU4XRegionDisplayNames;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XRegionDisplayNames_ICU4XError {
+ union {
+ ICU4XRegionDisplayNames* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XRegionDisplayNames_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XScriptWithExtensions_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XScriptWithExtensions_ICU4XError.h
new file mode 100644
index 0000000000..bffd6161aa
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XScriptWithExtensions_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XScriptWithExtensions_ICU4XError_H
+#define diplomat_result_box_ICU4XScriptWithExtensions_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XScriptWithExtensions ICU4XScriptWithExtensions;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XScriptWithExtensions_ICU4XError {
+ union {
+ ICU4XScriptWithExtensions* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XScriptWithExtensions_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XSentenceSegmenter_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XSentenceSegmenter_ICU4XError.h
new file mode 100644
index 0000000000..a8ab968fa9
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XSentenceSegmenter_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XSentenceSegmenter_ICU4XError_H
+#define diplomat_result_box_ICU4XSentenceSegmenter_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XSentenceSegmenter ICU4XSentenceSegmenter;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XSentenceSegmenter_ICU4XError {
+ union {
+ ICU4XSentenceSegmenter* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XSentenceSegmenter_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XTimeFormatter_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XTimeFormatter_ICU4XError.h
new file mode 100644
index 0000000000..0e63cbbc2a
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XTimeFormatter_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XTimeFormatter_ICU4XError_H
+#define diplomat_result_box_ICU4XTimeFormatter_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XTimeFormatter ICU4XTimeFormatter;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XTimeFormatter_ICU4XError {
+ union {
+ ICU4XTimeFormatter* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XTimeFormatter_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XTimeZoneFormatter_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XTimeZoneFormatter_ICU4XError.h
new file mode 100644
index 0000000000..5f4851051e
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XTimeZoneFormatter_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XTimeZoneFormatter_ICU4XError_H
+#define diplomat_result_box_ICU4XTimeZoneFormatter_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XTimeZoneFormatter ICU4XTimeZoneFormatter;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XTimeZoneFormatter_ICU4XError {
+ union {
+ ICU4XTimeZoneFormatter* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XTimeZoneFormatter_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XTime_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XTime_ICU4XError.h
new file mode 100644
index 0000000000..3e58b1e4da
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XTime_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XTime_ICU4XError_H
+#define diplomat_result_box_ICU4XTime_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XTime ICU4XTime;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XTime_ICU4XError {
+ union {
+ ICU4XTime* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XTime_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XTitlecaseMapper_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XTitlecaseMapper_ICU4XError.h
new file mode 100644
index 0000000000..f8b017cfd4
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XTitlecaseMapper_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XTitlecaseMapper_ICU4XError_H
+#define diplomat_result_box_ICU4XTitlecaseMapper_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XTitlecaseMapper ICU4XTitlecaseMapper;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XTitlecaseMapper_ICU4XError {
+ union {
+ ICU4XTitlecaseMapper* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XTitlecaseMapper_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XUnicodeSetData_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XUnicodeSetData_ICU4XError.h
new file mode 100644
index 0000000000..6dd14e82b6
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XUnicodeSetData_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XUnicodeSetData_ICU4XError_H
+#define diplomat_result_box_ICU4XUnicodeSetData_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XUnicodeSetData ICU4XUnicodeSetData;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XUnicodeSetData_ICU4XError {
+ union {
+ ICU4XUnicodeSetData* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XUnicodeSetData_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XWeekCalculator_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XWeekCalculator_ICU4XError.h
new file mode 100644
index 0000000000..1f547fd383
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XWeekCalculator_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XWeekCalculator_ICU4XError_H
+#define diplomat_result_box_ICU4XWeekCalculator_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XWeekCalculator ICU4XWeekCalculator;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XWeekCalculator_ICU4XError {
+ union {
+ ICU4XWeekCalculator* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XWeekCalculator_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XWordSegmenter_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XWordSegmenter_ICU4XError.h
new file mode 100644
index 0000000000..e41c59b661
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XWordSegmenter_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XWordSegmenter_ICU4XError_H
+#define diplomat_result_box_ICU4XWordSegmenter_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XWordSegmenter ICU4XWordSegmenter;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XWordSegmenter_ICU4XError {
+ union {
+ ICU4XWordSegmenter* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XWordSegmenter_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XZonedDateTimeFormatter_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XZonedDateTimeFormatter_ICU4XError.h
new file mode 100644
index 0000000000..52a0ab4462
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_box_ICU4XZonedDateTimeFormatter_ICU4XError.h
@@ -0,0 +1,26 @@
+#ifndef diplomat_result_box_ICU4XZonedDateTimeFormatter_ICU4XError_H
+#define diplomat_result_box_ICU4XZonedDateTimeFormatter_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+typedef struct ICU4XZonedDateTimeFormatter ICU4XZonedDateTimeFormatter;
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_box_ICU4XZonedDateTimeFormatter_ICU4XError {
+ union {
+ ICU4XZonedDateTimeFormatter* ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_box_ICU4XZonedDateTimeFormatter_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_int32_t_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_int32_t_ICU4XError.h
new file mode 100644
index 0000000000..adbe148dd1
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_int32_t_ICU4XError.h
@@ -0,0 +1,25 @@
+#ifndef diplomat_result_int32_t_ICU4XError_H
+#define diplomat_result_int32_t_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_int32_t_ICU4XError {
+ union {
+ int32_t ok;
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_int32_t_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_uint16_t_void.h b/intl/icu_capi/cpp/include/diplomat_result_uint16_t_void.h
new file mode 100644
index 0000000000..3adeb5f36d
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_uint16_t_void.h
@@ -0,0 +1,23 @@
+#ifndef diplomat_result_uint16_t_void_H
+#define diplomat_result_uint16_t_void_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_uint16_t_void {
+ union {
+ uint16_t ok;
+ };
+ bool is_ok;
+} diplomat_result_uint16_t_void;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_void_ICU4XError.h b/intl/icu_capi/cpp/include/diplomat_result_void_ICU4XError.h
new file mode 100644
index 0000000000..f092491e34
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_void_ICU4XError.h
@@ -0,0 +1,24 @@
+#ifndef diplomat_result_void_ICU4XError_H
+#define diplomat_result_void_ICU4XError_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#include "ICU4XError.h"
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_void_ICU4XError {
+ union {
+ ICU4XError err;
+ };
+ bool is_ok;
+} diplomat_result_void_ICU4XError;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_result_void_void.h b/intl/icu_capi/cpp/include/diplomat_result_void_void.h
new file mode 100644
index 0000000000..2d5cc704e5
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_result_void_void.h
@@ -0,0 +1,20 @@
+#ifndef diplomat_result_void_void_H
+#define diplomat_result_void_void_H
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "diplomat_runtime.h"
+
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+typedef struct diplomat_result_void_void {
+ bool is_ok;
+} diplomat_result_void_void;
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_runtime.h b/intl/icu_capi/cpp/include/diplomat_runtime.h
new file mode 100644
index 0000000000..de0f9c76fe
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_runtime.h
@@ -0,0 +1,70 @@
+#ifndef DIPLOMAT_RUNTIME_C_H
+#define DIPLOMAT_RUNTIME_C_H
+
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <sys/types.h>
+
+// uchar.h doesn't always exist, but char32_t is always available
+// in C++ anyway
+#ifndef __cplusplus
+#ifdef __APPLE__
+#include <stdint.h>
+typedef uint16_t char16_t;
+typedef uint32_t char32_t;
+#else
+#include <uchar.h>
+#endif
+#endif
+
+
+#ifdef __cplusplus
+namespace capi {
+extern "C" {
+#endif
+
+typedef struct DiplomatWriteable {
+ void* context;
+ char* buf;
+ size_t len;
+ size_t cap;
+ void (*flush)(struct DiplomatWriteable*);
+ bool (*grow)(struct DiplomatWriteable*, size_t);
+} DiplomatWriteable;
+
+DiplomatWriteable diplomat_simple_writeable(char* buf, size_t buf_size);
+
+typedef struct DiplomatStringView {
+ const char* data;
+ size_t len;
+} DiplomatStringView;
+
+#define MAKE_SLICE_VIEW(name, c_ty) \
+ typedef struct Diplomat##name##View { \
+ const c_ty* data; \
+ size_t len; \
+ } Diplomat##name##View;
+
+MAKE_SLICE_VIEW(I8, int8_t)
+MAKE_SLICE_VIEW(U8, uint8_t)
+MAKE_SLICE_VIEW(I16, int16_t)
+MAKE_SLICE_VIEW(U16, uint16_t)
+MAKE_SLICE_VIEW(I32, int32_t)
+MAKE_SLICE_VIEW(U32, uint32_t)
+MAKE_SLICE_VIEW(I64, int64_t)
+MAKE_SLICE_VIEW(U64, uint64_t)
+MAKE_SLICE_VIEW(Isize, intptr_t)
+MAKE_SLICE_VIEW(Usize, size_t)
+MAKE_SLICE_VIEW(F32, float)
+MAKE_SLICE_VIEW(F64, double)
+MAKE_SLICE_VIEW(Bool, bool)
+MAKE_SLICE_VIEW(Char, char32_t)
+
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace capi
+#endif
+
+#endif
diff --git a/intl/icu_capi/cpp/include/diplomat_runtime.hpp b/intl/icu_capi/cpp/include/diplomat_runtime.hpp
new file mode 100644
index 0000000000..841752280d
--- /dev/null
+++ b/intl/icu_capi/cpp/include/diplomat_runtime.hpp
@@ -0,0 +1,175 @@
+#ifndef DIPLOMAT_RUNTIME_CPP_H
+#define DIPLOMAT_RUNTIME_CPP_H
+
+#include <string>
+#include <variant>
+#include <array>
+#include <optional>
+#include <type_traits>
+
+#if __cplusplus >= 202002L
+#include<span>
+#endif
+
+#include "diplomat_runtime.h"
+
+namespace diplomat {
+
+extern "C" inline void Flush(capi::DiplomatWriteable* w) {
+ std::string* string = reinterpret_cast<std::string*>(w->context);
+ string->resize(w->len);
+};
+
+extern "C" inline bool Grow(capi::DiplomatWriteable* w, uintptr_t requested) {
+ std::string* string = reinterpret_cast<std::string*>(w->context);
+ string->resize(requested);
+ w->cap = string->length();
+ w->buf = &(*string)[0];
+ return true;
+};
+
+inline capi::DiplomatWriteable WriteableFromString(std::string& string) {
+ capi::DiplomatWriteable w;
+ w.context = &string;
+ w.buf = &string[0];
+ w.len = string.length();
+ // Same as length, since C++ strings are not supposed
+ // to be written to past their len; you resize *first*
+ w.cap = string.length();
+ w.flush = Flush;
+ w.grow = Grow;
+ return w;
+};
+
+template<typename T> struct WriteableTrait {
+ // static inline capi::DiplomatWriteable Construct(T& t);
+};
+
+
+template<> struct WriteableTrait<std::string> {
+ static inline capi::DiplomatWriteable Construct(std::string& t) {
+ return diplomat::WriteableFromString(t);
+ }
+};
+
+template<class T> struct Ok {
+ T inner;
+ explicit Ok(T&& i): inner(std::move(i)) {}
+ // We don't want to expose an lvalue-capable constructor in general
+ // however there is no problem doing this for trivially copyable types
+ template<typename X = T, typename = typename std::enable_if<std::is_trivially_copyable<X>::value>::type>
+ explicit Ok(const T& i): inner(i) {}
+ Ok() = default;
+ Ok(Ok&&) noexcept = default;
+ Ok(const Ok &) = default;
+ Ok& operator=(const Ok&) = default;
+ Ok& operator=(Ok&&) noexcept = default;
+};
+
+template<class T> struct Err {
+ T inner;
+ explicit Err(T&& i): inner(std::move(i)) {}
+ // We don't want to expose an lvalue-capable constructor in general
+ // however there is no problem doing this for trivially copyable types
+ template<typename X = T, typename = typename std::enable_if<std::is_trivially_copyable<X>::value>::type>
+ explicit Err(const T& i): inner(i) {}
+ Err() = default;
+ Err(Err&&) noexcept = default;
+ Err(const Err &) = default;
+ Err& operator=(const Err&) = default;
+ Err& operator=(Err&&) noexcept = default;
+};
+
+template<class T, class E>
+class result {
+private:
+ std::variant<Ok<T>, Err<E>> val;
+public:
+ explicit result(Ok<T>&& v): val(std::move(v)) {}
+ explicit result(Err<E>&& v): val(std::move(v)) {}
+ result() = default;
+ result(const result &) = default;
+ result& operator=(const result&) = default;
+ result& operator=(Ok<T>&& t) {
+ this->val = Ok<T>(std::move(t));
+ return *this;
+ }
+ result& operator=(Err<E>&& e) {
+ this->val = Err<E>(std::move(e));
+ return *this;
+ }
+ result& operator=(result&&) noexcept = default;
+ result(result &&) noexcept = default;
+ ~result() = default;
+ bool is_ok() const {
+ return std::holds_alternative<Ok<T>>(this->val);
+ };
+ bool is_err() const {
+ return std::holds_alternative<Err<E>>(this->val);
+ };
+
+ std::optional<T> ok() && {
+ if (!this->is_ok()) {
+ return std::nullopt;
+ }
+ return std::make_optional(std::move(std::get<Ok<T>>(std::move(this->val)).inner));
+ };
+ std::optional<E> err() && {
+ if (!this->is_err()) {
+ return std::nullopt;
+ }
+ return std::make_optional(std::move(std::get<Err<E>>(std::move(this->val)).inner));
+ }
+
+ void set_ok(T&& t) {
+ this->val = Ok<T>(std::move(t));
+ }
+
+ void set_err(E&& e) {
+ this->val = Err<E>(std::move(e));
+ }
+
+ template<typename T2>
+ result<T2, E> replace_ok(T2&& t) {
+ if (this->is_err()) {
+ return result<T2, E>(Err<E>(std::get<Err<E>>(std::move(this->val))));
+ } else {
+ return result<T2, E>(Ok<T2>(std::move(t)));
+ }
+ }
+};
+
+
+// Use custom std::span on C++17, otherwise use std::span
+#if __cplusplus >= 202002L
+
+template<class T> using span = std::span<T>;
+
+#else // __cplusplus >= 202002L
+
+// C++-17-compatible std::span
+template<class T>
+class span {
+
+public:
+ constexpr span(T* data, size_t size)
+ : data_(data), size_(size) {}
+ template<size_t N>
+ explicit constexpr span(std::array<typename std::remove_const<T>::type, N>& arr)
+ : data_(const_cast<T*>(arr.data())), size_(N) {}
+ constexpr T* data() const noexcept {
+ return this->data_;
+ }
+ constexpr size_t size() const noexcept {
+ return this->size_;
+ }
+private:
+ T* data_;
+ size_t size_;
+};
+
+#endif // __cplusplus >= 202002L
+
+}
+
+#endif