summaryrefslogtreecommitdiffstats
path: root/intl/icu_capi/cpp/include
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /intl/icu_capi/cpp/include
parentInitial commit. (diff)
downloadfirefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz
firefox-26a029d407be480d791972afb5975cf62c9360a6.zip
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'intl/icu_capi/cpp/include')
-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
311 files changed, 19678 insertions, 0 deletions
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