From a8815972854647d5ce0621a6aab83c51b8378a81 Mon Sep 17 00:00:00 2001
From: Robert Bastian <4706271+robertbastian@users.noreply.github.com>
Date: Tue, 23 Jul 2024 13:02:01 +0200
Subject: [PATCH] Add C++ namespace (#5273)

Based on #5272

Fixes #2182, #5267.
---
 ffi/capi/bindings/cpp/AnyCalendarKind.hpp     |  81 ---
 ffi/capi/bindings/cpp/Bidi.d.hpp              |  59 --
 ffi/capi/bindings/cpp/Bidi.hpp                | 106 ---
 ffi/capi/bindings/cpp/BidiDirection.hpp       |  38 --
 ffi/capi/bindings/cpp/BidiInfo.d.hpp          |  48 --
 ffi/capi/bindings/cpp/BidiInfo.hpp            |  78 ---
 ffi/capi/bindings/cpp/BidiParagraph.d.hpp     |  53 --
 ffi/capi/bindings/cpp/BidiParagraph.hpp       | 105 ---
 ffi/capi/bindings/cpp/Calendar.d.hpp          |  50 --
 ffi/capi/bindings/cpp/Calendar.hpp            |  76 ---
 ffi/capi/bindings/cpp/CalendarError.hpp       |  39 --
 ffi/capi/bindings/cpp/CalendarParseError.hpp  |  40 --
 .../cpp/CanonicalCombiningClassMap.d.hpp      |  45 --
 .../cpp/CanonicalCombiningClassMap.hpp        |  65 --
 .../bindings/cpp/CanonicalComposition.d.hpp   |  45 --
 .../bindings/cpp/CanonicalComposition.hpp     |  66 --
 .../bindings/cpp/CanonicalDecomposition.d.hpp |  46 --
 .../bindings/cpp/CanonicalDecomposition.hpp   |  66 --
 ffi/capi/bindings/cpp/CaseMapCloser.d.hpp     |  49 --
 ffi/capi/bindings/cpp/CaseMapCloser.hpp       |  76 ---
 ffi/capi/bindings/cpp/CaseMapper.d.hpp        |  70 --
 ffi/capi/bindings/cpp/CaseMapper.hpp          | 187 ------
 .../bindings/cpp/CodePointMapData16.d.hpp     |  55 --
 ffi/capi/bindings/cpp/CodePointMapData16.hpp  |  91 ---
 ffi/capi/bindings/cpp/CodePointMapData8.d.hpp |  77 ---
 ffi/capi/bindings/cpp/CodePointMapData8.hpp   | 178 -----
 .../bindings/cpp/CodePointRangeIterator.d.hpp |  41 --
 .../bindings/cpp/CodePointRangeIterator.hpp   |  55 --
 .../cpp/CodePointRangeIteratorResult.d.hpp    |  34 -
 .../cpp/CodePointRangeIteratorResult.hpp      |  42 --
 .../bindings/cpp/CodePointSetBuilder.d.hpp    |  72 --
 ffi/capi/bindings/cpp/CodePointSetBuilder.hpp | 163 -----
 ffi/capi/bindings/cpp/CodePointSetData.d.hpp  | 184 ------
 ffi/capi/bindings/cpp/CodePointSetData.hpp    | 615 ------------------
 ffi/capi/bindings/cpp/Collator.d.hpp          |  53 --
 ffi/capi/bindings/cpp/Collator.hpp            |  91 ---
 .../cpp/CollatorAlternateHandling.hpp         |  38 --
 .../cpp/CollatorBackwardSecondLevel.hpp       |  38 --
 ffi/capi/bindings/cpp/CollatorCaseFirst.hpp   |  39 --
 ffi/capi/bindings/cpp/CollatorCaseLevel.hpp   |  38 --
 ffi/capi/bindings/cpp/CollatorMaxVariable.hpp |  40 --
 ffi/capi/bindings/cpp/CollatorNumeric.hpp     |  38 --
 ffi/capi/bindings/cpp/CollatorOptionsV1.d.hpp |  57 --
 ffi/capi/bindings/cpp/CollatorOptionsV1.hpp   |  57 --
 .../cpp/CollatorResolvedOptionsV1.d.hpp       |  57 --
 .../cpp/CollatorResolvedOptionsV1.hpp         |  57 --
 ffi/capi/bindings/cpp/CollatorStrength.hpp    |  41 --
 .../bindings/cpp/ComposingNormalizer.d.hpp    |  55 --
 ffi/capi/bindings/cpp/ComposingNormalizer.hpp | 113 ----
 ffi/capi/bindings/cpp/CustomTimeZone.d.hpp    | 102 ---
 ffi/capi/bindings/cpp/CustomTimeZone.hpp      | 279 --------
 ffi/capi/bindings/cpp/DataError.hpp           |  44 --
 ffi/capi/bindings/cpp/DataProvider.d.hpp      |  55 --
 ffi/capi/bindings/cpp/DataProvider.hpp        | 108 ---
 ffi/capi/bindings/cpp/Date.d.hpp              |  84 ---
 ffi/capi/bindings/cpp/Date.hpp                | 202 ------
 ffi/capi/bindings/cpp/DateFormatter.d.hpp     |  62 --
 ffi/capi/bindings/cpp/DateFormatter.hpp       | 113 ----
 ffi/capi/bindings/cpp/DateLength.hpp          |  39 --
 ffi/capi/bindings/cpp/DateTime.d.hpp          | 102 ---
 ffi/capi/bindings/cpp/DateTime.hpp            | 262 --------
 ffi/capi/bindings/cpp/DateTimeFormatter.d.hpp |  55 --
 ffi/capi/bindings/cpp/DateTimeFormatter.hpp   |  89 ---
 .../bindings/cpp/DecomposingNormalizer.d.hpp  |  55 --
 .../bindings/cpp/DecomposingNormalizer.hpp    | 113 ----
 .../bindings/cpp/DisplayNamesFallback.hpp     |  37 --
 .../bindings/cpp/DisplayNamesOptionsV1.d.hpp  |  41 --
 .../bindings/cpp/DisplayNamesOptionsV1.hpp    |  45 --
 ffi/capi/bindings/cpp/DisplayNamesStyle.hpp   |  40 --
 ffi/capi/bindings/cpp/Error.hpp               |  55 --
 ffi/capi/bindings/cpp/FixedDecimal.d.hpp      | 110 ----
 ffi/capi/bindings/cpp/FixedDecimal.hpp        | 299 ---------
 .../bindings/cpp/FixedDecimalFormatter.d.hpp  |  52 --
 .../bindings/cpp/FixedDecimalFormatter.hpp    |  98 ---
 .../cpp/FixedDecimalGroupingStrategy.hpp      |  39 --
 .../bindings/cpp/FixedDecimalParseError.hpp   |  38 --
 .../cpp/FixedDecimalRoundingIncrement.hpp     |  39 --
 .../bindings/cpp/FixedDecimalRoundingMode.hpp |  44 --
 ffi/capi/bindings/cpp/FixedDecimalSign.hpp    |  38 --
 .../bindings/cpp/FixedDecimalSignDisplay.hpp  |  40 --
 .../cpp/GeneralCategoryNameToMaskMapper.d.hpp |  47 --
 .../cpp/GeneralCategoryNameToMaskMapper.hpp   |  75 ---
 .../GraphemeClusterBreakIteratorLatin1.d.hpp  |  39 --
 .../GraphemeClusterBreakIteratorLatin1.hpp    |  54 --
 .../GraphemeClusterBreakIteratorUtf16.d.hpp   |  39 --
 .../cpp/GraphemeClusterBreakIteratorUtf16.hpp |  54 --
 .../GraphemeClusterBreakIteratorUtf8.d.hpp    |  39 --
 .../cpp/GraphemeClusterBreakIteratorUtf8.hpp  |  54 --
 .../cpp/GraphemeClusterSegmenter.d.hpp        |  55 --
 .../bindings/cpp/GraphemeClusterSegmenter.hpp |  87 ---
 .../bindings/cpp/GregorianDateFormatter.d.hpp |  54 --
 .../bindings/cpp/GregorianDateFormatter.hpp   |  85 ---
 .../cpp/GregorianDateTimeFormatter.d.hpp      |  51 --
 .../cpp/GregorianDateTimeFormatter.hpp        |  75 ---
 .../cpp/GregorianZonedDateTimeFormatter.d.hpp |  56 --
 .../cpp/GregorianZonedDateTimeFormatter.hpp   |  90 ---
 ffi/capi/bindings/cpp/IsoDate.d.hpp           |  80 ---
 ffi/capi/bindings/cpp/IsoDate.hpp             | 174 -----
 ffi/capi/bindings/cpp/IsoDateTime.d.hpp       | 102 ---
 ffi/capi/bindings/cpp/IsoDateTime.hpp         | 244 -------
 ffi/capi/bindings/cpp/IsoTimeZoneFormat.hpp   |  39 --
 .../bindings/cpp/IsoTimeZoneMinuteDisplay.hpp |  37 --
 .../bindings/cpp/IsoTimeZoneOptions.d.hpp     |  41 --
 ffi/capi/bindings/cpp/IsoTimeZoneOptions.hpp  |  45 --
 .../bindings/cpp/IsoTimeZoneSecondDisplay.hpp |  37 --
 ffi/capi/bindings/cpp/IsoWeekday.hpp          |  42 --
 ffi/capi/bindings/cpp/LanguageDisplay.hpp     |  37 --
 ffi/capi/bindings/cpp/LeadingAdjustment.hpp   |  38 --
 .../cpp/LineBreakIteratorLatin1.d.hpp         |  39 --
 .../bindings/cpp/LineBreakIteratorLatin1.hpp  |  54 --
 .../bindings/cpp/LineBreakIteratorUtf16.d.hpp |  39 --
 .../bindings/cpp/LineBreakIteratorUtf16.hpp   |  54 --
 .../bindings/cpp/LineBreakIteratorUtf8.d.hpp  |  39 --
 .../bindings/cpp/LineBreakIteratorUtf8.hpp    |  54 --
 .../bindings/cpp/LineBreakOptionsV1.d.hpp     |  39 --
 ffi/capi/bindings/cpp/LineBreakOptionsV1.hpp  |  44 --
 ffi/capi/bindings/cpp/LineBreakStrictness.hpp |  39 --
 ffi/capi/bindings/cpp/LineBreakWordOption.hpp |  38 --
 ffi/capi/bindings/cpp/LineSegmenter.d.hpp     |  66 --
 ffi/capi/bindings/cpp/LineSegmenter.hpp       | 131 ----
 ffi/capi/bindings/cpp/ListFormatter.d.hpp     |  54 --
 ffi/capi/bindings/cpp/ListFormatter.hpp       | 105 ---
 ffi/capi/bindings/cpp/ListLength.hpp          |  38 --
 ffi/capi/bindings/cpp/Locale.d.hpp            |  71 --
 ffi/capi/bindings/cpp/Locale.hpp              | 204 ------
 .../bindings/cpp/LocaleCanonicalizer.d.hpp    |  50 --
 ffi/capi/bindings/cpp/LocaleCanonicalizer.hpp |  75 ---
 ffi/capi/bindings/cpp/LocaleDirection.hpp     |  38 --
 .../bindings/cpp/LocaleDirectionality.d.hpp   |  56 --
 .../bindings/cpp/LocaleDirectionality.hpp     |  93 ---
 .../cpp/LocaleDisplayNamesFormatter.d.hpp     |  48 --
 .../cpp/LocaleDisplayNamesFormatter.hpp       |  72 --
 ffi/capi/bindings/cpp/LocaleExpander.d.hpp    |  54 --
 ffi/capi/bindings/cpp/LocaleExpander.hpp      |  91 ---
 .../bindings/cpp/LocaleFallbackConfig.d.hpp   |  39 --
 .../bindings/cpp/LocaleFallbackConfig.hpp     |  44 --
 .../bindings/cpp/LocaleFallbackIterator.d.hpp |  42 --
 .../bindings/cpp/LocaleFallbackIterator.hpp   |  55 --
 .../bindings/cpp/LocaleFallbackPriority.hpp   |  38 --
 .../bindings/cpp/LocaleFallbackSupplement.hpp |  37 --
 ffi/capi/bindings/cpp/LocaleFallbacker.d.hpp  |  51 --
 ffi/capi/bindings/cpp/LocaleFallbacker.hpp    |  76 ---
 .../cpp/LocaleFallbackerWithConfig.d.hpp      |  44 --
 .../cpp/LocaleFallbackerWithConfig.hpp        |  57 --
 ffi/capi/bindings/cpp/LocaleParseError.hpp    |  39 --
 ffi/capi/bindings/cpp/Logger.d.hpp            |  39 --
 ffi/capi/bindings/cpp/Logger.hpp              |  54 --
 ffi/capi/bindings/cpp/MeasureUnit.d.hpp       |  37 --
 ffi/capi/bindings/cpp/MeasureUnit.hpp         |  47 --
 ffi/capi/bindings/cpp/MeasureUnitParser.d.hpp |  42 --
 ffi/capi/bindings/cpp/MeasureUnitParser.hpp   |  57 --
 .../bindings/cpp/MetazoneCalculator.d.hpp     |  43 --
 ffi/capi/bindings/cpp/MetazoneCalculator.hpp  |  57 --
 ffi/capi/bindings/cpp/PluralCategory.hpp      |  50 --
 ffi/capi/bindings/cpp/PluralOperands.d.hpp    |  45 --
 ffi/capi/bindings/cpp/PluralOperands.hpp      |  65 --
 ffi/capi/bindings/cpp/PluralRules.d.hpp       |  55 --
 ffi/capi/bindings/cpp/PluralRules.hpp         |  86 ---
 .../cpp/PropertyValueNameToEnumMapper.d.hpp   |  65 --
 .../cpp/PropertyValueNameToEnumMapper.hpp     | 147 -----
 .../bindings/cpp/RegionDisplayNames.d.hpp     |  48 --
 ffi/capi/bindings/cpp/RegionDisplayNames.hpp  |  73 ---
 ffi/capi/bindings/cpp/ReorderedIndexMap.d.hpp |  45 --
 ffi/capi/bindings/cpp/ReorderedIndexMap.hpp   |  76 ---
 .../bindings/cpp/ScriptExtensionsSet.d.hpp    |  43 --
 ffi/capi/bindings/cpp/ScriptExtensionsSet.hpp |  71 --
 .../bindings/cpp/ScriptWithExtensions.d.hpp   |  55 --
 .../bindings/cpp/ScriptWithExtensions.hpp     |  91 ---
 .../cpp/ScriptWithExtensionsBorrowed.d.hpp    |  50 --
 .../cpp/ScriptWithExtensionsBorrowed.hpp      |  82 ---
 ffi/capi/bindings/cpp/SegmenterWordType.hpp   |  45 --
 .../cpp/SentenceBreakIteratorLatin1.d.hpp     |  39 --
 .../cpp/SentenceBreakIteratorLatin1.hpp       |  54 --
 .../cpp/SentenceBreakIteratorUtf16.d.hpp      |  39 --
 .../cpp/SentenceBreakIteratorUtf16.hpp        |  54 --
 .../cpp/SentenceBreakIteratorUtf8.d.hpp       |  39 --
 .../cpp/SentenceBreakIteratorUtf8.hpp         |  54 --
 ffi/capi/bindings/cpp/SentenceSegmenter.d.hpp |  55 --
 ffi/capi/bindings/cpp/SentenceSegmenter.hpp   |  87 ---
 ffi/capi/bindings/cpp/Time.d.hpp              |  54 --
 ffi/capi/bindings/cpp/Time.hpp                | 105 ---
 ffi/capi/bindings/cpp/TimeFormatter.d.hpp     |  58 --
 ffi/capi/bindings/cpp/TimeFormatter.hpp       |  97 ---
 ffi/capi/bindings/cpp/TimeLength.hpp          |  39 --
 ffi/capi/bindings/cpp/TimeZoneFormatter.d.hpp |  68 --
 ffi/capi/bindings/cpp/TimeZoneFormatter.hpp   | 156 -----
 ffi/capi/bindings/cpp/TimeZoneIdMapper.d.hpp  |  52 --
 ffi/capi/bindings/cpp/TimeZoneIdMapper.hpp    | 116 ----
 ...ZoneIdMapperWithFastCanonicalization.d.hpp |  48 --
 ...meZoneIdMapperWithFastCanonicalization.hpp |  87 ---
 .../cpp/TimeZoneInvalidOffsetError.d.hpp      |  25 -
 ffi/capi/bindings/cpp/TitlecaseMapper.d.hpp   |  48 --
 ffi/capi/bindings/cpp/TitlecaseMapper.hpp     |  76 ---
 .../bindings/cpp/TitlecaseOptionsV1.d.hpp     |  39 --
 ffi/capi/bindings/cpp/TitlecaseOptionsV1.hpp  |  49 --
 ffi/capi/bindings/cpp/TrailingCase.hpp        |  37 --
 ffi/capi/bindings/cpp/TransformResult.hpp     |  37 --
 ffi/capi/bindings/cpp/UnicodeSetData.d.hpp    |  59 --
 ffi/capi/bindings/cpp/UnicodeSetData.hpp      | 120 ----
 ffi/capi/bindings/cpp/UnitsConverter.d.hpp    |  41 --
 ffi/capi/bindings/cpp/UnitsConverter.hpp      |  62 --
 .../bindings/cpp/UnitsConverterFactory.d.hpp  |  53 --
 .../bindings/cpp/UnitsConverterFactory.hpp    |  76 ---
 ffi/capi/bindings/cpp/WeekCalculator.d.hpp    |  55 --
 ffi/capi/bindings/cpp/WeekCalculator.hpp      |  90 ---
 ffi/capi/bindings/cpp/WeekOf.d.hpp            |  35 -
 ffi/capi/bindings/cpp/WeekOf.hpp              |  41 --
 ffi/capi/bindings/cpp/WeekRelativeUnit.hpp    |  38 --
 .../cpp/WordBreakIteratorLatin1.d.hpp         |  45 --
 .../bindings/cpp/WordBreakIteratorLatin1.hpp  |  69 --
 .../bindings/cpp/WordBreakIteratorUtf16.d.hpp |  45 --
 .../bindings/cpp/WordBreakIteratorUtf16.hpp   |  69 --
 .../bindings/cpp/WordBreakIteratorUtf8.d.hpp  |  45 --
 .../bindings/cpp/WordBreakIteratorUtf8.hpp    |  69 --
 ffi/capi/bindings/cpp/WordSegmenter.d.hpp     |  59 --
 ffi/capi/bindings/cpp/WordSegmenter.hpp       | 103 ---
 .../bindings/cpp/ZonedDateTimeFormatter.d.hpp |  60 --
 .../bindings/cpp/ZonedDateTimeFormatter.hpp   | 105 ---
 .../cpp/{ => icu4x}/AnyCalendarKind.d.hpp     |  26 +-
 .../bindings/cpp/icu4x/AnyCalendarKind.hpp    |  81 +++
 ffi/capi/bindings/cpp/icu4x/Bidi.d.hpp        |  64 ++
 ffi/capi/bindings/cpp/icu4x/Bidi.hpp          | 106 +++
 .../cpp/{ => icu4x}/BidiDirection.d.hpp       |  17 +-
 ffi/capi/bindings/cpp/icu4x/BidiDirection.hpp |  38 ++
 ffi/capi/bindings/cpp/icu4x/BidiInfo.d.hpp    |  51 ++
 ffi/capi/bindings/cpp/icu4x/BidiInfo.hpp      |  78 +++
 .../bindings/cpp/icu4x/BidiParagraph.d.hpp    |  56 ++
 ffi/capi/bindings/cpp/icu4x/BidiParagraph.hpp | 105 +++
 ffi/capi/bindings/cpp/icu4x/Calendar.d.hpp    |  55 ++
 ffi/capi/bindings/cpp/icu4x/Calendar.hpp      |  76 +++
 .../cpp/{ => icu4x}/CalendarError.d.hpp       |  17 +-
 ffi/capi/bindings/cpp/icu4x/CalendarError.hpp |  39 ++
 .../cpp/{ => icu4x}/CalendarParseError.d.hpp  |  17 +-
 .../bindings/cpp/icu4x/CalendarParseError.hpp |  40 ++
 .../icu4x/CanonicalCombiningClassMap.d.hpp    |  50 ++
 .../cpp/icu4x/CanonicalCombiningClassMap.hpp  |  65 ++
 .../cpp/icu4x/CanonicalComposition.d.hpp      |  50 ++
 .../cpp/icu4x/CanonicalComposition.hpp        |  66 ++
 .../cpp/icu4x/CanonicalDecomposition.d.hpp    |  51 ++
 .../cpp/icu4x/CanonicalDecomposition.hpp      |  66 ++
 .../bindings/cpp/icu4x/CaseMapCloser.d.hpp    |  54 ++
 ffi/capi/bindings/cpp/icu4x/CaseMapCloser.hpp |  76 +++
 ffi/capi/bindings/cpp/icu4x/CaseMapper.d.hpp  |  75 +++
 ffi/capi/bindings/cpp/icu4x/CaseMapper.hpp    | 187 ++++++
 .../cpp/icu4x/CodePointMapData16.d.hpp        |  60 ++
 .../bindings/cpp/icu4x/CodePointMapData16.hpp |  91 +++
 .../cpp/icu4x/CodePointMapData8.d.hpp         |  82 +++
 .../bindings/cpp/icu4x/CodePointMapData8.hpp  | 178 +++++
 .../cpp/icu4x/CodePointRangeIterator.d.hpp    |  44 ++
 .../cpp/icu4x/CodePointRangeIterator.hpp      |  55 ++
 .../icu4x/CodePointRangeIteratorResult.d.hpp  |  35 +
 .../icu4x/CodePointRangeIteratorResult.hpp    |  42 ++
 .../cpp/icu4x/CodePointSetBuilder.d.hpp       |  77 +++
 .../cpp/icu4x/CodePointSetBuilder.hpp         | 163 +++++
 .../bindings/cpp/icu4x/CodePointSetData.d.hpp | 189 ++++++
 .../bindings/cpp/icu4x/CodePointSetData.hpp   | 615 ++++++++++++++++++
 ffi/capi/bindings/cpp/icu4x/Collator.d.hpp    |  58 ++
 ffi/capi/bindings/cpp/icu4x/Collator.hpp      |  91 +++
 .../CollatorAlternateHandling.d.hpp           |  17 +-
 .../cpp/icu4x/CollatorAlternateHandling.hpp   |  38 ++
 .../CollatorBackwardSecondLevel.d.hpp         |  17 +-
 .../cpp/icu4x/CollatorBackwardSecondLevel.hpp |  38 ++
 .../cpp/{ => icu4x}/CollatorCaseFirst.d.hpp   |  17 +-
 .../bindings/cpp/icu4x/CollatorCaseFirst.hpp  |  39 ++
 .../cpp/{ => icu4x}/CollatorCaseLevel.d.hpp   |  17 +-
 .../bindings/cpp/icu4x/CollatorCaseLevel.hpp  |  38 ++
 .../cpp/{ => icu4x}/CollatorMaxVariable.d.hpp |  17 +-
 .../cpp/icu4x/CollatorMaxVariable.hpp         |  40 ++
 .../cpp/{ => icu4x}/CollatorNumeric.d.hpp     |  17 +-
 .../bindings/cpp/icu4x/CollatorNumeric.hpp    |  38 ++
 .../cpp/icu4x/CollatorOptionsV1.d.hpp         |  60 ++
 .../bindings/cpp/icu4x/CollatorOptionsV1.hpp  |  57 ++
 .../cpp/icu4x/CollatorResolvedOptionsV1.d.hpp |  60 ++
 .../cpp/icu4x/CollatorResolvedOptionsV1.hpp   |  57 ++
 .../cpp/{ => icu4x}/CollatorStrength.d.hpp    |  17 +-
 .../bindings/cpp/icu4x/CollatorStrength.hpp   |  41 ++
 .../cpp/icu4x/ComposingNormalizer.d.hpp       |  60 ++
 .../cpp/icu4x/ComposingNormalizer.hpp         | 113 ++++
 .../bindings/cpp/icu4x/CustomTimeZone.d.hpp   | 107 +++
 .../bindings/cpp/icu4x/CustomTimeZone.hpp     | 279 ++++++++
 .../bindings/cpp/{ => icu4x}/DataError.d.hpp  |  17 +-
 ffi/capi/bindings/cpp/icu4x/DataError.hpp     |  44 ++
 .../bindings/cpp/icu4x/DataProvider.d.hpp     |  60 ++
 ffi/capi/bindings/cpp/icu4x/DataProvider.hpp  | 108 +++
 ffi/capi/bindings/cpp/icu4x/Date.d.hpp        |  89 +++
 ffi/capi/bindings/cpp/icu4x/Date.hpp          | 202 ++++++
 .../bindings/cpp/icu4x/DateFormatter.d.hpp    |  67 ++
 ffi/capi/bindings/cpp/icu4x/DateFormatter.hpp | 113 ++++
 .../bindings/cpp/{ => icu4x}/DateLength.d.hpp |  17 +-
 ffi/capi/bindings/cpp/icu4x/DateLength.hpp    |  39 ++
 ffi/capi/bindings/cpp/icu4x/DateTime.d.hpp    | 107 +++
 ffi/capi/bindings/cpp/icu4x/DateTime.hpp      | 262 ++++++++
 .../cpp/icu4x/DateTimeFormatter.d.hpp         |  60 ++
 .../bindings/cpp/icu4x/DateTimeFormatter.hpp  |  89 +++
 .../bindings/cpp/{ => icu4x}/Decomposed.d.hpp |  17 +-
 .../bindings/cpp/{ => icu4x}/Decomposed.hpp   |  18 +-
 .../cpp/icu4x/DecomposingNormalizer.d.hpp     |  60 ++
 .../cpp/icu4x/DecomposingNormalizer.hpp       | 113 ++++
 .../{ => icu4x}/DisplayNamesFallback.d.hpp    |  17 +-
 .../cpp/icu4x/DisplayNamesFallback.hpp        |  37 ++
 .../cpp/icu4x/DisplayNamesOptionsV1.d.hpp     |  44 ++
 .../cpp/icu4x/DisplayNamesOptionsV1.hpp       |  45 ++
 .../cpp/{ => icu4x}/DisplayNamesStyle.d.hpp   |  17 +-
 .../bindings/cpp/icu4x/DisplayNamesStyle.hpp  |  40 ++
 ffi/capi/bindings/cpp/{ => icu4x}/Error.d.hpp |  17 +-
 ffi/capi/bindings/cpp/icu4x/Error.hpp         |  55 ++
 .../bindings/cpp/icu4x/FixedDecimal.d.hpp     | 115 ++++
 ffi/capi/bindings/cpp/icu4x/FixedDecimal.hpp  | 299 +++++++++
 .../cpp/icu4x/FixedDecimalFormatter.d.hpp     |  57 ++
 .../cpp/icu4x/FixedDecimalFormatter.hpp       |  98 +++
 .../FixedDecimalGroupingStrategy.d.hpp        |  17 +-
 .../icu4x/FixedDecimalGroupingStrategy.hpp    |  39 ++
 .../{ => icu4x}/FixedDecimalLimitError.d.hpp  |  13 +-
 .../{ => icu4x}/FixedDecimalLimitError.hpp    |  10 +-
 .../{ => icu4x}/FixedDecimalParseError.d.hpp  |  17 +-
 .../cpp/icu4x/FixedDecimalParseError.hpp      |  38 ++
 .../FixedDecimalRoundingIncrement.d.hpp       |  17 +-
 .../icu4x/FixedDecimalRoundingIncrement.hpp   |  39 ++
 .../FixedDecimalRoundingMode.d.hpp            |  17 +-
 .../cpp/icu4x/FixedDecimalRoundingMode.hpp    |  44 ++
 .../cpp/{ => icu4x}/FixedDecimalSign.d.hpp    |  17 +-
 .../bindings/cpp/icu4x/FixedDecimalSign.hpp   |  38 ++
 .../{ => icu4x}/FixedDecimalSignDisplay.d.hpp |  17 +-
 .../cpp/icu4x/FixedDecimalSignDisplay.hpp     |  40 ++
 .../GeneralCategoryNameToMaskMapper.d.hpp     |  52 ++
 .../icu4x/GeneralCategoryNameToMaskMapper.hpp |  75 +++
 .../GraphemeClusterBreakIteratorLatin1.d.hpp  |  40 ++
 .../GraphemeClusterBreakIteratorLatin1.hpp    |  54 ++
 .../GraphemeClusterBreakIteratorUtf16.d.hpp   |  40 ++
 .../GraphemeClusterBreakIteratorUtf16.hpp     |  54 ++
 .../GraphemeClusterBreakIteratorUtf8.d.hpp    |  40 ++
 .../GraphemeClusterBreakIteratorUtf8.hpp      |  54 ++
 .../cpp/icu4x/GraphemeClusterSegmenter.d.hpp  |  60 ++
 .../cpp/icu4x/GraphemeClusterSegmenter.hpp    |  87 +++
 .../cpp/icu4x/GregorianDateFormatter.d.hpp    |  59 ++
 .../cpp/icu4x/GregorianDateFormatter.hpp      |  85 +++
 .../icu4x/GregorianDateTimeFormatter.d.hpp    |  56 ++
 .../cpp/icu4x/GregorianDateTimeFormatter.hpp  |  75 +++
 .../GregorianZonedDateTimeFormatter.d.hpp     |  61 ++
 .../icu4x/GregorianZonedDateTimeFormatter.hpp |  90 +++
 ffi/capi/bindings/cpp/icu4x/IsoDate.d.hpp     |  85 +++
 ffi/capi/bindings/cpp/icu4x/IsoDate.hpp       | 174 +++++
 ffi/capi/bindings/cpp/icu4x/IsoDateTime.d.hpp | 107 +++
 ffi/capi/bindings/cpp/icu4x/IsoDateTime.hpp   | 244 +++++++
 .../cpp/{ => icu4x}/IsoTimeZoneFormat.d.hpp   |  17 +-
 .../bindings/cpp/icu4x/IsoTimeZoneFormat.hpp  |  39 ++
 .../IsoTimeZoneMinuteDisplay.d.hpp            |  17 +-
 .../cpp/icu4x/IsoTimeZoneMinuteDisplay.hpp    |  37 ++
 .../cpp/icu4x/IsoTimeZoneOptions.d.hpp        |  44 ++
 .../bindings/cpp/icu4x/IsoTimeZoneOptions.hpp |  45 ++
 .../IsoTimeZoneSecondDisplay.d.hpp            |  17 +-
 .../cpp/icu4x/IsoTimeZoneSecondDisplay.hpp    |  37 ++
 .../bindings/cpp/{ => icu4x}/IsoWeekday.d.hpp |  17 +-
 ffi/capi/bindings/cpp/icu4x/IsoWeekday.hpp    |  42 ++
 .../cpp/{ => icu4x}/LanguageDisplay.d.hpp     |  17 +-
 .../bindings/cpp/icu4x/LanguageDisplay.hpp    |  37 ++
 .../cpp/{ => icu4x}/LeadingAdjustment.d.hpp   |  17 +-
 .../bindings/cpp/icu4x/LeadingAdjustment.hpp  |  38 ++
 .../cpp/icu4x/LineBreakIteratorLatin1.d.hpp   |  40 ++
 .../cpp/icu4x/LineBreakIteratorLatin1.hpp     |  54 ++
 .../cpp/icu4x/LineBreakIteratorUtf16.d.hpp    |  40 ++
 .../cpp/icu4x/LineBreakIteratorUtf16.hpp      |  54 ++
 .../cpp/icu4x/LineBreakIteratorUtf8.d.hpp     |  40 ++
 .../cpp/icu4x/LineBreakIteratorUtf8.hpp       |  54 ++
 .../cpp/icu4x/LineBreakOptionsV1.d.hpp        |  42 ++
 .../bindings/cpp/icu4x/LineBreakOptionsV1.hpp |  44 ++
 .../cpp/{ => icu4x}/LineBreakStrictness.d.hpp |  17 +-
 .../cpp/icu4x/LineBreakStrictness.hpp         |  39 ++
 .../cpp/{ => icu4x}/LineBreakWordOption.d.hpp |  17 +-
 .../cpp/icu4x/LineBreakWordOption.hpp         |  38 ++
 .../bindings/cpp/icu4x/LineSegmenter.d.hpp    |  71 ++
 ffi/capi/bindings/cpp/icu4x/LineSegmenter.hpp | 131 ++++
 .../bindings/cpp/icu4x/ListFormatter.d.hpp    |  59 ++
 ffi/capi/bindings/cpp/icu4x/ListFormatter.hpp | 105 +++
 .../bindings/cpp/{ => icu4x}/ListLength.d.hpp |  17 +-
 ffi/capi/bindings/cpp/icu4x/ListLength.hpp    |  38 ++
 ffi/capi/bindings/cpp/icu4x/Locale.d.hpp      |  76 +++
 ffi/capi/bindings/cpp/icu4x/Locale.hpp        | 204 ++++++
 .../cpp/icu4x/LocaleCanonicalizer.d.hpp       |  55 ++
 .../cpp/icu4x/LocaleCanonicalizer.hpp         |  75 +++
 .../cpp/{ => icu4x}/LocaleDirection.d.hpp     |  17 +-
 .../bindings/cpp/icu4x/LocaleDirection.hpp    |  38 ++
 .../cpp/icu4x/LocaleDirectionality.d.hpp      |  61 ++
 .../cpp/icu4x/LocaleDirectionality.hpp        |  93 +++
 .../icu4x/LocaleDisplayNamesFormatter.d.hpp   |  53 ++
 .../cpp/icu4x/LocaleDisplayNamesFormatter.hpp |  72 ++
 .../bindings/cpp/icu4x/LocaleExpander.d.hpp   |  59 ++
 .../bindings/cpp/icu4x/LocaleExpander.hpp     |  91 +++
 .../cpp/icu4x/LocaleFallbackConfig.d.hpp      |  42 ++
 .../cpp/icu4x/LocaleFallbackConfig.hpp        |  44 ++
 .../cpp/icu4x/LocaleFallbackIterator.d.hpp    |  45 ++
 .../cpp/icu4x/LocaleFallbackIterator.hpp      |  55 ++
 .../{ => icu4x}/LocaleFallbackPriority.d.hpp  |  17 +-
 .../cpp/icu4x/LocaleFallbackPriority.hpp      |  38 ++
 .../LocaleFallbackSupplement.d.hpp            |  17 +-
 .../cpp/icu4x/LocaleFallbackSupplement.hpp    |  37 ++
 .../bindings/cpp/icu4x/LocaleFallbacker.d.hpp |  56 ++
 .../bindings/cpp/icu4x/LocaleFallbacker.hpp   |  76 +++
 .../icu4x/LocaleFallbackerWithConfig.d.hpp    |  47 ++
 .../cpp/icu4x/LocaleFallbackerWithConfig.hpp  |  57 ++
 .../cpp/{ => icu4x}/LocaleParseError.d.hpp    |  17 +-
 .../bindings/cpp/icu4x/LocaleParseError.hpp   |  39 ++
 ffi/capi/bindings/cpp/icu4x/Logger.d.hpp      |  40 ++
 ffi/capi/bindings/cpp/icu4x/Logger.hpp        |  54 ++
 ffi/capi/bindings/cpp/icu4x/MeasureUnit.d.hpp |  38 ++
 ffi/capi/bindings/cpp/icu4x/MeasureUnit.hpp   |  47 ++
 .../cpp/icu4x/MeasureUnitParser.d.hpp         |  45 ++
 .../bindings/cpp/icu4x/MeasureUnitParser.hpp  |  57 ++
 .../cpp/icu4x/MetazoneCalculator.d.hpp        |  48 ++
 .../bindings/cpp/icu4x/MetazoneCalculator.hpp |  57 ++
 .../cpp/{ => icu4x}/PluralCategories.d.hpp    |  17 +-
 .../cpp/{ => icu4x}/PluralCategories.hpp      |  18 +-
 .../cpp/{ => icu4x}/PluralCategory.d.hpp      |  23 +-
 .../bindings/cpp/icu4x/PluralCategory.hpp     |  50 ++
 .../bindings/cpp/icu4x/PluralOperands.d.hpp   |  50 ++
 .../bindings/cpp/icu4x/PluralOperands.hpp     |  65 ++
 ffi/capi/bindings/cpp/icu4x/PluralRules.d.hpp |  60 ++
 ffi/capi/bindings/cpp/icu4x/PluralRules.hpp   |  86 +++
 .../icu4x/PropertyValueNameToEnumMapper.d.hpp |  70 ++
 .../icu4x/PropertyValueNameToEnumMapper.hpp   | 147 +++++
 .../cpp/icu4x/RegionDisplayNames.d.hpp        |  53 ++
 .../bindings/cpp/icu4x/RegionDisplayNames.hpp |  73 +++
 .../cpp/icu4x/ReorderedIndexMap.d.hpp         |  46 ++
 .../bindings/cpp/icu4x/ReorderedIndexMap.hpp  |  76 +++
 .../cpp/icu4x/ScriptExtensionsSet.d.hpp       |  44 ++
 .../cpp/icu4x/ScriptExtensionsSet.hpp         |  71 ++
 .../cpp/icu4x/ScriptWithExtensions.d.hpp      |  60 ++
 .../cpp/icu4x/ScriptWithExtensions.hpp        |  91 +++
 .../icu4x/ScriptWithExtensionsBorrowed.d.hpp  |  53 ++
 .../icu4x/ScriptWithExtensionsBorrowed.hpp    |  82 +++
 .../cpp/{ => icu4x}/SegmenterWordType.d.hpp   |  17 +-
 .../bindings/cpp/icu4x/SegmenterWordType.hpp  |  45 ++
 .../icu4x/SentenceBreakIteratorLatin1.d.hpp   |  40 ++
 .../cpp/icu4x/SentenceBreakIteratorLatin1.hpp |  54 ++
 .../icu4x/SentenceBreakIteratorUtf16.d.hpp    |  40 ++
 .../cpp/icu4x/SentenceBreakIteratorUtf16.hpp  |  54 ++
 .../cpp/icu4x/SentenceBreakIteratorUtf8.d.hpp |  40 ++
 .../cpp/icu4x/SentenceBreakIteratorUtf8.hpp   |  54 ++
 .../cpp/icu4x/SentenceSegmenter.d.hpp         |  60 ++
 .../bindings/cpp/icu4x/SentenceSegmenter.hpp  |  87 +++
 ffi/capi/bindings/cpp/icu4x/Time.d.hpp        |  59 ++
 ffi/capi/bindings/cpp/icu4x/Time.hpp          | 105 +++
 .../bindings/cpp/icu4x/TimeFormatter.d.hpp    |  63 ++
 ffi/capi/bindings/cpp/icu4x/TimeFormatter.hpp |  97 +++
 .../bindings/cpp/{ => icu4x}/TimeLength.d.hpp |  17 +-
 ffi/capi/bindings/cpp/icu4x/TimeLength.hpp    |  39 ++
 .../cpp/icu4x/TimeZoneFormatter.d.hpp         |  73 +++
 .../bindings/cpp/icu4x/TimeZoneFormatter.hpp  | 156 +++++
 .../bindings/cpp/icu4x/TimeZoneIdMapper.d.hpp |  57 ++
 .../bindings/cpp/icu4x/TimeZoneIdMapper.hpp   | 116 ++++
 ...ZoneIdMapperWithFastCanonicalization.d.hpp |  53 ++
 ...meZoneIdMapperWithFastCanonicalization.hpp |  87 +++
 .../{ => icu4x}/TimeZoneInvalidIdError.d.hpp  |  13 +-
 .../{ => icu4x}/TimeZoneInvalidIdError.hpp    |  10 +-
 .../icu4x/TimeZoneInvalidOffsetError.d.hpp    |  26 +
 .../TimeZoneInvalidOffsetError.hpp            |  10 +-
 .../bindings/cpp/icu4x/TitlecaseMapper.d.hpp  |  53 ++
 .../bindings/cpp/icu4x/TitlecaseMapper.hpp    |  76 +++
 .../cpp/icu4x/TitlecaseOptionsV1.d.hpp        |  43 ++
 .../bindings/cpp/icu4x/TitlecaseOptionsV1.hpp |  49 ++
 .../cpp/{ => icu4x}/TrailingCase.d.hpp        |  17 +-
 ffi/capi/bindings/cpp/icu4x/TrailingCase.hpp  |  37 ++
 .../cpp/{ => icu4x}/TransformResult.d.hpp     |  17 +-
 .../bindings/cpp/icu4x/TransformResult.hpp    |  37 ++
 .../bindings/cpp/icu4x/UnicodeSetData.d.hpp   |  64 ++
 .../bindings/cpp/icu4x/UnicodeSetData.hpp     | 120 ++++
 .../bindings/cpp/icu4x/UnitsConverter.d.hpp   |  47 ++
 .../bindings/cpp/icu4x/UnitsConverter.hpp     |  62 ++
 .../cpp/icu4x/UnitsConverterFactory.d.hpp     |  58 ++
 .../cpp/icu4x/UnitsConverterFactory.hpp       |  76 +++
 .../bindings/cpp/icu4x/WeekCalculator.d.hpp   |  60 ++
 .../bindings/cpp/icu4x/WeekCalculator.hpp     |  90 +++
 ffi/capi/bindings/cpp/icu4x/WeekOf.d.hpp      |  38 ++
 ffi/capi/bindings/cpp/icu4x/WeekOf.hpp        |  41 ++
 .../cpp/{ => icu4x}/WeekRelativeUnit.d.hpp    |  17 +-
 .../bindings/cpp/icu4x/WeekRelativeUnit.hpp   |  38 ++
 .../cpp/{ => icu4x}/WeekendContainsDay.d.hpp  |  17 +-
 .../cpp/{ => icu4x}/WeekendContainsDay.hpp    |  18 +-
 .../cpp/icu4x/WordBreakIteratorLatin1.d.hpp   |  48 ++
 .../cpp/icu4x/WordBreakIteratorLatin1.hpp     |  69 ++
 .../cpp/icu4x/WordBreakIteratorUtf16.d.hpp    |  48 ++
 .../cpp/icu4x/WordBreakIteratorUtf16.hpp      |  69 ++
 .../cpp/icu4x/WordBreakIteratorUtf8.d.hpp     |  48 ++
 .../cpp/icu4x/WordBreakIteratorUtf8.hpp       |  69 ++
 .../bindings/cpp/icu4x/WordSegmenter.d.hpp    |  64 ++
 ffi/capi/bindings/cpp/icu4x/WordSegmenter.hpp | 103 +++
 .../cpp/icu4x/ZonedDateTimeFormatter.d.hpp    |  65 ++
 .../cpp/icu4x/ZonedDateTimeFormatter.hpp      | 105 +++
 ffi/capi/src/bidi.rs                          |   1 +
 ffi/capi/src/calendar.rs                      |   1 +
 ffi/capi/src/casemap.rs                       |   1 +
 ffi/capi/src/collator.rs                      |   1 +
 ffi/capi/src/collections_sets.rs              |   1 +
 ffi/capi/src/date.rs                          |   1 +
 ffi/capi/src/datetime.rs                      |   1 +
 ffi/capi/src/datetime_formatter.rs            |   1 +
 ffi/capi/src/decimal.rs                       |   1 +
 ffi/capi/src/displaynames.rs                  |   1 +
 ffi/capi/src/errors.rs                        |   1 +
 ffi/capi/src/fallbacker.rs                    |   1 +
 ffi/capi/src/fixed_decimal.rs                 |   1 +
 ffi/capi/src/list.rs                          |   1 +
 ffi/capi/src/locale.rs                        |   1 +
 ffi/capi/src/locale_core.rs                   |   1 +
 ffi/capi/src/locale_directionality.rs         |   1 +
 ffi/capi/src/logging.rs                       |   1 +
 ffi/capi/src/metazone_calculator.rs           |   1 +
 ffi/capi/src/normalizer.rs                    |   1 +
 ffi/capi/src/normalizer_properties.rs         |   1 +
 ffi/capi/src/pluralrules.rs                   |   1 +
 ffi/capi/src/properties_iter.rs               |   1 +
 ffi/capi/src/properties_maps.rs               |   1 +
 ffi/capi/src/properties_names.rs              |   1 +
 ffi/capi/src/properties_sets.rs               |   1 +
 ffi/capi/src/properties_unisets.rs            |   1 +
 ffi/capi/src/provider.rs                      |   1 +
 ffi/capi/src/script.rs                        |   1 +
 ffi/capi/src/segmenter_grapheme.rs            |   1 +
 ffi/capi/src/segmenter_line.rs                |   1 +
 ffi/capi/src/segmenter_sentence.rs            |   1 +
 ffi/capi/src/segmenter_word.rs                |   1 +
 ffi/capi/src/time.rs                          |   1 +
 ffi/capi/src/timezone.rs                      |   1 +
 ffi/capi/src/timezone_formatter.rs            |   1 +
 ffi/capi/src/timezone_mapper.rs               |   1 +
 ffi/capi/src/units_converter.rs               |   1 +
 ffi/capi/src/week.rs                          |   1 +
 ffi/capi/src/zoned_formatter.rs               |   1 +
 tutorials/cpp/bidi.cpp                        |   8 +-
 tutorials/cpp/casemapping.cpp                 |  12 +-
 tutorials/cpp/collator.cpp                    |  10 +-
 tutorials/cpp/datetime.cpp                    |  22 +-
 tutorials/cpp/fixeddecimal.cpp                |   6 +-
 tutorials/cpp/locale.cpp                      |   6 +-
 tutorials/cpp/pluralrules.cpp                 |   6 +-
 tutorials/cpp/properties.cpp                  |  16 +-
 tutorials/cpp/segmenter.cpp                   |  14 +-
 tutorials/cpp/units_converter.cpp             |  12 +-
 538 files changed, 16202 insertions(+), 15738 deletions(-)
 delete mode 100644 ffi/capi/bindings/cpp/AnyCalendarKind.hpp
 delete mode 100644 ffi/capi/bindings/cpp/Bidi.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/Bidi.hpp
 delete mode 100644 ffi/capi/bindings/cpp/BidiDirection.hpp
 delete mode 100644 ffi/capi/bindings/cpp/BidiInfo.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/BidiInfo.hpp
 delete mode 100644 ffi/capi/bindings/cpp/BidiParagraph.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/BidiParagraph.hpp
 delete mode 100644 ffi/capi/bindings/cpp/Calendar.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/Calendar.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CalendarError.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CalendarParseError.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CanonicalCombiningClassMap.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CanonicalCombiningClassMap.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CanonicalComposition.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CanonicalComposition.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CanonicalDecomposition.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CanonicalDecomposition.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CaseMapCloser.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CaseMapCloser.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CaseMapper.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CaseMapper.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CodePointMapData16.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CodePointMapData16.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CodePointMapData8.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CodePointMapData8.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CodePointRangeIterator.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CodePointRangeIterator.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CodePointRangeIteratorResult.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CodePointRangeIteratorResult.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CodePointSetBuilder.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CodePointSetBuilder.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CodePointSetData.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CodePointSetData.hpp
 delete mode 100644 ffi/capi/bindings/cpp/Collator.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/Collator.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CollatorAlternateHandling.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CollatorBackwardSecondLevel.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CollatorCaseFirst.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CollatorCaseLevel.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CollatorMaxVariable.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CollatorNumeric.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CollatorOptionsV1.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CollatorOptionsV1.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CollatorResolvedOptionsV1.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CollatorResolvedOptionsV1.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CollatorStrength.hpp
 delete mode 100644 ffi/capi/bindings/cpp/ComposingNormalizer.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/ComposingNormalizer.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CustomTimeZone.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/CustomTimeZone.hpp
 delete mode 100644 ffi/capi/bindings/cpp/DataError.hpp
 delete mode 100644 ffi/capi/bindings/cpp/DataProvider.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/DataProvider.hpp
 delete mode 100644 ffi/capi/bindings/cpp/Date.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/Date.hpp
 delete mode 100644 ffi/capi/bindings/cpp/DateFormatter.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/DateFormatter.hpp
 delete mode 100644 ffi/capi/bindings/cpp/DateLength.hpp
 delete mode 100644 ffi/capi/bindings/cpp/DateTime.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/DateTime.hpp
 delete mode 100644 ffi/capi/bindings/cpp/DateTimeFormatter.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/DateTimeFormatter.hpp
 delete mode 100644 ffi/capi/bindings/cpp/DecomposingNormalizer.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/DecomposingNormalizer.hpp
 delete mode 100644 ffi/capi/bindings/cpp/DisplayNamesFallback.hpp
 delete mode 100644 ffi/capi/bindings/cpp/DisplayNamesOptionsV1.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/DisplayNamesOptionsV1.hpp
 delete mode 100644 ffi/capi/bindings/cpp/DisplayNamesStyle.hpp
 delete mode 100644 ffi/capi/bindings/cpp/Error.hpp
 delete mode 100644 ffi/capi/bindings/cpp/FixedDecimal.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/FixedDecimal.hpp
 delete mode 100644 ffi/capi/bindings/cpp/FixedDecimalFormatter.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/FixedDecimalFormatter.hpp
 delete mode 100644 ffi/capi/bindings/cpp/FixedDecimalGroupingStrategy.hpp
 delete mode 100644 ffi/capi/bindings/cpp/FixedDecimalParseError.hpp
 delete mode 100644 ffi/capi/bindings/cpp/FixedDecimalRoundingIncrement.hpp
 delete mode 100644 ffi/capi/bindings/cpp/FixedDecimalRoundingMode.hpp
 delete mode 100644 ffi/capi/bindings/cpp/FixedDecimalSign.hpp
 delete mode 100644 ffi/capi/bindings/cpp/FixedDecimalSignDisplay.hpp
 delete mode 100644 ffi/capi/bindings/cpp/GeneralCategoryNameToMaskMapper.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/GeneralCategoryNameToMaskMapper.hpp
 delete mode 100644 ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorLatin1.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorLatin1.hpp
 delete mode 100644 ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorUtf16.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorUtf16.hpp
 delete mode 100644 ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorUtf8.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorUtf8.hpp
 delete mode 100644 ffi/capi/bindings/cpp/GraphemeClusterSegmenter.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/GraphemeClusterSegmenter.hpp
 delete mode 100644 ffi/capi/bindings/cpp/GregorianDateFormatter.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/GregorianDateFormatter.hpp
 delete mode 100644 ffi/capi/bindings/cpp/GregorianDateTimeFormatter.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/GregorianDateTimeFormatter.hpp
 delete mode 100644 ffi/capi/bindings/cpp/GregorianZonedDateTimeFormatter.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/GregorianZonedDateTimeFormatter.hpp
 delete mode 100644 ffi/capi/bindings/cpp/IsoDate.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/IsoDate.hpp
 delete mode 100644 ffi/capi/bindings/cpp/IsoDateTime.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/IsoDateTime.hpp
 delete mode 100644 ffi/capi/bindings/cpp/IsoTimeZoneFormat.hpp
 delete mode 100644 ffi/capi/bindings/cpp/IsoTimeZoneMinuteDisplay.hpp
 delete mode 100644 ffi/capi/bindings/cpp/IsoTimeZoneOptions.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/IsoTimeZoneOptions.hpp
 delete mode 100644 ffi/capi/bindings/cpp/IsoTimeZoneSecondDisplay.hpp
 delete mode 100644 ffi/capi/bindings/cpp/IsoWeekday.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LanguageDisplay.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LeadingAdjustment.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LineBreakIteratorLatin1.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LineBreakIteratorLatin1.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LineBreakIteratorUtf16.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LineBreakIteratorUtf16.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LineBreakIteratorUtf8.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LineBreakIteratorUtf8.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LineBreakOptionsV1.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LineBreakOptionsV1.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LineBreakStrictness.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LineBreakWordOption.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LineSegmenter.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LineSegmenter.hpp
 delete mode 100644 ffi/capi/bindings/cpp/ListFormatter.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/ListFormatter.hpp
 delete mode 100644 ffi/capi/bindings/cpp/ListLength.hpp
 delete mode 100644 ffi/capi/bindings/cpp/Locale.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/Locale.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LocaleCanonicalizer.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LocaleCanonicalizer.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LocaleDirection.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LocaleDirectionality.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LocaleDirectionality.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LocaleDisplayNamesFormatter.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LocaleDisplayNamesFormatter.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LocaleExpander.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LocaleExpander.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LocaleFallbackConfig.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LocaleFallbackConfig.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LocaleFallbackIterator.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LocaleFallbackIterator.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LocaleFallbackPriority.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LocaleFallbackSupplement.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LocaleFallbacker.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LocaleFallbacker.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LocaleFallbackerWithConfig.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LocaleFallbackerWithConfig.hpp
 delete mode 100644 ffi/capi/bindings/cpp/LocaleParseError.hpp
 delete mode 100644 ffi/capi/bindings/cpp/Logger.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/Logger.hpp
 delete mode 100644 ffi/capi/bindings/cpp/MeasureUnit.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/MeasureUnit.hpp
 delete mode 100644 ffi/capi/bindings/cpp/MeasureUnitParser.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/MeasureUnitParser.hpp
 delete mode 100644 ffi/capi/bindings/cpp/MetazoneCalculator.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/MetazoneCalculator.hpp
 delete mode 100644 ffi/capi/bindings/cpp/PluralCategory.hpp
 delete mode 100644 ffi/capi/bindings/cpp/PluralOperands.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/PluralOperands.hpp
 delete mode 100644 ffi/capi/bindings/cpp/PluralRules.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/PluralRules.hpp
 delete mode 100644 ffi/capi/bindings/cpp/PropertyValueNameToEnumMapper.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/PropertyValueNameToEnumMapper.hpp
 delete mode 100644 ffi/capi/bindings/cpp/RegionDisplayNames.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/RegionDisplayNames.hpp
 delete mode 100644 ffi/capi/bindings/cpp/ReorderedIndexMap.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/ReorderedIndexMap.hpp
 delete mode 100644 ffi/capi/bindings/cpp/ScriptExtensionsSet.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/ScriptExtensionsSet.hpp
 delete mode 100644 ffi/capi/bindings/cpp/ScriptWithExtensions.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/ScriptWithExtensions.hpp
 delete mode 100644 ffi/capi/bindings/cpp/ScriptWithExtensionsBorrowed.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/ScriptWithExtensionsBorrowed.hpp
 delete mode 100644 ffi/capi/bindings/cpp/SegmenterWordType.hpp
 delete mode 100644 ffi/capi/bindings/cpp/SentenceBreakIteratorLatin1.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/SentenceBreakIteratorLatin1.hpp
 delete mode 100644 ffi/capi/bindings/cpp/SentenceBreakIteratorUtf16.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/SentenceBreakIteratorUtf16.hpp
 delete mode 100644 ffi/capi/bindings/cpp/SentenceBreakIteratorUtf8.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/SentenceBreakIteratorUtf8.hpp
 delete mode 100644 ffi/capi/bindings/cpp/SentenceSegmenter.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/SentenceSegmenter.hpp
 delete mode 100644 ffi/capi/bindings/cpp/Time.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/Time.hpp
 delete mode 100644 ffi/capi/bindings/cpp/TimeFormatter.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/TimeFormatter.hpp
 delete mode 100644 ffi/capi/bindings/cpp/TimeLength.hpp
 delete mode 100644 ffi/capi/bindings/cpp/TimeZoneFormatter.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/TimeZoneFormatter.hpp
 delete mode 100644 ffi/capi/bindings/cpp/TimeZoneIdMapper.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/TimeZoneIdMapper.hpp
 delete mode 100644 ffi/capi/bindings/cpp/TimeZoneIdMapperWithFastCanonicalization.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/TimeZoneIdMapperWithFastCanonicalization.hpp
 delete mode 100644 ffi/capi/bindings/cpp/TimeZoneInvalidOffsetError.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/TitlecaseMapper.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/TitlecaseMapper.hpp
 delete mode 100644 ffi/capi/bindings/cpp/TitlecaseOptionsV1.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/TitlecaseOptionsV1.hpp
 delete mode 100644 ffi/capi/bindings/cpp/TrailingCase.hpp
 delete mode 100644 ffi/capi/bindings/cpp/TransformResult.hpp
 delete mode 100644 ffi/capi/bindings/cpp/UnicodeSetData.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/UnicodeSetData.hpp
 delete mode 100644 ffi/capi/bindings/cpp/UnitsConverter.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/UnitsConverter.hpp
 delete mode 100644 ffi/capi/bindings/cpp/UnitsConverterFactory.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/UnitsConverterFactory.hpp
 delete mode 100644 ffi/capi/bindings/cpp/WeekCalculator.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/WeekCalculator.hpp
 delete mode 100644 ffi/capi/bindings/cpp/WeekOf.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/WeekOf.hpp
 delete mode 100644 ffi/capi/bindings/cpp/WeekRelativeUnit.hpp
 delete mode 100644 ffi/capi/bindings/cpp/WordBreakIteratorLatin1.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/WordBreakIteratorLatin1.hpp
 delete mode 100644 ffi/capi/bindings/cpp/WordBreakIteratorUtf16.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/WordBreakIteratorUtf16.hpp
 delete mode 100644 ffi/capi/bindings/cpp/WordBreakIteratorUtf8.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/WordBreakIteratorUtf8.hpp
 delete mode 100644 ffi/capi/bindings/cpp/WordSegmenter.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/WordSegmenter.hpp
 delete mode 100644 ffi/capi/bindings/cpp/ZonedDateTimeFormatter.d.hpp
 delete mode 100644 ffi/capi/bindings/cpp/ZonedDateTimeFormatter.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/AnyCalendarKind.d.hpp (73%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/AnyCalendarKind.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/Bidi.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/Bidi.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/BidiDirection.d.hpp (67%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/BidiDirection.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/BidiInfo.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/BidiInfo.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/BidiParagraph.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/BidiParagraph.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/Calendar.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/Calendar.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/CalendarError.d.hpp (70%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CalendarError.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/CalendarParseError.d.hpp (71%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CalendarParseError.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CanonicalCombiningClassMap.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CanonicalCombiningClassMap.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CanonicalComposition.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CanonicalComposition.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CanonicalDecomposition.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CanonicalDecomposition.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CaseMapCloser.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CaseMapCloser.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CaseMapper.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CaseMapper.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CodePointMapData16.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CodePointMapData16.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CodePointMapData8.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CodePointMapData8.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CodePointRangeIterator.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CodePointRangeIterator.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CodePointRangeIteratorResult.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CodePointRangeIteratorResult.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CodePointSetBuilder.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CodePointSetBuilder.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CodePointSetData.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CodePointSetData.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/Collator.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/Collator.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/CollatorAlternateHandling.d.hpp (66%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CollatorAlternateHandling.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/CollatorBackwardSecondLevel.d.hpp (65%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CollatorBackwardSecondLevel.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/CollatorCaseFirst.d.hpp (69%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CollatorCaseFirst.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/CollatorCaseLevel.d.hpp (67%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CollatorCaseLevel.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/CollatorMaxVariable.d.hpp (70%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CollatorMaxVariable.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/CollatorNumeric.d.hpp (67%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CollatorNumeric.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CollatorOptionsV1.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CollatorOptionsV1.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CollatorResolvedOptionsV1.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CollatorResolvedOptionsV1.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/CollatorStrength.d.hpp (72%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CollatorStrength.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/ComposingNormalizer.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/ComposingNormalizer.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CustomTimeZone.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/CustomTimeZone.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/DataError.d.hpp (77%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/DataError.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/DataProvider.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/DataProvider.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/Date.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/Date.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/DateFormatter.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/DateFormatter.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/DateLength.d.hpp (69%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/DateLength.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/DateTime.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/DateTime.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/DateTimeFormatter.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/DateTimeFormatter.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/Decomposed.d.hpp (50%)
 rename ffi/capi/bindings/cpp/{ => icu4x}/Decomposed.hpp (52%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/DecomposingNormalizer.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/DecomposingNormalizer.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/DisplayNamesFallback.d.hpp (65%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/DisplayNamesFallback.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/DisplayNamesOptionsV1.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/DisplayNamesOptionsV1.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/DisplayNamesStyle.d.hpp (70%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/DisplayNamesStyle.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/Error.d.hpp (88%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/Error.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/FixedDecimal.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/FixedDecimal.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/FixedDecimalFormatter.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/FixedDecimalFormatter.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/FixedDecimalGroupingStrategy.d.hpp (67%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/FixedDecimalGroupingStrategy.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/FixedDecimalLimitError.d.hpp (50%)
 rename ffi/capi/bindings/cpp/{ => icu4x}/FixedDecimalLimitError.hpp (59%)
 rename ffi/capi/bindings/cpp/{ => icu4x}/FixedDecimalParseError.d.hpp (66%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/FixedDecimalParseError.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/FixedDecimalRoundingIncrement.d.hpp (68%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/FixedDecimalRoundingIncrement.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/FixedDecimalRoundingMode.d.hpp (74%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/FixedDecimalRoundingMode.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/FixedDecimalSign.d.hpp (67%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/FixedDecimalSign.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/FixedDecimalSignDisplay.d.hpp (69%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/FixedDecimalSignDisplay.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/GeneralCategoryNameToMaskMapper.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/GeneralCategoryNameToMaskMapper.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorLatin1.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorLatin1.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorUtf16.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorUtf16.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorUtf8.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorUtf8.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/GraphemeClusterSegmenter.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/GraphemeClusterSegmenter.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/GregorianDateFormatter.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/GregorianDateFormatter.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/GregorianDateTimeFormatter.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/GregorianDateTimeFormatter.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/GregorianZonedDateTimeFormatter.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/GregorianZonedDateTimeFormatter.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/IsoDate.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/IsoDate.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/IsoDateTime.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/IsoDateTime.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/IsoTimeZoneFormat.d.hpp (69%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/IsoTimeZoneFormat.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/IsoTimeZoneMinuteDisplay.d.hpp (64%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/IsoTimeZoneMinuteDisplay.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/IsoTimeZoneOptions.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/IsoTimeZoneOptions.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/IsoTimeZoneSecondDisplay.d.hpp (64%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/IsoTimeZoneSecondDisplay.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/IsoWeekday.d.hpp (74%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/IsoWeekday.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/LanguageDisplay.d.hpp (66%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LanguageDisplay.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/LeadingAdjustment.d.hpp (67%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LeadingAdjustment.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LineBreakIteratorLatin1.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LineBreakIteratorLatin1.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LineBreakIteratorUtf16.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LineBreakIteratorUtf16.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LineBreakIteratorUtf8.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LineBreakIteratorUtf8.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LineBreakOptionsV1.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LineBreakOptionsV1.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/LineBreakStrictness.d.hpp (68%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LineBreakStrictness.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/LineBreakWordOption.d.hpp (67%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LineBreakWordOption.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LineSegmenter.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LineSegmenter.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/ListFormatter.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/ListFormatter.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/ListLength.d.hpp (68%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/ListLength.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/Locale.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/Locale.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LocaleCanonicalizer.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LocaleCanonicalizer.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/LocaleDirection.d.hpp (68%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LocaleDirection.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LocaleDirectionality.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LocaleDirectionality.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LocaleDisplayNamesFormatter.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LocaleDisplayNamesFormatter.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LocaleExpander.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LocaleExpander.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LocaleFallbackConfig.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LocaleFallbackConfig.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LocaleFallbackIterator.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LocaleFallbackIterator.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/LocaleFallbackPriority.d.hpp (67%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LocaleFallbackPriority.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/LocaleFallbackSupplement.d.hpp (64%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LocaleFallbackSupplement.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LocaleFallbacker.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LocaleFallbacker.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LocaleFallbackerWithConfig.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LocaleFallbackerWithConfig.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/LocaleParseError.d.hpp (69%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/LocaleParseError.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/Logger.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/Logger.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/MeasureUnit.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/MeasureUnit.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/MeasureUnitParser.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/MeasureUnitParser.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/MetazoneCalculator.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/MetazoneCalculator.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/PluralCategories.d.hpp (55%)
 rename ffi/capi/bindings/cpp/{ => icu4x}/PluralCategories.hpp (59%)
 rename ffi/capi/bindings/cpp/{ => icu4x}/PluralCategory.d.hpp (63%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/PluralCategory.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/PluralOperands.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/PluralOperands.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/PluralRules.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/PluralRules.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/PropertyValueNameToEnumMapper.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/PropertyValueNameToEnumMapper.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/RegionDisplayNames.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/RegionDisplayNames.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/ReorderedIndexMap.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/ReorderedIndexMap.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/ScriptExtensionsSet.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/ScriptExtensionsSet.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/ScriptWithExtensions.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/ScriptWithExtensions.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/ScriptWithExtensionsBorrowed.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/ScriptWithExtensionsBorrowed.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/SegmenterWordType.d.hpp (68%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/SegmenterWordType.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorLatin1.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorLatin1.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorUtf16.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorUtf16.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorUtf8.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorUtf8.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/SentenceSegmenter.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/SentenceSegmenter.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/Time.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/Time.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/TimeFormatter.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/TimeFormatter.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/TimeLength.d.hpp (69%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/TimeLength.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/TimeZoneFormatter.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/TimeZoneFormatter.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/TimeZoneIdMapper.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/TimeZoneIdMapper.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/TimeZoneIdMapperWithFastCanonicalization.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/TimeZoneIdMapperWithFastCanonicalization.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/TimeZoneInvalidIdError.d.hpp (50%)
 rename ffi/capi/bindings/cpp/{ => icu4x}/TimeZoneInvalidIdError.hpp (59%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/TimeZoneInvalidOffsetError.d.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/TimeZoneInvalidOffsetError.hpp (58%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/TitlecaseMapper.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/TitlecaseMapper.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/TitlecaseOptionsV1.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/TitlecaseOptionsV1.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/TrailingCase.d.hpp (67%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/TrailingCase.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/TransformResult.d.hpp (66%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/TransformResult.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/UnicodeSetData.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/UnicodeSetData.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/UnitsConverter.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/UnitsConverter.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/UnitsConverterFactory.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/UnitsConverterFactory.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/WeekCalculator.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/WeekCalculator.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/WeekOf.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/WeekOf.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/WeekRelativeUnit.d.hpp (67%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/WeekRelativeUnit.hpp
 rename ffi/capi/bindings/cpp/{ => icu4x}/WeekendContainsDay.d.hpp (58%)
 rename ffi/capi/bindings/cpp/{ => icu4x}/WeekendContainsDay.hpp (63%)
 create mode 100644 ffi/capi/bindings/cpp/icu4x/WordBreakIteratorLatin1.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/WordBreakIteratorLatin1.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/WordBreakIteratorUtf16.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/WordBreakIteratorUtf16.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/WordBreakIteratorUtf8.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/WordBreakIteratorUtf8.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/WordSegmenter.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/WordSegmenter.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/ZonedDateTimeFormatter.d.hpp
 create mode 100644 ffi/capi/bindings/cpp/icu4x/ZonedDateTimeFormatter.hpp

diff --git a/ffi/capi/bindings/cpp/AnyCalendarKind.hpp b/ffi/capi/bindings/cpp/AnyCalendarKind.hpp
deleted file mode 100644
index 14fb6b9003d..00000000000
--- a/ffi/capi/bindings/cpp/AnyCalendarKind.hpp
+++ /dev/null
@@ -1,81 +0,0 @@
-#ifndef AnyCalendarKind_HPP
-#define AnyCalendarKind_HPP
-
-#include "AnyCalendarKind.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "Locale.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_AnyCalendarKind_get_for_locale_mv1_result {union {diplomat::capi::AnyCalendarKind ok; }; bool is_ok;} icu4x_AnyCalendarKind_get_for_locale_mv1_result;
-    icu4x_AnyCalendarKind_get_for_locale_mv1_result icu4x_AnyCalendarKind_get_for_locale_mv1(const diplomat::capi::Locale* locale);
-    
-    typedef struct icu4x_AnyCalendarKind_get_for_bcp47_mv1_result {union {diplomat::capi::AnyCalendarKind ok; }; bool is_ok;} icu4x_AnyCalendarKind_get_for_bcp47_mv1_result;
-    icu4x_AnyCalendarKind_get_for_bcp47_mv1_result icu4x_AnyCalendarKind_get_for_bcp47_mv1(const char* s_data, size_t s_len);
-    
-    void icu4x_AnyCalendarKind_bcp47_mv1(diplomat::capi::AnyCalendarKind self, diplomat::capi::DiplomatWrite* write);
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::AnyCalendarKind AnyCalendarKind::AsFFI() const {
-  return static_cast<diplomat::capi::AnyCalendarKind>(value);
-}
-
-inline AnyCalendarKind AnyCalendarKind::FromFFI(diplomat::capi::AnyCalendarKind c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::AnyCalendarKind_Iso:
-    case diplomat::capi::AnyCalendarKind_Gregorian:
-    case diplomat::capi::AnyCalendarKind_Buddhist:
-    case diplomat::capi::AnyCalendarKind_Japanese:
-    case diplomat::capi::AnyCalendarKind_JapaneseExtended:
-    case diplomat::capi::AnyCalendarKind_Ethiopian:
-    case diplomat::capi::AnyCalendarKind_EthiopianAmeteAlem:
-    case diplomat::capi::AnyCalendarKind_Indian:
-    case diplomat::capi::AnyCalendarKind_Coptic:
-    case diplomat::capi::AnyCalendarKind_Dangi:
-    case diplomat::capi::AnyCalendarKind_Chinese:
-    case diplomat::capi::AnyCalendarKind_Hebrew:
-    case diplomat::capi::AnyCalendarKind_IslamicCivil:
-    case diplomat::capi::AnyCalendarKind_IslamicObservational:
-    case diplomat::capi::AnyCalendarKind_IslamicTabular:
-    case diplomat::capi::AnyCalendarKind_IslamicUmmAlQura:
-    case diplomat::capi::AnyCalendarKind_Persian:
-    case diplomat::capi::AnyCalendarKind_Roc:
-      return static_cast<AnyCalendarKind::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-
-inline std::optional<AnyCalendarKind> AnyCalendarKind::get_for_locale(const Locale& locale) {
-  auto result = diplomat::capi::icu4x_AnyCalendarKind_get_for_locale_mv1(locale.AsFFI());
-  return result.is_ok ? std::optional<AnyCalendarKind>(AnyCalendarKind::FromFFI(result.ok)) : std::nullopt;
-}
-
-inline std::optional<AnyCalendarKind> AnyCalendarKind::get_for_bcp47(std::string_view s) {
-  auto result = diplomat::capi::icu4x_AnyCalendarKind_get_for_bcp47_mv1(s.data(),
-    s.size());
-  return result.is_ok ? std::optional<AnyCalendarKind>(AnyCalendarKind::FromFFI(result.ok)) : std::nullopt;
-}
-
-inline std::string AnyCalendarKind::bcp47() {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_AnyCalendarKind_bcp47_mv1(this->AsFFI(),
-    &write);
-  return output;
-}
-#endif // AnyCalendarKind_HPP
diff --git a/ffi/capi/bindings/cpp/Bidi.d.hpp b/ffi/capi/bindings/cpp/Bidi.d.hpp
deleted file mode 100644
index 023af749d2d..00000000000
--- a/ffi/capi/bindings/cpp/Bidi.d.hpp
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef Bidi_D_HPP
-#define Bidi_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct BidiInfo; }
-class BidiInfo;
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct ReorderedIndexMap; }
-class ReorderedIndexMap;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct Bidi;
-} // namespace capi
-} // namespace
-
-class Bidi {
-public:
-
-  inline static diplomat::result<std::unique_ptr<Bidi>, DataError> create(const DataProvider& provider);
-
-  inline std::unique_ptr<BidiInfo> for_text(std::string_view text, uint8_t default_level) const;
-
-  inline std::unique_ptr<ReorderedIndexMap> reorder_visual(diplomat::span<const uint8_t> levels) const;
-
-  inline static bool level_is_rtl(uint8_t level);
-
-  inline static bool level_is_ltr(uint8_t level);
-
-  inline static uint8_t level_rtl();
-
-  inline static uint8_t level_ltr();
-
-  inline const diplomat::capi::Bidi* AsFFI() const;
-  inline diplomat::capi::Bidi* AsFFI();
-  inline static const Bidi* FromFFI(const diplomat::capi::Bidi* ptr);
-  inline static Bidi* FromFFI(diplomat::capi::Bidi* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  Bidi() = delete;
-  Bidi(const Bidi&) = delete;
-  Bidi(Bidi&&) noexcept = delete;
-  Bidi operator=(const Bidi&) = delete;
-  Bidi operator=(Bidi&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // Bidi_D_HPP
diff --git a/ffi/capi/bindings/cpp/Bidi.hpp b/ffi/capi/bindings/cpp/Bidi.hpp
deleted file mode 100644
index f08f458403b..00000000000
--- a/ffi/capi/bindings/cpp/Bidi.hpp
+++ /dev/null
@@ -1,106 +0,0 @@
-#ifndef Bidi_HPP
-#define Bidi_HPP
-
-#include "Bidi.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "BidiInfo.hpp"
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "ReorderedIndexMap.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_Bidi_create_mv1_result {union {diplomat::capi::Bidi* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_Bidi_create_mv1_result;
-    icu4x_Bidi_create_mv1_result icu4x_Bidi_create_mv1(const diplomat::capi::DataProvider* provider);
-    
-    diplomat::capi::BidiInfo* icu4x_Bidi_for_text_utf8_mv1(const diplomat::capi::Bidi* self, const char* text_data, size_t text_len, uint8_t default_level);
-    
-    diplomat::capi::ReorderedIndexMap* icu4x_Bidi_reorder_visual_mv1(const diplomat::capi::Bidi* self, const uint8_t* levels_data, size_t levels_len);
-    
-    bool icu4x_Bidi_level_is_rtl_mv1(uint8_t level);
-    
-    bool icu4x_Bidi_level_is_ltr_mv1(uint8_t level);
-    
-    uint8_t icu4x_Bidi_level_rtl_mv1(void);
-    
-    uint8_t icu4x_Bidi_level_ltr_mv1(void);
-    
-    
-    void icu4x_Bidi_destroy_mv1(Bidi* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<Bidi>, DataError> Bidi::create(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_Bidi_create_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<Bidi>, DataError>(diplomat::Ok<std::unique_ptr<Bidi>>(std::unique_ptr<Bidi>(Bidi::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<Bidi>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline std::unique_ptr<BidiInfo> Bidi::for_text(std::string_view text, uint8_t default_level) const {
-  auto result = diplomat::capi::icu4x_Bidi_for_text_utf8_mv1(this->AsFFI(),
-    text.data(),
-    text.size(),
-    default_level);
-  return std::unique_ptr<BidiInfo>(BidiInfo::FromFFI(result));
-}
-
-inline std::unique_ptr<ReorderedIndexMap> Bidi::reorder_visual(diplomat::span<const uint8_t> levels) const {
-  auto result = diplomat::capi::icu4x_Bidi_reorder_visual_mv1(this->AsFFI(),
-    levels.data(),
-    levels.size());
-  return std::unique_ptr<ReorderedIndexMap>(ReorderedIndexMap::FromFFI(result));
-}
-
-inline bool Bidi::level_is_rtl(uint8_t level) {
-  auto result = diplomat::capi::icu4x_Bidi_level_is_rtl_mv1(level);
-  return result;
-}
-
-inline bool Bidi::level_is_ltr(uint8_t level) {
-  auto result = diplomat::capi::icu4x_Bidi_level_is_ltr_mv1(level);
-  return result;
-}
-
-inline uint8_t Bidi::level_rtl() {
-  auto result = diplomat::capi::icu4x_Bidi_level_rtl_mv1();
-  return result;
-}
-
-inline uint8_t Bidi::level_ltr() {
-  auto result = diplomat::capi::icu4x_Bidi_level_ltr_mv1();
-  return result;
-}
-
-inline const diplomat::capi::Bidi* Bidi::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::Bidi*>(this);
-}
-
-inline diplomat::capi::Bidi* Bidi::AsFFI() {
-  return reinterpret_cast<diplomat::capi::Bidi*>(this);
-}
-
-inline const Bidi* Bidi::FromFFI(const diplomat::capi::Bidi* ptr) {
-  return reinterpret_cast<const Bidi*>(ptr);
-}
-
-inline Bidi* Bidi::FromFFI(diplomat::capi::Bidi* ptr) {
-  return reinterpret_cast<Bidi*>(ptr);
-}
-
-inline void Bidi::operator delete(void* ptr) {
-  diplomat::capi::icu4x_Bidi_destroy_mv1(reinterpret_cast<diplomat::capi::Bidi*>(ptr));
-}
-
-
-#endif // Bidi_HPP
diff --git a/ffi/capi/bindings/cpp/BidiDirection.hpp b/ffi/capi/bindings/cpp/BidiDirection.hpp
deleted file mode 100644
index 3e428fbd760..00000000000
--- a/ffi/capi/bindings/cpp/BidiDirection.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef BidiDirection_HPP
-#define BidiDirection_HPP
-
-#include "BidiDirection.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::BidiDirection BidiDirection::AsFFI() const {
-  return static_cast<diplomat::capi::BidiDirection>(value);
-}
-
-inline BidiDirection BidiDirection::FromFFI(diplomat::capi::BidiDirection c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::BidiDirection_Ltr:
-    case diplomat::capi::BidiDirection_Rtl:
-    case diplomat::capi::BidiDirection_Mixed:
-      return static_cast<BidiDirection::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // BidiDirection_HPP
diff --git a/ffi/capi/bindings/cpp/BidiInfo.d.hpp b/ffi/capi/bindings/cpp/BidiInfo.d.hpp
deleted file mode 100644
index c96d6f980d1..00000000000
--- a/ffi/capi/bindings/cpp/BidiInfo.d.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef BidiInfo_D_HPP
-#define BidiInfo_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct BidiParagraph; }
-class BidiParagraph;
-
-
-namespace diplomat {
-namespace capi {
-    struct BidiInfo;
-} // namespace capi
-} // namespace
-
-class BidiInfo {
-public:
-
-  inline size_t paragraph_count() const;
-
-  inline std::unique_ptr<BidiParagraph> paragraph_at(size_t n) const;
-
-  inline size_t size() const;
-
-  inline uint8_t level_at(size_t pos) const;
-
-  inline const diplomat::capi::BidiInfo* AsFFI() const;
-  inline diplomat::capi::BidiInfo* AsFFI();
-  inline static const BidiInfo* FromFFI(const diplomat::capi::BidiInfo* ptr);
-  inline static BidiInfo* FromFFI(diplomat::capi::BidiInfo* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  BidiInfo() = delete;
-  BidiInfo(const BidiInfo&) = delete;
-  BidiInfo(BidiInfo&&) noexcept = delete;
-  BidiInfo operator=(const BidiInfo&) = delete;
-  BidiInfo operator=(BidiInfo&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // BidiInfo_D_HPP
diff --git a/ffi/capi/bindings/cpp/BidiInfo.hpp b/ffi/capi/bindings/cpp/BidiInfo.hpp
deleted file mode 100644
index 0a66d81c7cc..00000000000
--- a/ffi/capi/bindings/cpp/BidiInfo.hpp
+++ /dev/null
@@ -1,78 +0,0 @@
-#ifndef BidiInfo_HPP
-#define BidiInfo_HPP
-
-#include "BidiInfo.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "BidiParagraph.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    size_t icu4x_BidiInfo_paragraph_count_mv1(const diplomat::capi::BidiInfo* self);
-    
-    diplomat::capi::BidiParagraph* icu4x_BidiInfo_paragraph_at_mv1(const diplomat::capi::BidiInfo* self, size_t n);
-    
-    size_t icu4x_BidiInfo_size_mv1(const diplomat::capi::BidiInfo* self);
-    
-    uint8_t icu4x_BidiInfo_level_at_mv1(const diplomat::capi::BidiInfo* self, size_t pos);
-    
-    
-    void icu4x_BidiInfo_destroy_mv1(BidiInfo* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline size_t BidiInfo::paragraph_count() const {
-  auto result = diplomat::capi::icu4x_BidiInfo_paragraph_count_mv1(this->AsFFI());
-  return result;
-}
-
-inline std::unique_ptr<BidiParagraph> BidiInfo::paragraph_at(size_t n) const {
-  auto result = diplomat::capi::icu4x_BidiInfo_paragraph_at_mv1(this->AsFFI(),
-    n);
-  return std::unique_ptr<BidiParagraph>(BidiParagraph::FromFFI(result));
-}
-
-inline size_t BidiInfo::size() const {
-  auto result = diplomat::capi::icu4x_BidiInfo_size_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint8_t BidiInfo::level_at(size_t pos) const {
-  auto result = diplomat::capi::icu4x_BidiInfo_level_at_mv1(this->AsFFI(),
-    pos);
-  return result;
-}
-
-inline const diplomat::capi::BidiInfo* BidiInfo::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::BidiInfo*>(this);
-}
-
-inline diplomat::capi::BidiInfo* BidiInfo::AsFFI() {
-  return reinterpret_cast<diplomat::capi::BidiInfo*>(this);
-}
-
-inline const BidiInfo* BidiInfo::FromFFI(const diplomat::capi::BidiInfo* ptr) {
-  return reinterpret_cast<const BidiInfo*>(ptr);
-}
-
-inline BidiInfo* BidiInfo::FromFFI(diplomat::capi::BidiInfo* ptr) {
-  return reinterpret_cast<BidiInfo*>(ptr);
-}
-
-inline void BidiInfo::operator delete(void* ptr) {
-  diplomat::capi::icu4x_BidiInfo_destroy_mv1(reinterpret_cast<diplomat::capi::BidiInfo*>(ptr));
-}
-
-
-#endif // BidiInfo_HPP
diff --git a/ffi/capi/bindings/cpp/BidiParagraph.d.hpp b/ffi/capi/bindings/cpp/BidiParagraph.d.hpp
deleted file mode 100644
index f4a1c24188d..00000000000
--- a/ffi/capi/bindings/cpp/BidiParagraph.d.hpp
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef BidiParagraph_D_HPP
-#define BidiParagraph_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-class BidiDirection;
-
-
-namespace diplomat {
-namespace capi {
-    struct BidiParagraph;
-} // namespace capi
-} // namespace
-
-class BidiParagraph {
-public:
-
-  inline bool set_paragraph_in_text(size_t n);
-
-  inline BidiDirection direction() const;
-
-  inline size_t size() const;
-
-  inline size_t range_start() const;
-
-  inline size_t range_end() const;
-
-  inline std::optional<std::string> reorder_line(size_t range_start, size_t range_end) const;
-
-  inline uint8_t level_at(size_t pos) const;
-
-  inline const diplomat::capi::BidiParagraph* AsFFI() const;
-  inline diplomat::capi::BidiParagraph* AsFFI();
-  inline static const BidiParagraph* FromFFI(const diplomat::capi::BidiParagraph* ptr);
-  inline static BidiParagraph* FromFFI(diplomat::capi::BidiParagraph* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  BidiParagraph() = delete;
-  BidiParagraph(const BidiParagraph&) = delete;
-  BidiParagraph(BidiParagraph&&) noexcept = delete;
-  BidiParagraph operator=(const BidiParagraph&) = delete;
-  BidiParagraph operator=(BidiParagraph&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // BidiParagraph_D_HPP
diff --git a/ffi/capi/bindings/cpp/BidiParagraph.hpp b/ffi/capi/bindings/cpp/BidiParagraph.hpp
deleted file mode 100644
index e5dc3b8828f..00000000000
--- a/ffi/capi/bindings/cpp/BidiParagraph.hpp
+++ /dev/null
@@ -1,105 +0,0 @@
-#ifndef BidiParagraph_HPP
-#define BidiParagraph_HPP
-
-#include "BidiParagraph.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "BidiDirection.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    bool icu4x_BidiParagraph_set_paragraph_in_text_mv1(diplomat::capi::BidiParagraph* self, size_t n);
-    
-    diplomat::capi::BidiDirection icu4x_BidiParagraph_direction_mv1(const diplomat::capi::BidiParagraph* self);
-    
-    size_t icu4x_BidiParagraph_size_mv1(const diplomat::capi::BidiParagraph* self);
-    
-    size_t icu4x_BidiParagraph_range_start_mv1(const diplomat::capi::BidiParagraph* self);
-    
-    size_t icu4x_BidiParagraph_range_end_mv1(const diplomat::capi::BidiParagraph* self);
-    
-    typedef struct icu4x_BidiParagraph_reorder_line_mv1_result { bool is_ok;} icu4x_BidiParagraph_reorder_line_mv1_result;
-    icu4x_BidiParagraph_reorder_line_mv1_result icu4x_BidiParagraph_reorder_line_mv1(const diplomat::capi::BidiParagraph* self, size_t range_start, size_t range_end, diplomat::capi::DiplomatWrite* write);
-    
-    uint8_t icu4x_BidiParagraph_level_at_mv1(const diplomat::capi::BidiParagraph* self, size_t pos);
-    
-    
-    void icu4x_BidiParagraph_destroy_mv1(BidiParagraph* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline bool BidiParagraph::set_paragraph_in_text(size_t n) {
-  auto result = diplomat::capi::icu4x_BidiParagraph_set_paragraph_in_text_mv1(this->AsFFI(),
-    n);
-  return result;
-}
-
-inline BidiDirection BidiParagraph::direction() const {
-  auto result = diplomat::capi::icu4x_BidiParagraph_direction_mv1(this->AsFFI());
-  return BidiDirection::FromFFI(result);
-}
-
-inline size_t BidiParagraph::size() const {
-  auto result = diplomat::capi::icu4x_BidiParagraph_size_mv1(this->AsFFI());
-  return result;
-}
-
-inline size_t BidiParagraph::range_start() const {
-  auto result = diplomat::capi::icu4x_BidiParagraph_range_start_mv1(this->AsFFI());
-  return result;
-}
-
-inline size_t BidiParagraph::range_end() const {
-  auto result = diplomat::capi::icu4x_BidiParagraph_range_end_mv1(this->AsFFI());
-  return result;
-}
-
-inline std::optional<std::string> BidiParagraph::reorder_line(size_t range_start, size_t range_end) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_BidiParagraph_reorder_line_mv1(this->AsFFI(),
-    range_start,
-    range_end,
-    &write);
-  return result.is_ok ? std::optional<std::string>(std::move(output)) : std::nullopt;
-}
-
-inline uint8_t BidiParagraph::level_at(size_t pos) const {
-  auto result = diplomat::capi::icu4x_BidiParagraph_level_at_mv1(this->AsFFI(),
-    pos);
-  return result;
-}
-
-inline const diplomat::capi::BidiParagraph* BidiParagraph::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::BidiParagraph*>(this);
-}
-
-inline diplomat::capi::BidiParagraph* BidiParagraph::AsFFI() {
-  return reinterpret_cast<diplomat::capi::BidiParagraph*>(this);
-}
-
-inline const BidiParagraph* BidiParagraph::FromFFI(const diplomat::capi::BidiParagraph* ptr) {
-  return reinterpret_cast<const BidiParagraph*>(ptr);
-}
-
-inline BidiParagraph* BidiParagraph::FromFFI(diplomat::capi::BidiParagraph* ptr) {
-  return reinterpret_cast<BidiParagraph*>(ptr);
-}
-
-inline void BidiParagraph::operator delete(void* ptr) {
-  diplomat::capi::icu4x_BidiParagraph_destroy_mv1(reinterpret_cast<diplomat::capi::BidiParagraph*>(ptr));
-}
-
-
-#endif // BidiParagraph_HPP
diff --git a/ffi/capi/bindings/cpp/Calendar.d.hpp b/ffi/capi/bindings/cpp/Calendar.d.hpp
deleted file mode 100644
index 9ef02b2f2b1..00000000000
--- a/ffi/capi/bindings/cpp/Calendar.d.hpp
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef Calendar_D_HPP
-#define Calendar_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-class AnyCalendarKind;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct Calendar;
-} // namespace capi
-} // namespace
-
-class Calendar {
-public:
-
-  inline static diplomat::result<std::unique_ptr<Calendar>, DataError> create_for_locale(const DataProvider& provider, const Locale& locale);
-
-  inline static diplomat::result<std::unique_ptr<Calendar>, DataError> create_for_kind(const DataProvider& provider, AnyCalendarKind kind);
-
-  inline AnyCalendarKind kind() const;
-
-  inline const diplomat::capi::Calendar* AsFFI() const;
-  inline diplomat::capi::Calendar* AsFFI();
-  inline static const Calendar* FromFFI(const diplomat::capi::Calendar* ptr);
-  inline static Calendar* FromFFI(diplomat::capi::Calendar* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  Calendar() = delete;
-  Calendar(const Calendar&) = delete;
-  Calendar(Calendar&&) noexcept = delete;
-  Calendar operator=(const Calendar&) = delete;
-  Calendar operator=(Calendar&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // Calendar_D_HPP
diff --git a/ffi/capi/bindings/cpp/Calendar.hpp b/ffi/capi/bindings/cpp/Calendar.hpp
deleted file mode 100644
index 6fc4014ba39..00000000000
--- a/ffi/capi/bindings/cpp/Calendar.hpp
+++ /dev/null
@@ -1,76 +0,0 @@
-#ifndef Calendar_HPP
-#define Calendar_HPP
-
-#include "Calendar.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "AnyCalendarKind.hpp"
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "Locale.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_Calendar_create_for_locale_mv1_result {union {diplomat::capi::Calendar* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_Calendar_create_for_locale_mv1_result;
-    icu4x_Calendar_create_for_locale_mv1_result icu4x_Calendar_create_for_locale_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale);
-    
-    typedef struct icu4x_Calendar_create_for_kind_mv1_result {union {diplomat::capi::Calendar* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_Calendar_create_for_kind_mv1_result;
-    icu4x_Calendar_create_for_kind_mv1_result icu4x_Calendar_create_for_kind_mv1(const diplomat::capi::DataProvider* provider, diplomat::capi::AnyCalendarKind kind);
-    
-    diplomat::capi::AnyCalendarKind icu4x_Calendar_kind_mv1(const diplomat::capi::Calendar* self);
-    
-    
-    void icu4x_Calendar_destroy_mv1(Calendar* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<Calendar>, DataError> Calendar::create_for_locale(const DataProvider& provider, const Locale& locale) {
-  auto result = diplomat::capi::icu4x_Calendar_create_for_locale_mv1(provider.AsFFI(),
-    locale.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<Calendar>, DataError>(diplomat::Ok<std::unique_ptr<Calendar>>(std::unique_ptr<Calendar>(Calendar::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<Calendar>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<Calendar>, DataError> Calendar::create_for_kind(const DataProvider& provider, AnyCalendarKind kind) {
-  auto result = diplomat::capi::icu4x_Calendar_create_for_kind_mv1(provider.AsFFI(),
-    kind.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<Calendar>, DataError>(diplomat::Ok<std::unique_ptr<Calendar>>(std::unique_ptr<Calendar>(Calendar::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<Calendar>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline AnyCalendarKind Calendar::kind() const {
-  auto result = diplomat::capi::icu4x_Calendar_kind_mv1(this->AsFFI());
-  return AnyCalendarKind::FromFFI(result);
-}
-
-inline const diplomat::capi::Calendar* Calendar::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::Calendar*>(this);
-}
-
-inline diplomat::capi::Calendar* Calendar::AsFFI() {
-  return reinterpret_cast<diplomat::capi::Calendar*>(this);
-}
-
-inline const Calendar* Calendar::FromFFI(const diplomat::capi::Calendar* ptr) {
-  return reinterpret_cast<const Calendar*>(ptr);
-}
-
-inline Calendar* Calendar::FromFFI(diplomat::capi::Calendar* ptr) {
-  return reinterpret_cast<Calendar*>(ptr);
-}
-
-inline void Calendar::operator delete(void* ptr) {
-  diplomat::capi::icu4x_Calendar_destroy_mv1(reinterpret_cast<diplomat::capi::Calendar*>(ptr));
-}
-
-
-#endif // Calendar_HPP
diff --git a/ffi/capi/bindings/cpp/CalendarError.hpp b/ffi/capi/bindings/cpp/CalendarError.hpp
deleted file mode 100644
index 838dc241dc0..00000000000
--- a/ffi/capi/bindings/cpp/CalendarError.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef CalendarError_HPP
-#define CalendarError_HPP
-
-#include "CalendarError.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::CalendarError CalendarError::AsFFI() const {
-  return static_cast<diplomat::capi::CalendarError>(value);
-}
-
-inline CalendarError CalendarError::FromFFI(diplomat::capi::CalendarError c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::CalendarError_Unknown:
-    case diplomat::capi::CalendarError_OutOfRange:
-    case diplomat::capi::CalendarError_UnknownEra:
-    case diplomat::capi::CalendarError_UnknownMonthCode:
-      return static_cast<CalendarError::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // CalendarError_HPP
diff --git a/ffi/capi/bindings/cpp/CalendarParseError.hpp b/ffi/capi/bindings/cpp/CalendarParseError.hpp
deleted file mode 100644
index 4d62a27ca85..00000000000
--- a/ffi/capi/bindings/cpp/CalendarParseError.hpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef CalendarParseError_HPP
-#define CalendarParseError_HPP
-
-#include "CalendarParseError.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::CalendarParseError CalendarParseError::AsFFI() const {
-  return static_cast<diplomat::capi::CalendarParseError>(value);
-}
-
-inline CalendarParseError CalendarParseError::FromFFI(diplomat::capi::CalendarParseError c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::CalendarParseError_Unknown:
-    case diplomat::capi::CalendarParseError_InvalidSyntax:
-    case diplomat::capi::CalendarParseError_OutOfRange:
-    case diplomat::capi::CalendarParseError_MissingFields:
-    case diplomat::capi::CalendarParseError_UnknownCalendar:
-      return static_cast<CalendarParseError::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // CalendarParseError_HPP
diff --git a/ffi/capi/bindings/cpp/CanonicalCombiningClassMap.d.hpp b/ffi/capi/bindings/cpp/CanonicalCombiningClassMap.d.hpp
deleted file mode 100644
index eaf45434b47..00000000000
--- a/ffi/capi/bindings/cpp/CanonicalCombiningClassMap.d.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef CanonicalCombiningClassMap_D_HPP
-#define CanonicalCombiningClassMap_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct CanonicalCombiningClassMap;
-} // namespace capi
-} // namespace
-
-class CanonicalCombiningClassMap {
-public:
-
-  inline static diplomat::result<std::unique_ptr<CanonicalCombiningClassMap>, DataError> create(const DataProvider& provider);
-
-  inline uint8_t get(char32_t ch) const;
-
-  inline const diplomat::capi::CanonicalCombiningClassMap* AsFFI() const;
-  inline diplomat::capi::CanonicalCombiningClassMap* AsFFI();
-  inline static const CanonicalCombiningClassMap* FromFFI(const diplomat::capi::CanonicalCombiningClassMap* ptr);
-  inline static CanonicalCombiningClassMap* FromFFI(diplomat::capi::CanonicalCombiningClassMap* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  CanonicalCombiningClassMap() = delete;
-  CanonicalCombiningClassMap(const CanonicalCombiningClassMap&) = delete;
-  CanonicalCombiningClassMap(CanonicalCombiningClassMap&&) noexcept = delete;
-  CanonicalCombiningClassMap operator=(const CanonicalCombiningClassMap&) = delete;
-  CanonicalCombiningClassMap operator=(CanonicalCombiningClassMap&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // CanonicalCombiningClassMap_D_HPP
diff --git a/ffi/capi/bindings/cpp/CanonicalCombiningClassMap.hpp b/ffi/capi/bindings/cpp/CanonicalCombiningClassMap.hpp
deleted file mode 100644
index 6a763422ad7..00000000000
--- a/ffi/capi/bindings/cpp/CanonicalCombiningClassMap.hpp
+++ /dev/null
@@ -1,65 +0,0 @@
-#ifndef CanonicalCombiningClassMap_HPP
-#define CanonicalCombiningClassMap_HPP
-
-#include "CanonicalCombiningClassMap.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_CanonicalCombiningClassMap_create_mv1_result {union {diplomat::capi::CanonicalCombiningClassMap* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CanonicalCombiningClassMap_create_mv1_result;
-    icu4x_CanonicalCombiningClassMap_create_mv1_result icu4x_CanonicalCombiningClassMap_create_mv1(const diplomat::capi::DataProvider* provider);
-    
-    uint8_t icu4x_CanonicalCombiningClassMap_get_mv1(const diplomat::capi::CanonicalCombiningClassMap* self, char32_t ch);
-    
-    
-    void icu4x_CanonicalCombiningClassMap_destroy_mv1(CanonicalCombiningClassMap* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<CanonicalCombiningClassMap>, DataError> CanonicalCombiningClassMap::create(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CanonicalCombiningClassMap_create_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CanonicalCombiningClassMap>, DataError>(diplomat::Ok<std::unique_ptr<CanonicalCombiningClassMap>>(std::unique_ptr<CanonicalCombiningClassMap>(CanonicalCombiningClassMap::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CanonicalCombiningClassMap>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline uint8_t CanonicalCombiningClassMap::get(char32_t ch) const {
-  auto result = diplomat::capi::icu4x_CanonicalCombiningClassMap_get_mv1(this->AsFFI(),
-    ch);
-  return result;
-}
-
-inline const diplomat::capi::CanonicalCombiningClassMap* CanonicalCombiningClassMap::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::CanonicalCombiningClassMap*>(this);
-}
-
-inline diplomat::capi::CanonicalCombiningClassMap* CanonicalCombiningClassMap::AsFFI() {
-  return reinterpret_cast<diplomat::capi::CanonicalCombiningClassMap*>(this);
-}
-
-inline const CanonicalCombiningClassMap* CanonicalCombiningClassMap::FromFFI(const diplomat::capi::CanonicalCombiningClassMap* ptr) {
-  return reinterpret_cast<const CanonicalCombiningClassMap*>(ptr);
-}
-
-inline CanonicalCombiningClassMap* CanonicalCombiningClassMap::FromFFI(diplomat::capi::CanonicalCombiningClassMap* ptr) {
-  return reinterpret_cast<CanonicalCombiningClassMap*>(ptr);
-}
-
-inline void CanonicalCombiningClassMap::operator delete(void* ptr) {
-  diplomat::capi::icu4x_CanonicalCombiningClassMap_destroy_mv1(reinterpret_cast<diplomat::capi::CanonicalCombiningClassMap*>(ptr));
-}
-
-
-#endif // CanonicalCombiningClassMap_HPP
diff --git a/ffi/capi/bindings/cpp/CanonicalComposition.d.hpp b/ffi/capi/bindings/cpp/CanonicalComposition.d.hpp
deleted file mode 100644
index ec09fbe36cc..00000000000
--- a/ffi/capi/bindings/cpp/CanonicalComposition.d.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef CanonicalComposition_D_HPP
-#define CanonicalComposition_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct CanonicalComposition;
-} // namespace capi
-} // namespace
-
-class CanonicalComposition {
-public:
-
-  inline static diplomat::result<std::unique_ptr<CanonicalComposition>, DataError> create(const DataProvider& provider);
-
-  inline char32_t compose(char32_t starter, char32_t second) const;
-
-  inline const diplomat::capi::CanonicalComposition* AsFFI() const;
-  inline diplomat::capi::CanonicalComposition* AsFFI();
-  inline static const CanonicalComposition* FromFFI(const diplomat::capi::CanonicalComposition* ptr);
-  inline static CanonicalComposition* FromFFI(diplomat::capi::CanonicalComposition* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  CanonicalComposition() = delete;
-  CanonicalComposition(const CanonicalComposition&) = delete;
-  CanonicalComposition(CanonicalComposition&&) noexcept = delete;
-  CanonicalComposition operator=(const CanonicalComposition&) = delete;
-  CanonicalComposition operator=(CanonicalComposition&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // CanonicalComposition_D_HPP
diff --git a/ffi/capi/bindings/cpp/CanonicalComposition.hpp b/ffi/capi/bindings/cpp/CanonicalComposition.hpp
deleted file mode 100644
index 9631407bbbe..00000000000
--- a/ffi/capi/bindings/cpp/CanonicalComposition.hpp
+++ /dev/null
@@ -1,66 +0,0 @@
-#ifndef CanonicalComposition_HPP
-#define CanonicalComposition_HPP
-
-#include "CanonicalComposition.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_CanonicalComposition_create_mv1_result {union {diplomat::capi::CanonicalComposition* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CanonicalComposition_create_mv1_result;
-    icu4x_CanonicalComposition_create_mv1_result icu4x_CanonicalComposition_create_mv1(const diplomat::capi::DataProvider* provider);
-    
-    char32_t icu4x_CanonicalComposition_compose_mv1(const diplomat::capi::CanonicalComposition* self, char32_t starter, char32_t second);
-    
-    
-    void icu4x_CanonicalComposition_destroy_mv1(CanonicalComposition* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<CanonicalComposition>, DataError> CanonicalComposition::create(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CanonicalComposition_create_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CanonicalComposition>, DataError>(diplomat::Ok<std::unique_ptr<CanonicalComposition>>(std::unique_ptr<CanonicalComposition>(CanonicalComposition::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CanonicalComposition>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline char32_t CanonicalComposition::compose(char32_t starter, char32_t second) const {
-  auto result = diplomat::capi::icu4x_CanonicalComposition_compose_mv1(this->AsFFI(),
-    starter,
-    second);
-  return result;
-}
-
-inline const diplomat::capi::CanonicalComposition* CanonicalComposition::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::CanonicalComposition*>(this);
-}
-
-inline diplomat::capi::CanonicalComposition* CanonicalComposition::AsFFI() {
-  return reinterpret_cast<diplomat::capi::CanonicalComposition*>(this);
-}
-
-inline const CanonicalComposition* CanonicalComposition::FromFFI(const diplomat::capi::CanonicalComposition* ptr) {
-  return reinterpret_cast<const CanonicalComposition*>(ptr);
-}
-
-inline CanonicalComposition* CanonicalComposition::FromFFI(diplomat::capi::CanonicalComposition* ptr) {
-  return reinterpret_cast<CanonicalComposition*>(ptr);
-}
-
-inline void CanonicalComposition::operator delete(void* ptr) {
-  diplomat::capi::icu4x_CanonicalComposition_destroy_mv1(reinterpret_cast<diplomat::capi::CanonicalComposition*>(ptr));
-}
-
-
-#endif // CanonicalComposition_HPP
diff --git a/ffi/capi/bindings/cpp/CanonicalDecomposition.d.hpp b/ffi/capi/bindings/cpp/CanonicalDecomposition.d.hpp
deleted file mode 100644
index 13278a23213..00000000000
--- a/ffi/capi/bindings/cpp/CanonicalDecomposition.d.hpp
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef CanonicalDecomposition_D_HPP
-#define CanonicalDecomposition_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-struct Decomposed;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct CanonicalDecomposition;
-} // namespace capi
-} // namespace
-
-class CanonicalDecomposition {
-public:
-
-  inline static diplomat::result<std::unique_ptr<CanonicalDecomposition>, DataError> create(const DataProvider& provider);
-
-  inline Decomposed decompose(char32_t c) const;
-
-  inline const diplomat::capi::CanonicalDecomposition* AsFFI() const;
-  inline diplomat::capi::CanonicalDecomposition* AsFFI();
-  inline static const CanonicalDecomposition* FromFFI(const diplomat::capi::CanonicalDecomposition* ptr);
-  inline static CanonicalDecomposition* FromFFI(diplomat::capi::CanonicalDecomposition* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  CanonicalDecomposition() = delete;
-  CanonicalDecomposition(const CanonicalDecomposition&) = delete;
-  CanonicalDecomposition(CanonicalDecomposition&&) noexcept = delete;
-  CanonicalDecomposition operator=(const CanonicalDecomposition&) = delete;
-  CanonicalDecomposition operator=(CanonicalDecomposition&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // CanonicalDecomposition_D_HPP
diff --git a/ffi/capi/bindings/cpp/CanonicalDecomposition.hpp b/ffi/capi/bindings/cpp/CanonicalDecomposition.hpp
deleted file mode 100644
index 5be84a5bbb0..00000000000
--- a/ffi/capi/bindings/cpp/CanonicalDecomposition.hpp
+++ /dev/null
@@ -1,66 +0,0 @@
-#ifndef CanonicalDecomposition_HPP
-#define CanonicalDecomposition_HPP
-
-#include "CanonicalDecomposition.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "Decomposed.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_CanonicalDecomposition_create_mv1_result {union {diplomat::capi::CanonicalDecomposition* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CanonicalDecomposition_create_mv1_result;
-    icu4x_CanonicalDecomposition_create_mv1_result icu4x_CanonicalDecomposition_create_mv1(const diplomat::capi::DataProvider* provider);
-    
-    diplomat::capi::Decomposed icu4x_CanonicalDecomposition_decompose_mv1(const diplomat::capi::CanonicalDecomposition* self, char32_t c);
-    
-    
-    void icu4x_CanonicalDecomposition_destroy_mv1(CanonicalDecomposition* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<CanonicalDecomposition>, DataError> CanonicalDecomposition::create(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CanonicalDecomposition_create_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CanonicalDecomposition>, DataError>(diplomat::Ok<std::unique_ptr<CanonicalDecomposition>>(std::unique_ptr<CanonicalDecomposition>(CanonicalDecomposition::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CanonicalDecomposition>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline Decomposed CanonicalDecomposition::decompose(char32_t c) const {
-  auto result = diplomat::capi::icu4x_CanonicalDecomposition_decompose_mv1(this->AsFFI(),
-    c);
-  return Decomposed::FromFFI(result);
-}
-
-inline const diplomat::capi::CanonicalDecomposition* CanonicalDecomposition::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::CanonicalDecomposition*>(this);
-}
-
-inline diplomat::capi::CanonicalDecomposition* CanonicalDecomposition::AsFFI() {
-  return reinterpret_cast<diplomat::capi::CanonicalDecomposition*>(this);
-}
-
-inline const CanonicalDecomposition* CanonicalDecomposition::FromFFI(const diplomat::capi::CanonicalDecomposition* ptr) {
-  return reinterpret_cast<const CanonicalDecomposition*>(ptr);
-}
-
-inline CanonicalDecomposition* CanonicalDecomposition::FromFFI(diplomat::capi::CanonicalDecomposition* ptr) {
-  return reinterpret_cast<CanonicalDecomposition*>(ptr);
-}
-
-inline void CanonicalDecomposition::operator delete(void* ptr) {
-  diplomat::capi::icu4x_CanonicalDecomposition_destroy_mv1(reinterpret_cast<diplomat::capi::CanonicalDecomposition*>(ptr));
-}
-
-
-#endif // CanonicalDecomposition_HPP
diff --git a/ffi/capi/bindings/cpp/CaseMapCloser.d.hpp b/ffi/capi/bindings/cpp/CaseMapCloser.d.hpp
deleted file mode 100644
index a4d2ab2422c..00000000000
--- a/ffi/capi/bindings/cpp/CaseMapCloser.d.hpp
+++ /dev/null
@@ -1,49 +0,0 @@
-#ifndef CaseMapCloser_D_HPP
-#define CaseMapCloser_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct CodePointSetBuilder; }
-class CodePointSetBuilder;
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct CaseMapCloser;
-} // namespace capi
-} // namespace
-
-class CaseMapCloser {
-public:
-
-  inline static diplomat::result<std::unique_ptr<CaseMapCloser>, DataError> create(const DataProvider& provider);
-
-  inline void add_case_closure_to(char32_t c, CodePointSetBuilder& builder) const;
-
-  inline bool add_string_case_closure_to(std::string_view s, CodePointSetBuilder& builder) const;
-
-  inline const diplomat::capi::CaseMapCloser* AsFFI() const;
-  inline diplomat::capi::CaseMapCloser* AsFFI();
-  inline static const CaseMapCloser* FromFFI(const diplomat::capi::CaseMapCloser* ptr);
-  inline static CaseMapCloser* FromFFI(diplomat::capi::CaseMapCloser* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  CaseMapCloser() = delete;
-  CaseMapCloser(const CaseMapCloser&) = delete;
-  CaseMapCloser(CaseMapCloser&&) noexcept = delete;
-  CaseMapCloser operator=(const CaseMapCloser&) = delete;
-  CaseMapCloser operator=(CaseMapCloser&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // CaseMapCloser_D_HPP
diff --git a/ffi/capi/bindings/cpp/CaseMapCloser.hpp b/ffi/capi/bindings/cpp/CaseMapCloser.hpp
deleted file mode 100644
index 856db551bf5..00000000000
--- a/ffi/capi/bindings/cpp/CaseMapCloser.hpp
+++ /dev/null
@@ -1,76 +0,0 @@
-#ifndef CaseMapCloser_HPP
-#define CaseMapCloser_HPP
-
-#include "CaseMapCloser.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "CodePointSetBuilder.hpp"
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_CaseMapCloser_create_mv1_result {union {diplomat::capi::CaseMapCloser* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CaseMapCloser_create_mv1_result;
-    icu4x_CaseMapCloser_create_mv1_result icu4x_CaseMapCloser_create_mv1(const diplomat::capi::DataProvider* provider);
-    
-    void icu4x_CaseMapCloser_add_case_closure_to_mv1(const diplomat::capi::CaseMapCloser* self, char32_t c, diplomat::capi::CodePointSetBuilder* builder);
-    
-    bool icu4x_CaseMapCloser_add_string_case_closure_to_mv1(const diplomat::capi::CaseMapCloser* self, const char* s_data, size_t s_len, diplomat::capi::CodePointSetBuilder* builder);
-    
-    
-    void icu4x_CaseMapCloser_destroy_mv1(CaseMapCloser* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<CaseMapCloser>, DataError> CaseMapCloser::create(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CaseMapCloser_create_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CaseMapCloser>, DataError>(diplomat::Ok<std::unique_ptr<CaseMapCloser>>(std::unique_ptr<CaseMapCloser>(CaseMapCloser::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CaseMapCloser>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline void CaseMapCloser::add_case_closure_to(char32_t c, CodePointSetBuilder& builder) const {
-  diplomat::capi::icu4x_CaseMapCloser_add_case_closure_to_mv1(this->AsFFI(),
-    c,
-    builder.AsFFI());
-}
-
-inline bool CaseMapCloser::add_string_case_closure_to(std::string_view s, CodePointSetBuilder& builder) const {
-  auto result = diplomat::capi::icu4x_CaseMapCloser_add_string_case_closure_to_mv1(this->AsFFI(),
-    s.data(),
-    s.size(),
-    builder.AsFFI());
-  return result;
-}
-
-inline const diplomat::capi::CaseMapCloser* CaseMapCloser::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::CaseMapCloser*>(this);
-}
-
-inline diplomat::capi::CaseMapCloser* CaseMapCloser::AsFFI() {
-  return reinterpret_cast<diplomat::capi::CaseMapCloser*>(this);
-}
-
-inline const CaseMapCloser* CaseMapCloser::FromFFI(const diplomat::capi::CaseMapCloser* ptr) {
-  return reinterpret_cast<const CaseMapCloser*>(ptr);
-}
-
-inline CaseMapCloser* CaseMapCloser::FromFFI(diplomat::capi::CaseMapCloser* ptr) {
-  return reinterpret_cast<CaseMapCloser*>(ptr);
-}
-
-inline void CaseMapCloser::operator delete(void* ptr) {
-  diplomat::capi::icu4x_CaseMapCloser_destroy_mv1(reinterpret_cast<diplomat::capi::CaseMapCloser*>(ptr));
-}
-
-
-#endif // CaseMapCloser_HPP
diff --git a/ffi/capi/bindings/cpp/CaseMapper.d.hpp b/ffi/capi/bindings/cpp/CaseMapper.d.hpp
deleted file mode 100644
index 708781ca618..00000000000
--- a/ffi/capi/bindings/cpp/CaseMapper.d.hpp
+++ /dev/null
@@ -1,70 +0,0 @@
-#ifndef CaseMapper_D_HPP
-#define CaseMapper_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct CodePointSetBuilder; }
-class CodePointSetBuilder;
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-struct TitlecaseOptionsV1;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct CaseMapper;
-} // namespace capi
-} // namespace
-
-class CaseMapper {
-public:
-
-  inline static diplomat::result<std::unique_ptr<CaseMapper>, DataError> create(const DataProvider& provider);
-
-  inline diplomat::result<std::string, diplomat::Utf8Error> lowercase(std::string_view s, const Locale& locale) const;
-
-  inline diplomat::result<std::string, diplomat::Utf8Error> uppercase(std::string_view s, const Locale& locale) const;
-
-  inline diplomat::result<std::string, diplomat::Utf8Error> titlecase_segment_with_only_case_data_v1(std::string_view s, const Locale& locale, TitlecaseOptionsV1 options) const;
-
-  inline diplomat::result<std::string, diplomat::Utf8Error> fold(std::string_view s) const;
-
-  inline diplomat::result<std::string, diplomat::Utf8Error> fold_turkic(std::string_view s) const;
-
-  inline void add_case_closure_to(char32_t c, CodePointSetBuilder& builder) const;
-
-  inline char32_t simple_lowercase(char32_t ch) const;
-
-  inline char32_t simple_uppercase(char32_t ch) const;
-
-  inline char32_t simple_titlecase(char32_t ch) const;
-
-  inline char32_t simple_fold(char32_t ch) const;
-
-  inline char32_t simple_fold_turkic(char32_t ch) const;
-
-  inline const diplomat::capi::CaseMapper* AsFFI() const;
-  inline diplomat::capi::CaseMapper* AsFFI();
-  inline static const CaseMapper* FromFFI(const diplomat::capi::CaseMapper* ptr);
-  inline static CaseMapper* FromFFI(diplomat::capi::CaseMapper* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  CaseMapper() = delete;
-  CaseMapper(const CaseMapper&) = delete;
-  CaseMapper(CaseMapper&&) noexcept = delete;
-  CaseMapper operator=(const CaseMapper&) = delete;
-  CaseMapper operator=(CaseMapper&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // CaseMapper_D_HPP
diff --git a/ffi/capi/bindings/cpp/CaseMapper.hpp b/ffi/capi/bindings/cpp/CaseMapper.hpp
deleted file mode 100644
index 6877b59105a..00000000000
--- a/ffi/capi/bindings/cpp/CaseMapper.hpp
+++ /dev/null
@@ -1,187 +0,0 @@
-#ifndef CaseMapper_HPP
-#define CaseMapper_HPP
-
-#include "CaseMapper.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "CodePointSetBuilder.hpp"
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "Locale.hpp"
-#include "TitlecaseOptionsV1.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_CaseMapper_create_mv1_result {union {diplomat::capi::CaseMapper* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CaseMapper_create_mv1_result;
-    icu4x_CaseMapper_create_mv1_result icu4x_CaseMapper_create_mv1(const diplomat::capi::DataProvider* provider);
-    
-    void icu4x_CaseMapper_lowercase_mv1(const diplomat::capi::CaseMapper* self, const char* s_data, size_t s_len, const diplomat::capi::Locale* locale, diplomat::capi::DiplomatWrite* write);
-    
-    void icu4x_CaseMapper_uppercase_mv1(const diplomat::capi::CaseMapper* self, const char* s_data, size_t s_len, const diplomat::capi::Locale* locale, diplomat::capi::DiplomatWrite* write);
-    
-    void icu4x_CaseMapper_titlecase_segment_with_only_case_data_v1_mv1(const diplomat::capi::CaseMapper* self, const char* s_data, size_t s_len, const diplomat::capi::Locale* locale, diplomat::capi::TitlecaseOptionsV1 options, diplomat::capi::DiplomatWrite* write);
-    
-    void icu4x_CaseMapper_fold_mv1(const diplomat::capi::CaseMapper* self, const char* s_data, size_t s_len, diplomat::capi::DiplomatWrite* write);
-    
-    void icu4x_CaseMapper_fold_turkic_mv1(const diplomat::capi::CaseMapper* self, const char* s_data, size_t s_len, diplomat::capi::DiplomatWrite* write);
-    
-    void icu4x_CaseMapper_add_case_closure_to_mv1(const diplomat::capi::CaseMapper* self, char32_t c, diplomat::capi::CodePointSetBuilder* builder);
-    
-    char32_t icu4x_CaseMapper_simple_lowercase_mv1(const diplomat::capi::CaseMapper* self, char32_t ch);
-    
-    char32_t icu4x_CaseMapper_simple_uppercase_mv1(const diplomat::capi::CaseMapper* self, char32_t ch);
-    
-    char32_t icu4x_CaseMapper_simple_titlecase_mv1(const diplomat::capi::CaseMapper* self, char32_t ch);
-    
-    char32_t icu4x_CaseMapper_simple_fold_mv1(const diplomat::capi::CaseMapper* self, char32_t ch);
-    
-    char32_t icu4x_CaseMapper_simple_fold_turkic_mv1(const diplomat::capi::CaseMapper* self, char32_t ch);
-    
-    
-    void icu4x_CaseMapper_destroy_mv1(CaseMapper* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<CaseMapper>, DataError> CaseMapper::create(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CaseMapper_create_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CaseMapper>, DataError>(diplomat::Ok<std::unique_ptr<CaseMapper>>(std::unique_ptr<CaseMapper>(CaseMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CaseMapper>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::string, diplomat::Utf8Error> CaseMapper::lowercase(std::string_view s, const Locale& locale) const {
-  if (!diplomat::capi::diplomat_is_str(s.data(), s.size())) {
-    return diplomat::Err<diplomat::Utf8Error>(diplomat::Utf8Error());
-  }
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_CaseMapper_lowercase_mv1(this->AsFFI(),
-    s.data(),
-    s.size(),
-    locale.AsFFI(),
-    &write);
-  return diplomat::Ok<std::string>(std::move(output));
-}
-
-inline diplomat::result<std::string, diplomat::Utf8Error> CaseMapper::uppercase(std::string_view s, const Locale& locale) const {
-  if (!diplomat::capi::diplomat_is_str(s.data(), s.size())) {
-    return diplomat::Err<diplomat::Utf8Error>(diplomat::Utf8Error());
-  }
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_CaseMapper_uppercase_mv1(this->AsFFI(),
-    s.data(),
-    s.size(),
-    locale.AsFFI(),
-    &write);
-  return diplomat::Ok<std::string>(std::move(output));
-}
-
-inline diplomat::result<std::string, diplomat::Utf8Error> CaseMapper::titlecase_segment_with_only_case_data_v1(std::string_view s, const Locale& locale, TitlecaseOptionsV1 options) const {
-  if (!diplomat::capi::diplomat_is_str(s.data(), s.size())) {
-    return diplomat::Err<diplomat::Utf8Error>(diplomat::Utf8Error());
-  }
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_CaseMapper_titlecase_segment_with_only_case_data_v1_mv1(this->AsFFI(),
-    s.data(),
-    s.size(),
-    locale.AsFFI(),
-    options.AsFFI(),
-    &write);
-  return diplomat::Ok<std::string>(std::move(output));
-}
-
-inline diplomat::result<std::string, diplomat::Utf8Error> CaseMapper::fold(std::string_view s) const {
-  if (!diplomat::capi::diplomat_is_str(s.data(), s.size())) {
-    return diplomat::Err<diplomat::Utf8Error>(diplomat::Utf8Error());
-  }
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_CaseMapper_fold_mv1(this->AsFFI(),
-    s.data(),
-    s.size(),
-    &write);
-  return diplomat::Ok<std::string>(std::move(output));
-}
-
-inline diplomat::result<std::string, diplomat::Utf8Error> CaseMapper::fold_turkic(std::string_view s) const {
-  if (!diplomat::capi::diplomat_is_str(s.data(), s.size())) {
-    return diplomat::Err<diplomat::Utf8Error>(diplomat::Utf8Error());
-  }
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_CaseMapper_fold_turkic_mv1(this->AsFFI(),
-    s.data(),
-    s.size(),
-    &write);
-  return diplomat::Ok<std::string>(std::move(output));
-}
-
-inline void CaseMapper::add_case_closure_to(char32_t c, CodePointSetBuilder& builder) const {
-  diplomat::capi::icu4x_CaseMapper_add_case_closure_to_mv1(this->AsFFI(),
-    c,
-    builder.AsFFI());
-}
-
-inline char32_t CaseMapper::simple_lowercase(char32_t ch) const {
-  auto result = diplomat::capi::icu4x_CaseMapper_simple_lowercase_mv1(this->AsFFI(),
-    ch);
-  return result;
-}
-
-inline char32_t CaseMapper::simple_uppercase(char32_t ch) const {
-  auto result = diplomat::capi::icu4x_CaseMapper_simple_uppercase_mv1(this->AsFFI(),
-    ch);
-  return result;
-}
-
-inline char32_t CaseMapper::simple_titlecase(char32_t ch) const {
-  auto result = diplomat::capi::icu4x_CaseMapper_simple_titlecase_mv1(this->AsFFI(),
-    ch);
-  return result;
-}
-
-inline char32_t CaseMapper::simple_fold(char32_t ch) const {
-  auto result = diplomat::capi::icu4x_CaseMapper_simple_fold_mv1(this->AsFFI(),
-    ch);
-  return result;
-}
-
-inline char32_t CaseMapper::simple_fold_turkic(char32_t ch) const {
-  auto result = diplomat::capi::icu4x_CaseMapper_simple_fold_turkic_mv1(this->AsFFI(),
-    ch);
-  return result;
-}
-
-inline const diplomat::capi::CaseMapper* CaseMapper::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::CaseMapper*>(this);
-}
-
-inline diplomat::capi::CaseMapper* CaseMapper::AsFFI() {
-  return reinterpret_cast<diplomat::capi::CaseMapper*>(this);
-}
-
-inline const CaseMapper* CaseMapper::FromFFI(const diplomat::capi::CaseMapper* ptr) {
-  return reinterpret_cast<const CaseMapper*>(ptr);
-}
-
-inline CaseMapper* CaseMapper::FromFFI(diplomat::capi::CaseMapper* ptr) {
-  return reinterpret_cast<CaseMapper*>(ptr);
-}
-
-inline void CaseMapper::operator delete(void* ptr) {
-  diplomat::capi::icu4x_CaseMapper_destroy_mv1(reinterpret_cast<diplomat::capi::CaseMapper*>(ptr));
-}
-
-
-#endif // CaseMapper_HPP
diff --git a/ffi/capi/bindings/cpp/CodePointMapData16.d.hpp b/ffi/capi/bindings/cpp/CodePointMapData16.d.hpp
deleted file mode 100644
index 114bb6348e4..00000000000
--- a/ffi/capi/bindings/cpp/CodePointMapData16.d.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef CodePointMapData16_D_HPP
-#define CodePointMapData16_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct CodePointRangeIterator; }
-class CodePointRangeIterator;
-namespace diplomat::capi { struct CodePointSetData; }
-class CodePointSetData;
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct CodePointMapData16;
-} // namespace capi
-} // namespace
-
-class CodePointMapData16 {
-public:
-
-  inline uint16_t get(char32_t cp) const;
-
-  inline std::unique_ptr<CodePointRangeIterator> iter_ranges_for_value(uint16_t value) const;
-
-  inline std::unique_ptr<CodePointRangeIterator> iter_ranges_for_value_complemented(uint16_t value) const;
-
-  inline std::unique_ptr<CodePointSetData> get_set_for_value(uint16_t value) const;
-
-  inline static diplomat::result<std::unique_ptr<CodePointMapData16>, DataError> load_script(const DataProvider& provider);
-
-  inline const diplomat::capi::CodePointMapData16* AsFFI() const;
-  inline diplomat::capi::CodePointMapData16* AsFFI();
-  inline static const CodePointMapData16* FromFFI(const diplomat::capi::CodePointMapData16* ptr);
-  inline static CodePointMapData16* FromFFI(diplomat::capi::CodePointMapData16* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  CodePointMapData16() = delete;
-  CodePointMapData16(const CodePointMapData16&) = delete;
-  CodePointMapData16(CodePointMapData16&&) noexcept = delete;
-  CodePointMapData16 operator=(const CodePointMapData16&) = delete;
-  CodePointMapData16 operator=(CodePointMapData16&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // CodePointMapData16_D_HPP
diff --git a/ffi/capi/bindings/cpp/CodePointMapData16.hpp b/ffi/capi/bindings/cpp/CodePointMapData16.hpp
deleted file mode 100644
index 09c87f3f12c..00000000000
--- a/ffi/capi/bindings/cpp/CodePointMapData16.hpp
+++ /dev/null
@@ -1,91 +0,0 @@
-#ifndef CodePointMapData16_HPP
-#define CodePointMapData16_HPP
-
-#include "CodePointMapData16.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "CodePointRangeIterator.hpp"
-#include "CodePointSetData.hpp"
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    uint16_t icu4x_CodePointMapData16_get_mv1(const diplomat::capi::CodePointMapData16* self, char32_t cp);
-    
-    diplomat::capi::CodePointRangeIterator* icu4x_CodePointMapData16_iter_ranges_for_value_mv1(const diplomat::capi::CodePointMapData16* self, uint16_t value);
-    
-    diplomat::capi::CodePointRangeIterator* icu4x_CodePointMapData16_iter_ranges_for_value_complemented_mv1(const diplomat::capi::CodePointMapData16* self, uint16_t value);
-    
-    diplomat::capi::CodePointSetData* icu4x_CodePointMapData16_get_set_for_value_mv1(const diplomat::capi::CodePointMapData16* self, uint16_t value);
-    
-    typedef struct icu4x_CodePointMapData16_load_script_mv1_result {union {diplomat::capi::CodePointMapData16* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData16_load_script_mv1_result;
-    icu4x_CodePointMapData16_load_script_mv1_result icu4x_CodePointMapData16_load_script_mv1(const diplomat::capi::DataProvider* provider);
-    
-    
-    void icu4x_CodePointMapData16_destroy_mv1(CodePointMapData16* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline uint16_t CodePointMapData16::get(char32_t cp) const {
-  auto result = diplomat::capi::icu4x_CodePointMapData16_get_mv1(this->AsFFI(),
-    cp);
-  return result;
-}
-
-inline std::unique_ptr<CodePointRangeIterator> CodePointMapData16::iter_ranges_for_value(uint16_t value) const {
-  auto result = diplomat::capi::icu4x_CodePointMapData16_iter_ranges_for_value_mv1(this->AsFFI(),
-    value);
-  return std::unique_ptr<CodePointRangeIterator>(CodePointRangeIterator::FromFFI(result));
-}
-
-inline std::unique_ptr<CodePointRangeIterator> CodePointMapData16::iter_ranges_for_value_complemented(uint16_t value) const {
-  auto result = diplomat::capi::icu4x_CodePointMapData16_iter_ranges_for_value_complemented_mv1(this->AsFFI(),
-    value);
-  return std::unique_ptr<CodePointRangeIterator>(CodePointRangeIterator::FromFFI(result));
-}
-
-inline std::unique_ptr<CodePointSetData> CodePointMapData16::get_set_for_value(uint16_t value) const {
-  auto result = diplomat::capi::icu4x_CodePointMapData16_get_set_for_value_mv1(this->AsFFI(),
-    value);
-  return std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointMapData16>, DataError> CodePointMapData16::load_script(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointMapData16_load_script_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointMapData16>, DataError>(diplomat::Ok<std::unique_ptr<CodePointMapData16>>(std::unique_ptr<CodePointMapData16>(CodePointMapData16::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointMapData16>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline const diplomat::capi::CodePointMapData16* CodePointMapData16::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::CodePointMapData16*>(this);
-}
-
-inline diplomat::capi::CodePointMapData16* CodePointMapData16::AsFFI() {
-  return reinterpret_cast<diplomat::capi::CodePointMapData16*>(this);
-}
-
-inline const CodePointMapData16* CodePointMapData16::FromFFI(const diplomat::capi::CodePointMapData16* ptr) {
-  return reinterpret_cast<const CodePointMapData16*>(ptr);
-}
-
-inline CodePointMapData16* CodePointMapData16::FromFFI(diplomat::capi::CodePointMapData16* ptr) {
-  return reinterpret_cast<CodePointMapData16*>(ptr);
-}
-
-inline void CodePointMapData16::operator delete(void* ptr) {
-  diplomat::capi::icu4x_CodePointMapData16_destroy_mv1(reinterpret_cast<diplomat::capi::CodePointMapData16*>(ptr));
-}
-
-
-#endif // CodePointMapData16_HPP
diff --git a/ffi/capi/bindings/cpp/CodePointMapData8.d.hpp b/ffi/capi/bindings/cpp/CodePointMapData8.d.hpp
deleted file mode 100644
index 4852bf5b75e..00000000000
--- a/ffi/capi/bindings/cpp/CodePointMapData8.d.hpp
+++ /dev/null
@@ -1,77 +0,0 @@
-#ifndef CodePointMapData8_D_HPP
-#define CodePointMapData8_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct CodePointRangeIterator; }
-class CodePointRangeIterator;
-namespace diplomat::capi { struct CodePointSetData; }
-class CodePointSetData;
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct CodePointMapData8;
-} // namespace capi
-} // namespace
-
-class CodePointMapData8 {
-public:
-
-  inline uint8_t get(char32_t cp) const;
-
-  inline static uint32_t general_category_to_mask(uint8_t gc);
-
-  inline std::unique_ptr<CodePointRangeIterator> iter_ranges_for_value(uint8_t value) const;
-
-  inline std::unique_ptr<CodePointRangeIterator> iter_ranges_for_value_complemented(uint8_t value) const;
-
-  inline std::unique_ptr<CodePointRangeIterator> iter_ranges_for_mask(uint32_t mask) const;
-
-  inline std::unique_ptr<CodePointSetData> get_set_for_value(uint8_t value) const;
-
-  inline static diplomat::result<std::unique_ptr<CodePointMapData8>, DataError> load_general_category(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointMapData8>, DataError> load_bidi_class(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointMapData8>, DataError> load_east_asian_width(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointMapData8>, DataError> load_hangul_syllable_type(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointMapData8>, DataError> load_indic_syllabic_category(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointMapData8>, DataError> load_line_break(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointMapData8>, DataError> try_grapheme_cluster_break(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointMapData8>, DataError> load_word_break(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointMapData8>, DataError> load_sentence_break(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointMapData8>, DataError> load_joining_type(const DataProvider& provider);
-
-  inline const diplomat::capi::CodePointMapData8* AsFFI() const;
-  inline diplomat::capi::CodePointMapData8* AsFFI();
-  inline static const CodePointMapData8* FromFFI(const diplomat::capi::CodePointMapData8* ptr);
-  inline static CodePointMapData8* FromFFI(diplomat::capi::CodePointMapData8* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  CodePointMapData8() = delete;
-  CodePointMapData8(const CodePointMapData8&) = delete;
-  CodePointMapData8(CodePointMapData8&&) noexcept = delete;
-  CodePointMapData8 operator=(const CodePointMapData8&) = delete;
-  CodePointMapData8 operator=(CodePointMapData8&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // CodePointMapData8_D_HPP
diff --git a/ffi/capi/bindings/cpp/CodePointMapData8.hpp b/ffi/capi/bindings/cpp/CodePointMapData8.hpp
deleted file mode 100644
index 10289193b2f..00000000000
--- a/ffi/capi/bindings/cpp/CodePointMapData8.hpp
+++ /dev/null
@@ -1,178 +0,0 @@
-#ifndef CodePointMapData8_HPP
-#define CodePointMapData8_HPP
-
-#include "CodePointMapData8.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "CodePointRangeIterator.hpp"
-#include "CodePointSetData.hpp"
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    uint8_t icu4x_CodePointMapData8_get_mv1(const diplomat::capi::CodePointMapData8* self, char32_t cp);
-    
-    uint32_t icu4x_CodePointMapData8_general_category_to_mask_mv1(uint8_t gc);
-    
-    diplomat::capi::CodePointRangeIterator* icu4x_CodePointMapData8_iter_ranges_for_value_mv1(const diplomat::capi::CodePointMapData8* self, uint8_t value);
-    
-    diplomat::capi::CodePointRangeIterator* icu4x_CodePointMapData8_iter_ranges_for_value_complemented_mv1(const diplomat::capi::CodePointMapData8* self, uint8_t value);
-    
-    diplomat::capi::CodePointRangeIterator* icu4x_CodePointMapData8_iter_ranges_for_mask_mv1(const diplomat::capi::CodePointMapData8* self, uint32_t mask);
-    
-    diplomat::capi::CodePointSetData* icu4x_CodePointMapData8_get_set_for_value_mv1(const diplomat::capi::CodePointMapData8* self, uint8_t value);
-    
-    typedef struct icu4x_CodePointMapData8_load_general_category_mv1_result {union {diplomat::capi::CodePointMapData8* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData8_load_general_category_mv1_result;
-    icu4x_CodePointMapData8_load_general_category_mv1_result icu4x_CodePointMapData8_load_general_category_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointMapData8_load_bidi_class_mv1_result {union {diplomat::capi::CodePointMapData8* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData8_load_bidi_class_mv1_result;
-    icu4x_CodePointMapData8_load_bidi_class_mv1_result icu4x_CodePointMapData8_load_bidi_class_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointMapData8_load_east_asian_width_mv1_result {union {diplomat::capi::CodePointMapData8* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData8_load_east_asian_width_mv1_result;
-    icu4x_CodePointMapData8_load_east_asian_width_mv1_result icu4x_CodePointMapData8_load_east_asian_width_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointMapData8_load_hangul_syllable_type_mv1_result {union {diplomat::capi::CodePointMapData8* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData8_load_hangul_syllable_type_mv1_result;
-    icu4x_CodePointMapData8_load_hangul_syllable_type_mv1_result icu4x_CodePointMapData8_load_hangul_syllable_type_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointMapData8_load_indic_syllabic_category_mv1_result {union {diplomat::capi::CodePointMapData8* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData8_load_indic_syllabic_category_mv1_result;
-    icu4x_CodePointMapData8_load_indic_syllabic_category_mv1_result icu4x_CodePointMapData8_load_indic_syllabic_category_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointMapData8_load_line_break_mv1_result {union {diplomat::capi::CodePointMapData8* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData8_load_line_break_mv1_result;
-    icu4x_CodePointMapData8_load_line_break_mv1_result icu4x_CodePointMapData8_load_line_break_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointMapData8_try_grapheme_cluster_break_mv1_result {union {diplomat::capi::CodePointMapData8* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData8_try_grapheme_cluster_break_mv1_result;
-    icu4x_CodePointMapData8_try_grapheme_cluster_break_mv1_result icu4x_CodePointMapData8_try_grapheme_cluster_break_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointMapData8_load_word_break_mv1_result {union {diplomat::capi::CodePointMapData8* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData8_load_word_break_mv1_result;
-    icu4x_CodePointMapData8_load_word_break_mv1_result icu4x_CodePointMapData8_load_word_break_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointMapData8_load_sentence_break_mv1_result {union {diplomat::capi::CodePointMapData8* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData8_load_sentence_break_mv1_result;
-    icu4x_CodePointMapData8_load_sentence_break_mv1_result icu4x_CodePointMapData8_load_sentence_break_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointMapData8_load_joining_type_mv1_result {union {diplomat::capi::CodePointMapData8* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData8_load_joining_type_mv1_result;
-    icu4x_CodePointMapData8_load_joining_type_mv1_result icu4x_CodePointMapData8_load_joining_type_mv1(const diplomat::capi::DataProvider* provider);
-    
-    
-    void icu4x_CodePointMapData8_destroy_mv1(CodePointMapData8* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline uint8_t CodePointMapData8::get(char32_t cp) const {
-  auto result = diplomat::capi::icu4x_CodePointMapData8_get_mv1(this->AsFFI(),
-    cp);
-  return result;
-}
-
-inline uint32_t CodePointMapData8::general_category_to_mask(uint8_t gc) {
-  auto result = diplomat::capi::icu4x_CodePointMapData8_general_category_to_mask_mv1(gc);
-  return result;
-}
-
-inline std::unique_ptr<CodePointRangeIterator> CodePointMapData8::iter_ranges_for_value(uint8_t value) const {
-  auto result = diplomat::capi::icu4x_CodePointMapData8_iter_ranges_for_value_mv1(this->AsFFI(),
-    value);
-  return std::unique_ptr<CodePointRangeIterator>(CodePointRangeIterator::FromFFI(result));
-}
-
-inline std::unique_ptr<CodePointRangeIterator> CodePointMapData8::iter_ranges_for_value_complemented(uint8_t value) const {
-  auto result = diplomat::capi::icu4x_CodePointMapData8_iter_ranges_for_value_complemented_mv1(this->AsFFI(),
-    value);
-  return std::unique_ptr<CodePointRangeIterator>(CodePointRangeIterator::FromFFI(result));
-}
-
-inline std::unique_ptr<CodePointRangeIterator> CodePointMapData8::iter_ranges_for_mask(uint32_t mask) const {
-  auto result = diplomat::capi::icu4x_CodePointMapData8_iter_ranges_for_mask_mv1(this->AsFFI(),
-    mask);
-  return std::unique_ptr<CodePointRangeIterator>(CodePointRangeIterator::FromFFI(result));
-}
-
-inline std::unique_ptr<CodePointSetData> CodePointMapData8::get_set_for_value(uint8_t value) const {
-  auto result = diplomat::capi::icu4x_CodePointMapData8_get_set_for_value_mv1(this->AsFFI(),
-    value);
-  return std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointMapData8>, DataError> CodePointMapData8::load_general_category(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointMapData8_load_general_category_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointMapData8>, DataError>(diplomat::Ok<std::unique_ptr<CodePointMapData8>>(std::unique_ptr<CodePointMapData8>(CodePointMapData8::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointMapData8>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointMapData8>, DataError> CodePointMapData8::load_bidi_class(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointMapData8_load_bidi_class_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointMapData8>, DataError>(diplomat::Ok<std::unique_ptr<CodePointMapData8>>(std::unique_ptr<CodePointMapData8>(CodePointMapData8::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointMapData8>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointMapData8>, DataError> CodePointMapData8::load_east_asian_width(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointMapData8_load_east_asian_width_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointMapData8>, DataError>(diplomat::Ok<std::unique_ptr<CodePointMapData8>>(std::unique_ptr<CodePointMapData8>(CodePointMapData8::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointMapData8>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointMapData8>, DataError> CodePointMapData8::load_hangul_syllable_type(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointMapData8_load_hangul_syllable_type_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointMapData8>, DataError>(diplomat::Ok<std::unique_ptr<CodePointMapData8>>(std::unique_ptr<CodePointMapData8>(CodePointMapData8::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointMapData8>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointMapData8>, DataError> CodePointMapData8::load_indic_syllabic_category(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointMapData8_load_indic_syllabic_category_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointMapData8>, DataError>(diplomat::Ok<std::unique_ptr<CodePointMapData8>>(std::unique_ptr<CodePointMapData8>(CodePointMapData8::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointMapData8>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointMapData8>, DataError> CodePointMapData8::load_line_break(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointMapData8_load_line_break_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointMapData8>, DataError>(diplomat::Ok<std::unique_ptr<CodePointMapData8>>(std::unique_ptr<CodePointMapData8>(CodePointMapData8::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointMapData8>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointMapData8>, DataError> CodePointMapData8::try_grapheme_cluster_break(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointMapData8_try_grapheme_cluster_break_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointMapData8>, DataError>(diplomat::Ok<std::unique_ptr<CodePointMapData8>>(std::unique_ptr<CodePointMapData8>(CodePointMapData8::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointMapData8>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointMapData8>, DataError> CodePointMapData8::load_word_break(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointMapData8_load_word_break_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointMapData8>, DataError>(diplomat::Ok<std::unique_ptr<CodePointMapData8>>(std::unique_ptr<CodePointMapData8>(CodePointMapData8::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointMapData8>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointMapData8>, DataError> CodePointMapData8::load_sentence_break(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointMapData8_load_sentence_break_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointMapData8>, DataError>(diplomat::Ok<std::unique_ptr<CodePointMapData8>>(std::unique_ptr<CodePointMapData8>(CodePointMapData8::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointMapData8>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointMapData8>, DataError> CodePointMapData8::load_joining_type(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointMapData8_load_joining_type_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointMapData8>, DataError>(diplomat::Ok<std::unique_ptr<CodePointMapData8>>(std::unique_ptr<CodePointMapData8>(CodePointMapData8::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointMapData8>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline const diplomat::capi::CodePointMapData8* CodePointMapData8::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::CodePointMapData8*>(this);
-}
-
-inline diplomat::capi::CodePointMapData8* CodePointMapData8::AsFFI() {
-  return reinterpret_cast<diplomat::capi::CodePointMapData8*>(this);
-}
-
-inline const CodePointMapData8* CodePointMapData8::FromFFI(const diplomat::capi::CodePointMapData8* ptr) {
-  return reinterpret_cast<const CodePointMapData8*>(ptr);
-}
-
-inline CodePointMapData8* CodePointMapData8::FromFFI(diplomat::capi::CodePointMapData8* ptr) {
-  return reinterpret_cast<CodePointMapData8*>(ptr);
-}
-
-inline void CodePointMapData8::operator delete(void* ptr) {
-  diplomat::capi::icu4x_CodePointMapData8_destroy_mv1(reinterpret_cast<diplomat::capi::CodePointMapData8*>(ptr));
-}
-
-
-#endif // CodePointMapData8_HPP
diff --git a/ffi/capi/bindings/cpp/CodePointRangeIterator.d.hpp b/ffi/capi/bindings/cpp/CodePointRangeIterator.d.hpp
deleted file mode 100644
index 17ecf0c426b..00000000000
--- a/ffi/capi/bindings/cpp/CodePointRangeIterator.d.hpp
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef CodePointRangeIterator_D_HPP
-#define CodePointRangeIterator_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-struct CodePointRangeIteratorResult;
-
-
-namespace diplomat {
-namespace capi {
-    struct CodePointRangeIterator;
-} // namespace capi
-} // namespace
-
-class CodePointRangeIterator {
-public:
-
-  inline CodePointRangeIteratorResult next();
-
-  inline const diplomat::capi::CodePointRangeIterator* AsFFI() const;
-  inline diplomat::capi::CodePointRangeIterator* AsFFI();
-  inline static const CodePointRangeIterator* FromFFI(const diplomat::capi::CodePointRangeIterator* ptr);
-  inline static CodePointRangeIterator* FromFFI(diplomat::capi::CodePointRangeIterator* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  CodePointRangeIterator() = delete;
-  CodePointRangeIterator(const CodePointRangeIterator&) = delete;
-  CodePointRangeIterator(CodePointRangeIterator&&) noexcept = delete;
-  CodePointRangeIterator operator=(const CodePointRangeIterator&) = delete;
-  CodePointRangeIterator operator=(CodePointRangeIterator&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // CodePointRangeIterator_D_HPP
diff --git a/ffi/capi/bindings/cpp/CodePointRangeIterator.hpp b/ffi/capi/bindings/cpp/CodePointRangeIterator.hpp
deleted file mode 100644
index 0a31fab3d67..00000000000
--- a/ffi/capi/bindings/cpp/CodePointRangeIterator.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef CodePointRangeIterator_HPP
-#define CodePointRangeIterator_HPP
-
-#include "CodePointRangeIterator.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "CodePointRangeIteratorResult.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    diplomat::capi::CodePointRangeIteratorResult icu4x_CodePointRangeIterator_next_mv1(diplomat::capi::CodePointRangeIterator* self);
-    
-    
-    void icu4x_CodePointRangeIterator_destroy_mv1(CodePointRangeIterator* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline CodePointRangeIteratorResult CodePointRangeIterator::next() {
-  auto result = diplomat::capi::icu4x_CodePointRangeIterator_next_mv1(this->AsFFI());
-  return CodePointRangeIteratorResult::FromFFI(result);
-}
-
-inline const diplomat::capi::CodePointRangeIterator* CodePointRangeIterator::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::CodePointRangeIterator*>(this);
-}
-
-inline diplomat::capi::CodePointRangeIterator* CodePointRangeIterator::AsFFI() {
-  return reinterpret_cast<diplomat::capi::CodePointRangeIterator*>(this);
-}
-
-inline const CodePointRangeIterator* CodePointRangeIterator::FromFFI(const diplomat::capi::CodePointRangeIterator* ptr) {
-  return reinterpret_cast<const CodePointRangeIterator*>(ptr);
-}
-
-inline CodePointRangeIterator* CodePointRangeIterator::FromFFI(diplomat::capi::CodePointRangeIterator* ptr) {
-  return reinterpret_cast<CodePointRangeIterator*>(ptr);
-}
-
-inline void CodePointRangeIterator::operator delete(void* ptr) {
-  diplomat::capi::icu4x_CodePointRangeIterator_destroy_mv1(reinterpret_cast<diplomat::capi::CodePointRangeIterator*>(ptr));
-}
-
-
-#endif // CodePointRangeIterator_HPP
diff --git a/ffi/capi/bindings/cpp/CodePointRangeIteratorResult.d.hpp b/ffi/capi/bindings/cpp/CodePointRangeIteratorResult.d.hpp
deleted file mode 100644
index 1b7ece1e187..00000000000
--- a/ffi/capi/bindings/cpp/CodePointRangeIteratorResult.d.hpp
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef CodePointRangeIteratorResult_D_HPP
-#define CodePointRangeIteratorResult_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    struct CodePointRangeIteratorResult {
-      uint32_t start;
-      uint32_t end;
-      bool done;
-    };
-} // namespace capi
-} // namespace
-
-
-struct CodePointRangeIteratorResult {
-  uint32_t start;
-  uint32_t end;
-  bool done;
-
-  inline diplomat::capi::CodePointRangeIteratorResult AsFFI() const;
-  inline static CodePointRangeIteratorResult FromFFI(diplomat::capi::CodePointRangeIteratorResult c_struct);
-};
-
-
-#endif // CodePointRangeIteratorResult_D_HPP
diff --git a/ffi/capi/bindings/cpp/CodePointRangeIteratorResult.hpp b/ffi/capi/bindings/cpp/CodePointRangeIteratorResult.hpp
deleted file mode 100644
index 1159ab6eb7d..00000000000
--- a/ffi/capi/bindings/cpp/CodePointRangeIteratorResult.hpp
+++ /dev/null
@@ -1,42 +0,0 @@
-#ifndef CodePointRangeIteratorResult_HPP
-#define CodePointRangeIteratorResult_HPP
-
-#include "CodePointRangeIteratorResult.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-
-inline diplomat::capi::CodePointRangeIteratorResult CodePointRangeIteratorResult::AsFFI() const {
-  return diplomat::capi::CodePointRangeIteratorResult {
-    /* .start = */ start,
-    /* .end = */ end,
-    /* .done = */ done,
-  };
-}
-
-inline CodePointRangeIteratorResult CodePointRangeIteratorResult::FromFFI(diplomat::capi::CodePointRangeIteratorResult c_struct) {
-  return CodePointRangeIteratorResult {
-    /* .start = */ c_struct.start,
-    /* .end = */ c_struct.end,
-    /* .done = */ c_struct.done,
-  };
-}
-
-
-#endif // CodePointRangeIteratorResult_HPP
diff --git a/ffi/capi/bindings/cpp/CodePointSetBuilder.d.hpp b/ffi/capi/bindings/cpp/CodePointSetBuilder.d.hpp
deleted file mode 100644
index 275a403a854..00000000000
--- a/ffi/capi/bindings/cpp/CodePointSetBuilder.d.hpp
+++ /dev/null
@@ -1,72 +0,0 @@
-#ifndef CodePointSetBuilder_D_HPP
-#define CodePointSetBuilder_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct CodePointSetData; }
-class CodePointSetData;
-
-
-namespace diplomat {
-namespace capi {
-    struct CodePointSetBuilder;
-} // namespace capi
-} // namespace
-
-class CodePointSetBuilder {
-public:
-
-  inline static std::unique_ptr<CodePointSetBuilder> create();
-
-  inline std::unique_ptr<CodePointSetData> build();
-
-  inline void complement();
-
-  inline bool is_empty() const;
-
-  inline void add_char(char32_t ch);
-
-  inline void add_inclusive_range(char32_t start, char32_t end);
-
-  inline void add_set(const CodePointSetData& data);
-
-  inline void remove_char(char32_t ch);
-
-  inline void remove_inclusive_range(char32_t start, char32_t end);
-
-  inline void remove_set(const CodePointSetData& data);
-
-  inline void retain_char(char32_t ch);
-
-  inline void retain_inclusive_range(char32_t start, char32_t end);
-
-  inline void retain_set(const CodePointSetData& data);
-
-  inline void complement_char(char32_t ch);
-
-  inline void complement_inclusive_range(char32_t start, char32_t end);
-
-  inline void complement_set(const CodePointSetData& data);
-
-  inline const diplomat::capi::CodePointSetBuilder* AsFFI() const;
-  inline diplomat::capi::CodePointSetBuilder* AsFFI();
-  inline static const CodePointSetBuilder* FromFFI(const diplomat::capi::CodePointSetBuilder* ptr);
-  inline static CodePointSetBuilder* FromFFI(diplomat::capi::CodePointSetBuilder* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  CodePointSetBuilder() = delete;
-  CodePointSetBuilder(const CodePointSetBuilder&) = delete;
-  CodePointSetBuilder(CodePointSetBuilder&&) noexcept = delete;
-  CodePointSetBuilder operator=(const CodePointSetBuilder&) = delete;
-  CodePointSetBuilder operator=(CodePointSetBuilder&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // CodePointSetBuilder_D_HPP
diff --git a/ffi/capi/bindings/cpp/CodePointSetBuilder.hpp b/ffi/capi/bindings/cpp/CodePointSetBuilder.hpp
deleted file mode 100644
index c443b8bc19d..00000000000
--- a/ffi/capi/bindings/cpp/CodePointSetBuilder.hpp
+++ /dev/null
@@ -1,163 +0,0 @@
-#ifndef CodePointSetBuilder_HPP
-#define CodePointSetBuilder_HPP
-
-#include "CodePointSetBuilder.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "CodePointSetData.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    diplomat::capi::CodePointSetBuilder* icu4x_CodePointSetBuilder_create_mv1(void);
-    
-    diplomat::capi::CodePointSetData* icu4x_CodePointSetBuilder_build_mv1(diplomat::capi::CodePointSetBuilder* self);
-    
-    void icu4x_CodePointSetBuilder_complement_mv1(diplomat::capi::CodePointSetBuilder* self);
-    
-    bool icu4x_CodePointSetBuilder_is_empty_mv1(const diplomat::capi::CodePointSetBuilder* self);
-    
-    void icu4x_CodePointSetBuilder_add_char_mv1(diplomat::capi::CodePointSetBuilder* self, char32_t ch);
-    
-    void icu4x_CodePointSetBuilder_add_inclusive_range_mv1(diplomat::capi::CodePointSetBuilder* self, char32_t start, char32_t end);
-    
-    void icu4x_CodePointSetBuilder_add_set_mv1(diplomat::capi::CodePointSetBuilder* self, const diplomat::capi::CodePointSetData* data);
-    
-    void icu4x_CodePointSetBuilder_remove_char_mv1(diplomat::capi::CodePointSetBuilder* self, char32_t ch);
-    
-    void icu4x_CodePointSetBuilder_remove_inclusive_range_mv1(diplomat::capi::CodePointSetBuilder* self, char32_t start, char32_t end);
-    
-    void icu4x_CodePointSetBuilder_remove_set_mv1(diplomat::capi::CodePointSetBuilder* self, const diplomat::capi::CodePointSetData* data);
-    
-    void icu4x_CodePointSetBuilder_retain_char_mv1(diplomat::capi::CodePointSetBuilder* self, char32_t ch);
-    
-    void icu4x_CodePointSetBuilder_retain_inclusive_range_mv1(diplomat::capi::CodePointSetBuilder* self, char32_t start, char32_t end);
-    
-    void icu4x_CodePointSetBuilder_retain_set_mv1(diplomat::capi::CodePointSetBuilder* self, const diplomat::capi::CodePointSetData* data);
-    
-    void icu4x_CodePointSetBuilder_complement_char_mv1(diplomat::capi::CodePointSetBuilder* self, char32_t ch);
-    
-    void icu4x_CodePointSetBuilder_complement_inclusive_range_mv1(diplomat::capi::CodePointSetBuilder* self, char32_t start, char32_t end);
-    
-    void icu4x_CodePointSetBuilder_complement_set_mv1(diplomat::capi::CodePointSetBuilder* self, const diplomat::capi::CodePointSetData* data);
-    
-    
-    void icu4x_CodePointSetBuilder_destroy_mv1(CodePointSetBuilder* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline std::unique_ptr<CodePointSetBuilder> CodePointSetBuilder::create() {
-  auto result = diplomat::capi::icu4x_CodePointSetBuilder_create_mv1();
-  return std::unique_ptr<CodePointSetBuilder>(CodePointSetBuilder::FromFFI(result));
-}
-
-inline std::unique_ptr<CodePointSetData> CodePointSetBuilder::build() {
-  auto result = diplomat::capi::icu4x_CodePointSetBuilder_build_mv1(this->AsFFI());
-  return std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result));
-}
-
-inline void CodePointSetBuilder::complement() {
-  diplomat::capi::icu4x_CodePointSetBuilder_complement_mv1(this->AsFFI());
-}
-
-inline bool CodePointSetBuilder::is_empty() const {
-  auto result = diplomat::capi::icu4x_CodePointSetBuilder_is_empty_mv1(this->AsFFI());
-  return result;
-}
-
-inline void CodePointSetBuilder::add_char(char32_t ch) {
-  diplomat::capi::icu4x_CodePointSetBuilder_add_char_mv1(this->AsFFI(),
-    ch);
-}
-
-inline void CodePointSetBuilder::add_inclusive_range(char32_t start, char32_t end) {
-  diplomat::capi::icu4x_CodePointSetBuilder_add_inclusive_range_mv1(this->AsFFI(),
-    start,
-    end);
-}
-
-inline void CodePointSetBuilder::add_set(const CodePointSetData& data) {
-  diplomat::capi::icu4x_CodePointSetBuilder_add_set_mv1(this->AsFFI(),
-    data.AsFFI());
-}
-
-inline void CodePointSetBuilder::remove_char(char32_t ch) {
-  diplomat::capi::icu4x_CodePointSetBuilder_remove_char_mv1(this->AsFFI(),
-    ch);
-}
-
-inline void CodePointSetBuilder::remove_inclusive_range(char32_t start, char32_t end) {
-  diplomat::capi::icu4x_CodePointSetBuilder_remove_inclusive_range_mv1(this->AsFFI(),
-    start,
-    end);
-}
-
-inline void CodePointSetBuilder::remove_set(const CodePointSetData& data) {
-  diplomat::capi::icu4x_CodePointSetBuilder_remove_set_mv1(this->AsFFI(),
-    data.AsFFI());
-}
-
-inline void CodePointSetBuilder::retain_char(char32_t ch) {
-  diplomat::capi::icu4x_CodePointSetBuilder_retain_char_mv1(this->AsFFI(),
-    ch);
-}
-
-inline void CodePointSetBuilder::retain_inclusive_range(char32_t start, char32_t end) {
-  diplomat::capi::icu4x_CodePointSetBuilder_retain_inclusive_range_mv1(this->AsFFI(),
-    start,
-    end);
-}
-
-inline void CodePointSetBuilder::retain_set(const CodePointSetData& data) {
-  diplomat::capi::icu4x_CodePointSetBuilder_retain_set_mv1(this->AsFFI(),
-    data.AsFFI());
-}
-
-inline void CodePointSetBuilder::complement_char(char32_t ch) {
-  diplomat::capi::icu4x_CodePointSetBuilder_complement_char_mv1(this->AsFFI(),
-    ch);
-}
-
-inline void CodePointSetBuilder::complement_inclusive_range(char32_t start, char32_t end) {
-  diplomat::capi::icu4x_CodePointSetBuilder_complement_inclusive_range_mv1(this->AsFFI(),
-    start,
-    end);
-}
-
-inline void CodePointSetBuilder::complement_set(const CodePointSetData& data) {
-  diplomat::capi::icu4x_CodePointSetBuilder_complement_set_mv1(this->AsFFI(),
-    data.AsFFI());
-}
-
-inline const diplomat::capi::CodePointSetBuilder* CodePointSetBuilder::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::CodePointSetBuilder*>(this);
-}
-
-inline diplomat::capi::CodePointSetBuilder* CodePointSetBuilder::AsFFI() {
-  return reinterpret_cast<diplomat::capi::CodePointSetBuilder*>(this);
-}
-
-inline const CodePointSetBuilder* CodePointSetBuilder::FromFFI(const diplomat::capi::CodePointSetBuilder* ptr) {
-  return reinterpret_cast<const CodePointSetBuilder*>(ptr);
-}
-
-inline CodePointSetBuilder* CodePointSetBuilder::FromFFI(diplomat::capi::CodePointSetBuilder* ptr) {
-  return reinterpret_cast<CodePointSetBuilder*>(ptr);
-}
-
-inline void CodePointSetBuilder::operator delete(void* ptr) {
-  diplomat::capi::icu4x_CodePointSetBuilder_destroy_mv1(reinterpret_cast<diplomat::capi::CodePointSetBuilder*>(ptr));
-}
-
-
-#endif // CodePointSetBuilder_HPP
diff --git a/ffi/capi/bindings/cpp/CodePointSetData.d.hpp b/ffi/capi/bindings/cpp/CodePointSetData.d.hpp
deleted file mode 100644
index 4208d2d7869..00000000000
--- a/ffi/capi/bindings/cpp/CodePointSetData.d.hpp
+++ /dev/null
@@ -1,184 +0,0 @@
-#ifndef CodePointSetData_D_HPP
-#define CodePointSetData_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct CodePointRangeIterator; }
-class CodePointRangeIterator;
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-class DataError;
-class Error;
-
-
-namespace diplomat {
-namespace capi {
-    struct CodePointSetData;
-} // namespace capi
-} // namespace
-
-class CodePointSetData {
-public:
-
-  inline bool contains(char32_t cp) const;
-
-  inline std::unique_ptr<CodePointRangeIterator> iter_ranges() const;
-
-  inline std::unique_ptr<CodePointRangeIterator> iter_ranges_complemented() const;
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_for_general_category_group(const DataProvider& provider, uint32_t group);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_ascii_hex_digit(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_alnum(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_alphabetic(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_bidi_control(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_bidi_mirrored(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_blank(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_cased(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_case_ignorable(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_full_composition_exclusion(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_changes_when_casefolded(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_changes_when_casemapped(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_changes_when_nfkc_casefolded(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_changes_when_lowercased(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_changes_when_titlecased(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_changes_when_uppercased(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_dash(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_deprecated(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_default_ignorable_code_point(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_diacritic(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_emoji_modifier_base(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_emoji_component(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_emoji_modifier(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_emoji(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_emoji_presentation(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_extender(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_extended_pictographic(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_graph(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_grapheme_base(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_grapheme_extend(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_grapheme_link(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_hex_digit(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_hyphen(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_id_continue(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_ideographic(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_id_start(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_ids_binary_operator(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_ids_trinary_operator(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_join_control(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_logical_order_exception(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_lowercase(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_math(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_noncharacter_code_point(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_nfc_inert(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_nfd_inert(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_nfkc_inert(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_nfkd_inert(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_pattern_syntax(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_pattern_white_space(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_prepended_concatenation_mark(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_print(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_quotation_mark(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_radical(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_regional_indicator(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_soft_dotted(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_segment_starter(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_case_sensitive(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_sentence_terminal(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_terminal_punctuation(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_unified_ideograph(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_uppercase(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_variation_selector(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_white_space(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_xdigit(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_xid_continue(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<CodePointSetData>, DataError> load_xid_start(const DataProvider& provider);
-
-  inline static diplomat::result<diplomat::result<std::unique_ptr<CodePointSetData>, Error>, diplomat::Utf8Error> load_for_ecma262(const DataProvider& provider, std::string_view property_name);
-
-  inline const diplomat::capi::CodePointSetData* AsFFI() const;
-  inline diplomat::capi::CodePointSetData* AsFFI();
-  inline static const CodePointSetData* FromFFI(const diplomat::capi::CodePointSetData* ptr);
-  inline static CodePointSetData* FromFFI(diplomat::capi::CodePointSetData* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  CodePointSetData() = delete;
-  CodePointSetData(const CodePointSetData&) = delete;
-  CodePointSetData(CodePointSetData&&) noexcept = delete;
-  CodePointSetData operator=(const CodePointSetData&) = delete;
-  CodePointSetData operator=(CodePointSetData&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // CodePointSetData_D_HPP
diff --git a/ffi/capi/bindings/cpp/CodePointSetData.hpp b/ffi/capi/bindings/cpp/CodePointSetData.hpp
deleted file mode 100644
index 4627a606fa4..00000000000
--- a/ffi/capi/bindings/cpp/CodePointSetData.hpp
+++ /dev/null
@@ -1,615 +0,0 @@
-#ifndef CodePointSetData_HPP
-#define CodePointSetData_HPP
-
-#include "CodePointSetData.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "CodePointRangeIterator.hpp"
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "Error.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    bool icu4x_CodePointSetData_contains_mv1(const diplomat::capi::CodePointSetData* self, char32_t cp);
-    
-    diplomat::capi::CodePointRangeIterator* icu4x_CodePointSetData_iter_ranges_mv1(const diplomat::capi::CodePointSetData* self);
-    
-    diplomat::capi::CodePointRangeIterator* icu4x_CodePointSetData_iter_ranges_complemented_mv1(const diplomat::capi::CodePointSetData* self);
-    
-    typedef struct icu4x_CodePointSetData_load_for_general_category_group_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_for_general_category_group_mv1_result;
-    icu4x_CodePointSetData_load_for_general_category_group_mv1_result icu4x_CodePointSetData_load_for_general_category_group_mv1(const diplomat::capi::DataProvider* provider, uint32_t group);
-    
-    typedef struct icu4x_CodePointSetData_load_ascii_hex_digit_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_ascii_hex_digit_mv1_result;
-    icu4x_CodePointSetData_load_ascii_hex_digit_mv1_result icu4x_CodePointSetData_load_ascii_hex_digit_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_alnum_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_alnum_mv1_result;
-    icu4x_CodePointSetData_load_alnum_mv1_result icu4x_CodePointSetData_load_alnum_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_alphabetic_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_alphabetic_mv1_result;
-    icu4x_CodePointSetData_load_alphabetic_mv1_result icu4x_CodePointSetData_load_alphabetic_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_bidi_control_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_bidi_control_mv1_result;
-    icu4x_CodePointSetData_load_bidi_control_mv1_result icu4x_CodePointSetData_load_bidi_control_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_bidi_mirrored_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_bidi_mirrored_mv1_result;
-    icu4x_CodePointSetData_load_bidi_mirrored_mv1_result icu4x_CodePointSetData_load_bidi_mirrored_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_blank_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_blank_mv1_result;
-    icu4x_CodePointSetData_load_blank_mv1_result icu4x_CodePointSetData_load_blank_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_cased_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_cased_mv1_result;
-    icu4x_CodePointSetData_load_cased_mv1_result icu4x_CodePointSetData_load_cased_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_case_ignorable_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_case_ignorable_mv1_result;
-    icu4x_CodePointSetData_load_case_ignorable_mv1_result icu4x_CodePointSetData_load_case_ignorable_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_full_composition_exclusion_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_full_composition_exclusion_mv1_result;
-    icu4x_CodePointSetData_load_full_composition_exclusion_mv1_result icu4x_CodePointSetData_load_full_composition_exclusion_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_changes_when_casefolded_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_changes_when_casefolded_mv1_result;
-    icu4x_CodePointSetData_load_changes_when_casefolded_mv1_result icu4x_CodePointSetData_load_changes_when_casefolded_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_changes_when_casemapped_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_changes_when_casemapped_mv1_result;
-    icu4x_CodePointSetData_load_changes_when_casemapped_mv1_result icu4x_CodePointSetData_load_changes_when_casemapped_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_changes_when_nfkc_casefolded_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_changes_when_nfkc_casefolded_mv1_result;
-    icu4x_CodePointSetData_load_changes_when_nfkc_casefolded_mv1_result icu4x_CodePointSetData_load_changes_when_nfkc_casefolded_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_changes_when_lowercased_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_changes_when_lowercased_mv1_result;
-    icu4x_CodePointSetData_load_changes_when_lowercased_mv1_result icu4x_CodePointSetData_load_changes_when_lowercased_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_changes_when_titlecased_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_changes_when_titlecased_mv1_result;
-    icu4x_CodePointSetData_load_changes_when_titlecased_mv1_result icu4x_CodePointSetData_load_changes_when_titlecased_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_changes_when_uppercased_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_changes_when_uppercased_mv1_result;
-    icu4x_CodePointSetData_load_changes_when_uppercased_mv1_result icu4x_CodePointSetData_load_changes_when_uppercased_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_dash_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_dash_mv1_result;
-    icu4x_CodePointSetData_load_dash_mv1_result icu4x_CodePointSetData_load_dash_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_deprecated_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_deprecated_mv1_result;
-    icu4x_CodePointSetData_load_deprecated_mv1_result icu4x_CodePointSetData_load_deprecated_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_default_ignorable_code_point_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_default_ignorable_code_point_mv1_result;
-    icu4x_CodePointSetData_load_default_ignorable_code_point_mv1_result icu4x_CodePointSetData_load_default_ignorable_code_point_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_diacritic_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_diacritic_mv1_result;
-    icu4x_CodePointSetData_load_diacritic_mv1_result icu4x_CodePointSetData_load_diacritic_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_emoji_modifier_base_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_emoji_modifier_base_mv1_result;
-    icu4x_CodePointSetData_load_emoji_modifier_base_mv1_result icu4x_CodePointSetData_load_emoji_modifier_base_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_emoji_component_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_emoji_component_mv1_result;
-    icu4x_CodePointSetData_load_emoji_component_mv1_result icu4x_CodePointSetData_load_emoji_component_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_emoji_modifier_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_emoji_modifier_mv1_result;
-    icu4x_CodePointSetData_load_emoji_modifier_mv1_result icu4x_CodePointSetData_load_emoji_modifier_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_emoji_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_emoji_mv1_result;
-    icu4x_CodePointSetData_load_emoji_mv1_result icu4x_CodePointSetData_load_emoji_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_emoji_presentation_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_emoji_presentation_mv1_result;
-    icu4x_CodePointSetData_load_emoji_presentation_mv1_result icu4x_CodePointSetData_load_emoji_presentation_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_extender_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_extender_mv1_result;
-    icu4x_CodePointSetData_load_extender_mv1_result icu4x_CodePointSetData_load_extender_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_extended_pictographic_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_extended_pictographic_mv1_result;
-    icu4x_CodePointSetData_load_extended_pictographic_mv1_result icu4x_CodePointSetData_load_extended_pictographic_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_graph_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_graph_mv1_result;
-    icu4x_CodePointSetData_load_graph_mv1_result icu4x_CodePointSetData_load_graph_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_grapheme_base_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_grapheme_base_mv1_result;
-    icu4x_CodePointSetData_load_grapheme_base_mv1_result icu4x_CodePointSetData_load_grapheme_base_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_grapheme_extend_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_grapheme_extend_mv1_result;
-    icu4x_CodePointSetData_load_grapheme_extend_mv1_result icu4x_CodePointSetData_load_grapheme_extend_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_grapheme_link_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_grapheme_link_mv1_result;
-    icu4x_CodePointSetData_load_grapheme_link_mv1_result icu4x_CodePointSetData_load_grapheme_link_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_hex_digit_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_hex_digit_mv1_result;
-    icu4x_CodePointSetData_load_hex_digit_mv1_result icu4x_CodePointSetData_load_hex_digit_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_hyphen_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_hyphen_mv1_result;
-    icu4x_CodePointSetData_load_hyphen_mv1_result icu4x_CodePointSetData_load_hyphen_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_id_continue_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_id_continue_mv1_result;
-    icu4x_CodePointSetData_load_id_continue_mv1_result icu4x_CodePointSetData_load_id_continue_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_ideographic_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_ideographic_mv1_result;
-    icu4x_CodePointSetData_load_ideographic_mv1_result icu4x_CodePointSetData_load_ideographic_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_id_start_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_id_start_mv1_result;
-    icu4x_CodePointSetData_load_id_start_mv1_result icu4x_CodePointSetData_load_id_start_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_ids_binary_operator_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_ids_binary_operator_mv1_result;
-    icu4x_CodePointSetData_load_ids_binary_operator_mv1_result icu4x_CodePointSetData_load_ids_binary_operator_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_ids_trinary_operator_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_ids_trinary_operator_mv1_result;
-    icu4x_CodePointSetData_load_ids_trinary_operator_mv1_result icu4x_CodePointSetData_load_ids_trinary_operator_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_join_control_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_join_control_mv1_result;
-    icu4x_CodePointSetData_load_join_control_mv1_result icu4x_CodePointSetData_load_join_control_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_logical_order_exception_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_logical_order_exception_mv1_result;
-    icu4x_CodePointSetData_load_logical_order_exception_mv1_result icu4x_CodePointSetData_load_logical_order_exception_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_lowercase_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_lowercase_mv1_result;
-    icu4x_CodePointSetData_load_lowercase_mv1_result icu4x_CodePointSetData_load_lowercase_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_math_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_math_mv1_result;
-    icu4x_CodePointSetData_load_math_mv1_result icu4x_CodePointSetData_load_math_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_noncharacter_code_point_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_noncharacter_code_point_mv1_result;
-    icu4x_CodePointSetData_load_noncharacter_code_point_mv1_result icu4x_CodePointSetData_load_noncharacter_code_point_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_nfc_inert_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_nfc_inert_mv1_result;
-    icu4x_CodePointSetData_load_nfc_inert_mv1_result icu4x_CodePointSetData_load_nfc_inert_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_nfd_inert_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_nfd_inert_mv1_result;
-    icu4x_CodePointSetData_load_nfd_inert_mv1_result icu4x_CodePointSetData_load_nfd_inert_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_nfkc_inert_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_nfkc_inert_mv1_result;
-    icu4x_CodePointSetData_load_nfkc_inert_mv1_result icu4x_CodePointSetData_load_nfkc_inert_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_nfkd_inert_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_nfkd_inert_mv1_result;
-    icu4x_CodePointSetData_load_nfkd_inert_mv1_result icu4x_CodePointSetData_load_nfkd_inert_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_pattern_syntax_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_pattern_syntax_mv1_result;
-    icu4x_CodePointSetData_load_pattern_syntax_mv1_result icu4x_CodePointSetData_load_pattern_syntax_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_pattern_white_space_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_pattern_white_space_mv1_result;
-    icu4x_CodePointSetData_load_pattern_white_space_mv1_result icu4x_CodePointSetData_load_pattern_white_space_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_prepended_concatenation_mark_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_prepended_concatenation_mark_mv1_result;
-    icu4x_CodePointSetData_load_prepended_concatenation_mark_mv1_result icu4x_CodePointSetData_load_prepended_concatenation_mark_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_print_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_print_mv1_result;
-    icu4x_CodePointSetData_load_print_mv1_result icu4x_CodePointSetData_load_print_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_quotation_mark_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_quotation_mark_mv1_result;
-    icu4x_CodePointSetData_load_quotation_mark_mv1_result icu4x_CodePointSetData_load_quotation_mark_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_radical_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_radical_mv1_result;
-    icu4x_CodePointSetData_load_radical_mv1_result icu4x_CodePointSetData_load_radical_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_regional_indicator_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_regional_indicator_mv1_result;
-    icu4x_CodePointSetData_load_regional_indicator_mv1_result icu4x_CodePointSetData_load_regional_indicator_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_soft_dotted_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_soft_dotted_mv1_result;
-    icu4x_CodePointSetData_load_soft_dotted_mv1_result icu4x_CodePointSetData_load_soft_dotted_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_segment_starter_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_segment_starter_mv1_result;
-    icu4x_CodePointSetData_load_segment_starter_mv1_result icu4x_CodePointSetData_load_segment_starter_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_case_sensitive_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_case_sensitive_mv1_result;
-    icu4x_CodePointSetData_load_case_sensitive_mv1_result icu4x_CodePointSetData_load_case_sensitive_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_sentence_terminal_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_sentence_terminal_mv1_result;
-    icu4x_CodePointSetData_load_sentence_terminal_mv1_result icu4x_CodePointSetData_load_sentence_terminal_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_terminal_punctuation_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_terminal_punctuation_mv1_result;
-    icu4x_CodePointSetData_load_terminal_punctuation_mv1_result icu4x_CodePointSetData_load_terminal_punctuation_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_unified_ideograph_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_unified_ideograph_mv1_result;
-    icu4x_CodePointSetData_load_unified_ideograph_mv1_result icu4x_CodePointSetData_load_unified_ideograph_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_uppercase_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_uppercase_mv1_result;
-    icu4x_CodePointSetData_load_uppercase_mv1_result icu4x_CodePointSetData_load_uppercase_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_variation_selector_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_variation_selector_mv1_result;
-    icu4x_CodePointSetData_load_variation_selector_mv1_result icu4x_CodePointSetData_load_variation_selector_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_white_space_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_white_space_mv1_result;
-    icu4x_CodePointSetData_load_white_space_mv1_result icu4x_CodePointSetData_load_white_space_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_xdigit_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_xdigit_mv1_result;
-    icu4x_CodePointSetData_load_xdigit_mv1_result icu4x_CodePointSetData_load_xdigit_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_xid_continue_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_xid_continue_mv1_result;
-    icu4x_CodePointSetData_load_xid_continue_mv1_result icu4x_CodePointSetData_load_xid_continue_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_xid_start_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_xid_start_mv1_result;
-    icu4x_CodePointSetData_load_xid_start_mv1_result icu4x_CodePointSetData_load_xid_start_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_CodePointSetData_load_for_ecma262_mv1_result {union {diplomat::capi::CodePointSetData* ok; diplomat::capi::Error err;}; bool is_ok;} icu4x_CodePointSetData_load_for_ecma262_mv1_result;
-    icu4x_CodePointSetData_load_for_ecma262_mv1_result icu4x_CodePointSetData_load_for_ecma262_mv1(const diplomat::capi::DataProvider* provider, const char* property_name_data, size_t property_name_len);
-    
-    
-    void icu4x_CodePointSetData_destroy_mv1(CodePointSetData* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline bool CodePointSetData::contains(char32_t cp) const {
-  auto result = diplomat::capi::icu4x_CodePointSetData_contains_mv1(this->AsFFI(),
-    cp);
-  return result;
-}
-
-inline std::unique_ptr<CodePointRangeIterator> CodePointSetData::iter_ranges() const {
-  auto result = diplomat::capi::icu4x_CodePointSetData_iter_ranges_mv1(this->AsFFI());
-  return std::unique_ptr<CodePointRangeIterator>(CodePointRangeIterator::FromFFI(result));
-}
-
-inline std::unique_ptr<CodePointRangeIterator> CodePointSetData::iter_ranges_complemented() const {
-  auto result = diplomat::capi::icu4x_CodePointSetData_iter_ranges_complemented_mv1(this->AsFFI());
-  return std::unique_ptr<CodePointRangeIterator>(CodePointRangeIterator::FromFFI(result));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_for_general_category_group(const DataProvider& provider, uint32_t group) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_for_general_category_group_mv1(provider.AsFFI(),
-    group);
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_ascii_hex_digit(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_ascii_hex_digit_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_alnum(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_alnum_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_alphabetic(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_alphabetic_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_bidi_control(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_bidi_control_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_bidi_mirrored(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_bidi_mirrored_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_blank(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_blank_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_cased(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_cased_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_case_ignorable(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_case_ignorable_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_full_composition_exclusion(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_full_composition_exclusion_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_changes_when_casefolded(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_changes_when_casefolded_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_changes_when_casemapped(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_changes_when_casemapped_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_changes_when_nfkc_casefolded(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_changes_when_nfkc_casefolded_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_changes_when_lowercased(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_changes_when_lowercased_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_changes_when_titlecased(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_changes_when_titlecased_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_changes_when_uppercased(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_changes_when_uppercased_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_dash(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_dash_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_deprecated(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_deprecated_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_default_ignorable_code_point(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_default_ignorable_code_point_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_diacritic(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_diacritic_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_emoji_modifier_base(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_emoji_modifier_base_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_emoji_component(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_emoji_component_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_emoji_modifier(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_emoji_modifier_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_emoji(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_emoji_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_emoji_presentation(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_emoji_presentation_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_extender(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_extender_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_extended_pictographic(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_extended_pictographic_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_graph(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_graph_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_grapheme_base(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_grapheme_base_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_grapheme_extend(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_grapheme_extend_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_grapheme_link(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_grapheme_link_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_hex_digit(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_hex_digit_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_hyphen(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_hyphen_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_id_continue(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_id_continue_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_ideographic(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_ideographic_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_id_start(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_id_start_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_ids_binary_operator(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_ids_binary_operator_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_ids_trinary_operator(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_ids_trinary_operator_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_join_control(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_join_control_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_logical_order_exception(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_logical_order_exception_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_lowercase(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_lowercase_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_math(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_math_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_noncharacter_code_point(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_noncharacter_code_point_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_nfc_inert(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_nfc_inert_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_nfd_inert(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_nfd_inert_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_nfkc_inert(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_nfkc_inert_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_nfkd_inert(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_nfkd_inert_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_pattern_syntax(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_pattern_syntax_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_pattern_white_space(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_pattern_white_space_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_prepended_concatenation_mark(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_prepended_concatenation_mark_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_print(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_print_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_quotation_mark(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_quotation_mark_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_radical(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_radical_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_regional_indicator(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_regional_indicator_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_soft_dotted(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_soft_dotted_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_segment_starter(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_segment_starter_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_case_sensitive(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_case_sensitive_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_sentence_terminal(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_sentence_terminal_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_terminal_punctuation(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_terminal_punctuation_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_unified_ideograph(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_unified_ideograph_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_uppercase(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_uppercase_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_variation_selector(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_variation_selector_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_white_space(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_white_space_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_xdigit(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_xdigit_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_xid_continue(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_xid_continue_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<CodePointSetData>, DataError> CodePointSetData::load_xid_start(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_xid_start_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<diplomat::result<std::unique_ptr<CodePointSetData>, Error>, diplomat::Utf8Error> CodePointSetData::load_for_ecma262(const DataProvider& provider, std::string_view property_name) {
-  if (!diplomat::capi::diplomat_is_str(property_name.data(), property_name.size())) {
-    return diplomat::Err<diplomat::Utf8Error>(diplomat::Utf8Error());
-  }
-  auto result = diplomat::capi::icu4x_CodePointSetData_load_for_ecma262_mv1(provider.AsFFI(),
-    property_name.data(),
-    property_name.size());
-  return diplomat::Ok<diplomat::result<std::unique_ptr<CodePointSetData>, Error>>(result.is_ok ? diplomat::result<std::unique_ptr<CodePointSetData>, Error>(diplomat::Ok<std::unique_ptr<CodePointSetData>>(std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CodePointSetData>, Error>(diplomat::Err<Error>(Error::FromFFI(result.err))));
-}
-
-inline const diplomat::capi::CodePointSetData* CodePointSetData::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::CodePointSetData*>(this);
-}
-
-inline diplomat::capi::CodePointSetData* CodePointSetData::AsFFI() {
-  return reinterpret_cast<diplomat::capi::CodePointSetData*>(this);
-}
-
-inline const CodePointSetData* CodePointSetData::FromFFI(const diplomat::capi::CodePointSetData* ptr) {
-  return reinterpret_cast<const CodePointSetData*>(ptr);
-}
-
-inline CodePointSetData* CodePointSetData::FromFFI(diplomat::capi::CodePointSetData* ptr) {
-  return reinterpret_cast<CodePointSetData*>(ptr);
-}
-
-inline void CodePointSetData::operator delete(void* ptr) {
-  diplomat::capi::icu4x_CodePointSetData_destroy_mv1(reinterpret_cast<diplomat::capi::CodePointSetData*>(ptr));
-}
-
-
-#endif // CodePointSetData_HPP
diff --git a/ffi/capi/bindings/cpp/Collator.d.hpp b/ffi/capi/bindings/cpp/Collator.d.hpp
deleted file mode 100644
index 486d7ef874d..00000000000
--- a/ffi/capi/bindings/cpp/Collator.d.hpp
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef Collator_D_HPP
-#define Collator_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-struct CollatorOptionsV1;
-struct CollatorResolvedOptionsV1;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct Collator;
-} // namespace capi
-} // namespace
-
-class Collator {
-public:
-
-  inline static diplomat::result<std::unique_ptr<Collator>, DataError> create_v1(const DataProvider& provider, const Locale& locale, CollatorOptionsV1 options);
-
-  inline int8_t compare(std::string_view left, std::string_view right) const;
-
-  inline int8_t compare16(std::u16string_view left, std::u16string_view right) const;
-
-  inline CollatorResolvedOptionsV1 resolved_options_v1() const;
-
-  inline const diplomat::capi::Collator* AsFFI() const;
-  inline diplomat::capi::Collator* AsFFI();
-  inline static const Collator* FromFFI(const diplomat::capi::Collator* ptr);
-  inline static Collator* FromFFI(diplomat::capi::Collator* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  Collator() = delete;
-  Collator(const Collator&) = delete;
-  Collator(Collator&&) noexcept = delete;
-  Collator operator=(const Collator&) = delete;
-  Collator operator=(Collator&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // Collator_D_HPP
diff --git a/ffi/capi/bindings/cpp/Collator.hpp b/ffi/capi/bindings/cpp/Collator.hpp
deleted file mode 100644
index ac1850ca59c..00000000000
--- a/ffi/capi/bindings/cpp/Collator.hpp
+++ /dev/null
@@ -1,91 +0,0 @@
-#ifndef Collator_HPP
-#define Collator_HPP
-
-#include "Collator.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "CollatorOptionsV1.hpp"
-#include "CollatorResolvedOptionsV1.hpp"
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "Locale.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_Collator_create_v1_mv1_result {union {diplomat::capi::Collator* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_Collator_create_v1_mv1_result;
-    icu4x_Collator_create_v1_mv1_result icu4x_Collator_create_v1_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale, diplomat::capi::CollatorOptionsV1 options);
-    
-    int8_t icu4x_Collator_compare_utf8_mv1(const diplomat::capi::Collator* self, const char* left_data, size_t left_len, const char* right_data, size_t right_len);
-    
-    int8_t icu4x_Collator_compare_utf16_mv1(const diplomat::capi::Collator* self, const char16_t* left_data, size_t left_len, const char16_t* right_data, size_t right_len);
-    
-    diplomat::capi::CollatorResolvedOptionsV1 icu4x_Collator_resolved_options_v1_mv1(const diplomat::capi::Collator* self);
-    
-    
-    void icu4x_Collator_destroy_mv1(Collator* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<Collator>, DataError> Collator::create_v1(const DataProvider& provider, const Locale& locale, CollatorOptionsV1 options) {
-  auto result = diplomat::capi::icu4x_Collator_create_v1_mv1(provider.AsFFI(),
-    locale.AsFFI(),
-    options.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<Collator>, DataError>(diplomat::Ok<std::unique_ptr<Collator>>(std::unique_ptr<Collator>(Collator::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<Collator>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline int8_t Collator::compare(std::string_view left, std::string_view right) const {
-  auto result = diplomat::capi::icu4x_Collator_compare_utf8_mv1(this->AsFFI(),
-    left.data(),
-    left.size(),
-    right.data(),
-    right.size());
-  return result;
-}
-
-inline int8_t Collator::compare16(std::u16string_view left, std::u16string_view right) const {
-  auto result = diplomat::capi::icu4x_Collator_compare_utf16_mv1(this->AsFFI(),
-    left.data(),
-    left.size(),
-    right.data(),
-    right.size());
-  return result;
-}
-
-inline CollatorResolvedOptionsV1 Collator::resolved_options_v1() const {
-  auto result = diplomat::capi::icu4x_Collator_resolved_options_v1_mv1(this->AsFFI());
-  return CollatorResolvedOptionsV1::FromFFI(result);
-}
-
-inline const diplomat::capi::Collator* Collator::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::Collator*>(this);
-}
-
-inline diplomat::capi::Collator* Collator::AsFFI() {
-  return reinterpret_cast<diplomat::capi::Collator*>(this);
-}
-
-inline const Collator* Collator::FromFFI(const diplomat::capi::Collator* ptr) {
-  return reinterpret_cast<const Collator*>(ptr);
-}
-
-inline Collator* Collator::FromFFI(diplomat::capi::Collator* ptr) {
-  return reinterpret_cast<Collator*>(ptr);
-}
-
-inline void Collator::operator delete(void* ptr) {
-  diplomat::capi::icu4x_Collator_destroy_mv1(reinterpret_cast<diplomat::capi::Collator*>(ptr));
-}
-
-
-#endif // Collator_HPP
diff --git a/ffi/capi/bindings/cpp/CollatorAlternateHandling.hpp b/ffi/capi/bindings/cpp/CollatorAlternateHandling.hpp
deleted file mode 100644
index 24d8cbbb9fc..00000000000
--- a/ffi/capi/bindings/cpp/CollatorAlternateHandling.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef CollatorAlternateHandling_HPP
-#define CollatorAlternateHandling_HPP
-
-#include "CollatorAlternateHandling.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::CollatorAlternateHandling CollatorAlternateHandling::AsFFI() const {
-  return static_cast<diplomat::capi::CollatorAlternateHandling>(value);
-}
-
-inline CollatorAlternateHandling CollatorAlternateHandling::FromFFI(diplomat::capi::CollatorAlternateHandling c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::CollatorAlternateHandling_Auto:
-    case diplomat::capi::CollatorAlternateHandling_NonIgnorable:
-    case diplomat::capi::CollatorAlternateHandling_Shifted:
-      return static_cast<CollatorAlternateHandling::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // CollatorAlternateHandling_HPP
diff --git a/ffi/capi/bindings/cpp/CollatorBackwardSecondLevel.hpp b/ffi/capi/bindings/cpp/CollatorBackwardSecondLevel.hpp
deleted file mode 100644
index 161bf3223d7..00000000000
--- a/ffi/capi/bindings/cpp/CollatorBackwardSecondLevel.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef CollatorBackwardSecondLevel_HPP
-#define CollatorBackwardSecondLevel_HPP
-
-#include "CollatorBackwardSecondLevel.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::CollatorBackwardSecondLevel CollatorBackwardSecondLevel::AsFFI() const {
-  return static_cast<diplomat::capi::CollatorBackwardSecondLevel>(value);
-}
-
-inline CollatorBackwardSecondLevel CollatorBackwardSecondLevel::FromFFI(diplomat::capi::CollatorBackwardSecondLevel c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::CollatorBackwardSecondLevel_Auto:
-    case diplomat::capi::CollatorBackwardSecondLevel_Off:
-    case diplomat::capi::CollatorBackwardSecondLevel_On:
-      return static_cast<CollatorBackwardSecondLevel::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // CollatorBackwardSecondLevel_HPP
diff --git a/ffi/capi/bindings/cpp/CollatorCaseFirst.hpp b/ffi/capi/bindings/cpp/CollatorCaseFirst.hpp
deleted file mode 100644
index a4346969cb7..00000000000
--- a/ffi/capi/bindings/cpp/CollatorCaseFirst.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef CollatorCaseFirst_HPP
-#define CollatorCaseFirst_HPP
-
-#include "CollatorCaseFirst.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::CollatorCaseFirst CollatorCaseFirst::AsFFI() const {
-  return static_cast<diplomat::capi::CollatorCaseFirst>(value);
-}
-
-inline CollatorCaseFirst CollatorCaseFirst::FromFFI(diplomat::capi::CollatorCaseFirst c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::CollatorCaseFirst_Auto:
-    case diplomat::capi::CollatorCaseFirst_Off:
-    case diplomat::capi::CollatorCaseFirst_LowerFirst:
-    case diplomat::capi::CollatorCaseFirst_UpperFirst:
-      return static_cast<CollatorCaseFirst::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // CollatorCaseFirst_HPP
diff --git a/ffi/capi/bindings/cpp/CollatorCaseLevel.hpp b/ffi/capi/bindings/cpp/CollatorCaseLevel.hpp
deleted file mode 100644
index 9f668f3fb5f..00000000000
--- a/ffi/capi/bindings/cpp/CollatorCaseLevel.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef CollatorCaseLevel_HPP
-#define CollatorCaseLevel_HPP
-
-#include "CollatorCaseLevel.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::CollatorCaseLevel CollatorCaseLevel::AsFFI() const {
-  return static_cast<diplomat::capi::CollatorCaseLevel>(value);
-}
-
-inline CollatorCaseLevel CollatorCaseLevel::FromFFI(diplomat::capi::CollatorCaseLevel c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::CollatorCaseLevel_Auto:
-    case diplomat::capi::CollatorCaseLevel_Off:
-    case diplomat::capi::CollatorCaseLevel_On:
-      return static_cast<CollatorCaseLevel::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // CollatorCaseLevel_HPP
diff --git a/ffi/capi/bindings/cpp/CollatorMaxVariable.hpp b/ffi/capi/bindings/cpp/CollatorMaxVariable.hpp
deleted file mode 100644
index 1d7bb0ccca4..00000000000
--- a/ffi/capi/bindings/cpp/CollatorMaxVariable.hpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef CollatorMaxVariable_HPP
-#define CollatorMaxVariable_HPP
-
-#include "CollatorMaxVariable.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::CollatorMaxVariable CollatorMaxVariable::AsFFI() const {
-  return static_cast<diplomat::capi::CollatorMaxVariable>(value);
-}
-
-inline CollatorMaxVariable CollatorMaxVariable::FromFFI(diplomat::capi::CollatorMaxVariable c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::CollatorMaxVariable_Auto:
-    case diplomat::capi::CollatorMaxVariable_Space:
-    case diplomat::capi::CollatorMaxVariable_Punctuation:
-    case diplomat::capi::CollatorMaxVariable_Symbol:
-    case diplomat::capi::CollatorMaxVariable_Currency:
-      return static_cast<CollatorMaxVariable::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // CollatorMaxVariable_HPP
diff --git a/ffi/capi/bindings/cpp/CollatorNumeric.hpp b/ffi/capi/bindings/cpp/CollatorNumeric.hpp
deleted file mode 100644
index 29d17346921..00000000000
--- a/ffi/capi/bindings/cpp/CollatorNumeric.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef CollatorNumeric_HPP
-#define CollatorNumeric_HPP
-
-#include "CollatorNumeric.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::CollatorNumeric CollatorNumeric::AsFFI() const {
-  return static_cast<diplomat::capi::CollatorNumeric>(value);
-}
-
-inline CollatorNumeric CollatorNumeric::FromFFI(diplomat::capi::CollatorNumeric c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::CollatorNumeric_Auto:
-    case diplomat::capi::CollatorNumeric_Off:
-    case diplomat::capi::CollatorNumeric_On:
-      return static_cast<CollatorNumeric::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // CollatorNumeric_HPP
diff --git a/ffi/capi/bindings/cpp/CollatorOptionsV1.d.hpp b/ffi/capi/bindings/cpp/CollatorOptionsV1.d.hpp
deleted file mode 100644
index 4186b500783..00000000000
--- a/ffi/capi/bindings/cpp/CollatorOptionsV1.d.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef CollatorOptionsV1_D_HPP
-#define CollatorOptionsV1_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "CollatorAlternateHandling.d.hpp"
-#include "CollatorBackwardSecondLevel.d.hpp"
-#include "CollatorCaseFirst.d.hpp"
-#include "CollatorCaseLevel.d.hpp"
-#include "CollatorMaxVariable.d.hpp"
-#include "CollatorNumeric.d.hpp"
-#include "CollatorStrength.d.hpp"
-#include "diplomat_runtime.hpp"
-
-class CollatorAlternateHandling;
-class CollatorBackwardSecondLevel;
-class CollatorCaseFirst;
-class CollatorCaseLevel;
-class CollatorMaxVariable;
-class CollatorNumeric;
-class CollatorStrength;
-
-
-namespace diplomat {
-namespace capi {
-    struct CollatorOptionsV1 {
-      diplomat::capi::CollatorStrength strength;
-      diplomat::capi::CollatorAlternateHandling alternate_handling;
-      diplomat::capi::CollatorCaseFirst case_first;
-      diplomat::capi::CollatorMaxVariable max_variable;
-      diplomat::capi::CollatorCaseLevel case_level;
-      diplomat::capi::CollatorNumeric numeric;
-      diplomat::capi::CollatorBackwardSecondLevel backward_second_level;
-    };
-} // namespace capi
-} // namespace
-
-
-struct CollatorOptionsV1 {
-  CollatorStrength strength;
-  CollatorAlternateHandling alternate_handling;
-  CollatorCaseFirst case_first;
-  CollatorMaxVariable max_variable;
-  CollatorCaseLevel case_level;
-  CollatorNumeric numeric;
-  CollatorBackwardSecondLevel backward_second_level;
-
-  inline diplomat::capi::CollatorOptionsV1 AsFFI() const;
-  inline static CollatorOptionsV1 FromFFI(diplomat::capi::CollatorOptionsV1 c_struct);
-};
-
-
-#endif // CollatorOptionsV1_D_HPP
diff --git a/ffi/capi/bindings/cpp/CollatorOptionsV1.hpp b/ffi/capi/bindings/cpp/CollatorOptionsV1.hpp
deleted file mode 100644
index ab015d30e27..00000000000
--- a/ffi/capi/bindings/cpp/CollatorOptionsV1.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef CollatorOptionsV1_HPP
-#define CollatorOptionsV1_HPP
-
-#include "CollatorOptionsV1.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "CollatorAlternateHandling.hpp"
-#include "CollatorBackwardSecondLevel.hpp"
-#include "CollatorCaseFirst.hpp"
-#include "CollatorCaseLevel.hpp"
-#include "CollatorMaxVariable.hpp"
-#include "CollatorNumeric.hpp"
-#include "CollatorStrength.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-
-inline diplomat::capi::CollatorOptionsV1 CollatorOptionsV1::AsFFI() const {
-  return diplomat::capi::CollatorOptionsV1 {
-    /* .strength = */ strength.AsFFI(),
-    /* .alternate_handling = */ alternate_handling.AsFFI(),
-    /* .case_first = */ case_first.AsFFI(),
-    /* .max_variable = */ max_variable.AsFFI(),
-    /* .case_level = */ case_level.AsFFI(),
-    /* .numeric = */ numeric.AsFFI(),
-    /* .backward_second_level = */ backward_second_level.AsFFI(),
-  };
-}
-
-inline CollatorOptionsV1 CollatorOptionsV1::FromFFI(diplomat::capi::CollatorOptionsV1 c_struct) {
-  return CollatorOptionsV1 {
-    /* .strength = */ CollatorStrength::FromFFI(c_struct.strength),
-    /* .alternate_handling = */ CollatorAlternateHandling::FromFFI(c_struct.alternate_handling),
-    /* .case_first = */ CollatorCaseFirst::FromFFI(c_struct.case_first),
-    /* .max_variable = */ CollatorMaxVariable::FromFFI(c_struct.max_variable),
-    /* .case_level = */ CollatorCaseLevel::FromFFI(c_struct.case_level),
-    /* .numeric = */ CollatorNumeric::FromFFI(c_struct.numeric),
-    /* .backward_second_level = */ CollatorBackwardSecondLevel::FromFFI(c_struct.backward_second_level),
-  };
-}
-
-
-#endif // CollatorOptionsV1_HPP
diff --git a/ffi/capi/bindings/cpp/CollatorResolvedOptionsV1.d.hpp b/ffi/capi/bindings/cpp/CollatorResolvedOptionsV1.d.hpp
deleted file mode 100644
index d6aafa29eff..00000000000
--- a/ffi/capi/bindings/cpp/CollatorResolvedOptionsV1.d.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef CollatorResolvedOptionsV1_D_HPP
-#define CollatorResolvedOptionsV1_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "CollatorAlternateHandling.d.hpp"
-#include "CollatorBackwardSecondLevel.d.hpp"
-#include "CollatorCaseFirst.d.hpp"
-#include "CollatorCaseLevel.d.hpp"
-#include "CollatorMaxVariable.d.hpp"
-#include "CollatorNumeric.d.hpp"
-#include "CollatorStrength.d.hpp"
-#include "diplomat_runtime.hpp"
-
-class CollatorAlternateHandling;
-class CollatorBackwardSecondLevel;
-class CollatorCaseFirst;
-class CollatorCaseLevel;
-class CollatorMaxVariable;
-class CollatorNumeric;
-class CollatorStrength;
-
-
-namespace diplomat {
-namespace capi {
-    struct CollatorResolvedOptionsV1 {
-      diplomat::capi::CollatorStrength strength;
-      diplomat::capi::CollatorAlternateHandling alternate_handling;
-      diplomat::capi::CollatorCaseFirst case_first;
-      diplomat::capi::CollatorMaxVariable max_variable;
-      diplomat::capi::CollatorCaseLevel case_level;
-      diplomat::capi::CollatorNumeric numeric;
-      diplomat::capi::CollatorBackwardSecondLevel backward_second_level;
-    };
-} // namespace capi
-} // namespace
-
-
-struct CollatorResolvedOptionsV1 {
-  CollatorStrength strength;
-  CollatorAlternateHandling alternate_handling;
-  CollatorCaseFirst case_first;
-  CollatorMaxVariable max_variable;
-  CollatorCaseLevel case_level;
-  CollatorNumeric numeric;
-  CollatorBackwardSecondLevel backward_second_level;
-
-  inline diplomat::capi::CollatorResolvedOptionsV1 AsFFI() const;
-  inline static CollatorResolvedOptionsV1 FromFFI(diplomat::capi::CollatorResolvedOptionsV1 c_struct);
-};
-
-
-#endif // CollatorResolvedOptionsV1_D_HPP
diff --git a/ffi/capi/bindings/cpp/CollatorResolvedOptionsV1.hpp b/ffi/capi/bindings/cpp/CollatorResolvedOptionsV1.hpp
deleted file mode 100644
index 4013519a895..00000000000
--- a/ffi/capi/bindings/cpp/CollatorResolvedOptionsV1.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef CollatorResolvedOptionsV1_HPP
-#define CollatorResolvedOptionsV1_HPP
-
-#include "CollatorResolvedOptionsV1.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "CollatorAlternateHandling.hpp"
-#include "CollatorBackwardSecondLevel.hpp"
-#include "CollatorCaseFirst.hpp"
-#include "CollatorCaseLevel.hpp"
-#include "CollatorMaxVariable.hpp"
-#include "CollatorNumeric.hpp"
-#include "CollatorStrength.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-
-inline diplomat::capi::CollatorResolvedOptionsV1 CollatorResolvedOptionsV1::AsFFI() const {
-  return diplomat::capi::CollatorResolvedOptionsV1 {
-    /* .strength = */ strength.AsFFI(),
-    /* .alternate_handling = */ alternate_handling.AsFFI(),
-    /* .case_first = */ case_first.AsFFI(),
-    /* .max_variable = */ max_variable.AsFFI(),
-    /* .case_level = */ case_level.AsFFI(),
-    /* .numeric = */ numeric.AsFFI(),
-    /* .backward_second_level = */ backward_second_level.AsFFI(),
-  };
-}
-
-inline CollatorResolvedOptionsV1 CollatorResolvedOptionsV1::FromFFI(diplomat::capi::CollatorResolvedOptionsV1 c_struct) {
-  return CollatorResolvedOptionsV1 {
-    /* .strength = */ CollatorStrength::FromFFI(c_struct.strength),
-    /* .alternate_handling = */ CollatorAlternateHandling::FromFFI(c_struct.alternate_handling),
-    /* .case_first = */ CollatorCaseFirst::FromFFI(c_struct.case_first),
-    /* .max_variable = */ CollatorMaxVariable::FromFFI(c_struct.max_variable),
-    /* .case_level = */ CollatorCaseLevel::FromFFI(c_struct.case_level),
-    /* .numeric = */ CollatorNumeric::FromFFI(c_struct.numeric),
-    /* .backward_second_level = */ CollatorBackwardSecondLevel::FromFFI(c_struct.backward_second_level),
-  };
-}
-
-
-#endif // CollatorResolvedOptionsV1_HPP
diff --git a/ffi/capi/bindings/cpp/CollatorStrength.hpp b/ffi/capi/bindings/cpp/CollatorStrength.hpp
deleted file mode 100644
index 0ccd38b8728..00000000000
--- a/ffi/capi/bindings/cpp/CollatorStrength.hpp
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef CollatorStrength_HPP
-#define CollatorStrength_HPP
-
-#include "CollatorStrength.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::CollatorStrength CollatorStrength::AsFFI() const {
-  return static_cast<diplomat::capi::CollatorStrength>(value);
-}
-
-inline CollatorStrength CollatorStrength::FromFFI(diplomat::capi::CollatorStrength c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::CollatorStrength_Auto:
-    case diplomat::capi::CollatorStrength_Primary:
-    case diplomat::capi::CollatorStrength_Secondary:
-    case diplomat::capi::CollatorStrength_Tertiary:
-    case diplomat::capi::CollatorStrength_Quaternary:
-    case diplomat::capi::CollatorStrength_Identical:
-      return static_cast<CollatorStrength::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // CollatorStrength_HPP
diff --git a/ffi/capi/bindings/cpp/ComposingNormalizer.d.hpp b/ffi/capi/bindings/cpp/ComposingNormalizer.d.hpp
deleted file mode 100644
index ddf5c81f150..00000000000
--- a/ffi/capi/bindings/cpp/ComposingNormalizer.d.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef ComposingNormalizer_D_HPP
-#define ComposingNormalizer_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct ComposingNormalizer;
-} // namespace capi
-} // namespace
-
-class ComposingNormalizer {
-public:
-
-  inline static diplomat::result<std::unique_ptr<ComposingNormalizer>, DataError> create_nfc(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<ComposingNormalizer>, DataError> create_nfkc(const DataProvider& provider);
-
-  inline std::string normalize(std::string_view s) const;
-
-  inline bool is_normalized(std::string_view s) const;
-
-  inline bool is_normalized16(std::u16string_view s) const;
-
-  inline size_t is_normalized_up_to(std::string_view s) const;
-
-  inline size_t is_normalized16_up_to(std::u16string_view s) const;
-
-  inline const diplomat::capi::ComposingNormalizer* AsFFI() const;
-  inline diplomat::capi::ComposingNormalizer* AsFFI();
-  inline static const ComposingNormalizer* FromFFI(const diplomat::capi::ComposingNormalizer* ptr);
-  inline static ComposingNormalizer* FromFFI(diplomat::capi::ComposingNormalizer* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  ComposingNormalizer() = delete;
-  ComposingNormalizer(const ComposingNormalizer&) = delete;
-  ComposingNormalizer(ComposingNormalizer&&) noexcept = delete;
-  ComposingNormalizer operator=(const ComposingNormalizer&) = delete;
-  ComposingNormalizer operator=(ComposingNormalizer&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // ComposingNormalizer_D_HPP
diff --git a/ffi/capi/bindings/cpp/ComposingNormalizer.hpp b/ffi/capi/bindings/cpp/ComposingNormalizer.hpp
deleted file mode 100644
index 6476b3a7190..00000000000
--- a/ffi/capi/bindings/cpp/ComposingNormalizer.hpp
+++ /dev/null
@@ -1,113 +0,0 @@
-#ifndef ComposingNormalizer_HPP
-#define ComposingNormalizer_HPP
-
-#include "ComposingNormalizer.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_ComposingNormalizer_create_nfc_mv1_result {union {diplomat::capi::ComposingNormalizer* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_ComposingNormalizer_create_nfc_mv1_result;
-    icu4x_ComposingNormalizer_create_nfc_mv1_result icu4x_ComposingNormalizer_create_nfc_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_ComposingNormalizer_create_nfkc_mv1_result {union {diplomat::capi::ComposingNormalizer* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_ComposingNormalizer_create_nfkc_mv1_result;
-    icu4x_ComposingNormalizer_create_nfkc_mv1_result icu4x_ComposingNormalizer_create_nfkc_mv1(const diplomat::capi::DataProvider* provider);
-    
-    void icu4x_ComposingNormalizer_normalize_mv1(const diplomat::capi::ComposingNormalizer* self, const char* s_data, size_t s_len, diplomat::capi::DiplomatWrite* write);
-    
-    bool icu4x_ComposingNormalizer_is_normalized_utf8_mv1(const diplomat::capi::ComposingNormalizer* self, const char* s_data, size_t s_len);
-    
-    bool icu4x_ComposingNormalizer_is_normalized_utf16_mv1(const diplomat::capi::ComposingNormalizer* self, const char16_t* s_data, size_t s_len);
-    
-    size_t icu4x_ComposingNormalizer_is_normalized_utf8_up_to_mv1(const diplomat::capi::ComposingNormalizer* self, const char* s_data, size_t s_len);
-    
-    size_t icu4x_ComposingNormalizer_is_normalized_utf16_up_to_mv1(const diplomat::capi::ComposingNormalizer* self, const char16_t* s_data, size_t s_len);
-    
-    
-    void icu4x_ComposingNormalizer_destroy_mv1(ComposingNormalizer* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<ComposingNormalizer>, DataError> ComposingNormalizer::create_nfc(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_ComposingNormalizer_create_nfc_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<ComposingNormalizer>, DataError>(diplomat::Ok<std::unique_ptr<ComposingNormalizer>>(std::unique_ptr<ComposingNormalizer>(ComposingNormalizer::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<ComposingNormalizer>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<ComposingNormalizer>, DataError> ComposingNormalizer::create_nfkc(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_ComposingNormalizer_create_nfkc_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<ComposingNormalizer>, DataError>(diplomat::Ok<std::unique_ptr<ComposingNormalizer>>(std::unique_ptr<ComposingNormalizer>(ComposingNormalizer::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<ComposingNormalizer>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline std::string ComposingNormalizer::normalize(std::string_view s) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_ComposingNormalizer_normalize_mv1(this->AsFFI(),
-    s.data(),
-    s.size(),
-    &write);
-  return output;
-}
-
-inline bool ComposingNormalizer::is_normalized(std::string_view s) const {
-  auto result = diplomat::capi::icu4x_ComposingNormalizer_is_normalized_utf8_mv1(this->AsFFI(),
-    s.data(),
-    s.size());
-  return result;
-}
-
-inline bool ComposingNormalizer::is_normalized16(std::u16string_view s) const {
-  auto result = diplomat::capi::icu4x_ComposingNormalizer_is_normalized_utf16_mv1(this->AsFFI(),
-    s.data(),
-    s.size());
-  return result;
-}
-
-inline size_t ComposingNormalizer::is_normalized_up_to(std::string_view s) const {
-  auto result = diplomat::capi::icu4x_ComposingNormalizer_is_normalized_utf8_up_to_mv1(this->AsFFI(),
-    s.data(),
-    s.size());
-  return result;
-}
-
-inline size_t ComposingNormalizer::is_normalized16_up_to(std::u16string_view s) const {
-  auto result = diplomat::capi::icu4x_ComposingNormalizer_is_normalized_utf16_up_to_mv1(this->AsFFI(),
-    s.data(),
-    s.size());
-  return result;
-}
-
-inline const diplomat::capi::ComposingNormalizer* ComposingNormalizer::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::ComposingNormalizer*>(this);
-}
-
-inline diplomat::capi::ComposingNormalizer* ComposingNormalizer::AsFFI() {
-  return reinterpret_cast<diplomat::capi::ComposingNormalizer*>(this);
-}
-
-inline const ComposingNormalizer* ComposingNormalizer::FromFFI(const diplomat::capi::ComposingNormalizer* ptr) {
-  return reinterpret_cast<const ComposingNormalizer*>(ptr);
-}
-
-inline ComposingNormalizer* ComposingNormalizer::FromFFI(diplomat::capi::ComposingNormalizer* ptr) {
-  return reinterpret_cast<ComposingNormalizer*>(ptr);
-}
-
-inline void ComposingNormalizer::operator delete(void* ptr) {
-  diplomat::capi::icu4x_ComposingNormalizer_destroy_mv1(reinterpret_cast<diplomat::capi::ComposingNormalizer*>(ptr));
-}
-
-
-#endif // ComposingNormalizer_HPP
diff --git a/ffi/capi/bindings/cpp/CustomTimeZone.d.hpp b/ffi/capi/bindings/cpp/CustomTimeZone.d.hpp
deleted file mode 100644
index bba2fc60fa5..00000000000
--- a/ffi/capi/bindings/cpp/CustomTimeZone.d.hpp
+++ /dev/null
@@ -1,102 +0,0 @@
-#ifndef CustomTimeZone_D_HPP
-#define CustomTimeZone_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct IsoDateTime; }
-class IsoDateTime;
-namespace diplomat::capi { struct MetazoneCalculator; }
-class MetazoneCalculator;
-namespace diplomat::capi { struct TimeZoneIdMapper; }
-class TimeZoneIdMapper;
-struct TimeZoneInvalidIdError;
-struct TimeZoneInvalidOffsetError;
-
-
-namespace diplomat {
-namespace capi {
-    struct CustomTimeZone;
-} // namespace capi
-} // namespace
-
-class CustomTimeZone {
-public:
-
-  inline static diplomat::result<std::unique_ptr<CustomTimeZone>, TimeZoneInvalidOffsetError> from_string(std::string_view s);
-
-  inline static std::unique_ptr<CustomTimeZone> empty();
-
-  inline static std::unique_ptr<CustomTimeZone> utc();
-
-  inline static std::unique_ptr<CustomTimeZone> gmt();
-
-  inline static std::unique_ptr<CustomTimeZone> bst();
-
-  inline diplomat::result<std::monostate, TimeZoneInvalidOffsetError> try_set_gmt_offset_seconds(int32_t offset_seconds);
-
-  inline void set_gmt_offset_eighths_of_hour(int8_t offset_eighths_of_hour);
-
-  inline void clear_gmt_offset();
-
-  inline std::optional<int32_t> gmt_offset_seconds() const;
-
-  inline std::optional<bool> is_gmt_offset_positive() const;
-
-  inline std::optional<bool> is_gmt_offset_zero() const;
-
-  inline std::optional<bool> gmt_offset_has_minutes() const;
-
-  inline std::optional<bool> gmt_offset_has_seconds() const;
-
-  inline diplomat::result<std::monostate, TimeZoneInvalidIdError> try_set_time_zone_id(std::string_view id);
-
-  inline diplomat::result<std::monostate, TimeZoneInvalidIdError> try_set_iana_time_zone_id(const TimeZoneIdMapper& mapper, std::string_view id);
-
-  inline void clear_time_zone_id();
-
-  inline std::optional<std::string> time_zone_id() const;
-
-  inline diplomat::result<std::monostate, TimeZoneInvalidIdError> try_set_metazone_id(std::string_view id);
-
-  inline void clear_metazone_id();
-
-  inline std::optional<std::string> metazone_id() const;
-
-  inline std::optional<std::monostate> try_set_zone_variant(std::string_view id);
-
-  inline void clear_zone_variant();
-
-  inline std::optional<std::string> zone_variant() const;
-
-  inline void set_standard_time();
-
-  inline void set_daylight_time();
-
-  inline std::optional<bool> is_standard_time() const;
-
-  inline std::optional<bool> is_daylight_time() const;
-
-  inline void maybe_calculate_metazone(const MetazoneCalculator& metazone_calculator, const IsoDateTime& local_datetime);
-
-  inline const diplomat::capi::CustomTimeZone* AsFFI() const;
-  inline diplomat::capi::CustomTimeZone* AsFFI();
-  inline static const CustomTimeZone* FromFFI(const diplomat::capi::CustomTimeZone* ptr);
-  inline static CustomTimeZone* FromFFI(diplomat::capi::CustomTimeZone* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  CustomTimeZone() = delete;
-  CustomTimeZone(const CustomTimeZone&) = delete;
-  CustomTimeZone(CustomTimeZone&&) noexcept = delete;
-  CustomTimeZone operator=(const CustomTimeZone&) = delete;
-  CustomTimeZone operator=(CustomTimeZone&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // CustomTimeZone_D_HPP
diff --git a/ffi/capi/bindings/cpp/CustomTimeZone.hpp b/ffi/capi/bindings/cpp/CustomTimeZone.hpp
deleted file mode 100644
index a0d62b931af..00000000000
--- a/ffi/capi/bindings/cpp/CustomTimeZone.hpp
+++ /dev/null
@@ -1,279 +0,0 @@
-#ifndef CustomTimeZone_HPP
-#define CustomTimeZone_HPP
-
-#include "CustomTimeZone.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "IsoDateTime.hpp"
-#include "MetazoneCalculator.hpp"
-#include "TimeZoneIdMapper.hpp"
-#include "TimeZoneInvalidIdError.hpp"
-#include "TimeZoneInvalidOffsetError.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_CustomTimeZone_from_string_mv1_result {union {diplomat::capi::CustomTimeZone* ok; }; bool is_ok;} icu4x_CustomTimeZone_from_string_mv1_result;
-    icu4x_CustomTimeZone_from_string_mv1_result icu4x_CustomTimeZone_from_string_mv1(const char* s_data, size_t s_len);
-    
-    diplomat::capi::CustomTimeZone* icu4x_CustomTimeZone_empty_mv1(void);
-    
-    diplomat::capi::CustomTimeZone* icu4x_CustomTimeZone_utc_mv1(void);
-    
-    diplomat::capi::CustomTimeZone* icu4x_CustomTimeZone_gmt_mv1(void);
-    
-    diplomat::capi::CustomTimeZone* icu4x_CustomTimeZone_bst_mv1(void);
-    
-    typedef struct icu4x_CustomTimeZone_try_set_gmt_offset_seconds_mv1_result { bool is_ok;} icu4x_CustomTimeZone_try_set_gmt_offset_seconds_mv1_result;
-    icu4x_CustomTimeZone_try_set_gmt_offset_seconds_mv1_result icu4x_CustomTimeZone_try_set_gmt_offset_seconds_mv1(diplomat::capi::CustomTimeZone* self, int32_t offset_seconds);
-    
-    void icu4x_CustomTimeZone_set_gmt_offset_eighths_of_hour_mv1(diplomat::capi::CustomTimeZone* self, int8_t offset_eighths_of_hour);
-    
-    void icu4x_CustomTimeZone_clear_gmt_offset_mv1(diplomat::capi::CustomTimeZone* self);
-    
-    typedef struct icu4x_CustomTimeZone_gmt_offset_seconds_mv1_result {union {int32_t ok; }; bool is_ok;} icu4x_CustomTimeZone_gmt_offset_seconds_mv1_result;
-    icu4x_CustomTimeZone_gmt_offset_seconds_mv1_result icu4x_CustomTimeZone_gmt_offset_seconds_mv1(const diplomat::capi::CustomTimeZone* self);
-    
-    typedef struct icu4x_CustomTimeZone_is_gmt_offset_positive_mv1_result {union {bool ok; }; bool is_ok;} icu4x_CustomTimeZone_is_gmt_offset_positive_mv1_result;
-    icu4x_CustomTimeZone_is_gmt_offset_positive_mv1_result icu4x_CustomTimeZone_is_gmt_offset_positive_mv1(const diplomat::capi::CustomTimeZone* self);
-    
-    typedef struct icu4x_CustomTimeZone_is_gmt_offset_zero_mv1_result {union {bool ok; }; bool is_ok;} icu4x_CustomTimeZone_is_gmt_offset_zero_mv1_result;
-    icu4x_CustomTimeZone_is_gmt_offset_zero_mv1_result icu4x_CustomTimeZone_is_gmt_offset_zero_mv1(const diplomat::capi::CustomTimeZone* self);
-    
-    typedef struct icu4x_CustomTimeZone_gmt_offset_has_minutes_mv1_result {union {bool ok; }; bool is_ok;} icu4x_CustomTimeZone_gmt_offset_has_minutes_mv1_result;
-    icu4x_CustomTimeZone_gmt_offset_has_minutes_mv1_result icu4x_CustomTimeZone_gmt_offset_has_minutes_mv1(const diplomat::capi::CustomTimeZone* self);
-    
-    typedef struct icu4x_CustomTimeZone_gmt_offset_has_seconds_mv1_result {union {bool ok; }; bool is_ok;} icu4x_CustomTimeZone_gmt_offset_has_seconds_mv1_result;
-    icu4x_CustomTimeZone_gmt_offset_has_seconds_mv1_result icu4x_CustomTimeZone_gmt_offset_has_seconds_mv1(const diplomat::capi::CustomTimeZone* self);
-    
-    typedef struct icu4x_CustomTimeZone_try_set_time_zone_id_mv1_result { bool is_ok;} icu4x_CustomTimeZone_try_set_time_zone_id_mv1_result;
-    icu4x_CustomTimeZone_try_set_time_zone_id_mv1_result icu4x_CustomTimeZone_try_set_time_zone_id_mv1(diplomat::capi::CustomTimeZone* self, const char* id_data, size_t id_len);
-    
-    typedef struct icu4x_CustomTimeZone_try_set_iana_time_zone_id_mv1_result { bool is_ok;} icu4x_CustomTimeZone_try_set_iana_time_zone_id_mv1_result;
-    icu4x_CustomTimeZone_try_set_iana_time_zone_id_mv1_result icu4x_CustomTimeZone_try_set_iana_time_zone_id_mv1(diplomat::capi::CustomTimeZone* self, const diplomat::capi::TimeZoneIdMapper* mapper, const char* id_data, size_t id_len);
-    
-    void icu4x_CustomTimeZone_clear_time_zone_id_mv1(diplomat::capi::CustomTimeZone* self);
-    
-    typedef struct icu4x_CustomTimeZone_time_zone_id_mv1_result { bool is_ok;} icu4x_CustomTimeZone_time_zone_id_mv1_result;
-    icu4x_CustomTimeZone_time_zone_id_mv1_result icu4x_CustomTimeZone_time_zone_id_mv1(const diplomat::capi::CustomTimeZone* self, diplomat::capi::DiplomatWrite* write);
-    
-    typedef struct icu4x_CustomTimeZone_try_set_metazone_id_mv1_result { bool is_ok;} icu4x_CustomTimeZone_try_set_metazone_id_mv1_result;
-    icu4x_CustomTimeZone_try_set_metazone_id_mv1_result icu4x_CustomTimeZone_try_set_metazone_id_mv1(diplomat::capi::CustomTimeZone* self, const char* id_data, size_t id_len);
-    
-    void icu4x_CustomTimeZone_clear_metazone_id_mv1(diplomat::capi::CustomTimeZone* self);
-    
-    typedef struct icu4x_CustomTimeZone_metazone_id_mv1_result { bool is_ok;} icu4x_CustomTimeZone_metazone_id_mv1_result;
-    icu4x_CustomTimeZone_metazone_id_mv1_result icu4x_CustomTimeZone_metazone_id_mv1(const diplomat::capi::CustomTimeZone* self, diplomat::capi::DiplomatWrite* write);
-    
-    typedef struct icu4x_CustomTimeZone_try_set_zone_variant_mv1_result { bool is_ok;} icu4x_CustomTimeZone_try_set_zone_variant_mv1_result;
-    icu4x_CustomTimeZone_try_set_zone_variant_mv1_result icu4x_CustomTimeZone_try_set_zone_variant_mv1(diplomat::capi::CustomTimeZone* self, const char* id_data, size_t id_len);
-    
-    void icu4x_CustomTimeZone_clear_zone_variant_mv1(diplomat::capi::CustomTimeZone* self);
-    
-    typedef struct icu4x_CustomTimeZone_zone_variant_mv1_result { bool is_ok;} icu4x_CustomTimeZone_zone_variant_mv1_result;
-    icu4x_CustomTimeZone_zone_variant_mv1_result icu4x_CustomTimeZone_zone_variant_mv1(const diplomat::capi::CustomTimeZone* self, diplomat::capi::DiplomatWrite* write);
-    
-    void icu4x_CustomTimeZone_set_standard_time_mv1(diplomat::capi::CustomTimeZone* self);
-    
-    void icu4x_CustomTimeZone_set_daylight_time_mv1(diplomat::capi::CustomTimeZone* self);
-    
-    typedef struct icu4x_CustomTimeZone_is_standard_time_mv1_result {union {bool ok; }; bool is_ok;} icu4x_CustomTimeZone_is_standard_time_mv1_result;
-    icu4x_CustomTimeZone_is_standard_time_mv1_result icu4x_CustomTimeZone_is_standard_time_mv1(const diplomat::capi::CustomTimeZone* self);
-    
-    typedef struct icu4x_CustomTimeZone_is_daylight_time_mv1_result {union {bool ok; }; bool is_ok;} icu4x_CustomTimeZone_is_daylight_time_mv1_result;
-    icu4x_CustomTimeZone_is_daylight_time_mv1_result icu4x_CustomTimeZone_is_daylight_time_mv1(const diplomat::capi::CustomTimeZone* self);
-    
-    void icu4x_CustomTimeZone_maybe_calculate_metazone_mv1(diplomat::capi::CustomTimeZone* self, const diplomat::capi::MetazoneCalculator* metazone_calculator, const diplomat::capi::IsoDateTime* local_datetime);
-    
-    
-    void icu4x_CustomTimeZone_destroy_mv1(CustomTimeZone* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<CustomTimeZone>, TimeZoneInvalidOffsetError> CustomTimeZone::from_string(std::string_view s) {
-  auto result = diplomat::capi::icu4x_CustomTimeZone_from_string_mv1(s.data(),
-    s.size());
-  return result.is_ok ? diplomat::result<std::unique_ptr<CustomTimeZone>, TimeZoneInvalidOffsetError>(diplomat::Ok<std::unique_ptr<CustomTimeZone>>(std::unique_ptr<CustomTimeZone>(CustomTimeZone::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<CustomTimeZone>, TimeZoneInvalidOffsetError>(diplomat::Err<TimeZoneInvalidOffsetError>(TimeZoneInvalidOffsetError {}));
-}
-
-inline std::unique_ptr<CustomTimeZone> CustomTimeZone::empty() {
-  auto result = diplomat::capi::icu4x_CustomTimeZone_empty_mv1();
-  return std::unique_ptr<CustomTimeZone>(CustomTimeZone::FromFFI(result));
-}
-
-inline std::unique_ptr<CustomTimeZone> CustomTimeZone::utc() {
-  auto result = diplomat::capi::icu4x_CustomTimeZone_utc_mv1();
-  return std::unique_ptr<CustomTimeZone>(CustomTimeZone::FromFFI(result));
-}
-
-inline std::unique_ptr<CustomTimeZone> CustomTimeZone::gmt() {
-  auto result = diplomat::capi::icu4x_CustomTimeZone_gmt_mv1();
-  return std::unique_ptr<CustomTimeZone>(CustomTimeZone::FromFFI(result));
-}
-
-inline std::unique_ptr<CustomTimeZone> CustomTimeZone::bst() {
-  auto result = diplomat::capi::icu4x_CustomTimeZone_bst_mv1();
-  return std::unique_ptr<CustomTimeZone>(CustomTimeZone::FromFFI(result));
-}
-
-inline diplomat::result<std::monostate, TimeZoneInvalidOffsetError> CustomTimeZone::try_set_gmt_offset_seconds(int32_t offset_seconds) {
-  auto result = diplomat::capi::icu4x_CustomTimeZone_try_set_gmt_offset_seconds_mv1(this->AsFFI(),
-    offset_seconds);
-  return result.is_ok ? diplomat::result<std::monostate, TimeZoneInvalidOffsetError>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, TimeZoneInvalidOffsetError>(diplomat::Err<TimeZoneInvalidOffsetError>(TimeZoneInvalidOffsetError {}));
-}
-
-inline void CustomTimeZone::set_gmt_offset_eighths_of_hour(int8_t offset_eighths_of_hour) {
-  diplomat::capi::icu4x_CustomTimeZone_set_gmt_offset_eighths_of_hour_mv1(this->AsFFI(),
-    offset_eighths_of_hour);
-}
-
-inline void CustomTimeZone::clear_gmt_offset() {
-  diplomat::capi::icu4x_CustomTimeZone_clear_gmt_offset_mv1(this->AsFFI());
-}
-
-inline std::optional<int32_t> CustomTimeZone::gmt_offset_seconds() const {
-  auto result = diplomat::capi::icu4x_CustomTimeZone_gmt_offset_seconds_mv1(this->AsFFI());
-  return result.is_ok ? std::optional<int32_t>(result.ok) : std::nullopt;
-}
-
-inline std::optional<bool> CustomTimeZone::is_gmt_offset_positive() const {
-  auto result = diplomat::capi::icu4x_CustomTimeZone_is_gmt_offset_positive_mv1(this->AsFFI());
-  return result.is_ok ? std::optional<bool>(result.ok) : std::nullopt;
-}
-
-inline std::optional<bool> CustomTimeZone::is_gmt_offset_zero() const {
-  auto result = diplomat::capi::icu4x_CustomTimeZone_is_gmt_offset_zero_mv1(this->AsFFI());
-  return result.is_ok ? std::optional<bool>(result.ok) : std::nullopt;
-}
-
-inline std::optional<bool> CustomTimeZone::gmt_offset_has_minutes() const {
-  auto result = diplomat::capi::icu4x_CustomTimeZone_gmt_offset_has_minutes_mv1(this->AsFFI());
-  return result.is_ok ? std::optional<bool>(result.ok) : std::nullopt;
-}
-
-inline std::optional<bool> CustomTimeZone::gmt_offset_has_seconds() const {
-  auto result = diplomat::capi::icu4x_CustomTimeZone_gmt_offset_has_seconds_mv1(this->AsFFI());
-  return result.is_ok ? std::optional<bool>(result.ok) : std::nullopt;
-}
-
-inline diplomat::result<std::monostate, TimeZoneInvalidIdError> CustomTimeZone::try_set_time_zone_id(std::string_view id) {
-  auto result = diplomat::capi::icu4x_CustomTimeZone_try_set_time_zone_id_mv1(this->AsFFI(),
-    id.data(),
-    id.size());
-  return result.is_ok ? diplomat::result<std::monostate, TimeZoneInvalidIdError>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, TimeZoneInvalidIdError>(diplomat::Err<TimeZoneInvalidIdError>(TimeZoneInvalidIdError {}));
-}
-
-inline diplomat::result<std::monostate, TimeZoneInvalidIdError> CustomTimeZone::try_set_iana_time_zone_id(const TimeZoneIdMapper& mapper, std::string_view id) {
-  auto result = diplomat::capi::icu4x_CustomTimeZone_try_set_iana_time_zone_id_mv1(this->AsFFI(),
-    mapper.AsFFI(),
-    id.data(),
-    id.size());
-  return result.is_ok ? diplomat::result<std::monostate, TimeZoneInvalidIdError>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, TimeZoneInvalidIdError>(diplomat::Err<TimeZoneInvalidIdError>(TimeZoneInvalidIdError {}));
-}
-
-inline void CustomTimeZone::clear_time_zone_id() {
-  diplomat::capi::icu4x_CustomTimeZone_clear_time_zone_id_mv1(this->AsFFI());
-}
-
-inline std::optional<std::string> CustomTimeZone::time_zone_id() const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_CustomTimeZone_time_zone_id_mv1(this->AsFFI(),
-    &write);
-  return result.is_ok ? std::optional<std::string>(std::move(output)) : std::nullopt;
-}
-
-inline diplomat::result<std::monostate, TimeZoneInvalidIdError> CustomTimeZone::try_set_metazone_id(std::string_view id) {
-  auto result = diplomat::capi::icu4x_CustomTimeZone_try_set_metazone_id_mv1(this->AsFFI(),
-    id.data(),
-    id.size());
-  return result.is_ok ? diplomat::result<std::monostate, TimeZoneInvalidIdError>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, TimeZoneInvalidIdError>(diplomat::Err<TimeZoneInvalidIdError>(TimeZoneInvalidIdError {}));
-}
-
-inline void CustomTimeZone::clear_metazone_id() {
-  diplomat::capi::icu4x_CustomTimeZone_clear_metazone_id_mv1(this->AsFFI());
-}
-
-inline std::optional<std::string> CustomTimeZone::metazone_id() const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_CustomTimeZone_metazone_id_mv1(this->AsFFI(),
-    &write);
-  return result.is_ok ? std::optional<std::string>(std::move(output)) : std::nullopt;
-}
-
-inline std::optional<std::monostate> CustomTimeZone::try_set_zone_variant(std::string_view id) {
-  auto result = diplomat::capi::icu4x_CustomTimeZone_try_set_zone_variant_mv1(this->AsFFI(),
-    id.data(),
-    id.size());
-  return result.is_ok ? std::optional<std::monostate>() : std::nullopt;
-}
-
-inline void CustomTimeZone::clear_zone_variant() {
-  diplomat::capi::icu4x_CustomTimeZone_clear_zone_variant_mv1(this->AsFFI());
-}
-
-inline std::optional<std::string> CustomTimeZone::zone_variant() const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_CustomTimeZone_zone_variant_mv1(this->AsFFI(),
-    &write);
-  return result.is_ok ? std::optional<std::string>(std::move(output)) : std::nullopt;
-}
-
-inline void CustomTimeZone::set_standard_time() {
-  diplomat::capi::icu4x_CustomTimeZone_set_standard_time_mv1(this->AsFFI());
-}
-
-inline void CustomTimeZone::set_daylight_time() {
-  diplomat::capi::icu4x_CustomTimeZone_set_daylight_time_mv1(this->AsFFI());
-}
-
-inline std::optional<bool> CustomTimeZone::is_standard_time() const {
-  auto result = diplomat::capi::icu4x_CustomTimeZone_is_standard_time_mv1(this->AsFFI());
-  return result.is_ok ? std::optional<bool>(result.ok) : std::nullopt;
-}
-
-inline std::optional<bool> CustomTimeZone::is_daylight_time() const {
-  auto result = diplomat::capi::icu4x_CustomTimeZone_is_daylight_time_mv1(this->AsFFI());
-  return result.is_ok ? std::optional<bool>(result.ok) : std::nullopt;
-}
-
-inline void CustomTimeZone::maybe_calculate_metazone(const MetazoneCalculator& metazone_calculator, const IsoDateTime& local_datetime) {
-  diplomat::capi::icu4x_CustomTimeZone_maybe_calculate_metazone_mv1(this->AsFFI(),
-    metazone_calculator.AsFFI(),
-    local_datetime.AsFFI());
-}
-
-inline const diplomat::capi::CustomTimeZone* CustomTimeZone::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::CustomTimeZone*>(this);
-}
-
-inline diplomat::capi::CustomTimeZone* CustomTimeZone::AsFFI() {
-  return reinterpret_cast<diplomat::capi::CustomTimeZone*>(this);
-}
-
-inline const CustomTimeZone* CustomTimeZone::FromFFI(const diplomat::capi::CustomTimeZone* ptr) {
-  return reinterpret_cast<const CustomTimeZone*>(ptr);
-}
-
-inline CustomTimeZone* CustomTimeZone::FromFFI(diplomat::capi::CustomTimeZone* ptr) {
-  return reinterpret_cast<CustomTimeZone*>(ptr);
-}
-
-inline void CustomTimeZone::operator delete(void* ptr) {
-  diplomat::capi::icu4x_CustomTimeZone_destroy_mv1(reinterpret_cast<diplomat::capi::CustomTimeZone*>(ptr));
-}
-
-
-#endif // CustomTimeZone_HPP
diff --git a/ffi/capi/bindings/cpp/DataError.hpp b/ffi/capi/bindings/cpp/DataError.hpp
deleted file mode 100644
index 1c95047c81c..00000000000
--- a/ffi/capi/bindings/cpp/DataError.hpp
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef DataError_HPP
-#define DataError_HPP
-
-#include "DataError.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::DataError DataError::AsFFI() const {
-  return static_cast<diplomat::capi::DataError>(value);
-}
-
-inline DataError DataError::FromFFI(diplomat::capi::DataError c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::DataError_Unknown:
-    case diplomat::capi::DataError_MarkerNotFound:
-    case diplomat::capi::DataError_IdentifierNotFound:
-    case diplomat::capi::DataError_InvalidRequest:
-    case diplomat::capi::DataError_InconsistentData:
-    case diplomat::capi::DataError_Downcast:
-    case diplomat::capi::DataError_Deserialize:
-    case diplomat::capi::DataError_Custom:
-    case diplomat::capi::DataError_Io:
-      return static_cast<DataError::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // DataError_HPP
diff --git a/ffi/capi/bindings/cpp/DataProvider.d.hpp b/ffi/capi/bindings/cpp/DataProvider.d.hpp
deleted file mode 100644
index 2b486797254..00000000000
--- a/ffi/capi/bindings/cpp/DataProvider.d.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef DataProvider_D_HPP
-#define DataProvider_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct LocaleFallbacker; }
-class LocaleFallbacker;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct DataProvider;
-} // namespace capi
-} // namespace
-
-class DataProvider {
-public:
-
-  inline static std::unique_ptr<DataProvider> compiled();
-
-  inline static diplomat::result<std::unique_ptr<DataProvider>, DataError> from_fs(std::string_view path);
-
-  inline static diplomat::result<std::unique_ptr<DataProvider>, DataError> from_byte_slice(diplomat::span<const uint8_t> blob);
-
-  inline static std::unique_ptr<DataProvider> empty();
-
-  inline diplomat::result<std::monostate, DataError> fork_by_key(DataProvider& other);
-
-  inline diplomat::result<std::monostate, DataError> fork_by_locale(DataProvider& other);
-
-  inline diplomat::result<std::monostate, DataError> enable_locale_fallback_with(const LocaleFallbacker& fallbacker);
-
-  inline const diplomat::capi::DataProvider* AsFFI() const;
-  inline diplomat::capi::DataProvider* AsFFI();
-  inline static const DataProvider* FromFFI(const diplomat::capi::DataProvider* ptr);
-  inline static DataProvider* FromFFI(diplomat::capi::DataProvider* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  DataProvider() = delete;
-  DataProvider(const DataProvider&) = delete;
-  DataProvider(DataProvider&&) noexcept = delete;
-  DataProvider operator=(const DataProvider&) = delete;
-  DataProvider operator=(DataProvider&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // DataProvider_D_HPP
diff --git a/ffi/capi/bindings/cpp/DataProvider.hpp b/ffi/capi/bindings/cpp/DataProvider.hpp
deleted file mode 100644
index 928f5bdf39c..00000000000
--- a/ffi/capi/bindings/cpp/DataProvider.hpp
+++ /dev/null
@@ -1,108 +0,0 @@
-#ifndef DataProvider_HPP
-#define DataProvider_HPP
-
-#include "DataProvider.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "LocaleFallbacker.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    diplomat::capi::DataProvider* icu4x_DataProvider_compiled_mv1(void);
-    
-    typedef struct icu4x_DataProvider_from_fs_mv1_result {union {diplomat::capi::DataProvider* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_DataProvider_from_fs_mv1_result;
-    icu4x_DataProvider_from_fs_mv1_result icu4x_DataProvider_from_fs_mv1(const char* path_data, size_t path_len);
-    
-    typedef struct icu4x_DataProvider_from_byte_slice_mv1_result {union {diplomat::capi::DataProvider* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_DataProvider_from_byte_slice_mv1_result;
-    icu4x_DataProvider_from_byte_slice_mv1_result icu4x_DataProvider_from_byte_slice_mv1(const uint8_t* blob_data, size_t blob_len);
-    
-    diplomat::capi::DataProvider* icu4x_DataProvider_empty_mv1(void);
-    
-    typedef struct icu4x_DataProvider_fork_by_key_mv1_result {union { diplomat::capi::DataError err;}; bool is_ok;} icu4x_DataProvider_fork_by_key_mv1_result;
-    icu4x_DataProvider_fork_by_key_mv1_result icu4x_DataProvider_fork_by_key_mv1(diplomat::capi::DataProvider* self, diplomat::capi::DataProvider* other);
-    
-    typedef struct icu4x_DataProvider_fork_by_locale_mv1_result {union { diplomat::capi::DataError err;}; bool is_ok;} icu4x_DataProvider_fork_by_locale_mv1_result;
-    icu4x_DataProvider_fork_by_locale_mv1_result icu4x_DataProvider_fork_by_locale_mv1(diplomat::capi::DataProvider* self, diplomat::capi::DataProvider* other);
-    
-    typedef struct icu4x_DataProvider_enable_locale_fallback_with_mv1_result {union { diplomat::capi::DataError err;}; bool is_ok;} icu4x_DataProvider_enable_locale_fallback_with_mv1_result;
-    icu4x_DataProvider_enable_locale_fallback_with_mv1_result icu4x_DataProvider_enable_locale_fallback_with_mv1(diplomat::capi::DataProvider* self, const diplomat::capi::LocaleFallbacker* fallbacker);
-    
-    
-    void icu4x_DataProvider_destroy_mv1(DataProvider* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline std::unique_ptr<DataProvider> DataProvider::compiled() {
-  auto result = diplomat::capi::icu4x_DataProvider_compiled_mv1();
-  return std::unique_ptr<DataProvider>(DataProvider::FromFFI(result));
-}
-
-inline diplomat::result<std::unique_ptr<DataProvider>, DataError> DataProvider::from_fs(std::string_view path) {
-  auto result = diplomat::capi::icu4x_DataProvider_from_fs_mv1(path.data(),
-    path.size());
-  return result.is_ok ? diplomat::result<std::unique_ptr<DataProvider>, DataError>(diplomat::Ok<std::unique_ptr<DataProvider>>(std::unique_ptr<DataProvider>(DataProvider::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<DataProvider>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<DataProvider>, DataError> DataProvider::from_byte_slice(diplomat::span<const uint8_t> blob) {
-  auto result = diplomat::capi::icu4x_DataProvider_from_byte_slice_mv1(blob.data(),
-    blob.size());
-  return result.is_ok ? diplomat::result<std::unique_ptr<DataProvider>, DataError>(diplomat::Ok<std::unique_ptr<DataProvider>>(std::unique_ptr<DataProvider>(DataProvider::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<DataProvider>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline std::unique_ptr<DataProvider> DataProvider::empty() {
-  auto result = diplomat::capi::icu4x_DataProvider_empty_mv1();
-  return std::unique_ptr<DataProvider>(DataProvider::FromFFI(result));
-}
-
-inline diplomat::result<std::monostate, DataError> DataProvider::fork_by_key(DataProvider& other) {
-  auto result = diplomat::capi::icu4x_DataProvider_fork_by_key_mv1(this->AsFFI(),
-    other.AsFFI());
-  return result.is_ok ? diplomat::result<std::monostate, DataError>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::monostate, DataError> DataProvider::fork_by_locale(DataProvider& other) {
-  auto result = diplomat::capi::icu4x_DataProvider_fork_by_locale_mv1(this->AsFFI(),
-    other.AsFFI());
-  return result.is_ok ? diplomat::result<std::monostate, DataError>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::monostate, DataError> DataProvider::enable_locale_fallback_with(const LocaleFallbacker& fallbacker) {
-  auto result = diplomat::capi::icu4x_DataProvider_enable_locale_fallback_with_mv1(this->AsFFI(),
-    fallbacker.AsFFI());
-  return result.is_ok ? diplomat::result<std::monostate, DataError>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline const diplomat::capi::DataProvider* DataProvider::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::DataProvider*>(this);
-}
-
-inline diplomat::capi::DataProvider* DataProvider::AsFFI() {
-  return reinterpret_cast<diplomat::capi::DataProvider*>(this);
-}
-
-inline const DataProvider* DataProvider::FromFFI(const diplomat::capi::DataProvider* ptr) {
-  return reinterpret_cast<const DataProvider*>(ptr);
-}
-
-inline DataProvider* DataProvider::FromFFI(diplomat::capi::DataProvider* ptr) {
-  return reinterpret_cast<DataProvider*>(ptr);
-}
-
-inline void DataProvider::operator delete(void* ptr) {
-  diplomat::capi::icu4x_DataProvider_destroy_mv1(reinterpret_cast<diplomat::capi::DataProvider*>(ptr));
-}
-
-
-#endif // DataProvider_HPP
diff --git a/ffi/capi/bindings/cpp/Date.d.hpp b/ffi/capi/bindings/cpp/Date.d.hpp
deleted file mode 100644
index affe42f5a38..00000000000
--- a/ffi/capi/bindings/cpp/Date.d.hpp
+++ /dev/null
@@ -1,84 +0,0 @@
-#ifndef Date_D_HPP
-#define Date_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct Calendar; }
-class Calendar;
-namespace diplomat::capi { struct IsoDate; }
-class IsoDate;
-namespace diplomat::capi { struct WeekCalculator; }
-class WeekCalculator;
-struct WeekOf;
-class CalendarError;
-class CalendarParseError;
-class IsoWeekday;
-
-
-namespace diplomat {
-namespace capi {
-    struct Date;
-} // namespace capi
-} // namespace
-
-class Date {
-public:
-
-  inline static diplomat::result<std::unique_ptr<Date>, CalendarError> from_iso_in_calendar(int32_t year, uint8_t month, uint8_t day, const Calendar& calendar);
-
-  inline static diplomat::result<std::unique_ptr<Date>, CalendarError> from_codes_in_calendar(std::string_view era_code, int32_t year, std::string_view month_code, uint8_t day, const Calendar& calendar);
-
-  inline static diplomat::result<std::unique_ptr<Date>, CalendarParseError> from_string(std::string_view v);
-
-  inline std::unique_ptr<Date> to_calendar(const Calendar& calendar) const;
-
-  inline std::unique_ptr<IsoDate> to_iso() const;
-
-  inline uint16_t day_of_year() const;
-
-  inline uint32_t day_of_month() const;
-
-  inline IsoWeekday day_of_week() const;
-
-  inline uint32_t week_of_month(IsoWeekday first_weekday) const;
-
-  inline WeekOf week_of_year(const WeekCalculator& calculator) const;
-
-  inline uint32_t ordinal_month() const;
-
-  inline std::string month_code() const;
-
-  inline int32_t year_in_era() const;
-
-  inline std::string era() const;
-
-  inline uint8_t months_in_year() const;
-
-  inline uint8_t days_in_month() const;
-
-  inline uint16_t days_in_year() const;
-
-  inline std::unique_ptr<Calendar> calendar() const;
-
-  inline const diplomat::capi::Date* AsFFI() const;
-  inline diplomat::capi::Date* AsFFI();
-  inline static const Date* FromFFI(const diplomat::capi::Date* ptr);
-  inline static Date* FromFFI(diplomat::capi::Date* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  Date() = delete;
-  Date(const Date&) = delete;
-  Date(Date&&) noexcept = delete;
-  Date operator=(const Date&) = delete;
-  Date operator=(Date&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // Date_D_HPP
diff --git a/ffi/capi/bindings/cpp/Date.hpp b/ffi/capi/bindings/cpp/Date.hpp
deleted file mode 100644
index 23ce507331a..00000000000
--- a/ffi/capi/bindings/cpp/Date.hpp
+++ /dev/null
@@ -1,202 +0,0 @@
-#ifndef Date_HPP
-#define Date_HPP
-
-#include "Date.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "Calendar.hpp"
-#include "CalendarError.hpp"
-#include "CalendarParseError.hpp"
-#include "IsoDate.hpp"
-#include "IsoWeekday.hpp"
-#include "WeekCalculator.hpp"
-#include "WeekOf.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_Date_from_iso_in_calendar_mv1_result {union {diplomat::capi::Date* ok; diplomat::capi::CalendarError err;}; bool is_ok;} icu4x_Date_from_iso_in_calendar_mv1_result;
-    icu4x_Date_from_iso_in_calendar_mv1_result icu4x_Date_from_iso_in_calendar_mv1(int32_t year, uint8_t month, uint8_t day, const diplomat::capi::Calendar* calendar);
-    
-    typedef struct icu4x_Date_from_codes_in_calendar_mv1_result {union {diplomat::capi::Date* ok; diplomat::capi::CalendarError err;}; bool is_ok;} icu4x_Date_from_codes_in_calendar_mv1_result;
-    icu4x_Date_from_codes_in_calendar_mv1_result icu4x_Date_from_codes_in_calendar_mv1(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 diplomat::capi::Calendar* calendar);
-    
-    typedef struct icu4x_Date_from_string_mv1_result {union {diplomat::capi::Date* ok; diplomat::capi::CalendarParseError err;}; bool is_ok;} icu4x_Date_from_string_mv1_result;
-    icu4x_Date_from_string_mv1_result icu4x_Date_from_string_mv1(const char* v_data, size_t v_len);
-    
-    diplomat::capi::Date* icu4x_Date_to_calendar_mv1(const diplomat::capi::Date* self, const diplomat::capi::Calendar* calendar);
-    
-    diplomat::capi::IsoDate* icu4x_Date_to_iso_mv1(const diplomat::capi::Date* self);
-    
-    uint16_t icu4x_Date_day_of_year_mv1(const diplomat::capi::Date* self);
-    
-    uint32_t icu4x_Date_day_of_month_mv1(const diplomat::capi::Date* self);
-    
-    diplomat::capi::IsoWeekday icu4x_Date_day_of_week_mv1(const diplomat::capi::Date* self);
-    
-    uint32_t icu4x_Date_week_of_month_mv1(const diplomat::capi::Date* self, diplomat::capi::IsoWeekday first_weekday);
-    
-    diplomat::capi::WeekOf icu4x_Date_week_of_year_mv1(const diplomat::capi::Date* self, const diplomat::capi::WeekCalculator* calculator);
-    
-    uint32_t icu4x_Date_ordinal_month_mv1(const diplomat::capi::Date* self);
-    
-    void icu4x_Date_month_code_mv1(const diplomat::capi::Date* self, diplomat::capi::DiplomatWrite* write);
-    
-    int32_t icu4x_Date_year_in_era_mv1(const diplomat::capi::Date* self);
-    
-    void icu4x_Date_era_mv1(const diplomat::capi::Date* self, diplomat::capi::DiplomatWrite* write);
-    
-    uint8_t icu4x_Date_months_in_year_mv1(const diplomat::capi::Date* self);
-    
-    uint8_t icu4x_Date_days_in_month_mv1(const diplomat::capi::Date* self);
-    
-    uint16_t icu4x_Date_days_in_year_mv1(const diplomat::capi::Date* self);
-    
-    diplomat::capi::Calendar* icu4x_Date_calendar_mv1(const diplomat::capi::Date* self);
-    
-    
-    void icu4x_Date_destroy_mv1(Date* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<Date>, CalendarError> Date::from_iso_in_calendar(int32_t year, uint8_t month, uint8_t day, const Calendar& calendar) {
-  auto result = diplomat::capi::icu4x_Date_from_iso_in_calendar_mv1(year,
-    month,
-    day,
-    calendar.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<Date>, CalendarError>(diplomat::Ok<std::unique_ptr<Date>>(std::unique_ptr<Date>(Date::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<Date>, CalendarError>(diplomat::Err<CalendarError>(CalendarError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<Date>, CalendarError> Date::from_codes_in_calendar(std::string_view era_code, int32_t year, std::string_view month_code, uint8_t day, const Calendar& calendar) {
-  auto result = diplomat::capi::icu4x_Date_from_codes_in_calendar_mv1(era_code.data(),
-    era_code.size(),
-    year,
-    month_code.data(),
-    month_code.size(),
-    day,
-    calendar.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<Date>, CalendarError>(diplomat::Ok<std::unique_ptr<Date>>(std::unique_ptr<Date>(Date::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<Date>, CalendarError>(diplomat::Err<CalendarError>(CalendarError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<Date>, CalendarParseError> Date::from_string(std::string_view v) {
-  auto result = diplomat::capi::icu4x_Date_from_string_mv1(v.data(),
-    v.size());
-  return result.is_ok ? diplomat::result<std::unique_ptr<Date>, CalendarParseError>(diplomat::Ok<std::unique_ptr<Date>>(std::unique_ptr<Date>(Date::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<Date>, CalendarParseError>(diplomat::Err<CalendarParseError>(CalendarParseError::FromFFI(result.err)));
-}
-
-inline std::unique_ptr<Date> Date::to_calendar(const Calendar& calendar) const {
-  auto result = diplomat::capi::icu4x_Date_to_calendar_mv1(this->AsFFI(),
-    calendar.AsFFI());
-  return std::unique_ptr<Date>(Date::FromFFI(result));
-}
-
-inline std::unique_ptr<IsoDate> Date::to_iso() const {
-  auto result = diplomat::capi::icu4x_Date_to_iso_mv1(this->AsFFI());
-  return std::unique_ptr<IsoDate>(IsoDate::FromFFI(result));
-}
-
-inline uint16_t Date::day_of_year() const {
-  auto result = diplomat::capi::icu4x_Date_day_of_year_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint32_t Date::day_of_month() const {
-  auto result = diplomat::capi::icu4x_Date_day_of_month_mv1(this->AsFFI());
-  return result;
-}
-
-inline IsoWeekday Date::day_of_week() const {
-  auto result = diplomat::capi::icu4x_Date_day_of_week_mv1(this->AsFFI());
-  return IsoWeekday::FromFFI(result);
-}
-
-inline uint32_t Date::week_of_month(IsoWeekday first_weekday) const {
-  auto result = diplomat::capi::icu4x_Date_week_of_month_mv1(this->AsFFI(),
-    first_weekday.AsFFI());
-  return result;
-}
-
-inline WeekOf Date::week_of_year(const WeekCalculator& calculator) const {
-  auto result = diplomat::capi::icu4x_Date_week_of_year_mv1(this->AsFFI(),
-    calculator.AsFFI());
-  return WeekOf::FromFFI(result);
-}
-
-inline uint32_t Date::ordinal_month() const {
-  auto result = diplomat::capi::icu4x_Date_ordinal_month_mv1(this->AsFFI());
-  return result;
-}
-
-inline std::string Date::month_code() const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_Date_month_code_mv1(this->AsFFI(),
-    &write);
-  return output;
-}
-
-inline int32_t Date::year_in_era() const {
-  auto result = diplomat::capi::icu4x_Date_year_in_era_mv1(this->AsFFI());
-  return result;
-}
-
-inline std::string Date::era() const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_Date_era_mv1(this->AsFFI(),
-    &write);
-  return output;
-}
-
-inline uint8_t Date::months_in_year() const {
-  auto result = diplomat::capi::icu4x_Date_months_in_year_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint8_t Date::days_in_month() const {
-  auto result = diplomat::capi::icu4x_Date_days_in_month_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint16_t Date::days_in_year() const {
-  auto result = diplomat::capi::icu4x_Date_days_in_year_mv1(this->AsFFI());
-  return result;
-}
-
-inline std::unique_ptr<Calendar> Date::calendar() const {
-  auto result = diplomat::capi::icu4x_Date_calendar_mv1(this->AsFFI());
-  return std::unique_ptr<Calendar>(Calendar::FromFFI(result));
-}
-
-inline const diplomat::capi::Date* Date::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::Date*>(this);
-}
-
-inline diplomat::capi::Date* Date::AsFFI() {
-  return reinterpret_cast<diplomat::capi::Date*>(this);
-}
-
-inline const Date* Date::FromFFI(const diplomat::capi::Date* ptr) {
-  return reinterpret_cast<const Date*>(ptr);
-}
-
-inline Date* Date::FromFFI(diplomat::capi::Date* ptr) {
-  return reinterpret_cast<Date*>(ptr);
-}
-
-inline void Date::operator delete(void* ptr) {
-  diplomat::capi::icu4x_Date_destroy_mv1(reinterpret_cast<diplomat::capi::Date*>(ptr));
-}
-
-
-#endif // Date_HPP
diff --git a/ffi/capi/bindings/cpp/DateFormatter.d.hpp b/ffi/capi/bindings/cpp/DateFormatter.d.hpp
deleted file mode 100644
index 6bed3daa026..00000000000
--- a/ffi/capi/bindings/cpp/DateFormatter.d.hpp
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef DateFormatter_D_HPP
-#define DateFormatter_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct Date; }
-class Date;
-namespace diplomat::capi { struct DateTime; }
-class DateTime;
-namespace diplomat::capi { struct IsoDate; }
-class IsoDate;
-namespace diplomat::capi { struct IsoDateTime; }
-class IsoDateTime;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-class DateLength;
-class Error;
-
-
-namespace diplomat {
-namespace capi {
-    struct DateFormatter;
-} // namespace capi
-} // namespace
-
-class DateFormatter {
-public:
-
-  inline static diplomat::result<std::unique_ptr<DateFormatter>, Error> create_with_length(const DataProvider& provider, const Locale& locale, DateLength date_length);
-
-  inline diplomat::result<std::string, Error> format_date(const Date& value) const;
-
-  inline diplomat::result<std::string, Error> format_iso_date(const IsoDate& value) const;
-
-  inline diplomat::result<std::string, Error> format_datetime(const DateTime& value) const;
-
-  inline diplomat::result<std::string, Error> format_iso_datetime(const IsoDateTime& value) const;
-
-  inline const diplomat::capi::DateFormatter* AsFFI() const;
-  inline diplomat::capi::DateFormatter* AsFFI();
-  inline static const DateFormatter* FromFFI(const diplomat::capi::DateFormatter* ptr);
-  inline static DateFormatter* FromFFI(diplomat::capi::DateFormatter* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  DateFormatter() = delete;
-  DateFormatter(const DateFormatter&) = delete;
-  DateFormatter(DateFormatter&&) noexcept = delete;
-  DateFormatter operator=(const DateFormatter&) = delete;
-  DateFormatter operator=(DateFormatter&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // DateFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/DateFormatter.hpp b/ffi/capi/bindings/cpp/DateFormatter.hpp
deleted file mode 100644
index a78bf92f5fb..00000000000
--- a/ffi/capi/bindings/cpp/DateFormatter.hpp
+++ /dev/null
@@ -1,113 +0,0 @@
-#ifndef DateFormatter_HPP
-#define DateFormatter_HPP
-
-#include "DateFormatter.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataProvider.hpp"
-#include "Date.hpp"
-#include "DateLength.hpp"
-#include "DateTime.hpp"
-#include "Error.hpp"
-#include "IsoDate.hpp"
-#include "IsoDateTime.hpp"
-#include "Locale.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_DateFormatter_create_with_length_mv1_result {union {diplomat::capi::DateFormatter* ok; diplomat::capi::Error err;}; bool is_ok;} icu4x_DateFormatter_create_with_length_mv1_result;
-    icu4x_DateFormatter_create_with_length_mv1_result icu4x_DateFormatter_create_with_length_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale, diplomat::capi::DateLength date_length);
-    
-    typedef struct icu4x_DateFormatter_format_date_mv1_result {union { diplomat::capi::Error err;}; bool is_ok;} icu4x_DateFormatter_format_date_mv1_result;
-    icu4x_DateFormatter_format_date_mv1_result icu4x_DateFormatter_format_date_mv1(const diplomat::capi::DateFormatter* self, const diplomat::capi::Date* value, diplomat::capi::DiplomatWrite* write);
-    
-    typedef struct icu4x_DateFormatter_format_iso_date_mv1_result {union { diplomat::capi::Error err;}; bool is_ok;} icu4x_DateFormatter_format_iso_date_mv1_result;
-    icu4x_DateFormatter_format_iso_date_mv1_result icu4x_DateFormatter_format_iso_date_mv1(const diplomat::capi::DateFormatter* self, const diplomat::capi::IsoDate* value, diplomat::capi::DiplomatWrite* write);
-    
-    typedef struct icu4x_DateFormatter_format_datetime_mv1_result {union { diplomat::capi::Error err;}; bool is_ok;} icu4x_DateFormatter_format_datetime_mv1_result;
-    icu4x_DateFormatter_format_datetime_mv1_result icu4x_DateFormatter_format_datetime_mv1(const diplomat::capi::DateFormatter* self, const diplomat::capi::DateTime* value, diplomat::capi::DiplomatWrite* write);
-    
-    typedef struct icu4x_DateFormatter_format_iso_datetime_mv1_result {union { diplomat::capi::Error err;}; bool is_ok;} icu4x_DateFormatter_format_iso_datetime_mv1_result;
-    icu4x_DateFormatter_format_iso_datetime_mv1_result icu4x_DateFormatter_format_iso_datetime_mv1(const diplomat::capi::DateFormatter* self, const diplomat::capi::IsoDateTime* value, diplomat::capi::DiplomatWrite* write);
-    
-    
-    void icu4x_DateFormatter_destroy_mv1(DateFormatter* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<DateFormatter>, Error> DateFormatter::create_with_length(const DataProvider& provider, const Locale& locale, DateLength date_length) {
-  auto result = diplomat::capi::icu4x_DateFormatter_create_with_length_mv1(provider.AsFFI(),
-    locale.AsFFI(),
-    date_length.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<DateFormatter>, Error>(diplomat::Ok<std::unique_ptr<DateFormatter>>(std::unique_ptr<DateFormatter>(DateFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<DateFormatter>, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::string, Error> DateFormatter::format_date(const Date& value) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_DateFormatter_format_date_mv1(this->AsFFI(),
-    value.AsFFI(),
-    &write);
-  return result.is_ok ? diplomat::result<std::string, Error>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::string, Error> DateFormatter::format_iso_date(const IsoDate& value) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_DateFormatter_format_iso_date_mv1(this->AsFFI(),
-    value.AsFFI(),
-    &write);
-  return result.is_ok ? diplomat::result<std::string, Error>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::string, Error> DateFormatter::format_datetime(const DateTime& value) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_DateFormatter_format_datetime_mv1(this->AsFFI(),
-    value.AsFFI(),
-    &write);
-  return result.is_ok ? diplomat::result<std::string, Error>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::string, Error> DateFormatter::format_iso_datetime(const IsoDateTime& value) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_DateFormatter_format_iso_datetime_mv1(this->AsFFI(),
-    value.AsFFI(),
-    &write);
-  return result.is_ok ? diplomat::result<std::string, Error>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline const diplomat::capi::DateFormatter* DateFormatter::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::DateFormatter*>(this);
-}
-
-inline diplomat::capi::DateFormatter* DateFormatter::AsFFI() {
-  return reinterpret_cast<diplomat::capi::DateFormatter*>(this);
-}
-
-inline const DateFormatter* DateFormatter::FromFFI(const diplomat::capi::DateFormatter* ptr) {
-  return reinterpret_cast<const DateFormatter*>(ptr);
-}
-
-inline DateFormatter* DateFormatter::FromFFI(diplomat::capi::DateFormatter* ptr) {
-  return reinterpret_cast<DateFormatter*>(ptr);
-}
-
-inline void DateFormatter::operator delete(void* ptr) {
-  diplomat::capi::icu4x_DateFormatter_destroy_mv1(reinterpret_cast<diplomat::capi::DateFormatter*>(ptr));
-}
-
-
-#endif // DateFormatter_HPP
diff --git a/ffi/capi/bindings/cpp/DateLength.hpp b/ffi/capi/bindings/cpp/DateLength.hpp
deleted file mode 100644
index 21f030e2069..00000000000
--- a/ffi/capi/bindings/cpp/DateLength.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef DateLength_HPP
-#define DateLength_HPP
-
-#include "DateLength.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::DateLength DateLength::AsFFI() const {
-  return static_cast<diplomat::capi::DateLength>(value);
-}
-
-inline DateLength DateLength::FromFFI(diplomat::capi::DateLength c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::DateLength_Full:
-    case diplomat::capi::DateLength_Long:
-    case diplomat::capi::DateLength_Medium:
-    case diplomat::capi::DateLength_Short:
-      return static_cast<DateLength::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // DateLength_HPP
diff --git a/ffi/capi/bindings/cpp/DateTime.d.hpp b/ffi/capi/bindings/cpp/DateTime.d.hpp
deleted file mode 100644
index 62633c065eb..00000000000
--- a/ffi/capi/bindings/cpp/DateTime.d.hpp
+++ /dev/null
@@ -1,102 +0,0 @@
-#ifndef DateTime_D_HPP
-#define DateTime_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct Calendar; }
-class Calendar;
-namespace diplomat::capi { struct Date; }
-class Date;
-namespace diplomat::capi { struct IsoDateTime; }
-class IsoDateTime;
-namespace diplomat::capi { struct Time; }
-class Time;
-namespace diplomat::capi { struct WeekCalculator; }
-class WeekCalculator;
-struct WeekOf;
-class CalendarError;
-class CalendarParseError;
-class IsoWeekday;
-
-
-namespace diplomat {
-namespace capi {
-    struct DateTime;
-} // namespace capi
-} // namespace
-
-class DateTime {
-public:
-
-  inline static diplomat::result<std::unique_ptr<DateTime>, CalendarError> 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 Calendar& calendar);
-
-  inline static diplomat::result<std::unique_ptr<DateTime>, CalendarError> from_codes_in_calendar(std::string_view era_code, int32_t year, std::string_view month_code, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond, const Calendar& calendar);
-
-  inline static std::unique_ptr<DateTime> from_date_and_time(const Date& date, const Time& time);
-
-  inline static diplomat::result<std::unique_ptr<DateTime>, CalendarParseError> from_string(std::string_view v);
-
-  inline std::unique_ptr<Date> date() const;
-
-  inline std::unique_ptr<Time> time() const;
-
-  inline std::unique_ptr<IsoDateTime> to_iso() const;
-
-  inline std::unique_ptr<DateTime> to_calendar(const Calendar& calendar) const;
-
-  inline uint8_t hour() const;
-
-  inline uint8_t minute() const;
-
-  inline uint8_t second() const;
-
-  inline uint32_t nanosecond() const;
-
-  inline uint16_t day_of_year() const;
-
-  inline uint32_t day_of_month() const;
-
-  inline IsoWeekday day_of_week() const;
-
-  inline uint32_t week_of_month(IsoWeekday first_weekday) const;
-
-  inline WeekOf week_of_year(const WeekCalculator& calculator) const;
-
-  inline uint32_t ordinal_month() const;
-
-  inline std::string month_code() const;
-
-  inline int32_t year_in_era() const;
-
-  inline std::string era() const;
-
-  inline uint8_t months_in_year() const;
-
-  inline uint8_t days_in_month() const;
-
-  inline uint16_t days_in_year() const;
-
-  inline std::unique_ptr<Calendar> calendar() const;
-
-  inline const diplomat::capi::DateTime* AsFFI() const;
-  inline diplomat::capi::DateTime* AsFFI();
-  inline static const DateTime* FromFFI(const diplomat::capi::DateTime* ptr);
-  inline static DateTime* FromFFI(diplomat::capi::DateTime* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  DateTime() = delete;
-  DateTime(const DateTime&) = delete;
-  DateTime(DateTime&&) noexcept = delete;
-  DateTime operator=(const DateTime&) = delete;
-  DateTime operator=(DateTime&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // DateTime_D_HPP
diff --git a/ffi/capi/bindings/cpp/DateTime.hpp b/ffi/capi/bindings/cpp/DateTime.hpp
deleted file mode 100644
index c818b22e920..00000000000
--- a/ffi/capi/bindings/cpp/DateTime.hpp
+++ /dev/null
@@ -1,262 +0,0 @@
-#ifndef DateTime_HPP
-#define DateTime_HPP
-
-#include "DateTime.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "Calendar.hpp"
-#include "CalendarError.hpp"
-#include "CalendarParseError.hpp"
-#include "Date.hpp"
-#include "IsoDateTime.hpp"
-#include "IsoWeekday.hpp"
-#include "Time.hpp"
-#include "WeekCalculator.hpp"
-#include "WeekOf.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_DateTime_from_iso_in_calendar_mv1_result {union {diplomat::capi::DateTime* ok; diplomat::capi::CalendarError err;}; bool is_ok;} icu4x_DateTime_from_iso_in_calendar_mv1_result;
-    icu4x_DateTime_from_iso_in_calendar_mv1_result icu4x_DateTime_from_iso_in_calendar_mv1(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond, const diplomat::capi::Calendar* calendar);
-    
-    typedef struct icu4x_DateTime_from_codes_in_calendar_mv1_result {union {diplomat::capi::DateTime* ok; diplomat::capi::CalendarError err;}; bool is_ok;} icu4x_DateTime_from_codes_in_calendar_mv1_result;
-    icu4x_DateTime_from_codes_in_calendar_mv1_result icu4x_DateTime_from_codes_in_calendar_mv1(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 diplomat::capi::Calendar* calendar);
-    
-    diplomat::capi::DateTime* icu4x_DateTime_from_date_and_time_mv1(const diplomat::capi::Date* date, const diplomat::capi::Time* time);
-    
-    typedef struct icu4x_DateTime_from_string_mv1_result {union {diplomat::capi::DateTime* ok; diplomat::capi::CalendarParseError err;}; bool is_ok;} icu4x_DateTime_from_string_mv1_result;
-    icu4x_DateTime_from_string_mv1_result icu4x_DateTime_from_string_mv1(const char* v_data, size_t v_len);
-    
-    diplomat::capi::Date* icu4x_DateTime_date_mv1(const diplomat::capi::DateTime* self);
-    
-    diplomat::capi::Time* icu4x_DateTime_time_mv1(const diplomat::capi::DateTime* self);
-    
-    diplomat::capi::IsoDateTime* icu4x_DateTime_to_iso_mv1(const diplomat::capi::DateTime* self);
-    
-    diplomat::capi::DateTime* icu4x_DateTime_to_calendar_mv1(const diplomat::capi::DateTime* self, const diplomat::capi::Calendar* calendar);
-    
-    uint8_t icu4x_DateTime_hour_mv1(const diplomat::capi::DateTime* self);
-    
-    uint8_t icu4x_DateTime_minute_mv1(const diplomat::capi::DateTime* self);
-    
-    uint8_t icu4x_DateTime_second_mv1(const diplomat::capi::DateTime* self);
-    
-    uint32_t icu4x_DateTime_nanosecond_mv1(const diplomat::capi::DateTime* self);
-    
-    uint16_t icu4x_DateTime_day_of_year_mv1(const diplomat::capi::DateTime* self);
-    
-    uint32_t icu4x_DateTime_day_of_month_mv1(const diplomat::capi::DateTime* self);
-    
-    diplomat::capi::IsoWeekday icu4x_DateTime_day_of_week_mv1(const diplomat::capi::DateTime* self);
-    
-    uint32_t icu4x_DateTime_week_of_month_mv1(const diplomat::capi::DateTime* self, diplomat::capi::IsoWeekday first_weekday);
-    
-    diplomat::capi::WeekOf icu4x_DateTime_week_of_year_mv1(const diplomat::capi::DateTime* self, const diplomat::capi::WeekCalculator* calculator);
-    
-    uint32_t icu4x_DateTime_ordinal_month_mv1(const diplomat::capi::DateTime* self);
-    
-    void icu4x_DateTime_month_code_mv1(const diplomat::capi::DateTime* self, diplomat::capi::DiplomatWrite* write);
-    
-    int32_t icu4x_DateTime_year_in_era_mv1(const diplomat::capi::DateTime* self);
-    
-    void icu4x_DateTime_era_mv1(const diplomat::capi::DateTime* self, diplomat::capi::DiplomatWrite* write);
-    
-    uint8_t icu4x_DateTime_months_in_year_mv1(const diplomat::capi::DateTime* self);
-    
-    uint8_t icu4x_DateTime_days_in_month_mv1(const diplomat::capi::DateTime* self);
-    
-    uint16_t icu4x_DateTime_days_in_year_mv1(const diplomat::capi::DateTime* self);
-    
-    diplomat::capi::Calendar* icu4x_DateTime_calendar_mv1(const diplomat::capi::DateTime* self);
-    
-    
-    void icu4x_DateTime_destroy_mv1(DateTime* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<DateTime>, CalendarError> DateTime::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 Calendar& calendar) {
-  auto result = diplomat::capi::icu4x_DateTime_from_iso_in_calendar_mv1(year,
-    month,
-    day,
-    hour,
-    minute,
-    second,
-    nanosecond,
-    calendar.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<DateTime>, CalendarError>(diplomat::Ok<std::unique_ptr<DateTime>>(std::unique_ptr<DateTime>(DateTime::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<DateTime>, CalendarError>(diplomat::Err<CalendarError>(CalendarError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<DateTime>, CalendarError> DateTime::from_codes_in_calendar(std::string_view era_code, int32_t year, std::string_view month_code, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond, const Calendar& calendar) {
-  auto result = diplomat::capi::icu4x_DateTime_from_codes_in_calendar_mv1(era_code.data(),
-    era_code.size(),
-    year,
-    month_code.data(),
-    month_code.size(),
-    day,
-    hour,
-    minute,
-    second,
-    nanosecond,
-    calendar.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<DateTime>, CalendarError>(diplomat::Ok<std::unique_ptr<DateTime>>(std::unique_ptr<DateTime>(DateTime::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<DateTime>, CalendarError>(diplomat::Err<CalendarError>(CalendarError::FromFFI(result.err)));
-}
-
-inline std::unique_ptr<DateTime> DateTime::from_date_and_time(const Date& date, const Time& time) {
-  auto result = diplomat::capi::icu4x_DateTime_from_date_and_time_mv1(date.AsFFI(),
-    time.AsFFI());
-  return std::unique_ptr<DateTime>(DateTime::FromFFI(result));
-}
-
-inline diplomat::result<std::unique_ptr<DateTime>, CalendarParseError> DateTime::from_string(std::string_view v) {
-  auto result = diplomat::capi::icu4x_DateTime_from_string_mv1(v.data(),
-    v.size());
-  return result.is_ok ? diplomat::result<std::unique_ptr<DateTime>, CalendarParseError>(diplomat::Ok<std::unique_ptr<DateTime>>(std::unique_ptr<DateTime>(DateTime::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<DateTime>, CalendarParseError>(diplomat::Err<CalendarParseError>(CalendarParseError::FromFFI(result.err)));
-}
-
-inline std::unique_ptr<Date> DateTime::date() const {
-  auto result = diplomat::capi::icu4x_DateTime_date_mv1(this->AsFFI());
-  return std::unique_ptr<Date>(Date::FromFFI(result));
-}
-
-inline std::unique_ptr<Time> DateTime::time() const {
-  auto result = diplomat::capi::icu4x_DateTime_time_mv1(this->AsFFI());
-  return std::unique_ptr<Time>(Time::FromFFI(result));
-}
-
-inline std::unique_ptr<IsoDateTime> DateTime::to_iso() const {
-  auto result = diplomat::capi::icu4x_DateTime_to_iso_mv1(this->AsFFI());
-  return std::unique_ptr<IsoDateTime>(IsoDateTime::FromFFI(result));
-}
-
-inline std::unique_ptr<DateTime> DateTime::to_calendar(const Calendar& calendar) const {
-  auto result = diplomat::capi::icu4x_DateTime_to_calendar_mv1(this->AsFFI(),
-    calendar.AsFFI());
-  return std::unique_ptr<DateTime>(DateTime::FromFFI(result));
-}
-
-inline uint8_t DateTime::hour() const {
-  auto result = diplomat::capi::icu4x_DateTime_hour_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint8_t DateTime::minute() const {
-  auto result = diplomat::capi::icu4x_DateTime_minute_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint8_t DateTime::second() const {
-  auto result = diplomat::capi::icu4x_DateTime_second_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint32_t DateTime::nanosecond() const {
-  auto result = diplomat::capi::icu4x_DateTime_nanosecond_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint16_t DateTime::day_of_year() const {
-  auto result = diplomat::capi::icu4x_DateTime_day_of_year_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint32_t DateTime::day_of_month() const {
-  auto result = diplomat::capi::icu4x_DateTime_day_of_month_mv1(this->AsFFI());
-  return result;
-}
-
-inline IsoWeekday DateTime::day_of_week() const {
-  auto result = diplomat::capi::icu4x_DateTime_day_of_week_mv1(this->AsFFI());
-  return IsoWeekday::FromFFI(result);
-}
-
-inline uint32_t DateTime::week_of_month(IsoWeekday first_weekday) const {
-  auto result = diplomat::capi::icu4x_DateTime_week_of_month_mv1(this->AsFFI(),
-    first_weekday.AsFFI());
-  return result;
-}
-
-inline WeekOf DateTime::week_of_year(const WeekCalculator& calculator) const {
-  auto result = diplomat::capi::icu4x_DateTime_week_of_year_mv1(this->AsFFI(),
-    calculator.AsFFI());
-  return WeekOf::FromFFI(result);
-}
-
-inline uint32_t DateTime::ordinal_month() const {
-  auto result = diplomat::capi::icu4x_DateTime_ordinal_month_mv1(this->AsFFI());
-  return result;
-}
-
-inline std::string DateTime::month_code() const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_DateTime_month_code_mv1(this->AsFFI(),
-    &write);
-  return output;
-}
-
-inline int32_t DateTime::year_in_era() const {
-  auto result = diplomat::capi::icu4x_DateTime_year_in_era_mv1(this->AsFFI());
-  return result;
-}
-
-inline std::string DateTime::era() const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_DateTime_era_mv1(this->AsFFI(),
-    &write);
-  return output;
-}
-
-inline uint8_t DateTime::months_in_year() const {
-  auto result = diplomat::capi::icu4x_DateTime_months_in_year_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint8_t DateTime::days_in_month() const {
-  auto result = diplomat::capi::icu4x_DateTime_days_in_month_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint16_t DateTime::days_in_year() const {
-  auto result = diplomat::capi::icu4x_DateTime_days_in_year_mv1(this->AsFFI());
-  return result;
-}
-
-inline std::unique_ptr<Calendar> DateTime::calendar() const {
-  auto result = diplomat::capi::icu4x_DateTime_calendar_mv1(this->AsFFI());
-  return std::unique_ptr<Calendar>(Calendar::FromFFI(result));
-}
-
-inline const diplomat::capi::DateTime* DateTime::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::DateTime*>(this);
-}
-
-inline diplomat::capi::DateTime* DateTime::AsFFI() {
-  return reinterpret_cast<diplomat::capi::DateTime*>(this);
-}
-
-inline const DateTime* DateTime::FromFFI(const diplomat::capi::DateTime* ptr) {
-  return reinterpret_cast<const DateTime*>(ptr);
-}
-
-inline DateTime* DateTime::FromFFI(diplomat::capi::DateTime* ptr) {
-  return reinterpret_cast<DateTime*>(ptr);
-}
-
-inline void DateTime::operator delete(void* ptr) {
-  diplomat::capi::icu4x_DateTime_destroy_mv1(reinterpret_cast<diplomat::capi::DateTime*>(ptr));
-}
-
-
-#endif // DateTime_HPP
diff --git a/ffi/capi/bindings/cpp/DateTimeFormatter.d.hpp b/ffi/capi/bindings/cpp/DateTimeFormatter.d.hpp
deleted file mode 100644
index 59503efac73..00000000000
--- a/ffi/capi/bindings/cpp/DateTimeFormatter.d.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef DateTimeFormatter_D_HPP
-#define DateTimeFormatter_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct DateTime; }
-class DateTime;
-namespace diplomat::capi { struct IsoDateTime; }
-class IsoDateTime;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-class DateLength;
-class Error;
-class TimeLength;
-
-
-namespace diplomat {
-namespace capi {
-    struct DateTimeFormatter;
-} // namespace capi
-} // namespace
-
-class DateTimeFormatter {
-public:
-
-  inline static diplomat::result<std::unique_ptr<DateTimeFormatter>, Error> create_with_lengths(const DataProvider& provider, const Locale& locale, DateLength date_length, TimeLength time_length);
-
-  inline diplomat::result<std::string, Error> format_datetime(const DateTime& value) const;
-
-  inline diplomat::result<std::string, Error> format_iso_datetime(const IsoDateTime& value) const;
-
-  inline const diplomat::capi::DateTimeFormatter* AsFFI() const;
-  inline diplomat::capi::DateTimeFormatter* AsFFI();
-  inline static const DateTimeFormatter* FromFFI(const diplomat::capi::DateTimeFormatter* ptr);
-  inline static DateTimeFormatter* FromFFI(diplomat::capi::DateTimeFormatter* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  DateTimeFormatter() = delete;
-  DateTimeFormatter(const DateTimeFormatter&) = delete;
-  DateTimeFormatter(DateTimeFormatter&&) noexcept = delete;
-  DateTimeFormatter operator=(const DateTimeFormatter&) = delete;
-  DateTimeFormatter operator=(DateTimeFormatter&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // DateTimeFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/DateTimeFormatter.hpp b/ffi/capi/bindings/cpp/DateTimeFormatter.hpp
deleted file mode 100644
index 20a7c4a0e5e..00000000000
--- a/ffi/capi/bindings/cpp/DateTimeFormatter.hpp
+++ /dev/null
@@ -1,89 +0,0 @@
-#ifndef DateTimeFormatter_HPP
-#define DateTimeFormatter_HPP
-
-#include "DateTimeFormatter.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataProvider.hpp"
-#include "DateLength.hpp"
-#include "DateTime.hpp"
-#include "Error.hpp"
-#include "IsoDateTime.hpp"
-#include "Locale.hpp"
-#include "TimeLength.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_DateTimeFormatter_create_with_lengths_mv1_result {union {diplomat::capi::DateTimeFormatter* ok; diplomat::capi::Error err;}; bool is_ok;} icu4x_DateTimeFormatter_create_with_lengths_mv1_result;
-    icu4x_DateTimeFormatter_create_with_lengths_mv1_result icu4x_DateTimeFormatter_create_with_lengths_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale, diplomat::capi::DateLength date_length, diplomat::capi::TimeLength time_length);
-    
-    typedef struct icu4x_DateTimeFormatter_format_datetime_mv1_result {union { diplomat::capi::Error err;}; bool is_ok;} icu4x_DateTimeFormatter_format_datetime_mv1_result;
-    icu4x_DateTimeFormatter_format_datetime_mv1_result icu4x_DateTimeFormatter_format_datetime_mv1(const diplomat::capi::DateTimeFormatter* self, const diplomat::capi::DateTime* value, diplomat::capi::DiplomatWrite* write);
-    
-    typedef struct icu4x_DateTimeFormatter_format_iso_datetime_mv1_result {union { diplomat::capi::Error err;}; bool is_ok;} icu4x_DateTimeFormatter_format_iso_datetime_mv1_result;
-    icu4x_DateTimeFormatter_format_iso_datetime_mv1_result icu4x_DateTimeFormatter_format_iso_datetime_mv1(const diplomat::capi::DateTimeFormatter* self, const diplomat::capi::IsoDateTime* value, diplomat::capi::DiplomatWrite* write);
-    
-    
-    void icu4x_DateTimeFormatter_destroy_mv1(DateTimeFormatter* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<DateTimeFormatter>, Error> DateTimeFormatter::create_with_lengths(const DataProvider& provider, const Locale& locale, DateLength date_length, TimeLength time_length) {
-  auto result = diplomat::capi::icu4x_DateTimeFormatter_create_with_lengths_mv1(provider.AsFFI(),
-    locale.AsFFI(),
-    date_length.AsFFI(),
-    time_length.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<DateTimeFormatter>, Error>(diplomat::Ok<std::unique_ptr<DateTimeFormatter>>(std::unique_ptr<DateTimeFormatter>(DateTimeFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<DateTimeFormatter>, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::string, Error> DateTimeFormatter::format_datetime(const DateTime& value) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_DateTimeFormatter_format_datetime_mv1(this->AsFFI(),
-    value.AsFFI(),
-    &write);
-  return result.is_ok ? diplomat::result<std::string, Error>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::string, Error> DateTimeFormatter::format_iso_datetime(const IsoDateTime& value) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_DateTimeFormatter_format_iso_datetime_mv1(this->AsFFI(),
-    value.AsFFI(),
-    &write);
-  return result.is_ok ? diplomat::result<std::string, Error>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline const diplomat::capi::DateTimeFormatter* DateTimeFormatter::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::DateTimeFormatter*>(this);
-}
-
-inline diplomat::capi::DateTimeFormatter* DateTimeFormatter::AsFFI() {
-  return reinterpret_cast<diplomat::capi::DateTimeFormatter*>(this);
-}
-
-inline const DateTimeFormatter* DateTimeFormatter::FromFFI(const diplomat::capi::DateTimeFormatter* ptr) {
-  return reinterpret_cast<const DateTimeFormatter*>(ptr);
-}
-
-inline DateTimeFormatter* DateTimeFormatter::FromFFI(diplomat::capi::DateTimeFormatter* ptr) {
-  return reinterpret_cast<DateTimeFormatter*>(ptr);
-}
-
-inline void DateTimeFormatter::operator delete(void* ptr) {
-  diplomat::capi::icu4x_DateTimeFormatter_destroy_mv1(reinterpret_cast<diplomat::capi::DateTimeFormatter*>(ptr));
-}
-
-
-#endif // DateTimeFormatter_HPP
diff --git a/ffi/capi/bindings/cpp/DecomposingNormalizer.d.hpp b/ffi/capi/bindings/cpp/DecomposingNormalizer.d.hpp
deleted file mode 100644
index b790dd9bcf4..00000000000
--- a/ffi/capi/bindings/cpp/DecomposingNormalizer.d.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef DecomposingNormalizer_D_HPP
-#define DecomposingNormalizer_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct DecomposingNormalizer;
-} // namespace capi
-} // namespace
-
-class DecomposingNormalizer {
-public:
-
-  inline static diplomat::result<std::unique_ptr<DecomposingNormalizer>, DataError> create_nfd(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<DecomposingNormalizer>, DataError> create_nfkd(const DataProvider& provider);
-
-  inline std::string normalize(std::string_view s) const;
-
-  inline bool is_normalized(std::string_view s) const;
-
-  inline bool is_normalized_utf16(std::u16string_view s) const;
-
-  inline size_t is_normalized_up_to(std::string_view s) const;
-
-  inline size_t is_normalized_utf16_up_to(std::u16string_view s) const;
-
-  inline const diplomat::capi::DecomposingNormalizer* AsFFI() const;
-  inline diplomat::capi::DecomposingNormalizer* AsFFI();
-  inline static const DecomposingNormalizer* FromFFI(const diplomat::capi::DecomposingNormalizer* ptr);
-  inline static DecomposingNormalizer* FromFFI(diplomat::capi::DecomposingNormalizer* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  DecomposingNormalizer() = delete;
-  DecomposingNormalizer(const DecomposingNormalizer&) = delete;
-  DecomposingNormalizer(DecomposingNormalizer&&) noexcept = delete;
-  DecomposingNormalizer operator=(const DecomposingNormalizer&) = delete;
-  DecomposingNormalizer operator=(DecomposingNormalizer&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // DecomposingNormalizer_D_HPP
diff --git a/ffi/capi/bindings/cpp/DecomposingNormalizer.hpp b/ffi/capi/bindings/cpp/DecomposingNormalizer.hpp
deleted file mode 100644
index 0d917970f60..00000000000
--- a/ffi/capi/bindings/cpp/DecomposingNormalizer.hpp
+++ /dev/null
@@ -1,113 +0,0 @@
-#ifndef DecomposingNormalizer_HPP
-#define DecomposingNormalizer_HPP
-
-#include "DecomposingNormalizer.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_DecomposingNormalizer_create_nfd_mv1_result {union {diplomat::capi::DecomposingNormalizer* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_DecomposingNormalizer_create_nfd_mv1_result;
-    icu4x_DecomposingNormalizer_create_nfd_mv1_result icu4x_DecomposingNormalizer_create_nfd_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_DecomposingNormalizer_create_nfkd_mv1_result {union {diplomat::capi::DecomposingNormalizer* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_DecomposingNormalizer_create_nfkd_mv1_result;
-    icu4x_DecomposingNormalizer_create_nfkd_mv1_result icu4x_DecomposingNormalizer_create_nfkd_mv1(const diplomat::capi::DataProvider* provider);
-    
-    void icu4x_DecomposingNormalizer_normalize_mv1(const diplomat::capi::DecomposingNormalizer* self, const char* s_data, size_t s_len, diplomat::capi::DiplomatWrite* write);
-    
-    bool icu4x_DecomposingNormalizer_is_normalized_mv1(const diplomat::capi::DecomposingNormalizer* self, const char* s_data, size_t s_len);
-    
-    bool icu4x_DecomposingNormalizer_is_normalized_utf16_mv1(const diplomat::capi::DecomposingNormalizer* self, const char16_t* s_data, size_t s_len);
-    
-    size_t icu4x_DecomposingNormalizer_is_normalized_up_to_mv1(const diplomat::capi::DecomposingNormalizer* self, const char* s_data, size_t s_len);
-    
-    size_t icu4x_DecomposingNormalizer_is_normalized_utf16_up_to_mv1(const diplomat::capi::DecomposingNormalizer* self, const char16_t* s_data, size_t s_len);
-    
-    
-    void icu4x_DecomposingNormalizer_destroy_mv1(DecomposingNormalizer* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<DecomposingNormalizer>, DataError> DecomposingNormalizer::create_nfd(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_DecomposingNormalizer_create_nfd_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<DecomposingNormalizer>, DataError>(diplomat::Ok<std::unique_ptr<DecomposingNormalizer>>(std::unique_ptr<DecomposingNormalizer>(DecomposingNormalizer::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<DecomposingNormalizer>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<DecomposingNormalizer>, DataError> DecomposingNormalizer::create_nfkd(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_DecomposingNormalizer_create_nfkd_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<DecomposingNormalizer>, DataError>(diplomat::Ok<std::unique_ptr<DecomposingNormalizer>>(std::unique_ptr<DecomposingNormalizer>(DecomposingNormalizer::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<DecomposingNormalizer>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline std::string DecomposingNormalizer::normalize(std::string_view s) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_DecomposingNormalizer_normalize_mv1(this->AsFFI(),
-    s.data(),
-    s.size(),
-    &write);
-  return output;
-}
-
-inline bool DecomposingNormalizer::is_normalized(std::string_view s) const {
-  auto result = diplomat::capi::icu4x_DecomposingNormalizer_is_normalized_mv1(this->AsFFI(),
-    s.data(),
-    s.size());
-  return result;
-}
-
-inline bool DecomposingNormalizer::is_normalized_utf16(std::u16string_view s) const {
-  auto result = diplomat::capi::icu4x_DecomposingNormalizer_is_normalized_utf16_mv1(this->AsFFI(),
-    s.data(),
-    s.size());
-  return result;
-}
-
-inline size_t DecomposingNormalizer::is_normalized_up_to(std::string_view s) const {
-  auto result = diplomat::capi::icu4x_DecomposingNormalizer_is_normalized_up_to_mv1(this->AsFFI(),
-    s.data(),
-    s.size());
-  return result;
-}
-
-inline size_t DecomposingNormalizer::is_normalized_utf16_up_to(std::u16string_view s) const {
-  auto result = diplomat::capi::icu4x_DecomposingNormalizer_is_normalized_utf16_up_to_mv1(this->AsFFI(),
-    s.data(),
-    s.size());
-  return result;
-}
-
-inline const diplomat::capi::DecomposingNormalizer* DecomposingNormalizer::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::DecomposingNormalizer*>(this);
-}
-
-inline diplomat::capi::DecomposingNormalizer* DecomposingNormalizer::AsFFI() {
-  return reinterpret_cast<diplomat::capi::DecomposingNormalizer*>(this);
-}
-
-inline const DecomposingNormalizer* DecomposingNormalizer::FromFFI(const diplomat::capi::DecomposingNormalizer* ptr) {
-  return reinterpret_cast<const DecomposingNormalizer*>(ptr);
-}
-
-inline DecomposingNormalizer* DecomposingNormalizer::FromFFI(diplomat::capi::DecomposingNormalizer* ptr) {
-  return reinterpret_cast<DecomposingNormalizer*>(ptr);
-}
-
-inline void DecomposingNormalizer::operator delete(void* ptr) {
-  diplomat::capi::icu4x_DecomposingNormalizer_destroy_mv1(reinterpret_cast<diplomat::capi::DecomposingNormalizer*>(ptr));
-}
-
-
-#endif // DecomposingNormalizer_HPP
diff --git a/ffi/capi/bindings/cpp/DisplayNamesFallback.hpp b/ffi/capi/bindings/cpp/DisplayNamesFallback.hpp
deleted file mode 100644
index c6ef9df1ebe..00000000000
--- a/ffi/capi/bindings/cpp/DisplayNamesFallback.hpp
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef DisplayNamesFallback_HPP
-#define DisplayNamesFallback_HPP
-
-#include "DisplayNamesFallback.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::DisplayNamesFallback DisplayNamesFallback::AsFFI() const {
-  return static_cast<diplomat::capi::DisplayNamesFallback>(value);
-}
-
-inline DisplayNamesFallback DisplayNamesFallback::FromFFI(diplomat::capi::DisplayNamesFallback c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::DisplayNamesFallback_Code:
-    case diplomat::capi::DisplayNamesFallback_None:
-      return static_cast<DisplayNamesFallback::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // DisplayNamesFallback_HPP
diff --git a/ffi/capi/bindings/cpp/DisplayNamesOptionsV1.d.hpp b/ffi/capi/bindings/cpp/DisplayNamesOptionsV1.d.hpp
deleted file mode 100644
index bfe482bf6f4..00000000000
--- a/ffi/capi/bindings/cpp/DisplayNamesOptionsV1.d.hpp
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef DisplayNamesOptionsV1_D_HPP
-#define DisplayNamesOptionsV1_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DisplayNamesFallback.d.hpp"
-#include "DisplayNamesStyle.d.hpp"
-#include "LanguageDisplay.d.hpp"
-#include "diplomat_runtime.hpp"
-
-class DisplayNamesFallback;
-class DisplayNamesStyle;
-class LanguageDisplay;
-
-
-namespace diplomat {
-namespace capi {
-    struct DisplayNamesOptionsV1 {
-      diplomat::capi::DisplayNamesStyle style;
-      diplomat::capi::DisplayNamesFallback fallback;
-      diplomat::capi::LanguageDisplay language_display;
-    };
-} // namespace capi
-} // namespace
-
-
-struct DisplayNamesOptionsV1 {
-  DisplayNamesStyle style;
-  DisplayNamesFallback fallback;
-  LanguageDisplay language_display;
-
-  inline diplomat::capi::DisplayNamesOptionsV1 AsFFI() const;
-  inline static DisplayNamesOptionsV1 FromFFI(diplomat::capi::DisplayNamesOptionsV1 c_struct);
-};
-
-
-#endif // DisplayNamesOptionsV1_D_HPP
diff --git a/ffi/capi/bindings/cpp/DisplayNamesOptionsV1.hpp b/ffi/capi/bindings/cpp/DisplayNamesOptionsV1.hpp
deleted file mode 100644
index c77ca161c1b..00000000000
--- a/ffi/capi/bindings/cpp/DisplayNamesOptionsV1.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef DisplayNamesOptionsV1_HPP
-#define DisplayNamesOptionsV1_HPP
-
-#include "DisplayNamesOptionsV1.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DisplayNamesFallback.hpp"
-#include "DisplayNamesStyle.hpp"
-#include "LanguageDisplay.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-
-inline diplomat::capi::DisplayNamesOptionsV1 DisplayNamesOptionsV1::AsFFI() const {
-  return diplomat::capi::DisplayNamesOptionsV1 {
-    /* .style = */ style.AsFFI(),
-    /* .fallback = */ fallback.AsFFI(),
-    /* .language_display = */ language_display.AsFFI(),
-  };
-}
-
-inline DisplayNamesOptionsV1 DisplayNamesOptionsV1::FromFFI(diplomat::capi::DisplayNamesOptionsV1 c_struct) {
-  return DisplayNamesOptionsV1 {
-    /* .style = */ DisplayNamesStyle::FromFFI(c_struct.style),
-    /* .fallback = */ DisplayNamesFallback::FromFFI(c_struct.fallback),
-    /* .language_display = */ LanguageDisplay::FromFFI(c_struct.language_display),
-  };
-}
-
-
-#endif // DisplayNamesOptionsV1_HPP
diff --git a/ffi/capi/bindings/cpp/DisplayNamesStyle.hpp b/ffi/capi/bindings/cpp/DisplayNamesStyle.hpp
deleted file mode 100644
index f6fa60eaf0c..00000000000
--- a/ffi/capi/bindings/cpp/DisplayNamesStyle.hpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef DisplayNamesStyle_HPP
-#define DisplayNamesStyle_HPP
-
-#include "DisplayNamesStyle.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::DisplayNamesStyle DisplayNamesStyle::AsFFI() const {
-  return static_cast<diplomat::capi::DisplayNamesStyle>(value);
-}
-
-inline DisplayNamesStyle DisplayNamesStyle::FromFFI(diplomat::capi::DisplayNamesStyle c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::DisplayNamesStyle_Auto:
-    case diplomat::capi::DisplayNamesStyle_Narrow:
-    case diplomat::capi::DisplayNamesStyle_Short:
-    case diplomat::capi::DisplayNamesStyle_Long:
-    case diplomat::capi::DisplayNamesStyle_Menu:
-      return static_cast<DisplayNamesStyle::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // DisplayNamesStyle_HPP
diff --git a/ffi/capi/bindings/cpp/Error.hpp b/ffi/capi/bindings/cpp/Error.hpp
deleted file mode 100644
index 55d5e17c27d..00000000000
--- a/ffi/capi/bindings/cpp/Error.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef Error_HPP
-#define Error_HPP
-
-#include "Error.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::Error Error::AsFFI() const {
-  return static_cast<diplomat::capi::Error>(value);
-}
-
-inline Error Error::FromFFI(diplomat::capi::Error c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::Error_UnknownError:
-    case diplomat::capi::Error_DataMissingDataMarkerError:
-    case diplomat::capi::Error_DataMissingLocaleError:
-    case diplomat::capi::Error_DataNeedsLocaleError:
-    case diplomat::capi::Error_DataExtraneousLocaleError:
-    case diplomat::capi::Error_DataFilteredResourceError:
-    case diplomat::capi::Error_DataMismatchedTypeError:
-    case diplomat::capi::Error_DataCustomError:
-    case diplomat::capi::Error_DataIoError:
-    case diplomat::capi::Error_DataUnavailableBufferFormatError:
-    case diplomat::capi::Error_PropertyUnexpectedPropertyNameError:
-    case diplomat::capi::Error_DateTimePatternError:
-    case diplomat::capi::Error_DateTimeMissingInputFieldError:
-    case diplomat::capi::Error_DateTimeSkeletonError:
-    case diplomat::capi::Error_DateTimeUnsupportedFieldError:
-    case diplomat::capi::Error_DateTimeUnsupportedOptionsError:
-    case diplomat::capi::Error_DateTimeMissingWeekdaySymbolError:
-    case diplomat::capi::Error_DateTimeMissingMonthSymbolError:
-    case diplomat::capi::Error_DateTimeFixedDecimalError:
-    case diplomat::capi::Error_DateTimeMismatchedCalendarError:
-      return static_cast<Error::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // Error_HPP
diff --git a/ffi/capi/bindings/cpp/FixedDecimal.d.hpp b/ffi/capi/bindings/cpp/FixedDecimal.d.hpp
deleted file mode 100644
index f7bb205e670..00000000000
--- a/ffi/capi/bindings/cpp/FixedDecimal.d.hpp
+++ /dev/null
@@ -1,110 +0,0 @@
-#ifndef FixedDecimal_D_HPP
-#define FixedDecimal_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-struct FixedDecimalLimitError;
-class FixedDecimalParseError;
-class FixedDecimalRoundingIncrement;
-class FixedDecimalRoundingMode;
-class FixedDecimalSign;
-class FixedDecimalSignDisplay;
-
-
-namespace diplomat {
-namespace capi {
-    struct FixedDecimal;
-} // namespace capi
-} // namespace
-
-class FixedDecimal {
-public:
-
-  inline static std::unique_ptr<FixedDecimal> from(int32_t v);
-
-  inline static std::unique_ptr<FixedDecimal> from(uint32_t v);
-
-  inline static std::unique_ptr<FixedDecimal> from(int64_t v);
-
-  inline static std::unique_ptr<FixedDecimal> from(uint64_t v);
-
-  inline static diplomat::result<std::unique_ptr<FixedDecimal>, FixedDecimalLimitError> from_double_with_integer_precision(double f);
-
-  inline static diplomat::result<std::unique_ptr<FixedDecimal>, FixedDecimalLimitError> from_double_with_lower_magnitude(double f, int16_t magnitude);
-
-  inline static diplomat::result<std::unique_ptr<FixedDecimal>, FixedDecimalLimitError> from_double_with_significant_digits(double f, uint8_t digits);
-
-  inline static diplomat::result<std::unique_ptr<FixedDecimal>, FixedDecimalLimitError> from_double_with_floating_precision(double f);
-
-  inline static diplomat::result<std::unique_ptr<FixedDecimal>, FixedDecimalParseError> from_string(std::string_view v);
-
-  inline uint8_t digit_at(int16_t magnitude) const;
-
-  inline int16_t magnitude_start() const;
-
-  inline int16_t magnitude_end() const;
-
-  inline int16_t nonzero_magnitude_start() const;
-
-  inline int16_t nonzero_magnitude_end() const;
-
-  inline bool is_zero() const;
-
-  inline void multiply_pow10(int16_t power);
-
-  inline FixedDecimalSign sign() const;
-
-  inline void set_sign(FixedDecimalSign sign);
-
-  inline void apply_sign_display(FixedDecimalSignDisplay sign_display);
-
-  inline void trim_start();
-
-  inline void trim_end();
-
-  inline void pad_start(int16_t position);
-
-  inline void pad_end(int16_t position);
-
-  inline void set_max_position(int16_t position);
-
-  inline void round(int16_t position);
-
-  inline void ceil(int16_t position);
-
-  inline void expand(int16_t position);
-
-  inline void floor(int16_t position);
-
-  inline void trunc(int16_t position);
-
-  inline void round_with_mode(int16_t position, FixedDecimalRoundingMode mode);
-
-  inline void round_with_mode_and_increment(int16_t position, FixedDecimalRoundingMode mode, FixedDecimalRoundingIncrement increment);
-
-  inline diplomat::result<std::monostate, std::monostate> concatenate_end(FixedDecimal& other);
-
-  inline std::string to_string() const;
-
-  inline const diplomat::capi::FixedDecimal* AsFFI() const;
-  inline diplomat::capi::FixedDecimal* AsFFI();
-  inline static const FixedDecimal* FromFFI(const diplomat::capi::FixedDecimal* ptr);
-  inline static FixedDecimal* FromFFI(diplomat::capi::FixedDecimal* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  FixedDecimal() = delete;
-  FixedDecimal(const FixedDecimal&) = delete;
-  FixedDecimal(FixedDecimal&&) noexcept = delete;
-  FixedDecimal operator=(const FixedDecimal&) = delete;
-  FixedDecimal operator=(FixedDecimal&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // FixedDecimal_D_HPP
diff --git a/ffi/capi/bindings/cpp/FixedDecimal.hpp b/ffi/capi/bindings/cpp/FixedDecimal.hpp
deleted file mode 100644
index 2ac1400d5cc..00000000000
--- a/ffi/capi/bindings/cpp/FixedDecimal.hpp
+++ /dev/null
@@ -1,299 +0,0 @@
-#ifndef FixedDecimal_HPP
-#define FixedDecimal_HPP
-
-#include "FixedDecimal.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "FixedDecimalLimitError.hpp"
-#include "FixedDecimalParseError.hpp"
-#include "FixedDecimalRoundingIncrement.hpp"
-#include "FixedDecimalRoundingMode.hpp"
-#include "FixedDecimalSign.hpp"
-#include "FixedDecimalSignDisplay.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    diplomat::capi::FixedDecimal* icu4x_FixedDecimal_from_int32_mv1(int32_t v);
-    
-    diplomat::capi::FixedDecimal* icu4x_FixedDecimal_from_uint32_mv1(uint32_t v);
-    
-    diplomat::capi::FixedDecimal* icu4x_FixedDecimal_from_int64_mv1(int64_t v);
-    
-    diplomat::capi::FixedDecimal* icu4x_FixedDecimal_from_uint64_mv1(uint64_t v);
-    
-    typedef struct icu4x_FixedDecimal_from_double_with_integer_precision_mv1_result {union {diplomat::capi::FixedDecimal* ok; }; bool is_ok;} icu4x_FixedDecimal_from_double_with_integer_precision_mv1_result;
-    icu4x_FixedDecimal_from_double_with_integer_precision_mv1_result icu4x_FixedDecimal_from_double_with_integer_precision_mv1(double f);
-    
-    typedef struct icu4x_FixedDecimal_from_double_with_lower_magnitude_mv1_result {union {diplomat::capi::FixedDecimal* ok; }; bool is_ok;} icu4x_FixedDecimal_from_double_with_lower_magnitude_mv1_result;
-    icu4x_FixedDecimal_from_double_with_lower_magnitude_mv1_result icu4x_FixedDecimal_from_double_with_lower_magnitude_mv1(double f, int16_t magnitude);
-    
-    typedef struct icu4x_FixedDecimal_from_double_with_significant_digits_mv1_result {union {diplomat::capi::FixedDecimal* ok; }; bool is_ok;} icu4x_FixedDecimal_from_double_with_significant_digits_mv1_result;
-    icu4x_FixedDecimal_from_double_with_significant_digits_mv1_result icu4x_FixedDecimal_from_double_with_significant_digits_mv1(double f, uint8_t digits);
-    
-    typedef struct icu4x_FixedDecimal_from_double_with_floating_precision_mv1_result {union {diplomat::capi::FixedDecimal* ok; }; bool is_ok;} icu4x_FixedDecimal_from_double_with_floating_precision_mv1_result;
-    icu4x_FixedDecimal_from_double_with_floating_precision_mv1_result icu4x_FixedDecimal_from_double_with_floating_precision_mv1(double f);
-    
-    typedef struct icu4x_FixedDecimal_from_string_mv1_result {union {diplomat::capi::FixedDecimal* ok; diplomat::capi::FixedDecimalParseError err;}; bool is_ok;} icu4x_FixedDecimal_from_string_mv1_result;
-    icu4x_FixedDecimal_from_string_mv1_result icu4x_FixedDecimal_from_string_mv1(const char* v_data, size_t v_len);
-    
-    uint8_t icu4x_FixedDecimal_digit_at_mv1(const diplomat::capi::FixedDecimal* self, int16_t magnitude);
-    
-    int16_t icu4x_FixedDecimal_magnitude_start_mv1(const diplomat::capi::FixedDecimal* self);
-    
-    int16_t icu4x_FixedDecimal_magnitude_end_mv1(const diplomat::capi::FixedDecimal* self);
-    
-    int16_t icu4x_FixedDecimal_nonzero_magnitude_start_mv1(const diplomat::capi::FixedDecimal* self);
-    
-    int16_t icu4x_FixedDecimal_nonzero_magnitude_end_mv1(const diplomat::capi::FixedDecimal* self);
-    
-    bool icu4x_FixedDecimal_is_zero_mv1(const diplomat::capi::FixedDecimal* self);
-    
-    void icu4x_FixedDecimal_multiply_pow10_mv1(diplomat::capi::FixedDecimal* self, int16_t power);
-    
-    diplomat::capi::FixedDecimalSign icu4x_FixedDecimal_sign_mv1(const diplomat::capi::FixedDecimal* self);
-    
-    void icu4x_FixedDecimal_set_sign_mv1(diplomat::capi::FixedDecimal* self, diplomat::capi::FixedDecimalSign sign);
-    
-    void icu4x_FixedDecimal_apply_sign_display_mv1(diplomat::capi::FixedDecimal* self, diplomat::capi::FixedDecimalSignDisplay sign_display);
-    
-    void icu4x_FixedDecimal_trim_start_mv1(diplomat::capi::FixedDecimal* self);
-    
-    void icu4x_FixedDecimal_trim_end_mv1(diplomat::capi::FixedDecimal* self);
-    
-    void icu4x_FixedDecimal_pad_start_mv1(diplomat::capi::FixedDecimal* self, int16_t position);
-    
-    void icu4x_FixedDecimal_pad_end_mv1(diplomat::capi::FixedDecimal* self, int16_t position);
-    
-    void icu4x_FixedDecimal_set_max_position_mv1(diplomat::capi::FixedDecimal* self, int16_t position);
-    
-    void icu4x_FixedDecimal_round_mv1(diplomat::capi::FixedDecimal* self, int16_t position);
-    
-    void icu4x_FixedDecimal_ceil_mv1(diplomat::capi::FixedDecimal* self, int16_t position);
-    
-    void icu4x_FixedDecimal_expand_mv1(diplomat::capi::FixedDecimal* self, int16_t position);
-    
-    void icu4x_FixedDecimal_floor_mv1(diplomat::capi::FixedDecimal* self, int16_t position);
-    
-    void icu4x_FixedDecimal_trunc_mv1(diplomat::capi::FixedDecimal* self, int16_t position);
-    
-    void icu4x_FixedDecimal_round_with_mode_mv1(diplomat::capi::FixedDecimal* self, int16_t position, diplomat::capi::FixedDecimalRoundingMode mode);
-    
-    void icu4x_FixedDecimal_round_with_mode_and_increment_mv1(diplomat::capi::FixedDecimal* self, int16_t position, diplomat::capi::FixedDecimalRoundingMode mode, diplomat::capi::FixedDecimalRoundingIncrement increment);
-    
-    typedef struct icu4x_FixedDecimal_concatenate_end_mv1_result { bool is_ok;} icu4x_FixedDecimal_concatenate_end_mv1_result;
-    icu4x_FixedDecimal_concatenate_end_mv1_result icu4x_FixedDecimal_concatenate_end_mv1(diplomat::capi::FixedDecimal* self, diplomat::capi::FixedDecimal* other);
-    
-    void icu4x_FixedDecimal_to_string_mv1(const diplomat::capi::FixedDecimal* self, diplomat::capi::DiplomatWrite* write);
-    
-    
-    void icu4x_FixedDecimal_destroy_mv1(FixedDecimal* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline std::unique_ptr<FixedDecimal> FixedDecimal::from(int32_t v) {
-  auto result = diplomat::capi::icu4x_FixedDecimal_from_int32_mv1(v);
-  return std::unique_ptr<FixedDecimal>(FixedDecimal::FromFFI(result));
-}
-
-inline std::unique_ptr<FixedDecimal> FixedDecimal::from(uint32_t v) {
-  auto result = diplomat::capi::icu4x_FixedDecimal_from_uint32_mv1(v);
-  return std::unique_ptr<FixedDecimal>(FixedDecimal::FromFFI(result));
-}
-
-inline std::unique_ptr<FixedDecimal> FixedDecimal::from(int64_t v) {
-  auto result = diplomat::capi::icu4x_FixedDecimal_from_int64_mv1(v);
-  return std::unique_ptr<FixedDecimal>(FixedDecimal::FromFFI(result));
-}
-
-inline std::unique_ptr<FixedDecimal> FixedDecimal::from(uint64_t v) {
-  auto result = diplomat::capi::icu4x_FixedDecimal_from_uint64_mv1(v);
-  return std::unique_ptr<FixedDecimal>(FixedDecimal::FromFFI(result));
-}
-
-inline diplomat::result<std::unique_ptr<FixedDecimal>, FixedDecimalLimitError> FixedDecimal::from_double_with_integer_precision(double f) {
-  auto result = diplomat::capi::icu4x_FixedDecimal_from_double_with_integer_precision_mv1(f);
-  return result.is_ok ? diplomat::result<std::unique_ptr<FixedDecimal>, FixedDecimalLimitError>(diplomat::Ok<std::unique_ptr<FixedDecimal>>(std::unique_ptr<FixedDecimal>(FixedDecimal::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<FixedDecimal>, FixedDecimalLimitError>(diplomat::Err<FixedDecimalLimitError>(FixedDecimalLimitError {}));
-}
-
-inline diplomat::result<std::unique_ptr<FixedDecimal>, FixedDecimalLimitError> FixedDecimal::from_double_with_lower_magnitude(double f, int16_t magnitude) {
-  auto result = diplomat::capi::icu4x_FixedDecimal_from_double_with_lower_magnitude_mv1(f,
-    magnitude);
-  return result.is_ok ? diplomat::result<std::unique_ptr<FixedDecimal>, FixedDecimalLimitError>(diplomat::Ok<std::unique_ptr<FixedDecimal>>(std::unique_ptr<FixedDecimal>(FixedDecimal::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<FixedDecimal>, FixedDecimalLimitError>(diplomat::Err<FixedDecimalLimitError>(FixedDecimalLimitError {}));
-}
-
-inline diplomat::result<std::unique_ptr<FixedDecimal>, FixedDecimalLimitError> FixedDecimal::from_double_with_significant_digits(double f, uint8_t digits) {
-  auto result = diplomat::capi::icu4x_FixedDecimal_from_double_with_significant_digits_mv1(f,
-    digits);
-  return result.is_ok ? diplomat::result<std::unique_ptr<FixedDecimal>, FixedDecimalLimitError>(diplomat::Ok<std::unique_ptr<FixedDecimal>>(std::unique_ptr<FixedDecimal>(FixedDecimal::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<FixedDecimal>, FixedDecimalLimitError>(diplomat::Err<FixedDecimalLimitError>(FixedDecimalLimitError {}));
-}
-
-inline diplomat::result<std::unique_ptr<FixedDecimal>, FixedDecimalLimitError> FixedDecimal::from_double_with_floating_precision(double f) {
-  auto result = diplomat::capi::icu4x_FixedDecimal_from_double_with_floating_precision_mv1(f);
-  return result.is_ok ? diplomat::result<std::unique_ptr<FixedDecimal>, FixedDecimalLimitError>(diplomat::Ok<std::unique_ptr<FixedDecimal>>(std::unique_ptr<FixedDecimal>(FixedDecimal::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<FixedDecimal>, FixedDecimalLimitError>(diplomat::Err<FixedDecimalLimitError>(FixedDecimalLimitError {}));
-}
-
-inline diplomat::result<std::unique_ptr<FixedDecimal>, FixedDecimalParseError> FixedDecimal::from_string(std::string_view v) {
-  auto result = diplomat::capi::icu4x_FixedDecimal_from_string_mv1(v.data(),
-    v.size());
-  return result.is_ok ? diplomat::result<std::unique_ptr<FixedDecimal>, FixedDecimalParseError>(diplomat::Ok<std::unique_ptr<FixedDecimal>>(std::unique_ptr<FixedDecimal>(FixedDecimal::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<FixedDecimal>, FixedDecimalParseError>(diplomat::Err<FixedDecimalParseError>(FixedDecimalParseError::FromFFI(result.err)));
-}
-
-inline uint8_t FixedDecimal::digit_at(int16_t magnitude) const {
-  auto result = diplomat::capi::icu4x_FixedDecimal_digit_at_mv1(this->AsFFI(),
-    magnitude);
-  return result;
-}
-
-inline int16_t FixedDecimal::magnitude_start() const {
-  auto result = diplomat::capi::icu4x_FixedDecimal_magnitude_start_mv1(this->AsFFI());
-  return result;
-}
-
-inline int16_t FixedDecimal::magnitude_end() const {
-  auto result = diplomat::capi::icu4x_FixedDecimal_magnitude_end_mv1(this->AsFFI());
-  return result;
-}
-
-inline int16_t FixedDecimal::nonzero_magnitude_start() const {
-  auto result = diplomat::capi::icu4x_FixedDecimal_nonzero_magnitude_start_mv1(this->AsFFI());
-  return result;
-}
-
-inline int16_t FixedDecimal::nonzero_magnitude_end() const {
-  auto result = diplomat::capi::icu4x_FixedDecimal_nonzero_magnitude_end_mv1(this->AsFFI());
-  return result;
-}
-
-inline bool FixedDecimal::is_zero() const {
-  auto result = diplomat::capi::icu4x_FixedDecimal_is_zero_mv1(this->AsFFI());
-  return result;
-}
-
-inline void FixedDecimal::multiply_pow10(int16_t power) {
-  diplomat::capi::icu4x_FixedDecimal_multiply_pow10_mv1(this->AsFFI(),
-    power);
-}
-
-inline FixedDecimalSign FixedDecimal::sign() const {
-  auto result = diplomat::capi::icu4x_FixedDecimal_sign_mv1(this->AsFFI());
-  return FixedDecimalSign::FromFFI(result);
-}
-
-inline void FixedDecimal::set_sign(FixedDecimalSign sign) {
-  diplomat::capi::icu4x_FixedDecimal_set_sign_mv1(this->AsFFI(),
-    sign.AsFFI());
-}
-
-inline void FixedDecimal::apply_sign_display(FixedDecimalSignDisplay sign_display) {
-  diplomat::capi::icu4x_FixedDecimal_apply_sign_display_mv1(this->AsFFI(),
-    sign_display.AsFFI());
-}
-
-inline void FixedDecimal::trim_start() {
-  diplomat::capi::icu4x_FixedDecimal_trim_start_mv1(this->AsFFI());
-}
-
-inline void FixedDecimal::trim_end() {
-  diplomat::capi::icu4x_FixedDecimal_trim_end_mv1(this->AsFFI());
-}
-
-inline void FixedDecimal::pad_start(int16_t position) {
-  diplomat::capi::icu4x_FixedDecimal_pad_start_mv1(this->AsFFI(),
-    position);
-}
-
-inline void FixedDecimal::pad_end(int16_t position) {
-  diplomat::capi::icu4x_FixedDecimal_pad_end_mv1(this->AsFFI(),
-    position);
-}
-
-inline void FixedDecimal::set_max_position(int16_t position) {
-  diplomat::capi::icu4x_FixedDecimal_set_max_position_mv1(this->AsFFI(),
-    position);
-}
-
-inline void FixedDecimal::round(int16_t position) {
-  diplomat::capi::icu4x_FixedDecimal_round_mv1(this->AsFFI(),
-    position);
-}
-
-inline void FixedDecimal::ceil(int16_t position) {
-  diplomat::capi::icu4x_FixedDecimal_ceil_mv1(this->AsFFI(),
-    position);
-}
-
-inline void FixedDecimal::expand(int16_t position) {
-  diplomat::capi::icu4x_FixedDecimal_expand_mv1(this->AsFFI(),
-    position);
-}
-
-inline void FixedDecimal::floor(int16_t position) {
-  diplomat::capi::icu4x_FixedDecimal_floor_mv1(this->AsFFI(),
-    position);
-}
-
-inline void FixedDecimal::trunc(int16_t position) {
-  diplomat::capi::icu4x_FixedDecimal_trunc_mv1(this->AsFFI(),
-    position);
-}
-
-inline void FixedDecimal::round_with_mode(int16_t position, FixedDecimalRoundingMode mode) {
-  diplomat::capi::icu4x_FixedDecimal_round_with_mode_mv1(this->AsFFI(),
-    position,
-    mode.AsFFI());
-}
-
-inline void FixedDecimal::round_with_mode_and_increment(int16_t position, FixedDecimalRoundingMode mode, FixedDecimalRoundingIncrement increment) {
-  diplomat::capi::icu4x_FixedDecimal_round_with_mode_and_increment_mv1(this->AsFFI(),
-    position,
-    mode.AsFFI(),
-    increment.AsFFI());
-}
-
-inline diplomat::result<std::monostate, std::monostate> FixedDecimal::concatenate_end(FixedDecimal& other) {
-  auto result = diplomat::capi::icu4x_FixedDecimal_concatenate_end_mv1(this->AsFFI(),
-    other.AsFFI());
-  return result.is_ok ? diplomat::result<std::monostate, std::monostate>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, std::monostate>(diplomat::Err<std::monostate>());
-}
-
-inline std::string FixedDecimal::to_string() const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_FixedDecimal_to_string_mv1(this->AsFFI(),
-    &write);
-  return output;
-}
-
-inline const diplomat::capi::FixedDecimal* FixedDecimal::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::FixedDecimal*>(this);
-}
-
-inline diplomat::capi::FixedDecimal* FixedDecimal::AsFFI() {
-  return reinterpret_cast<diplomat::capi::FixedDecimal*>(this);
-}
-
-inline const FixedDecimal* FixedDecimal::FromFFI(const diplomat::capi::FixedDecimal* ptr) {
-  return reinterpret_cast<const FixedDecimal*>(ptr);
-}
-
-inline FixedDecimal* FixedDecimal::FromFFI(diplomat::capi::FixedDecimal* ptr) {
-  return reinterpret_cast<FixedDecimal*>(ptr);
-}
-
-inline void FixedDecimal::operator delete(void* ptr) {
-  diplomat::capi::icu4x_FixedDecimal_destroy_mv1(reinterpret_cast<diplomat::capi::FixedDecimal*>(ptr));
-}
-
-
-#endif // FixedDecimal_HPP
diff --git a/ffi/capi/bindings/cpp/FixedDecimalFormatter.d.hpp b/ffi/capi/bindings/cpp/FixedDecimalFormatter.d.hpp
deleted file mode 100644
index 626d442c8ba..00000000000
--- a/ffi/capi/bindings/cpp/FixedDecimalFormatter.d.hpp
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef FixedDecimalFormatter_D_HPP
-#define FixedDecimalFormatter_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct FixedDecimal; }
-class FixedDecimal;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-class DataError;
-class FixedDecimalGroupingStrategy;
-
-
-namespace diplomat {
-namespace capi {
-    struct FixedDecimalFormatter;
-} // namespace capi
-} // namespace
-
-class FixedDecimalFormatter {
-public:
-
-  inline static diplomat::result<std::unique_ptr<FixedDecimalFormatter>, DataError> create_with_grouping_strategy(const DataProvider& provider, const Locale& locale, FixedDecimalGroupingStrategy grouping_strategy);
-
-  inline static diplomat::result<std::unique_ptr<FixedDecimalFormatter>, DataError> create_with_manual_data(std::string_view plus_sign_prefix, std::string_view plus_sign_suffix, std::string_view minus_sign_prefix, std::string_view minus_sign_suffix, std::string_view decimal_separator, std::string_view grouping_separator, uint8_t primary_group_size, uint8_t secondary_group_size, uint8_t min_group_size, diplomat::span<const char32_t> digits, FixedDecimalGroupingStrategy grouping_strategy);
-
-  inline std::string format(const FixedDecimal& value) const;
-
-  inline const diplomat::capi::FixedDecimalFormatter* AsFFI() const;
-  inline diplomat::capi::FixedDecimalFormatter* AsFFI();
-  inline static const FixedDecimalFormatter* FromFFI(const diplomat::capi::FixedDecimalFormatter* ptr);
-  inline static FixedDecimalFormatter* FromFFI(diplomat::capi::FixedDecimalFormatter* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  FixedDecimalFormatter() = delete;
-  FixedDecimalFormatter(const FixedDecimalFormatter&) = delete;
-  FixedDecimalFormatter(FixedDecimalFormatter&&) noexcept = delete;
-  FixedDecimalFormatter operator=(const FixedDecimalFormatter&) = delete;
-  FixedDecimalFormatter operator=(FixedDecimalFormatter&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // FixedDecimalFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/FixedDecimalFormatter.hpp b/ffi/capi/bindings/cpp/FixedDecimalFormatter.hpp
deleted file mode 100644
index d446f9c476a..00000000000
--- a/ffi/capi/bindings/cpp/FixedDecimalFormatter.hpp
+++ /dev/null
@@ -1,98 +0,0 @@
-#ifndef FixedDecimalFormatter_HPP
-#define FixedDecimalFormatter_HPP
-
-#include "FixedDecimalFormatter.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "FixedDecimal.hpp"
-#include "FixedDecimalGroupingStrategy.hpp"
-#include "Locale.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_FixedDecimalFormatter_create_with_grouping_strategy_mv1_result {union {diplomat::capi::FixedDecimalFormatter* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_FixedDecimalFormatter_create_with_grouping_strategy_mv1_result;
-    icu4x_FixedDecimalFormatter_create_with_grouping_strategy_mv1_result icu4x_FixedDecimalFormatter_create_with_grouping_strategy_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale, diplomat::capi::FixedDecimalGroupingStrategy grouping_strategy);
-    
-    typedef struct icu4x_FixedDecimalFormatter_create_with_manual_data_mv1_result {union {diplomat::capi::FixedDecimalFormatter* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_FixedDecimalFormatter_create_with_manual_data_mv1_result;
-    icu4x_FixedDecimalFormatter_create_with_manual_data_mv1_result icu4x_FixedDecimalFormatter_create_with_manual_data_mv1(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, diplomat::capi::FixedDecimalGroupingStrategy grouping_strategy);
-    
-    void icu4x_FixedDecimalFormatter_format_mv1(const diplomat::capi::FixedDecimalFormatter* self, const diplomat::capi::FixedDecimal* value, diplomat::capi::DiplomatWrite* write);
-    
-    
-    void icu4x_FixedDecimalFormatter_destroy_mv1(FixedDecimalFormatter* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<FixedDecimalFormatter>, DataError> FixedDecimalFormatter::create_with_grouping_strategy(const DataProvider& provider, const Locale& locale, FixedDecimalGroupingStrategy grouping_strategy) {
-  auto result = diplomat::capi::icu4x_FixedDecimalFormatter_create_with_grouping_strategy_mv1(provider.AsFFI(),
-    locale.AsFFI(),
-    grouping_strategy.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<FixedDecimalFormatter>, DataError>(diplomat::Ok<std::unique_ptr<FixedDecimalFormatter>>(std::unique_ptr<FixedDecimalFormatter>(FixedDecimalFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<FixedDecimalFormatter>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<FixedDecimalFormatter>, DataError> FixedDecimalFormatter::create_with_manual_data(std::string_view plus_sign_prefix, std::string_view plus_sign_suffix, std::string_view minus_sign_prefix, std::string_view minus_sign_suffix, std::string_view decimal_separator, std::string_view grouping_separator, uint8_t primary_group_size, uint8_t secondary_group_size, uint8_t min_group_size, diplomat::span<const char32_t> digits, FixedDecimalGroupingStrategy grouping_strategy) {
-  auto result = diplomat::capi::icu4x_FixedDecimalFormatter_create_with_manual_data_mv1(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(),
-    grouping_strategy.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<FixedDecimalFormatter>, DataError>(diplomat::Ok<std::unique_ptr<FixedDecimalFormatter>>(std::unique_ptr<FixedDecimalFormatter>(FixedDecimalFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<FixedDecimalFormatter>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline std::string FixedDecimalFormatter::format(const FixedDecimal& value) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_FixedDecimalFormatter_format_mv1(this->AsFFI(),
-    value.AsFFI(),
-    &write);
-  return output;
-}
-
-inline const diplomat::capi::FixedDecimalFormatter* FixedDecimalFormatter::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::FixedDecimalFormatter*>(this);
-}
-
-inline diplomat::capi::FixedDecimalFormatter* FixedDecimalFormatter::AsFFI() {
-  return reinterpret_cast<diplomat::capi::FixedDecimalFormatter*>(this);
-}
-
-inline const FixedDecimalFormatter* FixedDecimalFormatter::FromFFI(const diplomat::capi::FixedDecimalFormatter* ptr) {
-  return reinterpret_cast<const FixedDecimalFormatter*>(ptr);
-}
-
-inline FixedDecimalFormatter* FixedDecimalFormatter::FromFFI(diplomat::capi::FixedDecimalFormatter* ptr) {
-  return reinterpret_cast<FixedDecimalFormatter*>(ptr);
-}
-
-inline void FixedDecimalFormatter::operator delete(void* ptr) {
-  diplomat::capi::icu4x_FixedDecimalFormatter_destroy_mv1(reinterpret_cast<diplomat::capi::FixedDecimalFormatter*>(ptr));
-}
-
-
-#endif // FixedDecimalFormatter_HPP
diff --git a/ffi/capi/bindings/cpp/FixedDecimalGroupingStrategy.hpp b/ffi/capi/bindings/cpp/FixedDecimalGroupingStrategy.hpp
deleted file mode 100644
index 950105b8310..00000000000
--- a/ffi/capi/bindings/cpp/FixedDecimalGroupingStrategy.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef FixedDecimalGroupingStrategy_HPP
-#define FixedDecimalGroupingStrategy_HPP
-
-#include "FixedDecimalGroupingStrategy.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::FixedDecimalGroupingStrategy FixedDecimalGroupingStrategy::AsFFI() const {
-  return static_cast<diplomat::capi::FixedDecimalGroupingStrategy>(value);
-}
-
-inline FixedDecimalGroupingStrategy FixedDecimalGroupingStrategy::FromFFI(diplomat::capi::FixedDecimalGroupingStrategy c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::FixedDecimalGroupingStrategy_Auto:
-    case diplomat::capi::FixedDecimalGroupingStrategy_Never:
-    case diplomat::capi::FixedDecimalGroupingStrategy_Always:
-    case diplomat::capi::FixedDecimalGroupingStrategy_Min2:
-      return static_cast<FixedDecimalGroupingStrategy::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // FixedDecimalGroupingStrategy_HPP
diff --git a/ffi/capi/bindings/cpp/FixedDecimalParseError.hpp b/ffi/capi/bindings/cpp/FixedDecimalParseError.hpp
deleted file mode 100644
index 4db0bf61977..00000000000
--- a/ffi/capi/bindings/cpp/FixedDecimalParseError.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef FixedDecimalParseError_HPP
-#define FixedDecimalParseError_HPP
-
-#include "FixedDecimalParseError.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::FixedDecimalParseError FixedDecimalParseError::AsFFI() const {
-  return static_cast<diplomat::capi::FixedDecimalParseError>(value);
-}
-
-inline FixedDecimalParseError FixedDecimalParseError::FromFFI(diplomat::capi::FixedDecimalParseError c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::FixedDecimalParseError_Unknown:
-    case diplomat::capi::FixedDecimalParseError_Limit:
-    case diplomat::capi::FixedDecimalParseError_Syntax:
-      return static_cast<FixedDecimalParseError::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // FixedDecimalParseError_HPP
diff --git a/ffi/capi/bindings/cpp/FixedDecimalRoundingIncrement.hpp b/ffi/capi/bindings/cpp/FixedDecimalRoundingIncrement.hpp
deleted file mode 100644
index e10039f6b08..00000000000
--- a/ffi/capi/bindings/cpp/FixedDecimalRoundingIncrement.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef FixedDecimalRoundingIncrement_HPP
-#define FixedDecimalRoundingIncrement_HPP
-
-#include "FixedDecimalRoundingIncrement.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::FixedDecimalRoundingIncrement FixedDecimalRoundingIncrement::AsFFI() const {
-  return static_cast<diplomat::capi::FixedDecimalRoundingIncrement>(value);
-}
-
-inline FixedDecimalRoundingIncrement FixedDecimalRoundingIncrement::FromFFI(diplomat::capi::FixedDecimalRoundingIncrement c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::FixedDecimalRoundingIncrement_MultiplesOf1:
-    case diplomat::capi::FixedDecimalRoundingIncrement_MultiplesOf2:
-    case diplomat::capi::FixedDecimalRoundingIncrement_MultiplesOf5:
-    case diplomat::capi::FixedDecimalRoundingIncrement_MultiplesOf25:
-      return static_cast<FixedDecimalRoundingIncrement::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // FixedDecimalRoundingIncrement_HPP
diff --git a/ffi/capi/bindings/cpp/FixedDecimalRoundingMode.hpp b/ffi/capi/bindings/cpp/FixedDecimalRoundingMode.hpp
deleted file mode 100644
index 8e21cad85a7..00000000000
--- a/ffi/capi/bindings/cpp/FixedDecimalRoundingMode.hpp
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef FixedDecimalRoundingMode_HPP
-#define FixedDecimalRoundingMode_HPP
-
-#include "FixedDecimalRoundingMode.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::FixedDecimalRoundingMode FixedDecimalRoundingMode::AsFFI() const {
-  return static_cast<diplomat::capi::FixedDecimalRoundingMode>(value);
-}
-
-inline FixedDecimalRoundingMode FixedDecimalRoundingMode::FromFFI(diplomat::capi::FixedDecimalRoundingMode c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::FixedDecimalRoundingMode_Ceil:
-    case diplomat::capi::FixedDecimalRoundingMode_Expand:
-    case diplomat::capi::FixedDecimalRoundingMode_Floor:
-    case diplomat::capi::FixedDecimalRoundingMode_Trunc:
-    case diplomat::capi::FixedDecimalRoundingMode_HalfCeil:
-    case diplomat::capi::FixedDecimalRoundingMode_HalfExpand:
-    case diplomat::capi::FixedDecimalRoundingMode_HalfFloor:
-    case diplomat::capi::FixedDecimalRoundingMode_HalfTrunc:
-    case diplomat::capi::FixedDecimalRoundingMode_HalfEven:
-      return static_cast<FixedDecimalRoundingMode::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // FixedDecimalRoundingMode_HPP
diff --git a/ffi/capi/bindings/cpp/FixedDecimalSign.hpp b/ffi/capi/bindings/cpp/FixedDecimalSign.hpp
deleted file mode 100644
index 6c75f4b094d..00000000000
--- a/ffi/capi/bindings/cpp/FixedDecimalSign.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef FixedDecimalSign_HPP
-#define FixedDecimalSign_HPP
-
-#include "FixedDecimalSign.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::FixedDecimalSign FixedDecimalSign::AsFFI() const {
-  return static_cast<diplomat::capi::FixedDecimalSign>(value);
-}
-
-inline FixedDecimalSign FixedDecimalSign::FromFFI(diplomat::capi::FixedDecimalSign c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::FixedDecimalSign_None:
-    case diplomat::capi::FixedDecimalSign_Negative:
-    case diplomat::capi::FixedDecimalSign_Positive:
-      return static_cast<FixedDecimalSign::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // FixedDecimalSign_HPP
diff --git a/ffi/capi/bindings/cpp/FixedDecimalSignDisplay.hpp b/ffi/capi/bindings/cpp/FixedDecimalSignDisplay.hpp
deleted file mode 100644
index ad768096412..00000000000
--- a/ffi/capi/bindings/cpp/FixedDecimalSignDisplay.hpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef FixedDecimalSignDisplay_HPP
-#define FixedDecimalSignDisplay_HPP
-
-#include "FixedDecimalSignDisplay.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::FixedDecimalSignDisplay FixedDecimalSignDisplay::AsFFI() const {
-  return static_cast<diplomat::capi::FixedDecimalSignDisplay>(value);
-}
-
-inline FixedDecimalSignDisplay FixedDecimalSignDisplay::FromFFI(diplomat::capi::FixedDecimalSignDisplay c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::FixedDecimalSignDisplay_Auto:
-    case diplomat::capi::FixedDecimalSignDisplay_Never:
-    case diplomat::capi::FixedDecimalSignDisplay_Always:
-    case diplomat::capi::FixedDecimalSignDisplay_ExceptZero:
-    case diplomat::capi::FixedDecimalSignDisplay_Negative:
-      return static_cast<FixedDecimalSignDisplay::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // FixedDecimalSignDisplay_HPP
diff --git a/ffi/capi/bindings/cpp/GeneralCategoryNameToMaskMapper.d.hpp b/ffi/capi/bindings/cpp/GeneralCategoryNameToMaskMapper.d.hpp
deleted file mode 100644
index 40ab8a76195..00000000000
--- a/ffi/capi/bindings/cpp/GeneralCategoryNameToMaskMapper.d.hpp
+++ /dev/null
@@ -1,47 +0,0 @@
-#ifndef GeneralCategoryNameToMaskMapper_D_HPP
-#define GeneralCategoryNameToMaskMapper_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct GeneralCategoryNameToMaskMapper;
-} // namespace capi
-} // namespace
-
-class GeneralCategoryNameToMaskMapper {
-public:
-
-  inline uint32_t get_strict(std::string_view name) const;
-
-  inline uint32_t get_loose(std::string_view name) const;
-
-  inline static diplomat::result<std::unique_ptr<GeneralCategoryNameToMaskMapper>, DataError> load(const DataProvider& provider);
-
-  inline const diplomat::capi::GeneralCategoryNameToMaskMapper* AsFFI() const;
-  inline diplomat::capi::GeneralCategoryNameToMaskMapper* AsFFI();
-  inline static const GeneralCategoryNameToMaskMapper* FromFFI(const diplomat::capi::GeneralCategoryNameToMaskMapper* ptr);
-  inline static GeneralCategoryNameToMaskMapper* FromFFI(diplomat::capi::GeneralCategoryNameToMaskMapper* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  GeneralCategoryNameToMaskMapper() = delete;
-  GeneralCategoryNameToMaskMapper(const GeneralCategoryNameToMaskMapper&) = delete;
-  GeneralCategoryNameToMaskMapper(GeneralCategoryNameToMaskMapper&&) noexcept = delete;
-  GeneralCategoryNameToMaskMapper operator=(const GeneralCategoryNameToMaskMapper&) = delete;
-  GeneralCategoryNameToMaskMapper operator=(GeneralCategoryNameToMaskMapper&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // GeneralCategoryNameToMaskMapper_D_HPP
diff --git a/ffi/capi/bindings/cpp/GeneralCategoryNameToMaskMapper.hpp b/ffi/capi/bindings/cpp/GeneralCategoryNameToMaskMapper.hpp
deleted file mode 100644
index 9ab2ca361b3..00000000000
--- a/ffi/capi/bindings/cpp/GeneralCategoryNameToMaskMapper.hpp
+++ /dev/null
@@ -1,75 +0,0 @@
-#ifndef GeneralCategoryNameToMaskMapper_HPP
-#define GeneralCategoryNameToMaskMapper_HPP
-
-#include "GeneralCategoryNameToMaskMapper.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    uint32_t icu4x_GeneralCategoryNameToMaskMapper_get_strict_mv1(const diplomat::capi::GeneralCategoryNameToMaskMapper* self, const char* name_data, size_t name_len);
-    
-    uint32_t icu4x_GeneralCategoryNameToMaskMapper_get_loose_mv1(const diplomat::capi::GeneralCategoryNameToMaskMapper* self, const char* name_data, size_t name_len);
-    
-    typedef struct icu4x_GeneralCategoryNameToMaskMapper_load_mv1_result {union {diplomat::capi::GeneralCategoryNameToMaskMapper* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_GeneralCategoryNameToMaskMapper_load_mv1_result;
-    icu4x_GeneralCategoryNameToMaskMapper_load_mv1_result icu4x_GeneralCategoryNameToMaskMapper_load_mv1(const diplomat::capi::DataProvider* provider);
-    
-    
-    void icu4x_GeneralCategoryNameToMaskMapper_destroy_mv1(GeneralCategoryNameToMaskMapper* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline uint32_t GeneralCategoryNameToMaskMapper::get_strict(std::string_view name) const {
-  auto result = diplomat::capi::icu4x_GeneralCategoryNameToMaskMapper_get_strict_mv1(this->AsFFI(),
-    name.data(),
-    name.size());
-  return result;
-}
-
-inline uint32_t GeneralCategoryNameToMaskMapper::get_loose(std::string_view name) const {
-  auto result = diplomat::capi::icu4x_GeneralCategoryNameToMaskMapper_get_loose_mv1(this->AsFFI(),
-    name.data(),
-    name.size());
-  return result;
-}
-
-inline diplomat::result<std::unique_ptr<GeneralCategoryNameToMaskMapper>, DataError> GeneralCategoryNameToMaskMapper::load(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_GeneralCategoryNameToMaskMapper_load_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<GeneralCategoryNameToMaskMapper>, DataError>(diplomat::Ok<std::unique_ptr<GeneralCategoryNameToMaskMapper>>(std::unique_ptr<GeneralCategoryNameToMaskMapper>(GeneralCategoryNameToMaskMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<GeneralCategoryNameToMaskMapper>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline const diplomat::capi::GeneralCategoryNameToMaskMapper* GeneralCategoryNameToMaskMapper::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::GeneralCategoryNameToMaskMapper*>(this);
-}
-
-inline diplomat::capi::GeneralCategoryNameToMaskMapper* GeneralCategoryNameToMaskMapper::AsFFI() {
-  return reinterpret_cast<diplomat::capi::GeneralCategoryNameToMaskMapper*>(this);
-}
-
-inline const GeneralCategoryNameToMaskMapper* GeneralCategoryNameToMaskMapper::FromFFI(const diplomat::capi::GeneralCategoryNameToMaskMapper* ptr) {
-  return reinterpret_cast<const GeneralCategoryNameToMaskMapper*>(ptr);
-}
-
-inline GeneralCategoryNameToMaskMapper* GeneralCategoryNameToMaskMapper::FromFFI(diplomat::capi::GeneralCategoryNameToMaskMapper* ptr) {
-  return reinterpret_cast<GeneralCategoryNameToMaskMapper*>(ptr);
-}
-
-inline void GeneralCategoryNameToMaskMapper::operator delete(void* ptr) {
-  diplomat::capi::icu4x_GeneralCategoryNameToMaskMapper_destroy_mv1(reinterpret_cast<diplomat::capi::GeneralCategoryNameToMaskMapper*>(ptr));
-}
-
-
-#endif // GeneralCategoryNameToMaskMapper_HPP
diff --git a/ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorLatin1.d.hpp b/ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorLatin1.d.hpp
deleted file mode 100644
index 330ec086da0..00000000000
--- a/ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorLatin1.d.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef GraphemeClusterBreakIteratorLatin1_D_HPP
-#define GraphemeClusterBreakIteratorLatin1_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    struct GraphemeClusterBreakIteratorLatin1;
-} // namespace capi
-} // namespace
-
-class GraphemeClusterBreakIteratorLatin1 {
-public:
-
-  inline int32_t next();
-
-  inline const diplomat::capi::GraphemeClusterBreakIteratorLatin1* AsFFI() const;
-  inline diplomat::capi::GraphemeClusterBreakIteratorLatin1* AsFFI();
-  inline static const GraphemeClusterBreakIteratorLatin1* FromFFI(const diplomat::capi::GraphemeClusterBreakIteratorLatin1* ptr);
-  inline static GraphemeClusterBreakIteratorLatin1* FromFFI(diplomat::capi::GraphemeClusterBreakIteratorLatin1* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  GraphemeClusterBreakIteratorLatin1() = delete;
-  GraphemeClusterBreakIteratorLatin1(const GraphemeClusterBreakIteratorLatin1&) = delete;
-  GraphemeClusterBreakIteratorLatin1(GraphemeClusterBreakIteratorLatin1&&) noexcept = delete;
-  GraphemeClusterBreakIteratorLatin1 operator=(const GraphemeClusterBreakIteratorLatin1&) = delete;
-  GraphemeClusterBreakIteratorLatin1 operator=(GraphemeClusterBreakIteratorLatin1&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // GraphemeClusterBreakIteratorLatin1_D_HPP
diff --git a/ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorLatin1.hpp b/ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorLatin1.hpp
deleted file mode 100644
index 97067248785..00000000000
--- a/ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorLatin1.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef GraphemeClusterBreakIteratorLatin1_HPP
-#define GraphemeClusterBreakIteratorLatin1_HPP
-
-#include "GraphemeClusterBreakIteratorLatin1.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    int32_t icu4x_GraphemeClusterBreakIteratorLatin1_next_mv1(diplomat::capi::GraphemeClusterBreakIteratorLatin1* self);
-    
-    
-    void icu4x_GraphemeClusterBreakIteratorLatin1_destroy_mv1(GraphemeClusterBreakIteratorLatin1* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline int32_t GraphemeClusterBreakIteratorLatin1::next() {
-  auto result = diplomat::capi::icu4x_GraphemeClusterBreakIteratorLatin1_next_mv1(this->AsFFI());
-  return result;
-}
-
-inline const diplomat::capi::GraphemeClusterBreakIteratorLatin1* GraphemeClusterBreakIteratorLatin1::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::GraphemeClusterBreakIteratorLatin1*>(this);
-}
-
-inline diplomat::capi::GraphemeClusterBreakIteratorLatin1* GraphemeClusterBreakIteratorLatin1::AsFFI() {
-  return reinterpret_cast<diplomat::capi::GraphemeClusterBreakIteratorLatin1*>(this);
-}
-
-inline const GraphemeClusterBreakIteratorLatin1* GraphemeClusterBreakIteratorLatin1::FromFFI(const diplomat::capi::GraphemeClusterBreakIteratorLatin1* ptr) {
-  return reinterpret_cast<const GraphemeClusterBreakIteratorLatin1*>(ptr);
-}
-
-inline GraphemeClusterBreakIteratorLatin1* GraphemeClusterBreakIteratorLatin1::FromFFI(diplomat::capi::GraphemeClusterBreakIteratorLatin1* ptr) {
-  return reinterpret_cast<GraphemeClusterBreakIteratorLatin1*>(ptr);
-}
-
-inline void GraphemeClusterBreakIteratorLatin1::operator delete(void* ptr) {
-  diplomat::capi::icu4x_GraphemeClusterBreakIteratorLatin1_destroy_mv1(reinterpret_cast<diplomat::capi::GraphemeClusterBreakIteratorLatin1*>(ptr));
-}
-
-
-#endif // GraphemeClusterBreakIteratorLatin1_HPP
diff --git a/ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorUtf16.d.hpp b/ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorUtf16.d.hpp
deleted file mode 100644
index 0c4fc534cec..00000000000
--- a/ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorUtf16.d.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef GraphemeClusterBreakIteratorUtf16_D_HPP
-#define GraphemeClusterBreakIteratorUtf16_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    struct GraphemeClusterBreakIteratorUtf16;
-} // namespace capi
-} // namespace
-
-class GraphemeClusterBreakIteratorUtf16 {
-public:
-
-  inline int32_t next();
-
-  inline const diplomat::capi::GraphemeClusterBreakIteratorUtf16* AsFFI() const;
-  inline diplomat::capi::GraphemeClusterBreakIteratorUtf16* AsFFI();
-  inline static const GraphemeClusterBreakIteratorUtf16* FromFFI(const diplomat::capi::GraphemeClusterBreakIteratorUtf16* ptr);
-  inline static GraphemeClusterBreakIteratorUtf16* FromFFI(diplomat::capi::GraphemeClusterBreakIteratorUtf16* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  GraphemeClusterBreakIteratorUtf16() = delete;
-  GraphemeClusterBreakIteratorUtf16(const GraphemeClusterBreakIteratorUtf16&) = delete;
-  GraphemeClusterBreakIteratorUtf16(GraphemeClusterBreakIteratorUtf16&&) noexcept = delete;
-  GraphemeClusterBreakIteratorUtf16 operator=(const GraphemeClusterBreakIteratorUtf16&) = delete;
-  GraphemeClusterBreakIteratorUtf16 operator=(GraphemeClusterBreakIteratorUtf16&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // GraphemeClusterBreakIteratorUtf16_D_HPP
diff --git a/ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorUtf16.hpp b/ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorUtf16.hpp
deleted file mode 100644
index 828c8d61f08..00000000000
--- a/ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorUtf16.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef GraphemeClusterBreakIteratorUtf16_HPP
-#define GraphemeClusterBreakIteratorUtf16_HPP
-
-#include "GraphemeClusterBreakIteratorUtf16.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    int32_t icu4x_GraphemeClusterBreakIteratorUtf16_next_mv1(diplomat::capi::GraphemeClusterBreakIteratorUtf16* self);
-    
-    
-    void icu4x_GraphemeClusterBreakIteratorUtf16_destroy_mv1(GraphemeClusterBreakIteratorUtf16* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline int32_t GraphemeClusterBreakIteratorUtf16::next() {
-  auto result = diplomat::capi::icu4x_GraphemeClusterBreakIteratorUtf16_next_mv1(this->AsFFI());
-  return result;
-}
-
-inline const diplomat::capi::GraphemeClusterBreakIteratorUtf16* GraphemeClusterBreakIteratorUtf16::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::GraphemeClusterBreakIteratorUtf16*>(this);
-}
-
-inline diplomat::capi::GraphemeClusterBreakIteratorUtf16* GraphemeClusterBreakIteratorUtf16::AsFFI() {
-  return reinterpret_cast<diplomat::capi::GraphemeClusterBreakIteratorUtf16*>(this);
-}
-
-inline const GraphemeClusterBreakIteratorUtf16* GraphemeClusterBreakIteratorUtf16::FromFFI(const diplomat::capi::GraphemeClusterBreakIteratorUtf16* ptr) {
-  return reinterpret_cast<const GraphemeClusterBreakIteratorUtf16*>(ptr);
-}
-
-inline GraphemeClusterBreakIteratorUtf16* GraphemeClusterBreakIteratorUtf16::FromFFI(diplomat::capi::GraphemeClusterBreakIteratorUtf16* ptr) {
-  return reinterpret_cast<GraphemeClusterBreakIteratorUtf16*>(ptr);
-}
-
-inline void GraphemeClusterBreakIteratorUtf16::operator delete(void* ptr) {
-  diplomat::capi::icu4x_GraphemeClusterBreakIteratorUtf16_destroy_mv1(reinterpret_cast<diplomat::capi::GraphemeClusterBreakIteratorUtf16*>(ptr));
-}
-
-
-#endif // GraphemeClusterBreakIteratorUtf16_HPP
diff --git a/ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorUtf8.d.hpp b/ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorUtf8.d.hpp
deleted file mode 100644
index 209afcc2061..00000000000
--- a/ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorUtf8.d.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef GraphemeClusterBreakIteratorUtf8_D_HPP
-#define GraphemeClusterBreakIteratorUtf8_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    struct GraphemeClusterBreakIteratorUtf8;
-} // namespace capi
-} // namespace
-
-class GraphemeClusterBreakIteratorUtf8 {
-public:
-
-  inline int32_t next();
-
-  inline const diplomat::capi::GraphemeClusterBreakIteratorUtf8* AsFFI() const;
-  inline diplomat::capi::GraphemeClusterBreakIteratorUtf8* AsFFI();
-  inline static const GraphemeClusterBreakIteratorUtf8* FromFFI(const diplomat::capi::GraphemeClusterBreakIteratorUtf8* ptr);
-  inline static GraphemeClusterBreakIteratorUtf8* FromFFI(diplomat::capi::GraphemeClusterBreakIteratorUtf8* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  GraphemeClusterBreakIteratorUtf8() = delete;
-  GraphemeClusterBreakIteratorUtf8(const GraphemeClusterBreakIteratorUtf8&) = delete;
-  GraphemeClusterBreakIteratorUtf8(GraphemeClusterBreakIteratorUtf8&&) noexcept = delete;
-  GraphemeClusterBreakIteratorUtf8 operator=(const GraphemeClusterBreakIteratorUtf8&) = delete;
-  GraphemeClusterBreakIteratorUtf8 operator=(GraphemeClusterBreakIteratorUtf8&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // GraphemeClusterBreakIteratorUtf8_D_HPP
diff --git a/ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorUtf8.hpp b/ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorUtf8.hpp
deleted file mode 100644
index 352f2a7f1fe..00000000000
--- a/ffi/capi/bindings/cpp/GraphemeClusterBreakIteratorUtf8.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef GraphemeClusterBreakIteratorUtf8_HPP
-#define GraphemeClusterBreakIteratorUtf8_HPP
-
-#include "GraphemeClusterBreakIteratorUtf8.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    int32_t icu4x_GraphemeClusterBreakIteratorUtf8_next_mv1(diplomat::capi::GraphemeClusterBreakIteratorUtf8* self);
-    
-    
-    void icu4x_GraphemeClusterBreakIteratorUtf8_destroy_mv1(GraphemeClusterBreakIteratorUtf8* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline int32_t GraphemeClusterBreakIteratorUtf8::next() {
-  auto result = diplomat::capi::icu4x_GraphemeClusterBreakIteratorUtf8_next_mv1(this->AsFFI());
-  return result;
-}
-
-inline const diplomat::capi::GraphemeClusterBreakIteratorUtf8* GraphemeClusterBreakIteratorUtf8::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::GraphemeClusterBreakIteratorUtf8*>(this);
-}
-
-inline diplomat::capi::GraphemeClusterBreakIteratorUtf8* GraphemeClusterBreakIteratorUtf8::AsFFI() {
-  return reinterpret_cast<diplomat::capi::GraphemeClusterBreakIteratorUtf8*>(this);
-}
-
-inline const GraphemeClusterBreakIteratorUtf8* GraphemeClusterBreakIteratorUtf8::FromFFI(const diplomat::capi::GraphemeClusterBreakIteratorUtf8* ptr) {
-  return reinterpret_cast<const GraphemeClusterBreakIteratorUtf8*>(ptr);
-}
-
-inline GraphemeClusterBreakIteratorUtf8* GraphemeClusterBreakIteratorUtf8::FromFFI(diplomat::capi::GraphemeClusterBreakIteratorUtf8* ptr) {
-  return reinterpret_cast<GraphemeClusterBreakIteratorUtf8*>(ptr);
-}
-
-inline void GraphemeClusterBreakIteratorUtf8::operator delete(void* ptr) {
-  diplomat::capi::icu4x_GraphemeClusterBreakIteratorUtf8_destroy_mv1(reinterpret_cast<diplomat::capi::GraphemeClusterBreakIteratorUtf8*>(ptr));
-}
-
-
-#endif // GraphemeClusterBreakIteratorUtf8_HPP
diff --git a/ffi/capi/bindings/cpp/GraphemeClusterSegmenter.d.hpp b/ffi/capi/bindings/cpp/GraphemeClusterSegmenter.d.hpp
deleted file mode 100644
index ee28b315d8c..00000000000
--- a/ffi/capi/bindings/cpp/GraphemeClusterSegmenter.d.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef GraphemeClusterSegmenter_D_HPP
-#define GraphemeClusterSegmenter_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct GraphemeClusterBreakIteratorLatin1; }
-class GraphemeClusterBreakIteratorLatin1;
-namespace diplomat::capi { struct GraphemeClusterBreakIteratorUtf16; }
-class GraphemeClusterBreakIteratorUtf16;
-namespace diplomat::capi { struct GraphemeClusterBreakIteratorUtf8; }
-class GraphemeClusterBreakIteratorUtf8;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct GraphemeClusterSegmenter;
-} // namespace capi
-} // namespace
-
-class GraphemeClusterSegmenter {
-public:
-
-  inline static diplomat::result<std::unique_ptr<GraphemeClusterSegmenter>, DataError> create(const DataProvider& provider);
-
-  inline std::unique_ptr<GraphemeClusterBreakIteratorUtf8> segment(std::string_view input) const;
-
-  inline std::unique_ptr<GraphemeClusterBreakIteratorUtf16> segment16(std::u16string_view input) const;
-
-  inline std::unique_ptr<GraphemeClusterBreakIteratorLatin1> segment_latin1(diplomat::span<const uint8_t> input) const;
-
-  inline const diplomat::capi::GraphemeClusterSegmenter* AsFFI() const;
-  inline diplomat::capi::GraphemeClusterSegmenter* AsFFI();
-  inline static const GraphemeClusterSegmenter* FromFFI(const diplomat::capi::GraphemeClusterSegmenter* ptr);
-  inline static GraphemeClusterSegmenter* FromFFI(diplomat::capi::GraphemeClusterSegmenter* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  GraphemeClusterSegmenter() = delete;
-  GraphemeClusterSegmenter(const GraphemeClusterSegmenter&) = delete;
-  GraphemeClusterSegmenter(GraphemeClusterSegmenter&&) noexcept = delete;
-  GraphemeClusterSegmenter operator=(const GraphemeClusterSegmenter&) = delete;
-  GraphemeClusterSegmenter operator=(GraphemeClusterSegmenter&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // GraphemeClusterSegmenter_D_HPP
diff --git a/ffi/capi/bindings/cpp/GraphemeClusterSegmenter.hpp b/ffi/capi/bindings/cpp/GraphemeClusterSegmenter.hpp
deleted file mode 100644
index b611d16e8d5..00000000000
--- a/ffi/capi/bindings/cpp/GraphemeClusterSegmenter.hpp
+++ /dev/null
@@ -1,87 +0,0 @@
-#ifndef GraphemeClusterSegmenter_HPP
-#define GraphemeClusterSegmenter_HPP
-
-#include "GraphemeClusterSegmenter.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "GraphemeClusterBreakIteratorLatin1.hpp"
-#include "GraphemeClusterBreakIteratorUtf16.hpp"
-#include "GraphemeClusterBreakIteratorUtf8.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_GraphemeClusterSegmenter_create_mv1_result {union {diplomat::capi::GraphemeClusterSegmenter* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_GraphemeClusterSegmenter_create_mv1_result;
-    icu4x_GraphemeClusterSegmenter_create_mv1_result icu4x_GraphemeClusterSegmenter_create_mv1(const diplomat::capi::DataProvider* provider);
-    
-    diplomat::capi::GraphemeClusterBreakIteratorUtf8* icu4x_GraphemeClusterSegmenter_segment_utf8_mv1(const diplomat::capi::GraphemeClusterSegmenter* self, const char* input_data, size_t input_len);
-    
-    diplomat::capi::GraphemeClusterBreakIteratorUtf16* icu4x_GraphemeClusterSegmenter_segment_utf16_mv1(const diplomat::capi::GraphemeClusterSegmenter* self, const char16_t* input_data, size_t input_len);
-    
-    diplomat::capi::GraphemeClusterBreakIteratorLatin1* icu4x_GraphemeClusterSegmenter_segment_latin1_mv1(const diplomat::capi::GraphemeClusterSegmenter* self, const uint8_t* input_data, size_t input_len);
-    
-    
-    void icu4x_GraphemeClusterSegmenter_destroy_mv1(GraphemeClusterSegmenter* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<GraphemeClusterSegmenter>, DataError> GraphemeClusterSegmenter::create(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_GraphemeClusterSegmenter_create_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<GraphemeClusterSegmenter>, DataError>(diplomat::Ok<std::unique_ptr<GraphemeClusterSegmenter>>(std::unique_ptr<GraphemeClusterSegmenter>(GraphemeClusterSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<GraphemeClusterSegmenter>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline std::unique_ptr<GraphemeClusterBreakIteratorUtf8> GraphemeClusterSegmenter::segment(std::string_view input) const {
-  auto result = diplomat::capi::icu4x_GraphemeClusterSegmenter_segment_utf8_mv1(this->AsFFI(),
-    input.data(),
-    input.size());
-  return std::unique_ptr<GraphemeClusterBreakIteratorUtf8>(GraphemeClusterBreakIteratorUtf8::FromFFI(result));
-}
-
-inline std::unique_ptr<GraphemeClusterBreakIteratorUtf16> GraphemeClusterSegmenter::segment16(std::u16string_view input) const {
-  auto result = diplomat::capi::icu4x_GraphemeClusterSegmenter_segment_utf16_mv1(this->AsFFI(),
-    input.data(),
-    input.size());
-  return std::unique_ptr<GraphemeClusterBreakIteratorUtf16>(GraphemeClusterBreakIteratorUtf16::FromFFI(result));
-}
-
-inline std::unique_ptr<GraphemeClusterBreakIteratorLatin1> GraphemeClusterSegmenter::segment_latin1(diplomat::span<const uint8_t> input) const {
-  auto result = diplomat::capi::icu4x_GraphemeClusterSegmenter_segment_latin1_mv1(this->AsFFI(),
-    input.data(),
-    input.size());
-  return std::unique_ptr<GraphemeClusterBreakIteratorLatin1>(GraphemeClusterBreakIteratorLatin1::FromFFI(result));
-}
-
-inline const diplomat::capi::GraphemeClusterSegmenter* GraphemeClusterSegmenter::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::GraphemeClusterSegmenter*>(this);
-}
-
-inline diplomat::capi::GraphemeClusterSegmenter* GraphemeClusterSegmenter::AsFFI() {
-  return reinterpret_cast<diplomat::capi::GraphemeClusterSegmenter*>(this);
-}
-
-inline const GraphemeClusterSegmenter* GraphemeClusterSegmenter::FromFFI(const diplomat::capi::GraphemeClusterSegmenter* ptr) {
-  return reinterpret_cast<const GraphemeClusterSegmenter*>(ptr);
-}
-
-inline GraphemeClusterSegmenter* GraphemeClusterSegmenter::FromFFI(diplomat::capi::GraphemeClusterSegmenter* ptr) {
-  return reinterpret_cast<GraphemeClusterSegmenter*>(ptr);
-}
-
-inline void GraphemeClusterSegmenter::operator delete(void* ptr) {
-  diplomat::capi::icu4x_GraphemeClusterSegmenter_destroy_mv1(reinterpret_cast<diplomat::capi::GraphemeClusterSegmenter*>(ptr));
-}
-
-
-#endif // GraphemeClusterSegmenter_HPP
diff --git a/ffi/capi/bindings/cpp/GregorianDateFormatter.d.hpp b/ffi/capi/bindings/cpp/GregorianDateFormatter.d.hpp
deleted file mode 100644
index 42fe5d6d68a..00000000000
--- a/ffi/capi/bindings/cpp/GregorianDateFormatter.d.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef GregorianDateFormatter_D_HPP
-#define GregorianDateFormatter_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct IsoDate; }
-class IsoDate;
-namespace diplomat::capi { struct IsoDateTime; }
-class IsoDateTime;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-class DateLength;
-class Error;
-
-
-namespace diplomat {
-namespace capi {
-    struct GregorianDateFormatter;
-} // namespace capi
-} // namespace
-
-class GregorianDateFormatter {
-public:
-
-  inline static diplomat::result<std::unique_ptr<GregorianDateFormatter>, Error> create_with_length(const DataProvider& provider, const Locale& locale, DateLength length);
-
-  inline std::string format_iso_date(const IsoDate& value) const;
-
-  inline std::string format_iso_datetime(const IsoDateTime& value) const;
-
-  inline const diplomat::capi::GregorianDateFormatter* AsFFI() const;
-  inline diplomat::capi::GregorianDateFormatter* AsFFI();
-  inline static const GregorianDateFormatter* FromFFI(const diplomat::capi::GregorianDateFormatter* ptr);
-  inline static GregorianDateFormatter* FromFFI(diplomat::capi::GregorianDateFormatter* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  GregorianDateFormatter() = delete;
-  GregorianDateFormatter(const GregorianDateFormatter&) = delete;
-  GregorianDateFormatter(GregorianDateFormatter&&) noexcept = delete;
-  GregorianDateFormatter operator=(const GregorianDateFormatter&) = delete;
-  GregorianDateFormatter operator=(GregorianDateFormatter&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // GregorianDateFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/GregorianDateFormatter.hpp b/ffi/capi/bindings/cpp/GregorianDateFormatter.hpp
deleted file mode 100644
index 0182d605b52..00000000000
--- a/ffi/capi/bindings/cpp/GregorianDateFormatter.hpp
+++ /dev/null
@@ -1,85 +0,0 @@
-#ifndef GregorianDateFormatter_HPP
-#define GregorianDateFormatter_HPP
-
-#include "GregorianDateFormatter.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataProvider.hpp"
-#include "DateLength.hpp"
-#include "Error.hpp"
-#include "IsoDate.hpp"
-#include "IsoDateTime.hpp"
-#include "Locale.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_GregorianDateFormatter_create_with_length_mv1_result {union {diplomat::capi::GregorianDateFormatter* ok; diplomat::capi::Error err;}; bool is_ok;} icu4x_GregorianDateFormatter_create_with_length_mv1_result;
-    icu4x_GregorianDateFormatter_create_with_length_mv1_result icu4x_GregorianDateFormatter_create_with_length_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale, diplomat::capi::DateLength length);
-    
-    void icu4x_GregorianDateFormatter_format_iso_date_mv1(const diplomat::capi::GregorianDateFormatter* self, const diplomat::capi::IsoDate* value, diplomat::capi::DiplomatWrite* write);
-    
-    void icu4x_GregorianDateFormatter_format_iso_datetime_mv1(const diplomat::capi::GregorianDateFormatter* self, const diplomat::capi::IsoDateTime* value, diplomat::capi::DiplomatWrite* write);
-    
-    
-    void icu4x_GregorianDateFormatter_destroy_mv1(GregorianDateFormatter* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<GregorianDateFormatter>, Error> GregorianDateFormatter::create_with_length(const DataProvider& provider, const Locale& locale, DateLength length) {
-  auto result = diplomat::capi::icu4x_GregorianDateFormatter_create_with_length_mv1(provider.AsFFI(),
-    locale.AsFFI(),
-    length.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<GregorianDateFormatter>, Error>(diplomat::Ok<std::unique_ptr<GregorianDateFormatter>>(std::unique_ptr<GregorianDateFormatter>(GregorianDateFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<GregorianDateFormatter>, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline std::string GregorianDateFormatter::format_iso_date(const IsoDate& value) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_GregorianDateFormatter_format_iso_date_mv1(this->AsFFI(),
-    value.AsFFI(),
-    &write);
-  return output;
-}
-
-inline std::string GregorianDateFormatter::format_iso_datetime(const IsoDateTime& value) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_GregorianDateFormatter_format_iso_datetime_mv1(this->AsFFI(),
-    value.AsFFI(),
-    &write);
-  return output;
-}
-
-inline const diplomat::capi::GregorianDateFormatter* GregorianDateFormatter::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::GregorianDateFormatter*>(this);
-}
-
-inline diplomat::capi::GregorianDateFormatter* GregorianDateFormatter::AsFFI() {
-  return reinterpret_cast<diplomat::capi::GregorianDateFormatter*>(this);
-}
-
-inline const GregorianDateFormatter* GregorianDateFormatter::FromFFI(const diplomat::capi::GregorianDateFormatter* ptr) {
-  return reinterpret_cast<const GregorianDateFormatter*>(ptr);
-}
-
-inline GregorianDateFormatter* GregorianDateFormatter::FromFFI(diplomat::capi::GregorianDateFormatter* ptr) {
-  return reinterpret_cast<GregorianDateFormatter*>(ptr);
-}
-
-inline void GregorianDateFormatter::operator delete(void* ptr) {
-  diplomat::capi::icu4x_GregorianDateFormatter_destroy_mv1(reinterpret_cast<diplomat::capi::GregorianDateFormatter*>(ptr));
-}
-
-
-#endif // GregorianDateFormatter_HPP
diff --git a/ffi/capi/bindings/cpp/GregorianDateTimeFormatter.d.hpp b/ffi/capi/bindings/cpp/GregorianDateTimeFormatter.d.hpp
deleted file mode 100644
index 88c0e1b12ff..00000000000
--- a/ffi/capi/bindings/cpp/GregorianDateTimeFormatter.d.hpp
+++ /dev/null
@@ -1,51 +0,0 @@
-#ifndef GregorianDateTimeFormatter_D_HPP
-#define GregorianDateTimeFormatter_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct IsoDateTime; }
-class IsoDateTime;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-class DateLength;
-class Error;
-class TimeLength;
-
-
-namespace diplomat {
-namespace capi {
-    struct GregorianDateTimeFormatter;
-} // namespace capi
-} // namespace
-
-class GregorianDateTimeFormatter {
-public:
-
-  inline static diplomat::result<std::unique_ptr<GregorianDateTimeFormatter>, Error> create_with_lengths(const DataProvider& provider, const Locale& locale, DateLength date_length, TimeLength time_length);
-
-  inline std::string format_iso_datetime(const IsoDateTime& value) const;
-
-  inline const diplomat::capi::GregorianDateTimeFormatter* AsFFI() const;
-  inline diplomat::capi::GregorianDateTimeFormatter* AsFFI();
-  inline static const GregorianDateTimeFormatter* FromFFI(const diplomat::capi::GregorianDateTimeFormatter* ptr);
-  inline static GregorianDateTimeFormatter* FromFFI(diplomat::capi::GregorianDateTimeFormatter* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  GregorianDateTimeFormatter() = delete;
-  GregorianDateTimeFormatter(const GregorianDateTimeFormatter&) = delete;
-  GregorianDateTimeFormatter(GregorianDateTimeFormatter&&) noexcept = delete;
-  GregorianDateTimeFormatter operator=(const GregorianDateTimeFormatter&) = delete;
-  GregorianDateTimeFormatter operator=(GregorianDateTimeFormatter&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // GregorianDateTimeFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/GregorianDateTimeFormatter.hpp b/ffi/capi/bindings/cpp/GregorianDateTimeFormatter.hpp
deleted file mode 100644
index 9b35e594465..00000000000
--- a/ffi/capi/bindings/cpp/GregorianDateTimeFormatter.hpp
+++ /dev/null
@@ -1,75 +0,0 @@
-#ifndef GregorianDateTimeFormatter_HPP
-#define GregorianDateTimeFormatter_HPP
-
-#include "GregorianDateTimeFormatter.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataProvider.hpp"
-#include "DateLength.hpp"
-#include "Error.hpp"
-#include "IsoDateTime.hpp"
-#include "Locale.hpp"
-#include "TimeLength.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_GregorianDateTimeFormatter_create_with_lengths_mv1_result {union {diplomat::capi::GregorianDateTimeFormatter* ok; diplomat::capi::Error err;}; bool is_ok;} icu4x_GregorianDateTimeFormatter_create_with_lengths_mv1_result;
-    icu4x_GregorianDateTimeFormatter_create_with_lengths_mv1_result icu4x_GregorianDateTimeFormatter_create_with_lengths_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale, diplomat::capi::DateLength date_length, diplomat::capi::TimeLength time_length);
-    
-    void icu4x_GregorianDateTimeFormatter_format_iso_datetime_mv1(const diplomat::capi::GregorianDateTimeFormatter* self, const diplomat::capi::IsoDateTime* value, diplomat::capi::DiplomatWrite* write);
-    
-    
-    void icu4x_GregorianDateTimeFormatter_destroy_mv1(GregorianDateTimeFormatter* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<GregorianDateTimeFormatter>, Error> GregorianDateTimeFormatter::create_with_lengths(const DataProvider& provider, const Locale& locale, DateLength date_length, TimeLength time_length) {
-  auto result = diplomat::capi::icu4x_GregorianDateTimeFormatter_create_with_lengths_mv1(provider.AsFFI(),
-    locale.AsFFI(),
-    date_length.AsFFI(),
-    time_length.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<GregorianDateTimeFormatter>, Error>(diplomat::Ok<std::unique_ptr<GregorianDateTimeFormatter>>(std::unique_ptr<GregorianDateTimeFormatter>(GregorianDateTimeFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<GregorianDateTimeFormatter>, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline std::string GregorianDateTimeFormatter::format_iso_datetime(const IsoDateTime& value) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_GregorianDateTimeFormatter_format_iso_datetime_mv1(this->AsFFI(),
-    value.AsFFI(),
-    &write);
-  return output;
-}
-
-inline const diplomat::capi::GregorianDateTimeFormatter* GregorianDateTimeFormatter::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::GregorianDateTimeFormatter*>(this);
-}
-
-inline diplomat::capi::GregorianDateTimeFormatter* GregorianDateTimeFormatter::AsFFI() {
-  return reinterpret_cast<diplomat::capi::GregorianDateTimeFormatter*>(this);
-}
-
-inline const GregorianDateTimeFormatter* GregorianDateTimeFormatter::FromFFI(const diplomat::capi::GregorianDateTimeFormatter* ptr) {
-  return reinterpret_cast<const GregorianDateTimeFormatter*>(ptr);
-}
-
-inline GregorianDateTimeFormatter* GregorianDateTimeFormatter::FromFFI(diplomat::capi::GregorianDateTimeFormatter* ptr) {
-  return reinterpret_cast<GregorianDateTimeFormatter*>(ptr);
-}
-
-inline void GregorianDateTimeFormatter::operator delete(void* ptr) {
-  diplomat::capi::icu4x_GregorianDateTimeFormatter_destroy_mv1(reinterpret_cast<diplomat::capi::GregorianDateTimeFormatter*>(ptr));
-}
-
-
-#endif // GregorianDateTimeFormatter_HPP
diff --git a/ffi/capi/bindings/cpp/GregorianZonedDateTimeFormatter.d.hpp b/ffi/capi/bindings/cpp/GregorianZonedDateTimeFormatter.d.hpp
deleted file mode 100644
index 47ef19bd390..00000000000
--- a/ffi/capi/bindings/cpp/GregorianZonedDateTimeFormatter.d.hpp
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef GregorianZonedDateTimeFormatter_D_HPP
-#define GregorianZonedDateTimeFormatter_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct CustomTimeZone; }
-class CustomTimeZone;
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct IsoDateTime; }
-class IsoDateTime;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-struct IsoTimeZoneOptions;
-class DateLength;
-class Error;
-class TimeLength;
-
-
-namespace diplomat {
-namespace capi {
-    struct GregorianZonedDateTimeFormatter;
-} // namespace capi
-} // namespace
-
-class GregorianZonedDateTimeFormatter {
-public:
-
-  inline static diplomat::result<std::unique_ptr<GregorianZonedDateTimeFormatter>, Error> create_with_lengths(const DataProvider& provider, const Locale& locale, DateLength date_length, TimeLength time_length);
-
-  inline static diplomat::result<std::unique_ptr<GregorianZonedDateTimeFormatter>, Error> create_with_lengths_and_iso_8601_time_zone_fallback(const DataProvider& provider, const Locale& locale, DateLength date_length, TimeLength time_length, IsoTimeZoneOptions zone_options);
-
-  inline std::string format_iso_datetime_with_custom_time_zone(const IsoDateTime& datetime, const CustomTimeZone& time_zone) const;
-
-  inline const diplomat::capi::GregorianZonedDateTimeFormatter* AsFFI() const;
-  inline diplomat::capi::GregorianZonedDateTimeFormatter* AsFFI();
-  inline static const GregorianZonedDateTimeFormatter* FromFFI(const diplomat::capi::GregorianZonedDateTimeFormatter* ptr);
-  inline static GregorianZonedDateTimeFormatter* FromFFI(diplomat::capi::GregorianZonedDateTimeFormatter* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  GregorianZonedDateTimeFormatter() = delete;
-  GregorianZonedDateTimeFormatter(const GregorianZonedDateTimeFormatter&) = delete;
-  GregorianZonedDateTimeFormatter(GregorianZonedDateTimeFormatter&&) noexcept = delete;
-  GregorianZonedDateTimeFormatter operator=(const GregorianZonedDateTimeFormatter&) = delete;
-  GregorianZonedDateTimeFormatter operator=(GregorianZonedDateTimeFormatter&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // GregorianZonedDateTimeFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/GregorianZonedDateTimeFormatter.hpp b/ffi/capi/bindings/cpp/GregorianZonedDateTimeFormatter.hpp
deleted file mode 100644
index 88f883c74f2..00000000000
--- a/ffi/capi/bindings/cpp/GregorianZonedDateTimeFormatter.hpp
+++ /dev/null
@@ -1,90 +0,0 @@
-#ifndef GregorianZonedDateTimeFormatter_HPP
-#define GregorianZonedDateTimeFormatter_HPP
-
-#include "GregorianZonedDateTimeFormatter.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "CustomTimeZone.hpp"
-#include "DataProvider.hpp"
-#include "DateLength.hpp"
-#include "Error.hpp"
-#include "IsoDateTime.hpp"
-#include "IsoTimeZoneOptions.hpp"
-#include "Locale.hpp"
-#include "TimeLength.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_GregorianZonedDateTimeFormatter_create_with_lengths_mv1_result {union {diplomat::capi::GregorianZonedDateTimeFormatter* ok; diplomat::capi::Error err;}; bool is_ok;} icu4x_GregorianZonedDateTimeFormatter_create_with_lengths_mv1_result;
-    icu4x_GregorianZonedDateTimeFormatter_create_with_lengths_mv1_result icu4x_GregorianZonedDateTimeFormatter_create_with_lengths_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale, diplomat::capi::DateLength date_length, diplomat::capi::TimeLength time_length);
-    
-    typedef struct icu4x_GregorianZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback_mv1_result {union {diplomat::capi::GregorianZonedDateTimeFormatter* ok; diplomat::capi::Error err;}; bool is_ok;} icu4x_GregorianZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback_mv1_result;
-    icu4x_GregorianZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback_mv1_result icu4x_GregorianZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale, diplomat::capi::DateLength date_length, diplomat::capi::TimeLength time_length, diplomat::capi::IsoTimeZoneOptions zone_options);
-    
-    void icu4x_GregorianZonedDateTimeFormatter_format_iso_datetime_with_custom_time_zone_mv1(const diplomat::capi::GregorianZonedDateTimeFormatter* self, const diplomat::capi::IsoDateTime* datetime, const diplomat::capi::CustomTimeZone* time_zone, diplomat::capi::DiplomatWrite* write);
-    
-    
-    void icu4x_GregorianZonedDateTimeFormatter_destroy_mv1(GregorianZonedDateTimeFormatter* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<GregorianZonedDateTimeFormatter>, Error> GregorianZonedDateTimeFormatter::create_with_lengths(const DataProvider& provider, const Locale& locale, DateLength date_length, TimeLength time_length) {
-  auto result = diplomat::capi::icu4x_GregorianZonedDateTimeFormatter_create_with_lengths_mv1(provider.AsFFI(),
-    locale.AsFFI(),
-    date_length.AsFFI(),
-    time_length.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<GregorianZonedDateTimeFormatter>, Error>(diplomat::Ok<std::unique_ptr<GregorianZonedDateTimeFormatter>>(std::unique_ptr<GregorianZonedDateTimeFormatter>(GregorianZonedDateTimeFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<GregorianZonedDateTimeFormatter>, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<GregorianZonedDateTimeFormatter>, Error> GregorianZonedDateTimeFormatter::create_with_lengths_and_iso_8601_time_zone_fallback(const DataProvider& provider, const Locale& locale, DateLength date_length, TimeLength time_length, IsoTimeZoneOptions zone_options) {
-  auto result = diplomat::capi::icu4x_GregorianZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback_mv1(provider.AsFFI(),
-    locale.AsFFI(),
-    date_length.AsFFI(),
-    time_length.AsFFI(),
-    zone_options.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<GregorianZonedDateTimeFormatter>, Error>(diplomat::Ok<std::unique_ptr<GregorianZonedDateTimeFormatter>>(std::unique_ptr<GregorianZonedDateTimeFormatter>(GregorianZonedDateTimeFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<GregorianZonedDateTimeFormatter>, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline std::string GregorianZonedDateTimeFormatter::format_iso_datetime_with_custom_time_zone(const IsoDateTime& datetime, const CustomTimeZone& time_zone) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_GregorianZonedDateTimeFormatter_format_iso_datetime_with_custom_time_zone_mv1(this->AsFFI(),
-    datetime.AsFFI(),
-    time_zone.AsFFI(),
-    &write);
-  return output;
-}
-
-inline const diplomat::capi::GregorianZonedDateTimeFormatter* GregorianZonedDateTimeFormatter::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::GregorianZonedDateTimeFormatter*>(this);
-}
-
-inline diplomat::capi::GregorianZonedDateTimeFormatter* GregorianZonedDateTimeFormatter::AsFFI() {
-  return reinterpret_cast<diplomat::capi::GregorianZonedDateTimeFormatter*>(this);
-}
-
-inline const GregorianZonedDateTimeFormatter* GregorianZonedDateTimeFormatter::FromFFI(const diplomat::capi::GregorianZonedDateTimeFormatter* ptr) {
-  return reinterpret_cast<const GregorianZonedDateTimeFormatter*>(ptr);
-}
-
-inline GregorianZonedDateTimeFormatter* GregorianZonedDateTimeFormatter::FromFFI(diplomat::capi::GregorianZonedDateTimeFormatter* ptr) {
-  return reinterpret_cast<GregorianZonedDateTimeFormatter*>(ptr);
-}
-
-inline void GregorianZonedDateTimeFormatter::operator delete(void* ptr) {
-  diplomat::capi::icu4x_GregorianZonedDateTimeFormatter_destroy_mv1(reinterpret_cast<diplomat::capi::GregorianZonedDateTimeFormatter*>(ptr));
-}
-
-
-#endif // GregorianZonedDateTimeFormatter_HPP
diff --git a/ffi/capi/bindings/cpp/IsoDate.d.hpp b/ffi/capi/bindings/cpp/IsoDate.d.hpp
deleted file mode 100644
index ef1c18f1269..00000000000
--- a/ffi/capi/bindings/cpp/IsoDate.d.hpp
+++ /dev/null
@@ -1,80 +0,0 @@
-#ifndef IsoDate_D_HPP
-#define IsoDate_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct Calendar; }
-class Calendar;
-namespace diplomat::capi { struct Date; }
-class Date;
-namespace diplomat::capi { struct WeekCalculator; }
-class WeekCalculator;
-struct WeekOf;
-class CalendarError;
-class CalendarParseError;
-class IsoWeekday;
-
-
-namespace diplomat {
-namespace capi {
-    struct IsoDate;
-} // namespace capi
-} // namespace
-
-class IsoDate {
-public:
-
-  inline static diplomat::result<std::unique_ptr<IsoDate>, CalendarError> create(int32_t year, uint8_t month, uint8_t day);
-
-  inline static diplomat::result<std::unique_ptr<IsoDate>, CalendarParseError> from_string(std::string_view v);
-
-  inline static std::unique_ptr<IsoDate> unix_epoch();
-
-  inline std::unique_ptr<Date> to_calendar(const Calendar& calendar) const;
-
-  inline std::unique_ptr<Date> to_any() const;
-
-  inline uint16_t day_of_year() const;
-
-  inline uint32_t day_of_month() const;
-
-  inline IsoWeekday day_of_week() const;
-
-  inline uint32_t week_of_month(IsoWeekday first_weekday) const;
-
-  inline WeekOf week_of_year(const WeekCalculator& calculator) const;
-
-  inline uint32_t month() const;
-
-  inline int32_t year() const;
-
-  inline bool is_in_leap_year() const;
-
-  inline uint8_t months_in_year() const;
-
-  inline uint8_t days_in_month() const;
-
-  inline uint16_t days_in_year() const;
-
-  inline const diplomat::capi::IsoDate* AsFFI() const;
-  inline diplomat::capi::IsoDate* AsFFI();
-  inline static const IsoDate* FromFFI(const diplomat::capi::IsoDate* ptr);
-  inline static IsoDate* FromFFI(diplomat::capi::IsoDate* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  IsoDate() = delete;
-  IsoDate(const IsoDate&) = delete;
-  IsoDate(IsoDate&&) noexcept = delete;
-  IsoDate operator=(const IsoDate&) = delete;
-  IsoDate operator=(IsoDate&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // IsoDate_D_HPP
diff --git a/ffi/capi/bindings/cpp/IsoDate.hpp b/ffi/capi/bindings/cpp/IsoDate.hpp
deleted file mode 100644
index 8c0201bb4cf..00000000000
--- a/ffi/capi/bindings/cpp/IsoDate.hpp
+++ /dev/null
@@ -1,174 +0,0 @@
-#ifndef IsoDate_HPP
-#define IsoDate_HPP
-
-#include "IsoDate.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "Calendar.hpp"
-#include "CalendarError.hpp"
-#include "CalendarParseError.hpp"
-#include "Date.hpp"
-#include "IsoWeekday.hpp"
-#include "WeekCalculator.hpp"
-#include "WeekOf.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_IsoDate_create_mv1_result {union {diplomat::capi::IsoDate* ok; diplomat::capi::CalendarError err;}; bool is_ok;} icu4x_IsoDate_create_mv1_result;
-    icu4x_IsoDate_create_mv1_result icu4x_IsoDate_create_mv1(int32_t year, uint8_t month, uint8_t day);
-    
-    typedef struct icu4x_IsoDate_from_string_mv1_result {union {diplomat::capi::IsoDate* ok; diplomat::capi::CalendarParseError err;}; bool is_ok;} icu4x_IsoDate_from_string_mv1_result;
-    icu4x_IsoDate_from_string_mv1_result icu4x_IsoDate_from_string_mv1(const char* v_data, size_t v_len);
-    
-    diplomat::capi::IsoDate* icu4x_IsoDate_unix_epoch_mv1(void);
-    
-    diplomat::capi::Date* icu4x_IsoDate_to_calendar_mv1(const diplomat::capi::IsoDate* self, const diplomat::capi::Calendar* calendar);
-    
-    diplomat::capi::Date* icu4x_IsoDate_to_any_mv1(const diplomat::capi::IsoDate* self);
-    
-    uint16_t icu4x_IsoDate_day_of_year_mv1(const diplomat::capi::IsoDate* self);
-    
-    uint32_t icu4x_IsoDate_day_of_month_mv1(const diplomat::capi::IsoDate* self);
-    
-    diplomat::capi::IsoWeekday icu4x_IsoDate_day_of_week_mv1(const diplomat::capi::IsoDate* self);
-    
-    uint32_t icu4x_IsoDate_week_of_month_mv1(const diplomat::capi::IsoDate* self, diplomat::capi::IsoWeekday first_weekday);
-    
-    diplomat::capi::WeekOf icu4x_IsoDate_week_of_year_mv1(const diplomat::capi::IsoDate* self, const diplomat::capi::WeekCalculator* calculator);
-    
-    uint32_t icu4x_IsoDate_month_mv1(const diplomat::capi::IsoDate* self);
-    
-    int32_t icu4x_IsoDate_year_mv1(const diplomat::capi::IsoDate* self);
-    
-    bool icu4x_IsoDate_is_in_leap_year_mv1(const diplomat::capi::IsoDate* self);
-    
-    uint8_t icu4x_IsoDate_months_in_year_mv1(const diplomat::capi::IsoDate* self);
-    
-    uint8_t icu4x_IsoDate_days_in_month_mv1(const diplomat::capi::IsoDate* self);
-    
-    uint16_t icu4x_IsoDate_days_in_year_mv1(const diplomat::capi::IsoDate* self);
-    
-    
-    void icu4x_IsoDate_destroy_mv1(IsoDate* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<IsoDate>, CalendarError> IsoDate::create(int32_t year, uint8_t month, uint8_t day) {
-  auto result = diplomat::capi::icu4x_IsoDate_create_mv1(year,
-    month,
-    day);
-  return result.is_ok ? diplomat::result<std::unique_ptr<IsoDate>, CalendarError>(diplomat::Ok<std::unique_ptr<IsoDate>>(std::unique_ptr<IsoDate>(IsoDate::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<IsoDate>, CalendarError>(diplomat::Err<CalendarError>(CalendarError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<IsoDate>, CalendarParseError> IsoDate::from_string(std::string_view v) {
-  auto result = diplomat::capi::icu4x_IsoDate_from_string_mv1(v.data(),
-    v.size());
-  return result.is_ok ? diplomat::result<std::unique_ptr<IsoDate>, CalendarParseError>(diplomat::Ok<std::unique_ptr<IsoDate>>(std::unique_ptr<IsoDate>(IsoDate::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<IsoDate>, CalendarParseError>(diplomat::Err<CalendarParseError>(CalendarParseError::FromFFI(result.err)));
-}
-
-inline std::unique_ptr<IsoDate> IsoDate::unix_epoch() {
-  auto result = diplomat::capi::icu4x_IsoDate_unix_epoch_mv1();
-  return std::unique_ptr<IsoDate>(IsoDate::FromFFI(result));
-}
-
-inline std::unique_ptr<Date> IsoDate::to_calendar(const Calendar& calendar) const {
-  auto result = diplomat::capi::icu4x_IsoDate_to_calendar_mv1(this->AsFFI(),
-    calendar.AsFFI());
-  return std::unique_ptr<Date>(Date::FromFFI(result));
-}
-
-inline std::unique_ptr<Date> IsoDate::to_any() const {
-  auto result = diplomat::capi::icu4x_IsoDate_to_any_mv1(this->AsFFI());
-  return std::unique_ptr<Date>(Date::FromFFI(result));
-}
-
-inline uint16_t IsoDate::day_of_year() const {
-  auto result = diplomat::capi::icu4x_IsoDate_day_of_year_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint32_t IsoDate::day_of_month() const {
-  auto result = diplomat::capi::icu4x_IsoDate_day_of_month_mv1(this->AsFFI());
-  return result;
-}
-
-inline IsoWeekday IsoDate::day_of_week() const {
-  auto result = diplomat::capi::icu4x_IsoDate_day_of_week_mv1(this->AsFFI());
-  return IsoWeekday::FromFFI(result);
-}
-
-inline uint32_t IsoDate::week_of_month(IsoWeekday first_weekday) const {
-  auto result = diplomat::capi::icu4x_IsoDate_week_of_month_mv1(this->AsFFI(),
-    first_weekday.AsFFI());
-  return result;
-}
-
-inline WeekOf IsoDate::week_of_year(const WeekCalculator& calculator) const {
-  auto result = diplomat::capi::icu4x_IsoDate_week_of_year_mv1(this->AsFFI(),
-    calculator.AsFFI());
-  return WeekOf::FromFFI(result);
-}
-
-inline uint32_t IsoDate::month() const {
-  auto result = diplomat::capi::icu4x_IsoDate_month_mv1(this->AsFFI());
-  return result;
-}
-
-inline int32_t IsoDate::year() const {
-  auto result = diplomat::capi::icu4x_IsoDate_year_mv1(this->AsFFI());
-  return result;
-}
-
-inline bool IsoDate::is_in_leap_year() const {
-  auto result = diplomat::capi::icu4x_IsoDate_is_in_leap_year_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint8_t IsoDate::months_in_year() const {
-  auto result = diplomat::capi::icu4x_IsoDate_months_in_year_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint8_t IsoDate::days_in_month() const {
-  auto result = diplomat::capi::icu4x_IsoDate_days_in_month_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint16_t IsoDate::days_in_year() const {
-  auto result = diplomat::capi::icu4x_IsoDate_days_in_year_mv1(this->AsFFI());
-  return result;
-}
-
-inline const diplomat::capi::IsoDate* IsoDate::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::IsoDate*>(this);
-}
-
-inline diplomat::capi::IsoDate* IsoDate::AsFFI() {
-  return reinterpret_cast<diplomat::capi::IsoDate*>(this);
-}
-
-inline const IsoDate* IsoDate::FromFFI(const diplomat::capi::IsoDate* ptr) {
-  return reinterpret_cast<const IsoDate*>(ptr);
-}
-
-inline IsoDate* IsoDate::FromFFI(diplomat::capi::IsoDate* ptr) {
-  return reinterpret_cast<IsoDate*>(ptr);
-}
-
-inline void IsoDate::operator delete(void* ptr) {
-  diplomat::capi::icu4x_IsoDate_destroy_mv1(reinterpret_cast<diplomat::capi::IsoDate*>(ptr));
-}
-
-
-#endif // IsoDate_HPP
diff --git a/ffi/capi/bindings/cpp/IsoDateTime.d.hpp b/ffi/capi/bindings/cpp/IsoDateTime.d.hpp
deleted file mode 100644
index 2247a1f156d..00000000000
--- a/ffi/capi/bindings/cpp/IsoDateTime.d.hpp
+++ /dev/null
@@ -1,102 +0,0 @@
-#ifndef IsoDateTime_D_HPP
-#define IsoDateTime_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct Calendar; }
-class Calendar;
-namespace diplomat::capi { struct DateTime; }
-class DateTime;
-namespace diplomat::capi { struct IsoDate; }
-class IsoDate;
-namespace diplomat::capi { struct Time; }
-class Time;
-namespace diplomat::capi { struct WeekCalculator; }
-class WeekCalculator;
-struct WeekOf;
-class CalendarError;
-class CalendarParseError;
-class IsoWeekday;
-
-
-namespace diplomat {
-namespace capi {
-    struct IsoDateTime;
-} // namespace capi
-} // namespace
-
-class IsoDateTime {
-public:
-
-  inline static diplomat::result<std::unique_ptr<IsoDateTime>, CalendarError> create(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond);
-
-  inline static std::unique_ptr<IsoDateTime> from_date_and_time(const IsoDate& date, const Time& time);
-
-  inline static diplomat::result<std::unique_ptr<IsoDateTime>, CalendarParseError> from_string(std::string_view v);
-
-  inline static std::unique_ptr<IsoDateTime> local_unix_epoch();
-
-  inline static std::unique_ptr<IsoDateTime> from_minutes_since_local_unix_epoch(int32_t minutes);
-
-  inline std::unique_ptr<IsoDate> date() const;
-
-  inline std::unique_ptr<Time> time() const;
-
-  inline std::unique_ptr<DateTime> to_any() const;
-
-  inline int32_t minutes_since_local_unix_epoch() const;
-
-  inline std::unique_ptr<DateTime> to_calendar(const Calendar& calendar) const;
-
-  inline uint8_t hour() const;
-
-  inline uint8_t minute() const;
-
-  inline uint8_t second() const;
-
-  inline uint32_t nanosecond() const;
-
-  inline uint16_t day_of_year() const;
-
-  inline uint32_t day_of_month() const;
-
-  inline IsoWeekday day_of_week() const;
-
-  inline uint32_t week_of_month(IsoWeekday first_weekday) const;
-
-  inline WeekOf week_of_year(const WeekCalculator& calculator) const;
-
-  inline uint32_t month() const;
-
-  inline int32_t year() const;
-
-  inline bool is_in_leap_year() const;
-
-  inline uint8_t months_in_year() const;
-
-  inline uint8_t days_in_month() const;
-
-  inline uint16_t days_in_year() const;
-
-  inline const diplomat::capi::IsoDateTime* AsFFI() const;
-  inline diplomat::capi::IsoDateTime* AsFFI();
-  inline static const IsoDateTime* FromFFI(const diplomat::capi::IsoDateTime* ptr);
-  inline static IsoDateTime* FromFFI(diplomat::capi::IsoDateTime* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  IsoDateTime() = delete;
-  IsoDateTime(const IsoDateTime&) = delete;
-  IsoDateTime(IsoDateTime&&) noexcept = delete;
-  IsoDateTime operator=(const IsoDateTime&) = delete;
-  IsoDateTime operator=(IsoDateTime&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // IsoDateTime_D_HPP
diff --git a/ffi/capi/bindings/cpp/IsoDateTime.hpp b/ffi/capi/bindings/cpp/IsoDateTime.hpp
deleted file mode 100644
index acecb7229bc..00000000000
--- a/ffi/capi/bindings/cpp/IsoDateTime.hpp
+++ /dev/null
@@ -1,244 +0,0 @@
-#ifndef IsoDateTime_HPP
-#define IsoDateTime_HPP
-
-#include "IsoDateTime.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "Calendar.hpp"
-#include "CalendarError.hpp"
-#include "CalendarParseError.hpp"
-#include "DateTime.hpp"
-#include "IsoDate.hpp"
-#include "IsoWeekday.hpp"
-#include "Time.hpp"
-#include "WeekCalculator.hpp"
-#include "WeekOf.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_IsoDateTime_create_mv1_result {union {diplomat::capi::IsoDateTime* ok; diplomat::capi::CalendarError err;}; bool is_ok;} icu4x_IsoDateTime_create_mv1_result;
-    icu4x_IsoDateTime_create_mv1_result icu4x_IsoDateTime_create_mv1(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond);
-    
-    diplomat::capi::IsoDateTime* icu4x_IsoDateTime_from_date_and_time_mv1(const diplomat::capi::IsoDate* date, const diplomat::capi::Time* time);
-    
-    typedef struct icu4x_IsoDateTime_from_string_mv1_result {union {diplomat::capi::IsoDateTime* ok; diplomat::capi::CalendarParseError err;}; bool is_ok;} icu4x_IsoDateTime_from_string_mv1_result;
-    icu4x_IsoDateTime_from_string_mv1_result icu4x_IsoDateTime_from_string_mv1(const char* v_data, size_t v_len);
-    
-    diplomat::capi::IsoDateTime* icu4x_IsoDateTime_local_unix_epoch_mv1(void);
-    
-    diplomat::capi::IsoDateTime* icu4x_IsoDateTime_from_minutes_since_local_unix_epoch_mv1(int32_t minutes);
-    
-    diplomat::capi::IsoDate* icu4x_IsoDateTime_date_mv1(const diplomat::capi::IsoDateTime* self);
-    
-    diplomat::capi::Time* icu4x_IsoDateTime_time_mv1(const diplomat::capi::IsoDateTime* self);
-    
-    diplomat::capi::DateTime* icu4x_IsoDateTime_to_any_mv1(const diplomat::capi::IsoDateTime* self);
-    
-    int32_t icu4x_IsoDateTime_minutes_since_local_unix_epoch_mv1(const diplomat::capi::IsoDateTime* self);
-    
-    diplomat::capi::DateTime* icu4x_IsoDateTime_to_calendar_mv1(const diplomat::capi::IsoDateTime* self, const diplomat::capi::Calendar* calendar);
-    
-    uint8_t icu4x_IsoDateTime_hour_mv1(const diplomat::capi::IsoDateTime* self);
-    
-    uint8_t icu4x_IsoDateTime_minute_mv1(const diplomat::capi::IsoDateTime* self);
-    
-    uint8_t icu4x_IsoDateTime_second_mv1(const diplomat::capi::IsoDateTime* self);
-    
-    uint32_t icu4x_IsoDateTime_nanosecond_mv1(const diplomat::capi::IsoDateTime* self);
-    
-    uint16_t icu4x_IsoDateTime_day_of_year_mv1(const diplomat::capi::IsoDateTime* self);
-    
-    uint32_t icu4x_IsoDateTime_day_of_month_mv1(const diplomat::capi::IsoDateTime* self);
-    
-    diplomat::capi::IsoWeekday icu4x_IsoDateTime_day_of_week_mv1(const diplomat::capi::IsoDateTime* self);
-    
-    uint32_t icu4x_IsoDateTime_week_of_month_mv1(const diplomat::capi::IsoDateTime* self, diplomat::capi::IsoWeekday first_weekday);
-    
-    diplomat::capi::WeekOf icu4x_IsoDateTime_week_of_year_mv1(const diplomat::capi::IsoDateTime* self, const diplomat::capi::WeekCalculator* calculator);
-    
-    uint32_t icu4x_IsoDateTime_month_mv1(const diplomat::capi::IsoDateTime* self);
-    
-    int32_t icu4x_IsoDateTime_year_mv1(const diplomat::capi::IsoDateTime* self);
-    
-    bool icu4x_IsoDateTime_is_in_leap_year_mv1(const diplomat::capi::IsoDateTime* self);
-    
-    uint8_t icu4x_IsoDateTime_months_in_year_mv1(const diplomat::capi::IsoDateTime* self);
-    
-    uint8_t icu4x_IsoDateTime_days_in_month_mv1(const diplomat::capi::IsoDateTime* self);
-    
-    uint16_t icu4x_IsoDateTime_days_in_year_mv1(const diplomat::capi::IsoDateTime* self);
-    
-    
-    void icu4x_IsoDateTime_destroy_mv1(IsoDateTime* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<IsoDateTime>, CalendarError> IsoDateTime::create(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond) {
-  auto result = diplomat::capi::icu4x_IsoDateTime_create_mv1(year,
-    month,
-    day,
-    hour,
-    minute,
-    second,
-    nanosecond);
-  return result.is_ok ? diplomat::result<std::unique_ptr<IsoDateTime>, CalendarError>(diplomat::Ok<std::unique_ptr<IsoDateTime>>(std::unique_ptr<IsoDateTime>(IsoDateTime::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<IsoDateTime>, CalendarError>(diplomat::Err<CalendarError>(CalendarError::FromFFI(result.err)));
-}
-
-inline std::unique_ptr<IsoDateTime> IsoDateTime::from_date_and_time(const IsoDate& date, const Time& time) {
-  auto result = diplomat::capi::icu4x_IsoDateTime_from_date_and_time_mv1(date.AsFFI(),
-    time.AsFFI());
-  return std::unique_ptr<IsoDateTime>(IsoDateTime::FromFFI(result));
-}
-
-inline diplomat::result<std::unique_ptr<IsoDateTime>, CalendarParseError> IsoDateTime::from_string(std::string_view v) {
-  auto result = diplomat::capi::icu4x_IsoDateTime_from_string_mv1(v.data(),
-    v.size());
-  return result.is_ok ? diplomat::result<std::unique_ptr<IsoDateTime>, CalendarParseError>(diplomat::Ok<std::unique_ptr<IsoDateTime>>(std::unique_ptr<IsoDateTime>(IsoDateTime::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<IsoDateTime>, CalendarParseError>(diplomat::Err<CalendarParseError>(CalendarParseError::FromFFI(result.err)));
-}
-
-inline std::unique_ptr<IsoDateTime> IsoDateTime::local_unix_epoch() {
-  auto result = diplomat::capi::icu4x_IsoDateTime_local_unix_epoch_mv1();
-  return std::unique_ptr<IsoDateTime>(IsoDateTime::FromFFI(result));
-}
-
-inline std::unique_ptr<IsoDateTime> IsoDateTime::from_minutes_since_local_unix_epoch(int32_t minutes) {
-  auto result = diplomat::capi::icu4x_IsoDateTime_from_minutes_since_local_unix_epoch_mv1(minutes);
-  return std::unique_ptr<IsoDateTime>(IsoDateTime::FromFFI(result));
-}
-
-inline std::unique_ptr<IsoDate> IsoDateTime::date() const {
-  auto result = diplomat::capi::icu4x_IsoDateTime_date_mv1(this->AsFFI());
-  return std::unique_ptr<IsoDate>(IsoDate::FromFFI(result));
-}
-
-inline std::unique_ptr<Time> IsoDateTime::time() const {
-  auto result = diplomat::capi::icu4x_IsoDateTime_time_mv1(this->AsFFI());
-  return std::unique_ptr<Time>(Time::FromFFI(result));
-}
-
-inline std::unique_ptr<DateTime> IsoDateTime::to_any() const {
-  auto result = diplomat::capi::icu4x_IsoDateTime_to_any_mv1(this->AsFFI());
-  return std::unique_ptr<DateTime>(DateTime::FromFFI(result));
-}
-
-inline int32_t IsoDateTime::minutes_since_local_unix_epoch() const {
-  auto result = diplomat::capi::icu4x_IsoDateTime_minutes_since_local_unix_epoch_mv1(this->AsFFI());
-  return result;
-}
-
-inline std::unique_ptr<DateTime> IsoDateTime::to_calendar(const Calendar& calendar) const {
-  auto result = diplomat::capi::icu4x_IsoDateTime_to_calendar_mv1(this->AsFFI(),
-    calendar.AsFFI());
-  return std::unique_ptr<DateTime>(DateTime::FromFFI(result));
-}
-
-inline uint8_t IsoDateTime::hour() const {
-  auto result = diplomat::capi::icu4x_IsoDateTime_hour_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint8_t IsoDateTime::minute() const {
-  auto result = diplomat::capi::icu4x_IsoDateTime_minute_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint8_t IsoDateTime::second() const {
-  auto result = diplomat::capi::icu4x_IsoDateTime_second_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint32_t IsoDateTime::nanosecond() const {
-  auto result = diplomat::capi::icu4x_IsoDateTime_nanosecond_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint16_t IsoDateTime::day_of_year() const {
-  auto result = diplomat::capi::icu4x_IsoDateTime_day_of_year_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint32_t IsoDateTime::day_of_month() const {
-  auto result = diplomat::capi::icu4x_IsoDateTime_day_of_month_mv1(this->AsFFI());
-  return result;
-}
-
-inline IsoWeekday IsoDateTime::day_of_week() const {
-  auto result = diplomat::capi::icu4x_IsoDateTime_day_of_week_mv1(this->AsFFI());
-  return IsoWeekday::FromFFI(result);
-}
-
-inline uint32_t IsoDateTime::week_of_month(IsoWeekday first_weekday) const {
-  auto result = diplomat::capi::icu4x_IsoDateTime_week_of_month_mv1(this->AsFFI(),
-    first_weekday.AsFFI());
-  return result;
-}
-
-inline WeekOf IsoDateTime::week_of_year(const WeekCalculator& calculator) const {
-  auto result = diplomat::capi::icu4x_IsoDateTime_week_of_year_mv1(this->AsFFI(),
-    calculator.AsFFI());
-  return WeekOf::FromFFI(result);
-}
-
-inline uint32_t IsoDateTime::month() const {
-  auto result = diplomat::capi::icu4x_IsoDateTime_month_mv1(this->AsFFI());
-  return result;
-}
-
-inline int32_t IsoDateTime::year() const {
-  auto result = diplomat::capi::icu4x_IsoDateTime_year_mv1(this->AsFFI());
-  return result;
-}
-
-inline bool IsoDateTime::is_in_leap_year() const {
-  auto result = diplomat::capi::icu4x_IsoDateTime_is_in_leap_year_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint8_t IsoDateTime::months_in_year() const {
-  auto result = diplomat::capi::icu4x_IsoDateTime_months_in_year_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint8_t IsoDateTime::days_in_month() const {
-  auto result = diplomat::capi::icu4x_IsoDateTime_days_in_month_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint16_t IsoDateTime::days_in_year() const {
-  auto result = diplomat::capi::icu4x_IsoDateTime_days_in_year_mv1(this->AsFFI());
-  return result;
-}
-
-inline const diplomat::capi::IsoDateTime* IsoDateTime::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::IsoDateTime*>(this);
-}
-
-inline diplomat::capi::IsoDateTime* IsoDateTime::AsFFI() {
-  return reinterpret_cast<diplomat::capi::IsoDateTime*>(this);
-}
-
-inline const IsoDateTime* IsoDateTime::FromFFI(const diplomat::capi::IsoDateTime* ptr) {
-  return reinterpret_cast<const IsoDateTime*>(ptr);
-}
-
-inline IsoDateTime* IsoDateTime::FromFFI(diplomat::capi::IsoDateTime* ptr) {
-  return reinterpret_cast<IsoDateTime*>(ptr);
-}
-
-inline void IsoDateTime::operator delete(void* ptr) {
-  diplomat::capi::icu4x_IsoDateTime_destroy_mv1(reinterpret_cast<diplomat::capi::IsoDateTime*>(ptr));
-}
-
-
-#endif // IsoDateTime_HPP
diff --git a/ffi/capi/bindings/cpp/IsoTimeZoneFormat.hpp b/ffi/capi/bindings/cpp/IsoTimeZoneFormat.hpp
deleted file mode 100644
index d3c2b655e69..00000000000
--- a/ffi/capi/bindings/cpp/IsoTimeZoneFormat.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef IsoTimeZoneFormat_HPP
-#define IsoTimeZoneFormat_HPP
-
-#include "IsoTimeZoneFormat.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::IsoTimeZoneFormat IsoTimeZoneFormat::AsFFI() const {
-  return static_cast<diplomat::capi::IsoTimeZoneFormat>(value);
-}
-
-inline IsoTimeZoneFormat IsoTimeZoneFormat::FromFFI(diplomat::capi::IsoTimeZoneFormat c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::IsoTimeZoneFormat_Basic:
-    case diplomat::capi::IsoTimeZoneFormat_Extended:
-    case diplomat::capi::IsoTimeZoneFormat_UtcBasic:
-    case diplomat::capi::IsoTimeZoneFormat_UtcExtended:
-      return static_cast<IsoTimeZoneFormat::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // IsoTimeZoneFormat_HPP
diff --git a/ffi/capi/bindings/cpp/IsoTimeZoneMinuteDisplay.hpp b/ffi/capi/bindings/cpp/IsoTimeZoneMinuteDisplay.hpp
deleted file mode 100644
index 37db3996f90..00000000000
--- a/ffi/capi/bindings/cpp/IsoTimeZoneMinuteDisplay.hpp
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef IsoTimeZoneMinuteDisplay_HPP
-#define IsoTimeZoneMinuteDisplay_HPP
-
-#include "IsoTimeZoneMinuteDisplay.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::IsoTimeZoneMinuteDisplay IsoTimeZoneMinuteDisplay::AsFFI() const {
-  return static_cast<diplomat::capi::IsoTimeZoneMinuteDisplay>(value);
-}
-
-inline IsoTimeZoneMinuteDisplay IsoTimeZoneMinuteDisplay::FromFFI(diplomat::capi::IsoTimeZoneMinuteDisplay c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::IsoTimeZoneMinuteDisplay_Required:
-    case diplomat::capi::IsoTimeZoneMinuteDisplay_Optional:
-      return static_cast<IsoTimeZoneMinuteDisplay::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // IsoTimeZoneMinuteDisplay_HPP
diff --git a/ffi/capi/bindings/cpp/IsoTimeZoneOptions.d.hpp b/ffi/capi/bindings/cpp/IsoTimeZoneOptions.d.hpp
deleted file mode 100644
index 6a1f7313237..00000000000
--- a/ffi/capi/bindings/cpp/IsoTimeZoneOptions.d.hpp
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef IsoTimeZoneOptions_D_HPP
-#define IsoTimeZoneOptions_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "IsoTimeZoneFormat.d.hpp"
-#include "IsoTimeZoneMinuteDisplay.d.hpp"
-#include "IsoTimeZoneSecondDisplay.d.hpp"
-#include "diplomat_runtime.hpp"
-
-class IsoTimeZoneFormat;
-class IsoTimeZoneMinuteDisplay;
-class IsoTimeZoneSecondDisplay;
-
-
-namespace diplomat {
-namespace capi {
-    struct IsoTimeZoneOptions {
-      diplomat::capi::IsoTimeZoneFormat format;
-      diplomat::capi::IsoTimeZoneMinuteDisplay minutes;
-      diplomat::capi::IsoTimeZoneSecondDisplay seconds;
-    };
-} // namespace capi
-} // namespace
-
-
-struct IsoTimeZoneOptions {
-  IsoTimeZoneFormat format;
-  IsoTimeZoneMinuteDisplay minutes;
-  IsoTimeZoneSecondDisplay seconds;
-
-  inline diplomat::capi::IsoTimeZoneOptions AsFFI() const;
-  inline static IsoTimeZoneOptions FromFFI(diplomat::capi::IsoTimeZoneOptions c_struct);
-};
-
-
-#endif // IsoTimeZoneOptions_D_HPP
diff --git a/ffi/capi/bindings/cpp/IsoTimeZoneOptions.hpp b/ffi/capi/bindings/cpp/IsoTimeZoneOptions.hpp
deleted file mode 100644
index f2a804cafa6..00000000000
--- a/ffi/capi/bindings/cpp/IsoTimeZoneOptions.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef IsoTimeZoneOptions_HPP
-#define IsoTimeZoneOptions_HPP
-
-#include "IsoTimeZoneOptions.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "IsoTimeZoneFormat.hpp"
-#include "IsoTimeZoneMinuteDisplay.hpp"
-#include "IsoTimeZoneSecondDisplay.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-
-inline diplomat::capi::IsoTimeZoneOptions IsoTimeZoneOptions::AsFFI() const {
-  return diplomat::capi::IsoTimeZoneOptions {
-    /* .format = */ format.AsFFI(),
-    /* .minutes = */ minutes.AsFFI(),
-    /* .seconds = */ seconds.AsFFI(),
-  };
-}
-
-inline IsoTimeZoneOptions IsoTimeZoneOptions::FromFFI(diplomat::capi::IsoTimeZoneOptions c_struct) {
-  return IsoTimeZoneOptions {
-    /* .format = */ IsoTimeZoneFormat::FromFFI(c_struct.format),
-    /* .minutes = */ IsoTimeZoneMinuteDisplay::FromFFI(c_struct.minutes),
-    /* .seconds = */ IsoTimeZoneSecondDisplay::FromFFI(c_struct.seconds),
-  };
-}
-
-
-#endif // IsoTimeZoneOptions_HPP
diff --git a/ffi/capi/bindings/cpp/IsoTimeZoneSecondDisplay.hpp b/ffi/capi/bindings/cpp/IsoTimeZoneSecondDisplay.hpp
deleted file mode 100644
index 5579c2a7ed6..00000000000
--- a/ffi/capi/bindings/cpp/IsoTimeZoneSecondDisplay.hpp
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef IsoTimeZoneSecondDisplay_HPP
-#define IsoTimeZoneSecondDisplay_HPP
-
-#include "IsoTimeZoneSecondDisplay.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::IsoTimeZoneSecondDisplay IsoTimeZoneSecondDisplay::AsFFI() const {
-  return static_cast<diplomat::capi::IsoTimeZoneSecondDisplay>(value);
-}
-
-inline IsoTimeZoneSecondDisplay IsoTimeZoneSecondDisplay::FromFFI(diplomat::capi::IsoTimeZoneSecondDisplay c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::IsoTimeZoneSecondDisplay_Optional:
-    case diplomat::capi::IsoTimeZoneSecondDisplay_Never:
-      return static_cast<IsoTimeZoneSecondDisplay::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // IsoTimeZoneSecondDisplay_HPP
diff --git a/ffi/capi/bindings/cpp/IsoWeekday.hpp b/ffi/capi/bindings/cpp/IsoWeekday.hpp
deleted file mode 100644
index 946e4b46d09..00000000000
--- a/ffi/capi/bindings/cpp/IsoWeekday.hpp
+++ /dev/null
@@ -1,42 +0,0 @@
-#ifndef IsoWeekday_HPP
-#define IsoWeekday_HPP
-
-#include "IsoWeekday.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::IsoWeekday IsoWeekday::AsFFI() const {
-  return static_cast<diplomat::capi::IsoWeekday>(value);
-}
-
-inline IsoWeekday IsoWeekday::FromFFI(diplomat::capi::IsoWeekday c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::IsoWeekday_Monday:
-    case diplomat::capi::IsoWeekday_Tuesday:
-    case diplomat::capi::IsoWeekday_Wednesday:
-    case diplomat::capi::IsoWeekday_Thursday:
-    case diplomat::capi::IsoWeekday_Friday:
-    case diplomat::capi::IsoWeekday_Saturday:
-    case diplomat::capi::IsoWeekday_Sunday:
-      return static_cast<IsoWeekday::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // IsoWeekday_HPP
diff --git a/ffi/capi/bindings/cpp/LanguageDisplay.hpp b/ffi/capi/bindings/cpp/LanguageDisplay.hpp
deleted file mode 100644
index ba1dc93daeb..00000000000
--- a/ffi/capi/bindings/cpp/LanguageDisplay.hpp
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef LanguageDisplay_HPP
-#define LanguageDisplay_HPP
-
-#include "LanguageDisplay.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::LanguageDisplay LanguageDisplay::AsFFI() const {
-  return static_cast<diplomat::capi::LanguageDisplay>(value);
-}
-
-inline LanguageDisplay LanguageDisplay::FromFFI(diplomat::capi::LanguageDisplay c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::LanguageDisplay_Dialect:
-    case diplomat::capi::LanguageDisplay_Standard:
-      return static_cast<LanguageDisplay::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // LanguageDisplay_HPP
diff --git a/ffi/capi/bindings/cpp/LeadingAdjustment.hpp b/ffi/capi/bindings/cpp/LeadingAdjustment.hpp
deleted file mode 100644
index 2c7ae24e1a2..00000000000
--- a/ffi/capi/bindings/cpp/LeadingAdjustment.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef LeadingAdjustment_HPP
-#define LeadingAdjustment_HPP
-
-#include "LeadingAdjustment.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::LeadingAdjustment LeadingAdjustment::AsFFI() const {
-  return static_cast<diplomat::capi::LeadingAdjustment>(value);
-}
-
-inline LeadingAdjustment LeadingAdjustment::FromFFI(diplomat::capi::LeadingAdjustment c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::LeadingAdjustment_Auto:
-    case diplomat::capi::LeadingAdjustment_None:
-    case diplomat::capi::LeadingAdjustment_ToCased:
-      return static_cast<LeadingAdjustment::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // LeadingAdjustment_HPP
diff --git a/ffi/capi/bindings/cpp/LineBreakIteratorLatin1.d.hpp b/ffi/capi/bindings/cpp/LineBreakIteratorLatin1.d.hpp
deleted file mode 100644
index 08f91b3ed66..00000000000
--- a/ffi/capi/bindings/cpp/LineBreakIteratorLatin1.d.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef LineBreakIteratorLatin1_D_HPP
-#define LineBreakIteratorLatin1_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    struct LineBreakIteratorLatin1;
-} // namespace capi
-} // namespace
-
-class LineBreakIteratorLatin1 {
-public:
-
-  inline int32_t next();
-
-  inline const diplomat::capi::LineBreakIteratorLatin1* AsFFI() const;
-  inline diplomat::capi::LineBreakIteratorLatin1* AsFFI();
-  inline static const LineBreakIteratorLatin1* FromFFI(const diplomat::capi::LineBreakIteratorLatin1* ptr);
-  inline static LineBreakIteratorLatin1* FromFFI(diplomat::capi::LineBreakIteratorLatin1* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  LineBreakIteratorLatin1() = delete;
-  LineBreakIteratorLatin1(const LineBreakIteratorLatin1&) = delete;
-  LineBreakIteratorLatin1(LineBreakIteratorLatin1&&) noexcept = delete;
-  LineBreakIteratorLatin1 operator=(const LineBreakIteratorLatin1&) = delete;
-  LineBreakIteratorLatin1 operator=(LineBreakIteratorLatin1&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // LineBreakIteratorLatin1_D_HPP
diff --git a/ffi/capi/bindings/cpp/LineBreakIteratorLatin1.hpp b/ffi/capi/bindings/cpp/LineBreakIteratorLatin1.hpp
deleted file mode 100644
index 4528457798d..00000000000
--- a/ffi/capi/bindings/cpp/LineBreakIteratorLatin1.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef LineBreakIteratorLatin1_HPP
-#define LineBreakIteratorLatin1_HPP
-
-#include "LineBreakIteratorLatin1.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    int32_t icu4x_LineBreakIteratorLatin1_next_mv1(diplomat::capi::LineBreakIteratorLatin1* self);
-    
-    
-    void icu4x_LineBreakIteratorLatin1_destroy_mv1(LineBreakIteratorLatin1* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline int32_t LineBreakIteratorLatin1::next() {
-  auto result = diplomat::capi::icu4x_LineBreakIteratorLatin1_next_mv1(this->AsFFI());
-  return result;
-}
-
-inline const diplomat::capi::LineBreakIteratorLatin1* LineBreakIteratorLatin1::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::LineBreakIteratorLatin1*>(this);
-}
-
-inline diplomat::capi::LineBreakIteratorLatin1* LineBreakIteratorLatin1::AsFFI() {
-  return reinterpret_cast<diplomat::capi::LineBreakIteratorLatin1*>(this);
-}
-
-inline const LineBreakIteratorLatin1* LineBreakIteratorLatin1::FromFFI(const diplomat::capi::LineBreakIteratorLatin1* ptr) {
-  return reinterpret_cast<const LineBreakIteratorLatin1*>(ptr);
-}
-
-inline LineBreakIteratorLatin1* LineBreakIteratorLatin1::FromFFI(diplomat::capi::LineBreakIteratorLatin1* ptr) {
-  return reinterpret_cast<LineBreakIteratorLatin1*>(ptr);
-}
-
-inline void LineBreakIteratorLatin1::operator delete(void* ptr) {
-  diplomat::capi::icu4x_LineBreakIteratorLatin1_destroy_mv1(reinterpret_cast<diplomat::capi::LineBreakIteratorLatin1*>(ptr));
-}
-
-
-#endif // LineBreakIteratorLatin1_HPP
diff --git a/ffi/capi/bindings/cpp/LineBreakIteratorUtf16.d.hpp b/ffi/capi/bindings/cpp/LineBreakIteratorUtf16.d.hpp
deleted file mode 100644
index b37ad8f586a..00000000000
--- a/ffi/capi/bindings/cpp/LineBreakIteratorUtf16.d.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef LineBreakIteratorUtf16_D_HPP
-#define LineBreakIteratorUtf16_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    struct LineBreakIteratorUtf16;
-} // namespace capi
-} // namespace
-
-class LineBreakIteratorUtf16 {
-public:
-
-  inline int32_t next();
-
-  inline const diplomat::capi::LineBreakIteratorUtf16* AsFFI() const;
-  inline diplomat::capi::LineBreakIteratorUtf16* AsFFI();
-  inline static const LineBreakIteratorUtf16* FromFFI(const diplomat::capi::LineBreakIteratorUtf16* ptr);
-  inline static LineBreakIteratorUtf16* FromFFI(diplomat::capi::LineBreakIteratorUtf16* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  LineBreakIteratorUtf16() = delete;
-  LineBreakIteratorUtf16(const LineBreakIteratorUtf16&) = delete;
-  LineBreakIteratorUtf16(LineBreakIteratorUtf16&&) noexcept = delete;
-  LineBreakIteratorUtf16 operator=(const LineBreakIteratorUtf16&) = delete;
-  LineBreakIteratorUtf16 operator=(LineBreakIteratorUtf16&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // LineBreakIteratorUtf16_D_HPP
diff --git a/ffi/capi/bindings/cpp/LineBreakIteratorUtf16.hpp b/ffi/capi/bindings/cpp/LineBreakIteratorUtf16.hpp
deleted file mode 100644
index 31e69ffd468..00000000000
--- a/ffi/capi/bindings/cpp/LineBreakIteratorUtf16.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef LineBreakIteratorUtf16_HPP
-#define LineBreakIteratorUtf16_HPP
-
-#include "LineBreakIteratorUtf16.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    int32_t icu4x_LineBreakIteratorUtf16_next_mv1(diplomat::capi::LineBreakIteratorUtf16* self);
-    
-    
-    void icu4x_LineBreakIteratorUtf16_destroy_mv1(LineBreakIteratorUtf16* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline int32_t LineBreakIteratorUtf16::next() {
-  auto result = diplomat::capi::icu4x_LineBreakIteratorUtf16_next_mv1(this->AsFFI());
-  return result;
-}
-
-inline const diplomat::capi::LineBreakIteratorUtf16* LineBreakIteratorUtf16::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::LineBreakIteratorUtf16*>(this);
-}
-
-inline diplomat::capi::LineBreakIteratorUtf16* LineBreakIteratorUtf16::AsFFI() {
-  return reinterpret_cast<diplomat::capi::LineBreakIteratorUtf16*>(this);
-}
-
-inline const LineBreakIteratorUtf16* LineBreakIteratorUtf16::FromFFI(const diplomat::capi::LineBreakIteratorUtf16* ptr) {
-  return reinterpret_cast<const LineBreakIteratorUtf16*>(ptr);
-}
-
-inline LineBreakIteratorUtf16* LineBreakIteratorUtf16::FromFFI(diplomat::capi::LineBreakIteratorUtf16* ptr) {
-  return reinterpret_cast<LineBreakIteratorUtf16*>(ptr);
-}
-
-inline void LineBreakIteratorUtf16::operator delete(void* ptr) {
-  diplomat::capi::icu4x_LineBreakIteratorUtf16_destroy_mv1(reinterpret_cast<diplomat::capi::LineBreakIteratorUtf16*>(ptr));
-}
-
-
-#endif // LineBreakIteratorUtf16_HPP
diff --git a/ffi/capi/bindings/cpp/LineBreakIteratorUtf8.d.hpp b/ffi/capi/bindings/cpp/LineBreakIteratorUtf8.d.hpp
deleted file mode 100644
index 1ab19005434..00000000000
--- a/ffi/capi/bindings/cpp/LineBreakIteratorUtf8.d.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef LineBreakIteratorUtf8_D_HPP
-#define LineBreakIteratorUtf8_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    struct LineBreakIteratorUtf8;
-} // namespace capi
-} // namespace
-
-class LineBreakIteratorUtf8 {
-public:
-
-  inline int32_t next();
-
-  inline const diplomat::capi::LineBreakIteratorUtf8* AsFFI() const;
-  inline diplomat::capi::LineBreakIteratorUtf8* AsFFI();
-  inline static const LineBreakIteratorUtf8* FromFFI(const diplomat::capi::LineBreakIteratorUtf8* ptr);
-  inline static LineBreakIteratorUtf8* FromFFI(diplomat::capi::LineBreakIteratorUtf8* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  LineBreakIteratorUtf8() = delete;
-  LineBreakIteratorUtf8(const LineBreakIteratorUtf8&) = delete;
-  LineBreakIteratorUtf8(LineBreakIteratorUtf8&&) noexcept = delete;
-  LineBreakIteratorUtf8 operator=(const LineBreakIteratorUtf8&) = delete;
-  LineBreakIteratorUtf8 operator=(LineBreakIteratorUtf8&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // LineBreakIteratorUtf8_D_HPP
diff --git a/ffi/capi/bindings/cpp/LineBreakIteratorUtf8.hpp b/ffi/capi/bindings/cpp/LineBreakIteratorUtf8.hpp
deleted file mode 100644
index b1183275b84..00000000000
--- a/ffi/capi/bindings/cpp/LineBreakIteratorUtf8.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef LineBreakIteratorUtf8_HPP
-#define LineBreakIteratorUtf8_HPP
-
-#include "LineBreakIteratorUtf8.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    int32_t icu4x_LineBreakIteratorUtf8_next_mv1(diplomat::capi::LineBreakIteratorUtf8* self);
-    
-    
-    void icu4x_LineBreakIteratorUtf8_destroy_mv1(LineBreakIteratorUtf8* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline int32_t LineBreakIteratorUtf8::next() {
-  auto result = diplomat::capi::icu4x_LineBreakIteratorUtf8_next_mv1(this->AsFFI());
-  return result;
-}
-
-inline const diplomat::capi::LineBreakIteratorUtf8* LineBreakIteratorUtf8::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::LineBreakIteratorUtf8*>(this);
-}
-
-inline diplomat::capi::LineBreakIteratorUtf8* LineBreakIteratorUtf8::AsFFI() {
-  return reinterpret_cast<diplomat::capi::LineBreakIteratorUtf8*>(this);
-}
-
-inline const LineBreakIteratorUtf8* LineBreakIteratorUtf8::FromFFI(const diplomat::capi::LineBreakIteratorUtf8* ptr) {
-  return reinterpret_cast<const LineBreakIteratorUtf8*>(ptr);
-}
-
-inline LineBreakIteratorUtf8* LineBreakIteratorUtf8::FromFFI(diplomat::capi::LineBreakIteratorUtf8* ptr) {
-  return reinterpret_cast<LineBreakIteratorUtf8*>(ptr);
-}
-
-inline void LineBreakIteratorUtf8::operator delete(void* ptr) {
-  diplomat::capi::icu4x_LineBreakIteratorUtf8_destroy_mv1(reinterpret_cast<diplomat::capi::LineBreakIteratorUtf8*>(ptr));
-}
-
-
-#endif // LineBreakIteratorUtf8_HPP
diff --git a/ffi/capi/bindings/cpp/LineBreakOptionsV1.d.hpp b/ffi/capi/bindings/cpp/LineBreakOptionsV1.d.hpp
deleted file mode 100644
index c223ec62a94..00000000000
--- a/ffi/capi/bindings/cpp/LineBreakOptionsV1.d.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef LineBreakOptionsV1_D_HPP
-#define LineBreakOptionsV1_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "LineBreakStrictness.d.hpp"
-#include "LineBreakWordOption.d.hpp"
-#include "diplomat_runtime.hpp"
-
-class LineBreakStrictness;
-class LineBreakWordOption;
-
-
-namespace diplomat {
-namespace capi {
-    struct LineBreakOptionsV1 {
-      diplomat::capi::LineBreakStrictness strictness;
-      diplomat::capi::LineBreakWordOption word_option;
-      bool ja_zh;
-    };
-} // namespace capi
-} // namespace
-
-
-struct LineBreakOptionsV1 {
-  LineBreakStrictness strictness;
-  LineBreakWordOption word_option;
-  bool ja_zh;
-
-  inline diplomat::capi::LineBreakOptionsV1 AsFFI() const;
-  inline static LineBreakOptionsV1 FromFFI(diplomat::capi::LineBreakOptionsV1 c_struct);
-};
-
-
-#endif // LineBreakOptionsV1_D_HPP
diff --git a/ffi/capi/bindings/cpp/LineBreakOptionsV1.hpp b/ffi/capi/bindings/cpp/LineBreakOptionsV1.hpp
deleted file mode 100644
index e7fa6c4370c..00000000000
--- a/ffi/capi/bindings/cpp/LineBreakOptionsV1.hpp
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef LineBreakOptionsV1_HPP
-#define LineBreakOptionsV1_HPP
-
-#include "LineBreakOptionsV1.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "LineBreakStrictness.hpp"
-#include "LineBreakWordOption.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-
-inline diplomat::capi::LineBreakOptionsV1 LineBreakOptionsV1::AsFFI() const {
-  return diplomat::capi::LineBreakOptionsV1 {
-    /* .strictness = */ strictness.AsFFI(),
-    /* .word_option = */ word_option.AsFFI(),
-    /* .ja_zh = */ ja_zh,
-  };
-}
-
-inline LineBreakOptionsV1 LineBreakOptionsV1::FromFFI(diplomat::capi::LineBreakOptionsV1 c_struct) {
-  return LineBreakOptionsV1 {
-    /* .strictness = */ LineBreakStrictness::FromFFI(c_struct.strictness),
-    /* .word_option = */ LineBreakWordOption::FromFFI(c_struct.word_option),
-    /* .ja_zh = */ c_struct.ja_zh,
-  };
-}
-
-
-#endif // LineBreakOptionsV1_HPP
diff --git a/ffi/capi/bindings/cpp/LineBreakStrictness.hpp b/ffi/capi/bindings/cpp/LineBreakStrictness.hpp
deleted file mode 100644
index cd254e82623..00000000000
--- a/ffi/capi/bindings/cpp/LineBreakStrictness.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef LineBreakStrictness_HPP
-#define LineBreakStrictness_HPP
-
-#include "LineBreakStrictness.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::LineBreakStrictness LineBreakStrictness::AsFFI() const {
-  return static_cast<diplomat::capi::LineBreakStrictness>(value);
-}
-
-inline LineBreakStrictness LineBreakStrictness::FromFFI(diplomat::capi::LineBreakStrictness c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::LineBreakStrictness_Loose:
-    case diplomat::capi::LineBreakStrictness_Normal:
-    case diplomat::capi::LineBreakStrictness_Strict:
-    case diplomat::capi::LineBreakStrictness_Anywhere:
-      return static_cast<LineBreakStrictness::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // LineBreakStrictness_HPP
diff --git a/ffi/capi/bindings/cpp/LineBreakWordOption.hpp b/ffi/capi/bindings/cpp/LineBreakWordOption.hpp
deleted file mode 100644
index 79ded380d48..00000000000
--- a/ffi/capi/bindings/cpp/LineBreakWordOption.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef LineBreakWordOption_HPP
-#define LineBreakWordOption_HPP
-
-#include "LineBreakWordOption.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::LineBreakWordOption LineBreakWordOption::AsFFI() const {
-  return static_cast<diplomat::capi::LineBreakWordOption>(value);
-}
-
-inline LineBreakWordOption LineBreakWordOption::FromFFI(diplomat::capi::LineBreakWordOption c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::LineBreakWordOption_Normal:
-    case diplomat::capi::LineBreakWordOption_BreakAll:
-    case diplomat::capi::LineBreakWordOption_KeepAll:
-      return static_cast<LineBreakWordOption::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // LineBreakWordOption_HPP
diff --git a/ffi/capi/bindings/cpp/LineSegmenter.d.hpp b/ffi/capi/bindings/cpp/LineSegmenter.d.hpp
deleted file mode 100644
index c11d5fd1437..00000000000
--- a/ffi/capi/bindings/cpp/LineSegmenter.d.hpp
+++ /dev/null
@@ -1,66 +0,0 @@
-#ifndef LineSegmenter_D_HPP
-#define LineSegmenter_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct LineBreakIteratorLatin1; }
-class LineBreakIteratorLatin1;
-namespace diplomat::capi { struct LineBreakIteratorUtf16; }
-class LineBreakIteratorUtf16;
-namespace diplomat::capi { struct LineBreakIteratorUtf8; }
-class LineBreakIteratorUtf8;
-struct LineBreakOptionsV1;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct LineSegmenter;
-} // namespace capi
-} // namespace
-
-class LineSegmenter {
-public:
-
-  inline static diplomat::result<std::unique_ptr<LineSegmenter>, DataError> create_auto(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<LineSegmenter>, DataError> create_lstm(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<LineSegmenter>, DataError> create_dictionary(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<LineSegmenter>, DataError> create_auto_with_options_v1(const DataProvider& provider, LineBreakOptionsV1 options);
-
-  inline static diplomat::result<std::unique_ptr<LineSegmenter>, DataError> create_lstm_with_options_v1(const DataProvider& provider, LineBreakOptionsV1 options);
-
-  inline static diplomat::result<std::unique_ptr<LineSegmenter>, DataError> create_dictionary_with_options_v1(const DataProvider& provider, LineBreakOptionsV1 options);
-
-  inline std::unique_ptr<LineBreakIteratorUtf8> segment(std::string_view input) const;
-
-  inline std::unique_ptr<LineBreakIteratorUtf16> segment16(std::u16string_view input) const;
-
-  inline std::unique_ptr<LineBreakIteratorLatin1> segment_latin1(diplomat::span<const uint8_t> input) const;
-
-  inline const diplomat::capi::LineSegmenter* AsFFI() const;
-  inline diplomat::capi::LineSegmenter* AsFFI();
-  inline static const LineSegmenter* FromFFI(const diplomat::capi::LineSegmenter* ptr);
-  inline static LineSegmenter* FromFFI(diplomat::capi::LineSegmenter* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  LineSegmenter() = delete;
-  LineSegmenter(const LineSegmenter&) = delete;
-  LineSegmenter(LineSegmenter&&) noexcept = delete;
-  LineSegmenter operator=(const LineSegmenter&) = delete;
-  LineSegmenter operator=(LineSegmenter&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // LineSegmenter_D_HPP
diff --git a/ffi/capi/bindings/cpp/LineSegmenter.hpp b/ffi/capi/bindings/cpp/LineSegmenter.hpp
deleted file mode 100644
index 024688a8db5..00000000000
--- a/ffi/capi/bindings/cpp/LineSegmenter.hpp
+++ /dev/null
@@ -1,131 +0,0 @@
-#ifndef LineSegmenter_HPP
-#define LineSegmenter_HPP
-
-#include "LineSegmenter.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "LineBreakIteratorLatin1.hpp"
-#include "LineBreakIteratorUtf16.hpp"
-#include "LineBreakIteratorUtf8.hpp"
-#include "LineBreakOptionsV1.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_LineSegmenter_create_auto_mv1_result {union {diplomat::capi::LineSegmenter* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_LineSegmenter_create_auto_mv1_result;
-    icu4x_LineSegmenter_create_auto_mv1_result icu4x_LineSegmenter_create_auto_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_LineSegmenter_create_lstm_mv1_result {union {diplomat::capi::LineSegmenter* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_LineSegmenter_create_lstm_mv1_result;
-    icu4x_LineSegmenter_create_lstm_mv1_result icu4x_LineSegmenter_create_lstm_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_LineSegmenter_create_dictionary_mv1_result {union {diplomat::capi::LineSegmenter* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_LineSegmenter_create_dictionary_mv1_result;
-    icu4x_LineSegmenter_create_dictionary_mv1_result icu4x_LineSegmenter_create_dictionary_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_LineSegmenter_create_auto_with_options_v1_mv1_result {union {diplomat::capi::LineSegmenter* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_LineSegmenter_create_auto_with_options_v1_mv1_result;
-    icu4x_LineSegmenter_create_auto_with_options_v1_mv1_result icu4x_LineSegmenter_create_auto_with_options_v1_mv1(const diplomat::capi::DataProvider* provider, diplomat::capi::LineBreakOptionsV1 options);
-    
-    typedef struct icu4x_LineSegmenter_create_lstm_with_options_v1_mv1_result {union {diplomat::capi::LineSegmenter* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_LineSegmenter_create_lstm_with_options_v1_mv1_result;
-    icu4x_LineSegmenter_create_lstm_with_options_v1_mv1_result icu4x_LineSegmenter_create_lstm_with_options_v1_mv1(const diplomat::capi::DataProvider* provider, diplomat::capi::LineBreakOptionsV1 options);
-    
-    typedef struct icu4x_LineSegmenter_create_dictionary_with_options_v1_mv1_result {union {diplomat::capi::LineSegmenter* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_LineSegmenter_create_dictionary_with_options_v1_mv1_result;
-    icu4x_LineSegmenter_create_dictionary_with_options_v1_mv1_result icu4x_LineSegmenter_create_dictionary_with_options_v1_mv1(const diplomat::capi::DataProvider* provider, diplomat::capi::LineBreakOptionsV1 options);
-    
-    diplomat::capi::LineBreakIteratorUtf8* icu4x_LineSegmenter_segment_utf8_mv1(const diplomat::capi::LineSegmenter* self, const char* input_data, size_t input_len);
-    
-    diplomat::capi::LineBreakIteratorUtf16* icu4x_LineSegmenter_segment_utf16_mv1(const diplomat::capi::LineSegmenter* self, const char16_t* input_data, size_t input_len);
-    
-    diplomat::capi::LineBreakIteratorLatin1* icu4x_LineSegmenter_segment_latin1_mv1(const diplomat::capi::LineSegmenter* self, const uint8_t* input_data, size_t input_len);
-    
-    
-    void icu4x_LineSegmenter_destroy_mv1(LineSegmenter* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<LineSegmenter>, DataError> LineSegmenter::create_auto(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_LineSegmenter_create_auto_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<LineSegmenter>, DataError>(diplomat::Ok<std::unique_ptr<LineSegmenter>>(std::unique_ptr<LineSegmenter>(LineSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<LineSegmenter>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<LineSegmenter>, DataError> LineSegmenter::create_lstm(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_LineSegmenter_create_lstm_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<LineSegmenter>, DataError>(diplomat::Ok<std::unique_ptr<LineSegmenter>>(std::unique_ptr<LineSegmenter>(LineSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<LineSegmenter>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<LineSegmenter>, DataError> LineSegmenter::create_dictionary(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_LineSegmenter_create_dictionary_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<LineSegmenter>, DataError>(diplomat::Ok<std::unique_ptr<LineSegmenter>>(std::unique_ptr<LineSegmenter>(LineSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<LineSegmenter>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<LineSegmenter>, DataError> LineSegmenter::create_auto_with_options_v1(const DataProvider& provider, LineBreakOptionsV1 options) {
-  auto result = diplomat::capi::icu4x_LineSegmenter_create_auto_with_options_v1_mv1(provider.AsFFI(),
-    options.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<LineSegmenter>, DataError>(diplomat::Ok<std::unique_ptr<LineSegmenter>>(std::unique_ptr<LineSegmenter>(LineSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<LineSegmenter>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<LineSegmenter>, DataError> LineSegmenter::create_lstm_with_options_v1(const DataProvider& provider, LineBreakOptionsV1 options) {
-  auto result = diplomat::capi::icu4x_LineSegmenter_create_lstm_with_options_v1_mv1(provider.AsFFI(),
-    options.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<LineSegmenter>, DataError>(diplomat::Ok<std::unique_ptr<LineSegmenter>>(std::unique_ptr<LineSegmenter>(LineSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<LineSegmenter>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<LineSegmenter>, DataError> LineSegmenter::create_dictionary_with_options_v1(const DataProvider& provider, LineBreakOptionsV1 options) {
-  auto result = diplomat::capi::icu4x_LineSegmenter_create_dictionary_with_options_v1_mv1(provider.AsFFI(),
-    options.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<LineSegmenter>, DataError>(diplomat::Ok<std::unique_ptr<LineSegmenter>>(std::unique_ptr<LineSegmenter>(LineSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<LineSegmenter>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline std::unique_ptr<LineBreakIteratorUtf8> LineSegmenter::segment(std::string_view input) const {
-  auto result = diplomat::capi::icu4x_LineSegmenter_segment_utf8_mv1(this->AsFFI(),
-    input.data(),
-    input.size());
-  return std::unique_ptr<LineBreakIteratorUtf8>(LineBreakIteratorUtf8::FromFFI(result));
-}
-
-inline std::unique_ptr<LineBreakIteratorUtf16> LineSegmenter::segment16(std::u16string_view input) const {
-  auto result = diplomat::capi::icu4x_LineSegmenter_segment_utf16_mv1(this->AsFFI(),
-    input.data(),
-    input.size());
-  return std::unique_ptr<LineBreakIteratorUtf16>(LineBreakIteratorUtf16::FromFFI(result));
-}
-
-inline std::unique_ptr<LineBreakIteratorLatin1> LineSegmenter::segment_latin1(diplomat::span<const uint8_t> input) const {
-  auto result = diplomat::capi::icu4x_LineSegmenter_segment_latin1_mv1(this->AsFFI(),
-    input.data(),
-    input.size());
-  return std::unique_ptr<LineBreakIteratorLatin1>(LineBreakIteratorLatin1::FromFFI(result));
-}
-
-inline const diplomat::capi::LineSegmenter* LineSegmenter::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::LineSegmenter*>(this);
-}
-
-inline diplomat::capi::LineSegmenter* LineSegmenter::AsFFI() {
-  return reinterpret_cast<diplomat::capi::LineSegmenter*>(this);
-}
-
-inline const LineSegmenter* LineSegmenter::FromFFI(const diplomat::capi::LineSegmenter* ptr) {
-  return reinterpret_cast<const LineSegmenter*>(ptr);
-}
-
-inline LineSegmenter* LineSegmenter::FromFFI(diplomat::capi::LineSegmenter* ptr) {
-  return reinterpret_cast<LineSegmenter*>(ptr);
-}
-
-inline void LineSegmenter::operator delete(void* ptr) {
-  diplomat::capi::icu4x_LineSegmenter_destroy_mv1(reinterpret_cast<diplomat::capi::LineSegmenter*>(ptr));
-}
-
-
-#endif // LineSegmenter_HPP
diff --git a/ffi/capi/bindings/cpp/ListFormatter.d.hpp b/ffi/capi/bindings/cpp/ListFormatter.d.hpp
deleted file mode 100644
index 97831ba1fb5..00000000000
--- a/ffi/capi/bindings/cpp/ListFormatter.d.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef ListFormatter_D_HPP
-#define ListFormatter_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-class DataError;
-class ListLength;
-
-
-namespace diplomat {
-namespace capi {
-    struct ListFormatter;
-} // namespace capi
-} // namespace
-
-class ListFormatter {
-public:
-
-  inline static diplomat::result<std::unique_ptr<ListFormatter>, DataError> create_and_with_length(const DataProvider& provider, const Locale& locale, ListLength length);
-
-  inline static diplomat::result<std::unique_ptr<ListFormatter>, DataError> create_or_with_length(const DataProvider& provider, const Locale& locale, ListLength length);
-
-  inline static diplomat::result<std::unique_ptr<ListFormatter>, DataError> create_unit_with_length(const DataProvider& provider, const Locale& locale, ListLength length);
-
-  inline std::string format(diplomat::span<const std::string_view> list) const;
-
-  inline std::string format16(diplomat::span<const std::u16string_view> list) const;
-
-  inline const diplomat::capi::ListFormatter* AsFFI() const;
-  inline diplomat::capi::ListFormatter* AsFFI();
-  inline static const ListFormatter* FromFFI(const diplomat::capi::ListFormatter* ptr);
-  inline static ListFormatter* FromFFI(diplomat::capi::ListFormatter* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  ListFormatter() = delete;
-  ListFormatter(const ListFormatter&) = delete;
-  ListFormatter(ListFormatter&&) noexcept = delete;
-  ListFormatter operator=(const ListFormatter&) = delete;
-  ListFormatter operator=(ListFormatter&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // ListFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/ListFormatter.hpp b/ffi/capi/bindings/cpp/ListFormatter.hpp
deleted file mode 100644
index e8d3125e393..00000000000
--- a/ffi/capi/bindings/cpp/ListFormatter.hpp
+++ /dev/null
@@ -1,105 +0,0 @@
-#ifndef ListFormatter_HPP
-#define ListFormatter_HPP
-
-#include "ListFormatter.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "ListLength.hpp"
-#include "Locale.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_ListFormatter_create_and_with_length_mv1_result {union {diplomat::capi::ListFormatter* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_ListFormatter_create_and_with_length_mv1_result;
-    icu4x_ListFormatter_create_and_with_length_mv1_result icu4x_ListFormatter_create_and_with_length_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale, diplomat::capi::ListLength length);
-    
-    typedef struct icu4x_ListFormatter_create_or_with_length_mv1_result {union {diplomat::capi::ListFormatter* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_ListFormatter_create_or_with_length_mv1_result;
-    icu4x_ListFormatter_create_or_with_length_mv1_result icu4x_ListFormatter_create_or_with_length_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale, diplomat::capi::ListLength length);
-    
-    typedef struct icu4x_ListFormatter_create_unit_with_length_mv1_result {union {diplomat::capi::ListFormatter* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_ListFormatter_create_unit_with_length_mv1_result;
-    icu4x_ListFormatter_create_unit_with_length_mv1_result icu4x_ListFormatter_create_unit_with_length_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale, diplomat::capi::ListLength length);
-    
-    void icu4x_ListFormatter_format_utf8_mv1(const diplomat::capi::ListFormatter* self, diplomat::capi::DiplomatStringsView* list_data, size_t list_len, diplomat::capi::DiplomatWrite* write);
-    
-    void icu4x_ListFormatter_format_utf16_mv1(const diplomat::capi::ListFormatter* self, diplomat::capi::DiplomatStrings16View* list_data, size_t list_len, diplomat::capi::DiplomatWrite* write);
-    
-    
-    void icu4x_ListFormatter_destroy_mv1(ListFormatter* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<ListFormatter>, DataError> ListFormatter::create_and_with_length(const DataProvider& provider, const Locale& locale, ListLength length) {
-  auto result = diplomat::capi::icu4x_ListFormatter_create_and_with_length_mv1(provider.AsFFI(),
-    locale.AsFFI(),
-    length.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<ListFormatter>, DataError>(diplomat::Ok<std::unique_ptr<ListFormatter>>(std::unique_ptr<ListFormatter>(ListFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<ListFormatter>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<ListFormatter>, DataError> ListFormatter::create_or_with_length(const DataProvider& provider, const Locale& locale, ListLength length) {
-  auto result = diplomat::capi::icu4x_ListFormatter_create_or_with_length_mv1(provider.AsFFI(),
-    locale.AsFFI(),
-    length.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<ListFormatter>, DataError>(diplomat::Ok<std::unique_ptr<ListFormatter>>(std::unique_ptr<ListFormatter>(ListFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<ListFormatter>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<ListFormatter>, DataError> ListFormatter::create_unit_with_length(const DataProvider& provider, const Locale& locale, ListLength length) {
-  auto result = diplomat::capi::icu4x_ListFormatter_create_unit_with_length_mv1(provider.AsFFI(),
-    locale.AsFFI(),
-    length.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<ListFormatter>, DataError>(diplomat::Ok<std::unique_ptr<ListFormatter>>(std::unique_ptr<ListFormatter>(ListFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<ListFormatter>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline std::string ListFormatter::format(diplomat::span<const std::string_view> list) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_ListFormatter_format_utf8_mv1(this->AsFFI(),
-    list.data(),
-    list.size(),
-    &write);
-  return output;
-}
-
-inline std::string ListFormatter::format16(diplomat::span<const std::u16string_view> list) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_ListFormatter_format_utf16_mv1(this->AsFFI(),
-    list.data(),
-    list.size(),
-    &write);
-  return output;
-}
-
-inline const diplomat::capi::ListFormatter* ListFormatter::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::ListFormatter*>(this);
-}
-
-inline diplomat::capi::ListFormatter* ListFormatter::AsFFI() {
-  return reinterpret_cast<diplomat::capi::ListFormatter*>(this);
-}
-
-inline const ListFormatter* ListFormatter::FromFFI(const diplomat::capi::ListFormatter* ptr) {
-  return reinterpret_cast<const ListFormatter*>(ptr);
-}
-
-inline ListFormatter* ListFormatter::FromFFI(diplomat::capi::ListFormatter* ptr) {
-  return reinterpret_cast<ListFormatter*>(ptr);
-}
-
-inline void ListFormatter::operator delete(void* ptr) {
-  diplomat::capi::icu4x_ListFormatter_destroy_mv1(reinterpret_cast<diplomat::capi::ListFormatter*>(ptr));
-}
-
-
-#endif // ListFormatter_HPP
diff --git a/ffi/capi/bindings/cpp/ListLength.hpp b/ffi/capi/bindings/cpp/ListLength.hpp
deleted file mode 100644
index 53a18125a16..00000000000
--- a/ffi/capi/bindings/cpp/ListLength.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef ListLength_HPP
-#define ListLength_HPP
-
-#include "ListLength.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::ListLength ListLength::AsFFI() const {
-  return static_cast<diplomat::capi::ListLength>(value);
-}
-
-inline ListLength ListLength::FromFFI(diplomat::capi::ListLength c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::ListLength_Wide:
-    case diplomat::capi::ListLength_Short:
-    case diplomat::capi::ListLength_Narrow:
-      return static_cast<ListLength::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // ListLength_HPP
diff --git a/ffi/capi/bindings/cpp/Locale.d.hpp b/ffi/capi/bindings/cpp/Locale.d.hpp
deleted file mode 100644
index d672ddae4c8..00000000000
--- a/ffi/capi/bindings/cpp/Locale.d.hpp
+++ /dev/null
@@ -1,71 +0,0 @@
-#ifndef Locale_D_HPP
-#define Locale_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-class LocaleParseError;
-
-
-namespace diplomat {
-namespace capi {
-    struct Locale;
-} // namespace capi
-} // namespace
-
-class Locale {
-public:
-
-  inline static diplomat::result<std::unique_ptr<Locale>, LocaleParseError> from_string(std::string_view name);
-
-  inline static std::unique_ptr<Locale> und();
-
-  inline std::unique_ptr<Locale> clone() const;
-
-  inline std::string basename() const;
-
-  inline std::optional<std::string> get_unicode_extension(std::string_view s) const;
-
-  inline std::string language() const;
-
-  inline diplomat::result<std::monostate, LocaleParseError> set_language(std::string_view s);
-
-  inline std::optional<std::string> region() const;
-
-  inline diplomat::result<std::monostate, LocaleParseError> set_region(std::string_view s);
-
-  inline std::optional<std::string> script() const;
-
-  inline diplomat::result<std::monostate, LocaleParseError> set_script(std::string_view s);
-
-  inline static diplomat::result<std::string, LocaleParseError> canonicalize(std::string_view s);
-
-  inline std::string to_string() const;
-
-  inline bool normalizing_eq(std::string_view other) const;
-
-  inline int8_t compare_to_string(std::string_view other) const;
-
-  inline int8_t compare_to(const Locale& other) const;
-
-  inline const diplomat::capi::Locale* AsFFI() const;
-  inline diplomat::capi::Locale* AsFFI();
-  inline static const Locale* FromFFI(const diplomat::capi::Locale* ptr);
-  inline static Locale* FromFFI(diplomat::capi::Locale* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  Locale() = delete;
-  Locale(const Locale&) = delete;
-  Locale(Locale&&) noexcept = delete;
-  Locale operator=(const Locale&) = delete;
-  Locale operator=(Locale&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // Locale_D_HPP
diff --git a/ffi/capi/bindings/cpp/Locale.hpp b/ffi/capi/bindings/cpp/Locale.hpp
deleted file mode 100644
index 1fdc4fee867..00000000000
--- a/ffi/capi/bindings/cpp/Locale.hpp
+++ /dev/null
@@ -1,204 +0,0 @@
-#ifndef Locale_HPP
-#define Locale_HPP
-
-#include "Locale.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "LocaleParseError.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_Locale_from_string_mv1_result {union {diplomat::capi::Locale* ok; diplomat::capi::LocaleParseError err;}; bool is_ok;} icu4x_Locale_from_string_mv1_result;
-    icu4x_Locale_from_string_mv1_result icu4x_Locale_from_string_mv1(const char* name_data, size_t name_len);
-    
-    diplomat::capi::Locale* icu4x_Locale_und_mv1(void);
-    
-    diplomat::capi::Locale* icu4x_Locale_clone_mv1(const diplomat::capi::Locale* self);
-    
-    void icu4x_Locale_basename_mv1(const diplomat::capi::Locale* self, diplomat::capi::DiplomatWrite* write);
-    
-    typedef struct icu4x_Locale_get_unicode_extension_mv1_result { bool is_ok;} icu4x_Locale_get_unicode_extension_mv1_result;
-    icu4x_Locale_get_unicode_extension_mv1_result icu4x_Locale_get_unicode_extension_mv1(const diplomat::capi::Locale* self, const char* s_data, size_t s_len, diplomat::capi::DiplomatWrite* write);
-    
-    void icu4x_Locale_language_mv1(const diplomat::capi::Locale* self, diplomat::capi::DiplomatWrite* write);
-    
-    typedef struct icu4x_Locale_set_language_mv1_result {union { diplomat::capi::LocaleParseError err;}; bool is_ok;} icu4x_Locale_set_language_mv1_result;
-    icu4x_Locale_set_language_mv1_result icu4x_Locale_set_language_mv1(diplomat::capi::Locale* self, const char* s_data, size_t s_len);
-    
-    typedef struct icu4x_Locale_region_mv1_result { bool is_ok;} icu4x_Locale_region_mv1_result;
-    icu4x_Locale_region_mv1_result icu4x_Locale_region_mv1(const diplomat::capi::Locale* self, diplomat::capi::DiplomatWrite* write);
-    
-    typedef struct icu4x_Locale_set_region_mv1_result {union { diplomat::capi::LocaleParseError err;}; bool is_ok;} icu4x_Locale_set_region_mv1_result;
-    icu4x_Locale_set_region_mv1_result icu4x_Locale_set_region_mv1(diplomat::capi::Locale* self, const char* s_data, size_t s_len);
-    
-    typedef struct icu4x_Locale_script_mv1_result { bool is_ok;} icu4x_Locale_script_mv1_result;
-    icu4x_Locale_script_mv1_result icu4x_Locale_script_mv1(const diplomat::capi::Locale* self, diplomat::capi::DiplomatWrite* write);
-    
-    typedef struct icu4x_Locale_set_script_mv1_result {union { diplomat::capi::LocaleParseError err;}; bool is_ok;} icu4x_Locale_set_script_mv1_result;
-    icu4x_Locale_set_script_mv1_result icu4x_Locale_set_script_mv1(diplomat::capi::Locale* self, const char* s_data, size_t s_len);
-    
-    typedef struct icu4x_Locale_canonicalize_mv1_result {union { diplomat::capi::LocaleParseError err;}; bool is_ok;} icu4x_Locale_canonicalize_mv1_result;
-    icu4x_Locale_canonicalize_mv1_result icu4x_Locale_canonicalize_mv1(const char* s_data, size_t s_len, diplomat::capi::DiplomatWrite* write);
-    
-    void icu4x_Locale_to_string_mv1(const diplomat::capi::Locale* self, diplomat::capi::DiplomatWrite* write);
-    
-    bool icu4x_Locale_normalizing_eq_mv1(const diplomat::capi::Locale* self, const char* other_data, size_t other_len);
-    
-    int8_t icu4x_Locale_compare_to_string_mv1(const diplomat::capi::Locale* self, const char* other_data, size_t other_len);
-    
-    int8_t icu4x_Locale_compare_to_mv1(const diplomat::capi::Locale* self, const diplomat::capi::Locale* other);
-    
-    
-    void icu4x_Locale_destroy_mv1(Locale* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<Locale>, LocaleParseError> Locale::from_string(std::string_view name) {
-  auto result = diplomat::capi::icu4x_Locale_from_string_mv1(name.data(),
-    name.size());
-  return result.is_ok ? diplomat::result<std::unique_ptr<Locale>, LocaleParseError>(diplomat::Ok<std::unique_ptr<Locale>>(std::unique_ptr<Locale>(Locale::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<Locale>, LocaleParseError>(diplomat::Err<LocaleParseError>(LocaleParseError::FromFFI(result.err)));
-}
-
-inline std::unique_ptr<Locale> Locale::und() {
-  auto result = diplomat::capi::icu4x_Locale_und_mv1();
-  return std::unique_ptr<Locale>(Locale::FromFFI(result));
-}
-
-inline std::unique_ptr<Locale> Locale::clone() const {
-  auto result = diplomat::capi::icu4x_Locale_clone_mv1(this->AsFFI());
-  return std::unique_ptr<Locale>(Locale::FromFFI(result));
-}
-
-inline std::string Locale::basename() const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_Locale_basename_mv1(this->AsFFI(),
-    &write);
-  return output;
-}
-
-inline std::optional<std::string> Locale::get_unicode_extension(std::string_view s) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_Locale_get_unicode_extension_mv1(this->AsFFI(),
-    s.data(),
-    s.size(),
-    &write);
-  return result.is_ok ? std::optional<std::string>(std::move(output)) : std::nullopt;
-}
-
-inline std::string Locale::language() const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_Locale_language_mv1(this->AsFFI(),
-    &write);
-  return output;
-}
-
-inline diplomat::result<std::monostate, LocaleParseError> Locale::set_language(std::string_view s) {
-  auto result = diplomat::capi::icu4x_Locale_set_language_mv1(this->AsFFI(),
-    s.data(),
-    s.size());
-  return result.is_ok ? diplomat::result<std::monostate, LocaleParseError>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, LocaleParseError>(diplomat::Err<LocaleParseError>(LocaleParseError::FromFFI(result.err)));
-}
-
-inline std::optional<std::string> Locale::region() const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_Locale_region_mv1(this->AsFFI(),
-    &write);
-  return result.is_ok ? std::optional<std::string>(std::move(output)) : std::nullopt;
-}
-
-inline diplomat::result<std::monostate, LocaleParseError> Locale::set_region(std::string_view s) {
-  auto result = diplomat::capi::icu4x_Locale_set_region_mv1(this->AsFFI(),
-    s.data(),
-    s.size());
-  return result.is_ok ? diplomat::result<std::monostate, LocaleParseError>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, LocaleParseError>(diplomat::Err<LocaleParseError>(LocaleParseError::FromFFI(result.err)));
-}
-
-inline std::optional<std::string> Locale::script() const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_Locale_script_mv1(this->AsFFI(),
-    &write);
-  return result.is_ok ? std::optional<std::string>(std::move(output)) : std::nullopt;
-}
-
-inline diplomat::result<std::monostate, LocaleParseError> Locale::set_script(std::string_view s) {
-  auto result = diplomat::capi::icu4x_Locale_set_script_mv1(this->AsFFI(),
-    s.data(),
-    s.size());
-  return result.is_ok ? diplomat::result<std::monostate, LocaleParseError>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, LocaleParseError>(diplomat::Err<LocaleParseError>(LocaleParseError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::string, LocaleParseError> Locale::canonicalize(std::string_view s) {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_Locale_canonicalize_mv1(s.data(),
-    s.size(),
-    &write);
-  return result.is_ok ? diplomat::result<std::string, LocaleParseError>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, LocaleParseError>(diplomat::Err<LocaleParseError>(LocaleParseError::FromFFI(result.err)));
-}
-
-inline std::string Locale::to_string() const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_Locale_to_string_mv1(this->AsFFI(),
-    &write);
-  return output;
-}
-
-inline bool Locale::normalizing_eq(std::string_view other) const {
-  auto result = diplomat::capi::icu4x_Locale_normalizing_eq_mv1(this->AsFFI(),
-    other.data(),
-    other.size());
-  return result;
-}
-
-inline int8_t Locale::compare_to_string(std::string_view other) const {
-  auto result = diplomat::capi::icu4x_Locale_compare_to_string_mv1(this->AsFFI(),
-    other.data(),
-    other.size());
-  return result;
-}
-
-inline int8_t Locale::compare_to(const Locale& other) const {
-  auto result = diplomat::capi::icu4x_Locale_compare_to_mv1(this->AsFFI(),
-    other.AsFFI());
-  return result;
-}
-
-inline const diplomat::capi::Locale* Locale::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::Locale*>(this);
-}
-
-inline diplomat::capi::Locale* Locale::AsFFI() {
-  return reinterpret_cast<diplomat::capi::Locale*>(this);
-}
-
-inline const Locale* Locale::FromFFI(const diplomat::capi::Locale* ptr) {
-  return reinterpret_cast<const Locale*>(ptr);
-}
-
-inline Locale* Locale::FromFFI(diplomat::capi::Locale* ptr) {
-  return reinterpret_cast<Locale*>(ptr);
-}
-
-inline void Locale::operator delete(void* ptr) {
-  diplomat::capi::icu4x_Locale_destroy_mv1(reinterpret_cast<diplomat::capi::Locale*>(ptr));
-}
-
-
-#endif // Locale_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleCanonicalizer.d.hpp b/ffi/capi/bindings/cpp/LocaleCanonicalizer.d.hpp
deleted file mode 100644
index fb63599cdcf..00000000000
--- a/ffi/capi/bindings/cpp/LocaleCanonicalizer.d.hpp
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef LocaleCanonicalizer_D_HPP
-#define LocaleCanonicalizer_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-class Error;
-class TransformResult;
-
-
-namespace diplomat {
-namespace capi {
-    struct LocaleCanonicalizer;
-} // namespace capi
-} // namespace
-
-class LocaleCanonicalizer {
-public:
-
-  inline static diplomat::result<std::unique_ptr<LocaleCanonicalizer>, Error> create(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<LocaleCanonicalizer>, Error> create_extended(const DataProvider& provider);
-
-  inline TransformResult canonicalize(Locale& locale) const;
-
-  inline const diplomat::capi::LocaleCanonicalizer* AsFFI() const;
-  inline diplomat::capi::LocaleCanonicalizer* AsFFI();
-  inline static const LocaleCanonicalizer* FromFFI(const diplomat::capi::LocaleCanonicalizer* ptr);
-  inline static LocaleCanonicalizer* FromFFI(diplomat::capi::LocaleCanonicalizer* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  LocaleCanonicalizer() = delete;
-  LocaleCanonicalizer(const LocaleCanonicalizer&) = delete;
-  LocaleCanonicalizer(LocaleCanonicalizer&&) noexcept = delete;
-  LocaleCanonicalizer operator=(const LocaleCanonicalizer&) = delete;
-  LocaleCanonicalizer operator=(LocaleCanonicalizer&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // LocaleCanonicalizer_D_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleCanonicalizer.hpp b/ffi/capi/bindings/cpp/LocaleCanonicalizer.hpp
deleted file mode 100644
index 4acc5243f46..00000000000
--- a/ffi/capi/bindings/cpp/LocaleCanonicalizer.hpp
+++ /dev/null
@@ -1,75 +0,0 @@
-#ifndef LocaleCanonicalizer_HPP
-#define LocaleCanonicalizer_HPP
-
-#include "LocaleCanonicalizer.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataProvider.hpp"
-#include "Error.hpp"
-#include "Locale.hpp"
-#include "TransformResult.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_LocaleCanonicalizer_create_mv1_result {union {diplomat::capi::LocaleCanonicalizer* ok; diplomat::capi::Error err;}; bool is_ok;} icu4x_LocaleCanonicalizer_create_mv1_result;
-    icu4x_LocaleCanonicalizer_create_mv1_result icu4x_LocaleCanonicalizer_create_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_LocaleCanonicalizer_create_extended_mv1_result {union {diplomat::capi::LocaleCanonicalizer* ok; diplomat::capi::Error err;}; bool is_ok;} icu4x_LocaleCanonicalizer_create_extended_mv1_result;
-    icu4x_LocaleCanonicalizer_create_extended_mv1_result icu4x_LocaleCanonicalizer_create_extended_mv1(const diplomat::capi::DataProvider* provider);
-    
-    diplomat::capi::TransformResult icu4x_LocaleCanonicalizer_canonicalize_mv1(const diplomat::capi::LocaleCanonicalizer* self, diplomat::capi::Locale* locale);
-    
-    
-    void icu4x_LocaleCanonicalizer_destroy_mv1(LocaleCanonicalizer* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<LocaleCanonicalizer>, Error> LocaleCanonicalizer::create(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_LocaleCanonicalizer_create_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<LocaleCanonicalizer>, Error>(diplomat::Ok<std::unique_ptr<LocaleCanonicalizer>>(std::unique_ptr<LocaleCanonicalizer>(LocaleCanonicalizer::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<LocaleCanonicalizer>, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<LocaleCanonicalizer>, Error> LocaleCanonicalizer::create_extended(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_LocaleCanonicalizer_create_extended_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<LocaleCanonicalizer>, Error>(diplomat::Ok<std::unique_ptr<LocaleCanonicalizer>>(std::unique_ptr<LocaleCanonicalizer>(LocaleCanonicalizer::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<LocaleCanonicalizer>, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline TransformResult LocaleCanonicalizer::canonicalize(Locale& locale) const {
-  auto result = diplomat::capi::icu4x_LocaleCanonicalizer_canonicalize_mv1(this->AsFFI(),
-    locale.AsFFI());
-  return TransformResult::FromFFI(result);
-}
-
-inline const diplomat::capi::LocaleCanonicalizer* LocaleCanonicalizer::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::LocaleCanonicalizer*>(this);
-}
-
-inline diplomat::capi::LocaleCanonicalizer* LocaleCanonicalizer::AsFFI() {
-  return reinterpret_cast<diplomat::capi::LocaleCanonicalizer*>(this);
-}
-
-inline const LocaleCanonicalizer* LocaleCanonicalizer::FromFFI(const diplomat::capi::LocaleCanonicalizer* ptr) {
-  return reinterpret_cast<const LocaleCanonicalizer*>(ptr);
-}
-
-inline LocaleCanonicalizer* LocaleCanonicalizer::FromFFI(diplomat::capi::LocaleCanonicalizer* ptr) {
-  return reinterpret_cast<LocaleCanonicalizer*>(ptr);
-}
-
-inline void LocaleCanonicalizer::operator delete(void* ptr) {
-  diplomat::capi::icu4x_LocaleCanonicalizer_destroy_mv1(reinterpret_cast<diplomat::capi::LocaleCanonicalizer*>(ptr));
-}
-
-
-#endif // LocaleCanonicalizer_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleDirection.hpp b/ffi/capi/bindings/cpp/LocaleDirection.hpp
deleted file mode 100644
index e67cc1ec5a0..00000000000
--- a/ffi/capi/bindings/cpp/LocaleDirection.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef LocaleDirection_HPP
-#define LocaleDirection_HPP
-
-#include "LocaleDirection.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::LocaleDirection LocaleDirection::AsFFI() const {
-  return static_cast<diplomat::capi::LocaleDirection>(value);
-}
-
-inline LocaleDirection LocaleDirection::FromFFI(diplomat::capi::LocaleDirection c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::LocaleDirection_LeftToRight:
-    case diplomat::capi::LocaleDirection_RightToLeft:
-    case diplomat::capi::LocaleDirection_Unknown:
-      return static_cast<LocaleDirection::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // LocaleDirection_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleDirectionality.d.hpp b/ffi/capi/bindings/cpp/LocaleDirectionality.d.hpp
deleted file mode 100644
index 156323396e4..00000000000
--- a/ffi/capi/bindings/cpp/LocaleDirectionality.d.hpp
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef LocaleDirectionality_D_HPP
-#define LocaleDirectionality_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-namespace diplomat::capi { struct LocaleExpander; }
-class LocaleExpander;
-class DataError;
-class LocaleDirection;
-
-
-namespace diplomat {
-namespace capi {
-    struct LocaleDirectionality;
-} // namespace capi
-} // namespace
-
-class LocaleDirectionality {
-public:
-
-  inline static diplomat::result<std::unique_ptr<LocaleDirectionality>, DataError> create(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<LocaleDirectionality>, DataError> create_with_expander(const DataProvider& provider, const LocaleExpander& expander);
-
-  inline LocaleDirection get(const Locale& locale) const;
-
-  inline bool is_left_to_right(const Locale& locale) const;
-
-  inline bool is_right_to_left(const Locale& locale) const;
-
-  inline const diplomat::capi::LocaleDirectionality* AsFFI() const;
-  inline diplomat::capi::LocaleDirectionality* AsFFI();
-  inline static const LocaleDirectionality* FromFFI(const diplomat::capi::LocaleDirectionality* ptr);
-  inline static LocaleDirectionality* FromFFI(diplomat::capi::LocaleDirectionality* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  LocaleDirectionality() = delete;
-  LocaleDirectionality(const LocaleDirectionality&) = delete;
-  LocaleDirectionality(LocaleDirectionality&&) noexcept = delete;
-  LocaleDirectionality operator=(const LocaleDirectionality&) = delete;
-  LocaleDirectionality operator=(LocaleDirectionality&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // LocaleDirectionality_D_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleDirectionality.hpp b/ffi/capi/bindings/cpp/LocaleDirectionality.hpp
deleted file mode 100644
index d14797c76a5..00000000000
--- a/ffi/capi/bindings/cpp/LocaleDirectionality.hpp
+++ /dev/null
@@ -1,93 +0,0 @@
-#ifndef LocaleDirectionality_HPP
-#define LocaleDirectionality_HPP
-
-#include "LocaleDirectionality.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "Locale.hpp"
-#include "LocaleDirection.hpp"
-#include "LocaleExpander.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_LocaleDirectionality_create_mv1_result {union {diplomat::capi::LocaleDirectionality* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_LocaleDirectionality_create_mv1_result;
-    icu4x_LocaleDirectionality_create_mv1_result icu4x_LocaleDirectionality_create_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_LocaleDirectionality_create_with_expander_mv1_result {union {diplomat::capi::LocaleDirectionality* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_LocaleDirectionality_create_with_expander_mv1_result;
-    icu4x_LocaleDirectionality_create_with_expander_mv1_result icu4x_LocaleDirectionality_create_with_expander_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::LocaleExpander* expander);
-    
-    diplomat::capi::LocaleDirection icu4x_LocaleDirectionality_get_mv1(const diplomat::capi::LocaleDirectionality* self, const diplomat::capi::Locale* locale);
-    
-    bool icu4x_LocaleDirectionality_is_left_to_right_mv1(const diplomat::capi::LocaleDirectionality* self, const diplomat::capi::Locale* locale);
-    
-    bool icu4x_LocaleDirectionality_is_right_to_left_mv1(const diplomat::capi::LocaleDirectionality* self, const diplomat::capi::Locale* locale);
-    
-    
-    void icu4x_LocaleDirectionality_destroy_mv1(LocaleDirectionality* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<LocaleDirectionality>, DataError> LocaleDirectionality::create(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_LocaleDirectionality_create_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<LocaleDirectionality>, DataError>(diplomat::Ok<std::unique_ptr<LocaleDirectionality>>(std::unique_ptr<LocaleDirectionality>(LocaleDirectionality::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<LocaleDirectionality>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<LocaleDirectionality>, DataError> LocaleDirectionality::create_with_expander(const DataProvider& provider, const LocaleExpander& expander) {
-  auto result = diplomat::capi::icu4x_LocaleDirectionality_create_with_expander_mv1(provider.AsFFI(),
-    expander.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<LocaleDirectionality>, DataError>(diplomat::Ok<std::unique_ptr<LocaleDirectionality>>(std::unique_ptr<LocaleDirectionality>(LocaleDirectionality::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<LocaleDirectionality>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline LocaleDirection LocaleDirectionality::get(const Locale& locale) const {
-  auto result = diplomat::capi::icu4x_LocaleDirectionality_get_mv1(this->AsFFI(),
-    locale.AsFFI());
-  return LocaleDirection::FromFFI(result);
-}
-
-inline bool LocaleDirectionality::is_left_to_right(const Locale& locale) const {
-  auto result = diplomat::capi::icu4x_LocaleDirectionality_is_left_to_right_mv1(this->AsFFI(),
-    locale.AsFFI());
-  return result;
-}
-
-inline bool LocaleDirectionality::is_right_to_left(const Locale& locale) const {
-  auto result = diplomat::capi::icu4x_LocaleDirectionality_is_right_to_left_mv1(this->AsFFI(),
-    locale.AsFFI());
-  return result;
-}
-
-inline const diplomat::capi::LocaleDirectionality* LocaleDirectionality::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::LocaleDirectionality*>(this);
-}
-
-inline diplomat::capi::LocaleDirectionality* LocaleDirectionality::AsFFI() {
-  return reinterpret_cast<diplomat::capi::LocaleDirectionality*>(this);
-}
-
-inline const LocaleDirectionality* LocaleDirectionality::FromFFI(const diplomat::capi::LocaleDirectionality* ptr) {
-  return reinterpret_cast<const LocaleDirectionality*>(ptr);
-}
-
-inline LocaleDirectionality* LocaleDirectionality::FromFFI(diplomat::capi::LocaleDirectionality* ptr) {
-  return reinterpret_cast<LocaleDirectionality*>(ptr);
-}
-
-inline void LocaleDirectionality::operator delete(void* ptr) {
-  diplomat::capi::icu4x_LocaleDirectionality_destroy_mv1(reinterpret_cast<diplomat::capi::LocaleDirectionality*>(ptr));
-}
-
-
-#endif // LocaleDirectionality_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleDisplayNamesFormatter.d.hpp b/ffi/capi/bindings/cpp/LocaleDisplayNamesFormatter.d.hpp
deleted file mode 100644
index 8ebafd683e0..00000000000
--- a/ffi/capi/bindings/cpp/LocaleDisplayNamesFormatter.d.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef LocaleDisplayNamesFormatter_D_HPP
-#define LocaleDisplayNamesFormatter_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-struct DisplayNamesOptionsV1;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct LocaleDisplayNamesFormatter;
-} // namespace capi
-} // namespace
-
-class LocaleDisplayNamesFormatter {
-public:
-
-  inline static diplomat::result<std::unique_ptr<LocaleDisplayNamesFormatter>, DataError> create_v1(const DataProvider& provider, const Locale& locale, DisplayNamesOptionsV1 options);
-
-  inline std::string of(const Locale& locale) const;
-
-  inline const diplomat::capi::LocaleDisplayNamesFormatter* AsFFI() const;
-  inline diplomat::capi::LocaleDisplayNamesFormatter* AsFFI();
-  inline static const LocaleDisplayNamesFormatter* FromFFI(const diplomat::capi::LocaleDisplayNamesFormatter* ptr);
-  inline static LocaleDisplayNamesFormatter* FromFFI(diplomat::capi::LocaleDisplayNamesFormatter* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  LocaleDisplayNamesFormatter() = delete;
-  LocaleDisplayNamesFormatter(const LocaleDisplayNamesFormatter&) = delete;
-  LocaleDisplayNamesFormatter(LocaleDisplayNamesFormatter&&) noexcept = delete;
-  LocaleDisplayNamesFormatter operator=(const LocaleDisplayNamesFormatter&) = delete;
-  LocaleDisplayNamesFormatter operator=(LocaleDisplayNamesFormatter&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // LocaleDisplayNamesFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleDisplayNamesFormatter.hpp b/ffi/capi/bindings/cpp/LocaleDisplayNamesFormatter.hpp
deleted file mode 100644
index eb04a48af01..00000000000
--- a/ffi/capi/bindings/cpp/LocaleDisplayNamesFormatter.hpp
+++ /dev/null
@@ -1,72 +0,0 @@
-#ifndef LocaleDisplayNamesFormatter_HPP
-#define LocaleDisplayNamesFormatter_HPP
-
-#include "LocaleDisplayNamesFormatter.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "DisplayNamesOptionsV1.hpp"
-#include "Locale.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_LocaleDisplayNamesFormatter_create_v1_mv1_result {union {diplomat::capi::LocaleDisplayNamesFormatter* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_LocaleDisplayNamesFormatter_create_v1_mv1_result;
-    icu4x_LocaleDisplayNamesFormatter_create_v1_mv1_result icu4x_LocaleDisplayNamesFormatter_create_v1_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale, diplomat::capi::DisplayNamesOptionsV1 options);
-    
-    void icu4x_LocaleDisplayNamesFormatter_of_mv1(const diplomat::capi::LocaleDisplayNamesFormatter* self, const diplomat::capi::Locale* locale, diplomat::capi::DiplomatWrite* write);
-    
-    
-    void icu4x_LocaleDisplayNamesFormatter_destroy_mv1(LocaleDisplayNamesFormatter* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<LocaleDisplayNamesFormatter>, DataError> LocaleDisplayNamesFormatter::create_v1(const DataProvider& provider, const Locale& locale, DisplayNamesOptionsV1 options) {
-  auto result = diplomat::capi::icu4x_LocaleDisplayNamesFormatter_create_v1_mv1(provider.AsFFI(),
-    locale.AsFFI(),
-    options.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<LocaleDisplayNamesFormatter>, DataError>(diplomat::Ok<std::unique_ptr<LocaleDisplayNamesFormatter>>(std::unique_ptr<LocaleDisplayNamesFormatter>(LocaleDisplayNamesFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<LocaleDisplayNamesFormatter>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline std::string LocaleDisplayNamesFormatter::of(const Locale& locale) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_LocaleDisplayNamesFormatter_of_mv1(this->AsFFI(),
-    locale.AsFFI(),
-    &write);
-  return output;
-}
-
-inline const diplomat::capi::LocaleDisplayNamesFormatter* LocaleDisplayNamesFormatter::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::LocaleDisplayNamesFormatter*>(this);
-}
-
-inline diplomat::capi::LocaleDisplayNamesFormatter* LocaleDisplayNamesFormatter::AsFFI() {
-  return reinterpret_cast<diplomat::capi::LocaleDisplayNamesFormatter*>(this);
-}
-
-inline const LocaleDisplayNamesFormatter* LocaleDisplayNamesFormatter::FromFFI(const diplomat::capi::LocaleDisplayNamesFormatter* ptr) {
-  return reinterpret_cast<const LocaleDisplayNamesFormatter*>(ptr);
-}
-
-inline LocaleDisplayNamesFormatter* LocaleDisplayNamesFormatter::FromFFI(diplomat::capi::LocaleDisplayNamesFormatter* ptr) {
-  return reinterpret_cast<LocaleDisplayNamesFormatter*>(ptr);
-}
-
-inline void LocaleDisplayNamesFormatter::operator delete(void* ptr) {
-  diplomat::capi::icu4x_LocaleDisplayNamesFormatter_destroy_mv1(reinterpret_cast<diplomat::capi::LocaleDisplayNamesFormatter*>(ptr));
-}
-
-
-#endif // LocaleDisplayNamesFormatter_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleExpander.d.hpp b/ffi/capi/bindings/cpp/LocaleExpander.d.hpp
deleted file mode 100644
index f0d4f03ad9a..00000000000
--- a/ffi/capi/bindings/cpp/LocaleExpander.d.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef LocaleExpander_D_HPP
-#define LocaleExpander_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-class Error;
-class TransformResult;
-
-
-namespace diplomat {
-namespace capi {
-    struct LocaleExpander;
-} // namespace capi
-} // namespace
-
-class LocaleExpander {
-public:
-
-  inline static diplomat::result<std::unique_ptr<LocaleExpander>, Error> create(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<LocaleExpander>, Error> create_extended(const DataProvider& provider);
-
-  inline TransformResult maximize(Locale& locale) const;
-
-  inline TransformResult minimize(Locale& locale) const;
-
-  inline TransformResult minimize_favor_script(Locale& locale) const;
-
-  inline const diplomat::capi::LocaleExpander* AsFFI() const;
-  inline diplomat::capi::LocaleExpander* AsFFI();
-  inline static const LocaleExpander* FromFFI(const diplomat::capi::LocaleExpander* ptr);
-  inline static LocaleExpander* FromFFI(diplomat::capi::LocaleExpander* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  LocaleExpander() = delete;
-  LocaleExpander(const LocaleExpander&) = delete;
-  LocaleExpander(LocaleExpander&&) noexcept = delete;
-  LocaleExpander operator=(const LocaleExpander&) = delete;
-  LocaleExpander operator=(LocaleExpander&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // LocaleExpander_D_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleExpander.hpp b/ffi/capi/bindings/cpp/LocaleExpander.hpp
deleted file mode 100644
index 5ccb7168509..00000000000
--- a/ffi/capi/bindings/cpp/LocaleExpander.hpp
+++ /dev/null
@@ -1,91 +0,0 @@
-#ifndef LocaleExpander_HPP
-#define LocaleExpander_HPP
-
-#include "LocaleExpander.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataProvider.hpp"
-#include "Error.hpp"
-#include "Locale.hpp"
-#include "TransformResult.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_LocaleExpander_create_mv1_result {union {diplomat::capi::LocaleExpander* ok; diplomat::capi::Error err;}; bool is_ok;} icu4x_LocaleExpander_create_mv1_result;
-    icu4x_LocaleExpander_create_mv1_result icu4x_LocaleExpander_create_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_LocaleExpander_create_extended_mv1_result {union {diplomat::capi::LocaleExpander* ok; diplomat::capi::Error err;}; bool is_ok;} icu4x_LocaleExpander_create_extended_mv1_result;
-    icu4x_LocaleExpander_create_extended_mv1_result icu4x_LocaleExpander_create_extended_mv1(const diplomat::capi::DataProvider* provider);
-    
-    diplomat::capi::TransformResult icu4x_LocaleExpander_maximize_mv1(const diplomat::capi::LocaleExpander* self, diplomat::capi::Locale* locale);
-    
-    diplomat::capi::TransformResult icu4x_LocaleExpander_minimize_mv1(const diplomat::capi::LocaleExpander* self, diplomat::capi::Locale* locale);
-    
-    diplomat::capi::TransformResult icu4x_LocaleExpander_minimize_favor_script_mv1(const diplomat::capi::LocaleExpander* self, diplomat::capi::Locale* locale);
-    
-    
-    void icu4x_LocaleExpander_destroy_mv1(LocaleExpander* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<LocaleExpander>, Error> LocaleExpander::create(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_LocaleExpander_create_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<LocaleExpander>, Error>(diplomat::Ok<std::unique_ptr<LocaleExpander>>(std::unique_ptr<LocaleExpander>(LocaleExpander::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<LocaleExpander>, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<LocaleExpander>, Error> LocaleExpander::create_extended(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_LocaleExpander_create_extended_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<LocaleExpander>, Error>(diplomat::Ok<std::unique_ptr<LocaleExpander>>(std::unique_ptr<LocaleExpander>(LocaleExpander::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<LocaleExpander>, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline TransformResult LocaleExpander::maximize(Locale& locale) const {
-  auto result = diplomat::capi::icu4x_LocaleExpander_maximize_mv1(this->AsFFI(),
-    locale.AsFFI());
-  return TransformResult::FromFFI(result);
-}
-
-inline TransformResult LocaleExpander::minimize(Locale& locale) const {
-  auto result = diplomat::capi::icu4x_LocaleExpander_minimize_mv1(this->AsFFI(),
-    locale.AsFFI());
-  return TransformResult::FromFFI(result);
-}
-
-inline TransformResult LocaleExpander::minimize_favor_script(Locale& locale) const {
-  auto result = diplomat::capi::icu4x_LocaleExpander_minimize_favor_script_mv1(this->AsFFI(),
-    locale.AsFFI());
-  return TransformResult::FromFFI(result);
-}
-
-inline const diplomat::capi::LocaleExpander* LocaleExpander::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::LocaleExpander*>(this);
-}
-
-inline diplomat::capi::LocaleExpander* LocaleExpander::AsFFI() {
-  return reinterpret_cast<diplomat::capi::LocaleExpander*>(this);
-}
-
-inline const LocaleExpander* LocaleExpander::FromFFI(const diplomat::capi::LocaleExpander* ptr) {
-  return reinterpret_cast<const LocaleExpander*>(ptr);
-}
-
-inline LocaleExpander* LocaleExpander::FromFFI(diplomat::capi::LocaleExpander* ptr) {
-  return reinterpret_cast<LocaleExpander*>(ptr);
-}
-
-inline void LocaleExpander::operator delete(void* ptr) {
-  diplomat::capi::icu4x_LocaleExpander_destroy_mv1(reinterpret_cast<diplomat::capi::LocaleExpander*>(ptr));
-}
-
-
-#endif // LocaleExpander_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleFallbackConfig.d.hpp b/ffi/capi/bindings/cpp/LocaleFallbackConfig.d.hpp
deleted file mode 100644
index 4d3ceb7968f..00000000000
--- a/ffi/capi/bindings/cpp/LocaleFallbackConfig.d.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef LocaleFallbackConfig_D_HPP
-#define LocaleFallbackConfig_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "LocaleFallbackPriority.d.hpp"
-#include "LocaleFallbackSupplement.d.hpp"
-#include "diplomat_runtime.hpp"
-
-class LocaleFallbackPriority;
-class LocaleFallbackSupplement;
-
-
-namespace diplomat {
-namespace capi {
-    struct LocaleFallbackConfig {
-      diplomat::capi::LocaleFallbackPriority priority;
-      diplomat::capi::DiplomatStringView extension_key;
-      diplomat::capi::LocaleFallbackSupplement fallback_supplement;
-    };
-} // namespace capi
-} // namespace
-
-
-struct LocaleFallbackConfig {
-  LocaleFallbackPriority priority;
-  std::string_view extension_key;
-  LocaleFallbackSupplement fallback_supplement;
-
-  inline diplomat::capi::LocaleFallbackConfig AsFFI() const;
-  inline static LocaleFallbackConfig FromFFI(diplomat::capi::LocaleFallbackConfig c_struct);
-};
-
-
-#endif // LocaleFallbackConfig_D_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleFallbackConfig.hpp b/ffi/capi/bindings/cpp/LocaleFallbackConfig.hpp
deleted file mode 100644
index 151f58cdcf9..00000000000
--- a/ffi/capi/bindings/cpp/LocaleFallbackConfig.hpp
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef LocaleFallbackConfig_HPP
-#define LocaleFallbackConfig_HPP
-
-#include "LocaleFallbackConfig.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "LocaleFallbackPriority.hpp"
-#include "LocaleFallbackSupplement.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-
-inline diplomat::capi::LocaleFallbackConfig LocaleFallbackConfig::AsFFI() const {
-  return diplomat::capi::LocaleFallbackConfig {
-    /* .priority = */ priority.AsFFI(),
-    /* .extension_key = */ {extension_key.data(), extension_key.size()},
-    /* .fallback_supplement = */ fallback_supplement.AsFFI(),
-  };
-}
-
-inline LocaleFallbackConfig LocaleFallbackConfig::FromFFI(diplomat::capi::LocaleFallbackConfig c_struct) {
-  return LocaleFallbackConfig {
-    /* .priority = */ LocaleFallbackPriority::FromFFI(c_struct.priority),
-    /* .extension_key = */ std::string_view(c_struct.extension_key.data, c_struct.extension_key.len),
-    /* .fallback_supplement = */ LocaleFallbackSupplement::FromFFI(c_struct.fallback_supplement),
-  };
-}
-
-
-#endif // LocaleFallbackConfig_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleFallbackIterator.d.hpp b/ffi/capi/bindings/cpp/LocaleFallbackIterator.d.hpp
deleted file mode 100644
index acc9fe20083..00000000000
--- a/ffi/capi/bindings/cpp/LocaleFallbackIterator.d.hpp
+++ /dev/null
@@ -1,42 +0,0 @@
-#ifndef LocaleFallbackIterator_D_HPP
-#define LocaleFallbackIterator_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct Locale; }
-class Locale;
-
-
-namespace diplomat {
-namespace capi {
-    struct LocaleFallbackIterator;
-} // namespace capi
-} // namespace
-
-class LocaleFallbackIterator {
-public:
-
-  inline std::unique_ptr<Locale> next();
-
-  inline const diplomat::capi::LocaleFallbackIterator* AsFFI() const;
-  inline diplomat::capi::LocaleFallbackIterator* AsFFI();
-  inline static const LocaleFallbackIterator* FromFFI(const diplomat::capi::LocaleFallbackIterator* ptr);
-  inline static LocaleFallbackIterator* FromFFI(diplomat::capi::LocaleFallbackIterator* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  LocaleFallbackIterator() = delete;
-  LocaleFallbackIterator(const LocaleFallbackIterator&) = delete;
-  LocaleFallbackIterator(LocaleFallbackIterator&&) noexcept = delete;
-  LocaleFallbackIterator operator=(const LocaleFallbackIterator&) = delete;
-  LocaleFallbackIterator operator=(LocaleFallbackIterator&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // LocaleFallbackIterator_D_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleFallbackIterator.hpp b/ffi/capi/bindings/cpp/LocaleFallbackIterator.hpp
deleted file mode 100644
index 70aae6261fb..00000000000
--- a/ffi/capi/bindings/cpp/LocaleFallbackIterator.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef LocaleFallbackIterator_HPP
-#define LocaleFallbackIterator_HPP
-
-#include "LocaleFallbackIterator.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "Locale.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    diplomat::capi::Locale* icu4x_LocaleFallbackIterator_next_mv1(diplomat::capi::LocaleFallbackIterator* self);
-    
-    
-    void icu4x_LocaleFallbackIterator_destroy_mv1(LocaleFallbackIterator* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline std::unique_ptr<Locale> LocaleFallbackIterator::next() {
-  auto result = diplomat::capi::icu4x_LocaleFallbackIterator_next_mv1(this->AsFFI());
-  return std::unique_ptr<Locale>(Locale::FromFFI(result));
-}
-
-inline const diplomat::capi::LocaleFallbackIterator* LocaleFallbackIterator::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::LocaleFallbackIterator*>(this);
-}
-
-inline diplomat::capi::LocaleFallbackIterator* LocaleFallbackIterator::AsFFI() {
-  return reinterpret_cast<diplomat::capi::LocaleFallbackIterator*>(this);
-}
-
-inline const LocaleFallbackIterator* LocaleFallbackIterator::FromFFI(const diplomat::capi::LocaleFallbackIterator* ptr) {
-  return reinterpret_cast<const LocaleFallbackIterator*>(ptr);
-}
-
-inline LocaleFallbackIterator* LocaleFallbackIterator::FromFFI(diplomat::capi::LocaleFallbackIterator* ptr) {
-  return reinterpret_cast<LocaleFallbackIterator*>(ptr);
-}
-
-inline void LocaleFallbackIterator::operator delete(void* ptr) {
-  diplomat::capi::icu4x_LocaleFallbackIterator_destroy_mv1(reinterpret_cast<diplomat::capi::LocaleFallbackIterator*>(ptr));
-}
-
-
-#endif // LocaleFallbackIterator_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleFallbackPriority.hpp b/ffi/capi/bindings/cpp/LocaleFallbackPriority.hpp
deleted file mode 100644
index 37dc135a9d9..00000000000
--- a/ffi/capi/bindings/cpp/LocaleFallbackPriority.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef LocaleFallbackPriority_HPP
-#define LocaleFallbackPriority_HPP
-
-#include "LocaleFallbackPriority.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::LocaleFallbackPriority LocaleFallbackPriority::AsFFI() const {
-  return static_cast<diplomat::capi::LocaleFallbackPriority>(value);
-}
-
-inline LocaleFallbackPriority LocaleFallbackPriority::FromFFI(diplomat::capi::LocaleFallbackPriority c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::LocaleFallbackPriority_Language:
-    case diplomat::capi::LocaleFallbackPriority_Region:
-    case diplomat::capi::LocaleFallbackPriority_Collation:
-      return static_cast<LocaleFallbackPriority::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // LocaleFallbackPriority_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleFallbackSupplement.hpp b/ffi/capi/bindings/cpp/LocaleFallbackSupplement.hpp
deleted file mode 100644
index 1a15b81a857..00000000000
--- a/ffi/capi/bindings/cpp/LocaleFallbackSupplement.hpp
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef LocaleFallbackSupplement_HPP
-#define LocaleFallbackSupplement_HPP
-
-#include "LocaleFallbackSupplement.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::LocaleFallbackSupplement LocaleFallbackSupplement::AsFFI() const {
-  return static_cast<diplomat::capi::LocaleFallbackSupplement>(value);
-}
-
-inline LocaleFallbackSupplement LocaleFallbackSupplement::FromFFI(diplomat::capi::LocaleFallbackSupplement c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::LocaleFallbackSupplement_None:
-    case diplomat::capi::LocaleFallbackSupplement_Collation:
-      return static_cast<LocaleFallbackSupplement::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // LocaleFallbackSupplement_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleFallbacker.d.hpp b/ffi/capi/bindings/cpp/LocaleFallbacker.d.hpp
deleted file mode 100644
index 7457c7ab6b8..00000000000
--- a/ffi/capi/bindings/cpp/LocaleFallbacker.d.hpp
+++ /dev/null
@@ -1,51 +0,0 @@
-#ifndef LocaleFallbacker_D_HPP
-#define LocaleFallbacker_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct LocaleFallbackerWithConfig; }
-class LocaleFallbackerWithConfig;
-struct LocaleFallbackConfig;
-class DataError;
-class LocaleParseError;
-
-
-namespace diplomat {
-namespace capi {
-    struct LocaleFallbacker;
-} // namespace capi
-} // namespace
-
-class LocaleFallbacker {
-public:
-
-  inline static diplomat::result<std::unique_ptr<LocaleFallbacker>, DataError> create(const DataProvider& provider);
-
-  inline static std::unique_ptr<LocaleFallbacker> without_data();
-
-  inline diplomat::result<std::unique_ptr<LocaleFallbackerWithConfig>, LocaleParseError> for_config(LocaleFallbackConfig config) const;
-
-  inline const diplomat::capi::LocaleFallbacker* AsFFI() const;
-  inline diplomat::capi::LocaleFallbacker* AsFFI();
-  inline static const LocaleFallbacker* FromFFI(const diplomat::capi::LocaleFallbacker* ptr);
-  inline static LocaleFallbacker* FromFFI(diplomat::capi::LocaleFallbacker* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  LocaleFallbacker() = delete;
-  LocaleFallbacker(const LocaleFallbacker&) = delete;
-  LocaleFallbacker(LocaleFallbacker&&) noexcept = delete;
-  LocaleFallbacker operator=(const LocaleFallbacker&) = delete;
-  LocaleFallbacker operator=(LocaleFallbacker&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // LocaleFallbacker_D_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleFallbacker.hpp b/ffi/capi/bindings/cpp/LocaleFallbacker.hpp
deleted file mode 100644
index cd5655e575d..00000000000
--- a/ffi/capi/bindings/cpp/LocaleFallbacker.hpp
+++ /dev/null
@@ -1,76 +0,0 @@
-#ifndef LocaleFallbacker_HPP
-#define LocaleFallbacker_HPP
-
-#include "LocaleFallbacker.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "LocaleFallbackConfig.hpp"
-#include "LocaleFallbackerWithConfig.hpp"
-#include "LocaleParseError.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_LocaleFallbacker_create_mv1_result {union {diplomat::capi::LocaleFallbacker* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_LocaleFallbacker_create_mv1_result;
-    icu4x_LocaleFallbacker_create_mv1_result icu4x_LocaleFallbacker_create_mv1(const diplomat::capi::DataProvider* provider);
-    
-    diplomat::capi::LocaleFallbacker* icu4x_LocaleFallbacker_without_data_mv1(void);
-    
-    typedef struct icu4x_LocaleFallbacker_for_config_mv1_result {union {diplomat::capi::LocaleFallbackerWithConfig* ok; diplomat::capi::LocaleParseError err;}; bool is_ok;} icu4x_LocaleFallbacker_for_config_mv1_result;
-    icu4x_LocaleFallbacker_for_config_mv1_result icu4x_LocaleFallbacker_for_config_mv1(const diplomat::capi::LocaleFallbacker* self, diplomat::capi::LocaleFallbackConfig config);
-    
-    
-    void icu4x_LocaleFallbacker_destroy_mv1(LocaleFallbacker* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<LocaleFallbacker>, DataError> LocaleFallbacker::create(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_LocaleFallbacker_create_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<LocaleFallbacker>, DataError>(diplomat::Ok<std::unique_ptr<LocaleFallbacker>>(std::unique_ptr<LocaleFallbacker>(LocaleFallbacker::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<LocaleFallbacker>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline std::unique_ptr<LocaleFallbacker> LocaleFallbacker::without_data() {
-  auto result = diplomat::capi::icu4x_LocaleFallbacker_without_data_mv1();
-  return std::unique_ptr<LocaleFallbacker>(LocaleFallbacker::FromFFI(result));
-}
-
-inline diplomat::result<std::unique_ptr<LocaleFallbackerWithConfig>, LocaleParseError> LocaleFallbacker::for_config(LocaleFallbackConfig config) const {
-  auto result = diplomat::capi::icu4x_LocaleFallbacker_for_config_mv1(this->AsFFI(),
-    config.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<LocaleFallbackerWithConfig>, LocaleParseError>(diplomat::Ok<std::unique_ptr<LocaleFallbackerWithConfig>>(std::unique_ptr<LocaleFallbackerWithConfig>(LocaleFallbackerWithConfig::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<LocaleFallbackerWithConfig>, LocaleParseError>(diplomat::Err<LocaleParseError>(LocaleParseError::FromFFI(result.err)));
-}
-
-inline const diplomat::capi::LocaleFallbacker* LocaleFallbacker::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::LocaleFallbacker*>(this);
-}
-
-inline diplomat::capi::LocaleFallbacker* LocaleFallbacker::AsFFI() {
-  return reinterpret_cast<diplomat::capi::LocaleFallbacker*>(this);
-}
-
-inline const LocaleFallbacker* LocaleFallbacker::FromFFI(const diplomat::capi::LocaleFallbacker* ptr) {
-  return reinterpret_cast<const LocaleFallbacker*>(ptr);
-}
-
-inline LocaleFallbacker* LocaleFallbacker::FromFFI(diplomat::capi::LocaleFallbacker* ptr) {
-  return reinterpret_cast<LocaleFallbacker*>(ptr);
-}
-
-inline void LocaleFallbacker::operator delete(void* ptr) {
-  diplomat::capi::icu4x_LocaleFallbacker_destroy_mv1(reinterpret_cast<diplomat::capi::LocaleFallbacker*>(ptr));
-}
-
-
-#endif // LocaleFallbacker_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleFallbackerWithConfig.d.hpp b/ffi/capi/bindings/cpp/LocaleFallbackerWithConfig.d.hpp
deleted file mode 100644
index 4b1450d7636..00000000000
--- a/ffi/capi/bindings/cpp/LocaleFallbackerWithConfig.d.hpp
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef LocaleFallbackerWithConfig_D_HPP
-#define LocaleFallbackerWithConfig_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct Locale; }
-class Locale;
-namespace diplomat::capi { struct LocaleFallbackIterator; }
-class LocaleFallbackIterator;
-
-
-namespace diplomat {
-namespace capi {
-    struct LocaleFallbackerWithConfig;
-} // namespace capi
-} // namespace
-
-class LocaleFallbackerWithConfig {
-public:
-
-  inline std::unique_ptr<LocaleFallbackIterator> fallback_for_locale(const Locale& locale) const;
-
-  inline const diplomat::capi::LocaleFallbackerWithConfig* AsFFI() const;
-  inline diplomat::capi::LocaleFallbackerWithConfig* AsFFI();
-  inline static const LocaleFallbackerWithConfig* FromFFI(const diplomat::capi::LocaleFallbackerWithConfig* ptr);
-  inline static LocaleFallbackerWithConfig* FromFFI(diplomat::capi::LocaleFallbackerWithConfig* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  LocaleFallbackerWithConfig() = delete;
-  LocaleFallbackerWithConfig(const LocaleFallbackerWithConfig&) = delete;
-  LocaleFallbackerWithConfig(LocaleFallbackerWithConfig&&) noexcept = delete;
-  LocaleFallbackerWithConfig operator=(const LocaleFallbackerWithConfig&) = delete;
-  LocaleFallbackerWithConfig operator=(LocaleFallbackerWithConfig&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // LocaleFallbackerWithConfig_D_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleFallbackerWithConfig.hpp b/ffi/capi/bindings/cpp/LocaleFallbackerWithConfig.hpp
deleted file mode 100644
index fbf60c6fdbc..00000000000
--- a/ffi/capi/bindings/cpp/LocaleFallbackerWithConfig.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef LocaleFallbackerWithConfig_HPP
-#define LocaleFallbackerWithConfig_HPP
-
-#include "LocaleFallbackerWithConfig.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "Locale.hpp"
-#include "LocaleFallbackIterator.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    diplomat::capi::LocaleFallbackIterator* icu4x_LocaleFallbackerWithConfig_fallback_for_locale_mv1(const diplomat::capi::LocaleFallbackerWithConfig* self, const diplomat::capi::Locale* locale);
-    
-    
-    void icu4x_LocaleFallbackerWithConfig_destroy_mv1(LocaleFallbackerWithConfig* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline std::unique_ptr<LocaleFallbackIterator> LocaleFallbackerWithConfig::fallback_for_locale(const Locale& locale) const {
-  auto result = diplomat::capi::icu4x_LocaleFallbackerWithConfig_fallback_for_locale_mv1(this->AsFFI(),
-    locale.AsFFI());
-  return std::unique_ptr<LocaleFallbackIterator>(LocaleFallbackIterator::FromFFI(result));
-}
-
-inline const diplomat::capi::LocaleFallbackerWithConfig* LocaleFallbackerWithConfig::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::LocaleFallbackerWithConfig*>(this);
-}
-
-inline diplomat::capi::LocaleFallbackerWithConfig* LocaleFallbackerWithConfig::AsFFI() {
-  return reinterpret_cast<diplomat::capi::LocaleFallbackerWithConfig*>(this);
-}
-
-inline const LocaleFallbackerWithConfig* LocaleFallbackerWithConfig::FromFFI(const diplomat::capi::LocaleFallbackerWithConfig* ptr) {
-  return reinterpret_cast<const LocaleFallbackerWithConfig*>(ptr);
-}
-
-inline LocaleFallbackerWithConfig* LocaleFallbackerWithConfig::FromFFI(diplomat::capi::LocaleFallbackerWithConfig* ptr) {
-  return reinterpret_cast<LocaleFallbackerWithConfig*>(ptr);
-}
-
-inline void LocaleFallbackerWithConfig::operator delete(void* ptr) {
-  diplomat::capi::icu4x_LocaleFallbackerWithConfig_destroy_mv1(reinterpret_cast<diplomat::capi::LocaleFallbackerWithConfig*>(ptr));
-}
-
-
-#endif // LocaleFallbackerWithConfig_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleParseError.hpp b/ffi/capi/bindings/cpp/LocaleParseError.hpp
deleted file mode 100644
index 4f944297249..00000000000
--- a/ffi/capi/bindings/cpp/LocaleParseError.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef LocaleParseError_HPP
-#define LocaleParseError_HPP
-
-#include "LocaleParseError.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::LocaleParseError LocaleParseError::AsFFI() const {
-  return static_cast<diplomat::capi::LocaleParseError>(value);
-}
-
-inline LocaleParseError LocaleParseError::FromFFI(diplomat::capi::LocaleParseError c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::LocaleParseError_Unknown:
-    case diplomat::capi::LocaleParseError_Language:
-    case diplomat::capi::LocaleParseError_Subtag:
-    case diplomat::capi::LocaleParseError_Extension:
-      return static_cast<LocaleParseError::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // LocaleParseError_HPP
diff --git a/ffi/capi/bindings/cpp/Logger.d.hpp b/ffi/capi/bindings/cpp/Logger.d.hpp
deleted file mode 100644
index 2b055943258..00000000000
--- a/ffi/capi/bindings/cpp/Logger.d.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef Logger_D_HPP
-#define Logger_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    struct Logger;
-} // namespace capi
-} // namespace
-
-class Logger {
-public:
-
-  inline static bool init_simple_logger();
-
-  inline const diplomat::capi::Logger* AsFFI() const;
-  inline diplomat::capi::Logger* AsFFI();
-  inline static const Logger* FromFFI(const diplomat::capi::Logger* ptr);
-  inline static Logger* FromFFI(diplomat::capi::Logger* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  Logger() = delete;
-  Logger(const Logger&) = delete;
-  Logger(Logger&&) noexcept = delete;
-  Logger operator=(const Logger&) = delete;
-  Logger operator=(Logger&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // Logger_D_HPP
diff --git a/ffi/capi/bindings/cpp/Logger.hpp b/ffi/capi/bindings/cpp/Logger.hpp
deleted file mode 100644
index 069dc706d93..00000000000
--- a/ffi/capi/bindings/cpp/Logger.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef Logger_HPP
-#define Logger_HPP
-
-#include "Logger.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    bool icu4x_Logger_init_simple_logger_mv1(void);
-    
-    
-    void icu4x_Logger_destroy_mv1(Logger* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline bool Logger::init_simple_logger() {
-  auto result = diplomat::capi::icu4x_Logger_init_simple_logger_mv1();
-  return result;
-}
-
-inline const diplomat::capi::Logger* Logger::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::Logger*>(this);
-}
-
-inline diplomat::capi::Logger* Logger::AsFFI() {
-  return reinterpret_cast<diplomat::capi::Logger*>(this);
-}
-
-inline const Logger* Logger::FromFFI(const diplomat::capi::Logger* ptr) {
-  return reinterpret_cast<const Logger*>(ptr);
-}
-
-inline Logger* Logger::FromFFI(diplomat::capi::Logger* ptr) {
-  return reinterpret_cast<Logger*>(ptr);
-}
-
-inline void Logger::operator delete(void* ptr) {
-  diplomat::capi::icu4x_Logger_destroy_mv1(reinterpret_cast<diplomat::capi::Logger*>(ptr));
-}
-
-
-#endif // Logger_HPP
diff --git a/ffi/capi/bindings/cpp/MeasureUnit.d.hpp b/ffi/capi/bindings/cpp/MeasureUnit.d.hpp
deleted file mode 100644
index dbaba64bba0..00000000000
--- a/ffi/capi/bindings/cpp/MeasureUnit.d.hpp
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef MeasureUnit_D_HPP
-#define MeasureUnit_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    struct MeasureUnit;
-} // namespace capi
-} // namespace
-
-class MeasureUnit {
-public:
-
-  inline const diplomat::capi::MeasureUnit* AsFFI() const;
-  inline diplomat::capi::MeasureUnit* AsFFI();
-  inline static const MeasureUnit* FromFFI(const diplomat::capi::MeasureUnit* ptr);
-  inline static MeasureUnit* FromFFI(diplomat::capi::MeasureUnit* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  MeasureUnit() = delete;
-  MeasureUnit(const MeasureUnit&) = delete;
-  MeasureUnit(MeasureUnit&&) noexcept = delete;
-  MeasureUnit operator=(const MeasureUnit&) = delete;
-  MeasureUnit operator=(MeasureUnit&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // MeasureUnit_D_HPP
diff --git a/ffi/capi/bindings/cpp/MeasureUnit.hpp b/ffi/capi/bindings/cpp/MeasureUnit.hpp
deleted file mode 100644
index 0276844ebce..00000000000
--- a/ffi/capi/bindings/cpp/MeasureUnit.hpp
+++ /dev/null
@@ -1,47 +0,0 @@
-#ifndef MeasureUnit_HPP
-#define MeasureUnit_HPP
-
-#include "MeasureUnit.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    void icu4x_MeasureUnit_destroy_mv1(MeasureUnit* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline const diplomat::capi::MeasureUnit* MeasureUnit::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::MeasureUnit*>(this);
-}
-
-inline diplomat::capi::MeasureUnit* MeasureUnit::AsFFI() {
-  return reinterpret_cast<diplomat::capi::MeasureUnit*>(this);
-}
-
-inline const MeasureUnit* MeasureUnit::FromFFI(const diplomat::capi::MeasureUnit* ptr) {
-  return reinterpret_cast<const MeasureUnit*>(ptr);
-}
-
-inline MeasureUnit* MeasureUnit::FromFFI(diplomat::capi::MeasureUnit* ptr) {
-  return reinterpret_cast<MeasureUnit*>(ptr);
-}
-
-inline void MeasureUnit::operator delete(void* ptr) {
-  diplomat::capi::icu4x_MeasureUnit_destroy_mv1(reinterpret_cast<diplomat::capi::MeasureUnit*>(ptr));
-}
-
-
-#endif // MeasureUnit_HPP
diff --git a/ffi/capi/bindings/cpp/MeasureUnitParser.d.hpp b/ffi/capi/bindings/cpp/MeasureUnitParser.d.hpp
deleted file mode 100644
index ee948059378..00000000000
--- a/ffi/capi/bindings/cpp/MeasureUnitParser.d.hpp
+++ /dev/null
@@ -1,42 +0,0 @@
-#ifndef MeasureUnitParser_D_HPP
-#define MeasureUnitParser_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct MeasureUnit; }
-class MeasureUnit;
-
-
-namespace diplomat {
-namespace capi {
-    struct MeasureUnitParser;
-} // namespace capi
-} // namespace
-
-class MeasureUnitParser {
-public:
-
-  inline std::unique_ptr<MeasureUnit> parse(std::string_view unit_id) const;
-
-  inline const diplomat::capi::MeasureUnitParser* AsFFI() const;
-  inline diplomat::capi::MeasureUnitParser* AsFFI();
-  inline static const MeasureUnitParser* FromFFI(const diplomat::capi::MeasureUnitParser* ptr);
-  inline static MeasureUnitParser* FromFFI(diplomat::capi::MeasureUnitParser* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  MeasureUnitParser() = delete;
-  MeasureUnitParser(const MeasureUnitParser&) = delete;
-  MeasureUnitParser(MeasureUnitParser&&) noexcept = delete;
-  MeasureUnitParser operator=(const MeasureUnitParser&) = delete;
-  MeasureUnitParser operator=(MeasureUnitParser&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // MeasureUnitParser_D_HPP
diff --git a/ffi/capi/bindings/cpp/MeasureUnitParser.hpp b/ffi/capi/bindings/cpp/MeasureUnitParser.hpp
deleted file mode 100644
index e6bd4159d56..00000000000
--- a/ffi/capi/bindings/cpp/MeasureUnitParser.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef MeasureUnitParser_HPP
-#define MeasureUnitParser_HPP
-
-#include "MeasureUnitParser.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "MeasureUnit.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    diplomat::capi::MeasureUnit* icu4x_MeasureUnitParser_parse_mv1(const diplomat::capi::MeasureUnitParser* self, const char* unit_id_data, size_t unit_id_len);
-    
-    
-    void icu4x_MeasureUnitParser_destroy_mv1(MeasureUnitParser* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline std::unique_ptr<MeasureUnit> MeasureUnitParser::parse(std::string_view unit_id) const {
-  auto result = diplomat::capi::icu4x_MeasureUnitParser_parse_mv1(this->AsFFI(),
-    unit_id.data(),
-    unit_id.size());
-  return std::unique_ptr<MeasureUnit>(MeasureUnit::FromFFI(result));
-}
-
-inline const diplomat::capi::MeasureUnitParser* MeasureUnitParser::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::MeasureUnitParser*>(this);
-}
-
-inline diplomat::capi::MeasureUnitParser* MeasureUnitParser::AsFFI() {
-  return reinterpret_cast<diplomat::capi::MeasureUnitParser*>(this);
-}
-
-inline const MeasureUnitParser* MeasureUnitParser::FromFFI(const diplomat::capi::MeasureUnitParser* ptr) {
-  return reinterpret_cast<const MeasureUnitParser*>(ptr);
-}
-
-inline MeasureUnitParser* MeasureUnitParser::FromFFI(diplomat::capi::MeasureUnitParser* ptr) {
-  return reinterpret_cast<MeasureUnitParser*>(ptr);
-}
-
-inline void MeasureUnitParser::operator delete(void* ptr) {
-  diplomat::capi::icu4x_MeasureUnitParser_destroy_mv1(reinterpret_cast<diplomat::capi::MeasureUnitParser*>(ptr));
-}
-
-
-#endif // MeasureUnitParser_HPP
diff --git a/ffi/capi/bindings/cpp/MetazoneCalculator.d.hpp b/ffi/capi/bindings/cpp/MetazoneCalculator.d.hpp
deleted file mode 100644
index a4434ef4454..00000000000
--- a/ffi/capi/bindings/cpp/MetazoneCalculator.d.hpp
+++ /dev/null
@@ -1,43 +0,0 @@
-#ifndef MetazoneCalculator_D_HPP
-#define MetazoneCalculator_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct MetazoneCalculator;
-} // namespace capi
-} // namespace
-
-class MetazoneCalculator {
-public:
-
-  inline static diplomat::result<std::unique_ptr<MetazoneCalculator>, DataError> create(const DataProvider& provider);
-
-  inline const diplomat::capi::MetazoneCalculator* AsFFI() const;
-  inline diplomat::capi::MetazoneCalculator* AsFFI();
-  inline static const MetazoneCalculator* FromFFI(const diplomat::capi::MetazoneCalculator* ptr);
-  inline static MetazoneCalculator* FromFFI(diplomat::capi::MetazoneCalculator* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  MetazoneCalculator() = delete;
-  MetazoneCalculator(const MetazoneCalculator&) = delete;
-  MetazoneCalculator(MetazoneCalculator&&) noexcept = delete;
-  MetazoneCalculator operator=(const MetazoneCalculator&) = delete;
-  MetazoneCalculator operator=(MetazoneCalculator&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // MetazoneCalculator_D_HPP
diff --git a/ffi/capi/bindings/cpp/MetazoneCalculator.hpp b/ffi/capi/bindings/cpp/MetazoneCalculator.hpp
deleted file mode 100644
index e39738014c3..00000000000
--- a/ffi/capi/bindings/cpp/MetazoneCalculator.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef MetazoneCalculator_HPP
-#define MetazoneCalculator_HPP
-
-#include "MetazoneCalculator.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_MetazoneCalculator_create_mv1_result {union {diplomat::capi::MetazoneCalculator* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_MetazoneCalculator_create_mv1_result;
-    icu4x_MetazoneCalculator_create_mv1_result icu4x_MetazoneCalculator_create_mv1(const diplomat::capi::DataProvider* provider);
-    
-    
-    void icu4x_MetazoneCalculator_destroy_mv1(MetazoneCalculator* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<MetazoneCalculator>, DataError> MetazoneCalculator::create(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_MetazoneCalculator_create_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<MetazoneCalculator>, DataError>(diplomat::Ok<std::unique_ptr<MetazoneCalculator>>(std::unique_ptr<MetazoneCalculator>(MetazoneCalculator::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<MetazoneCalculator>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline const diplomat::capi::MetazoneCalculator* MetazoneCalculator::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::MetazoneCalculator*>(this);
-}
-
-inline diplomat::capi::MetazoneCalculator* MetazoneCalculator::AsFFI() {
-  return reinterpret_cast<diplomat::capi::MetazoneCalculator*>(this);
-}
-
-inline const MetazoneCalculator* MetazoneCalculator::FromFFI(const diplomat::capi::MetazoneCalculator* ptr) {
-  return reinterpret_cast<const MetazoneCalculator*>(ptr);
-}
-
-inline MetazoneCalculator* MetazoneCalculator::FromFFI(diplomat::capi::MetazoneCalculator* ptr) {
-  return reinterpret_cast<MetazoneCalculator*>(ptr);
-}
-
-inline void MetazoneCalculator::operator delete(void* ptr) {
-  diplomat::capi::icu4x_MetazoneCalculator_destroy_mv1(reinterpret_cast<diplomat::capi::MetazoneCalculator*>(ptr));
-}
-
-
-#endif // MetazoneCalculator_HPP
diff --git a/ffi/capi/bindings/cpp/PluralCategory.hpp b/ffi/capi/bindings/cpp/PluralCategory.hpp
deleted file mode 100644
index 1d605a53f73..00000000000
--- a/ffi/capi/bindings/cpp/PluralCategory.hpp
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef PluralCategory_HPP
-#define PluralCategory_HPP
-
-#include "PluralCategory.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_PluralCategory_get_for_cldr_string_mv1_result {union {diplomat::capi::PluralCategory ok; }; bool is_ok;} icu4x_PluralCategory_get_for_cldr_string_mv1_result;
-    icu4x_PluralCategory_get_for_cldr_string_mv1_result icu4x_PluralCategory_get_for_cldr_string_mv1(const char* s_data, size_t s_len);
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::PluralCategory PluralCategory::AsFFI() const {
-  return static_cast<diplomat::capi::PluralCategory>(value);
-}
-
-inline PluralCategory PluralCategory::FromFFI(diplomat::capi::PluralCategory c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::PluralCategory_Zero:
-    case diplomat::capi::PluralCategory_One:
-    case diplomat::capi::PluralCategory_Two:
-    case diplomat::capi::PluralCategory_Few:
-    case diplomat::capi::PluralCategory_Many:
-    case diplomat::capi::PluralCategory_Other:
-      return static_cast<PluralCategory::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-
-inline std::optional<PluralCategory> PluralCategory::get_for_cldr_string(std::string_view s) {
-  auto result = diplomat::capi::icu4x_PluralCategory_get_for_cldr_string_mv1(s.data(),
-    s.size());
-  return result.is_ok ? std::optional<PluralCategory>(PluralCategory::FromFFI(result.ok)) : std::nullopt;
-}
-#endif // PluralCategory_HPP
diff --git a/ffi/capi/bindings/cpp/PluralOperands.d.hpp b/ffi/capi/bindings/cpp/PluralOperands.d.hpp
deleted file mode 100644
index 88cd6767f49..00000000000
--- a/ffi/capi/bindings/cpp/PluralOperands.d.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef PluralOperands_D_HPP
-#define PluralOperands_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct FixedDecimal; }
-class FixedDecimal;
-class FixedDecimalParseError;
-
-
-namespace diplomat {
-namespace capi {
-    struct PluralOperands;
-} // namespace capi
-} // namespace
-
-class PluralOperands {
-public:
-
-  inline static diplomat::result<std::unique_ptr<PluralOperands>, FixedDecimalParseError> from_string(std::string_view s);
-
-  inline static std::unique_ptr<PluralOperands> from_fixed_decimal(const FixedDecimal& x);
-
-  inline const diplomat::capi::PluralOperands* AsFFI() const;
-  inline diplomat::capi::PluralOperands* AsFFI();
-  inline static const PluralOperands* FromFFI(const diplomat::capi::PluralOperands* ptr);
-  inline static PluralOperands* FromFFI(diplomat::capi::PluralOperands* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  PluralOperands() = delete;
-  PluralOperands(const PluralOperands&) = delete;
-  PluralOperands(PluralOperands&&) noexcept = delete;
-  PluralOperands operator=(const PluralOperands&) = delete;
-  PluralOperands operator=(PluralOperands&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // PluralOperands_D_HPP
diff --git a/ffi/capi/bindings/cpp/PluralOperands.hpp b/ffi/capi/bindings/cpp/PluralOperands.hpp
deleted file mode 100644
index 57ae62bd9b8..00000000000
--- a/ffi/capi/bindings/cpp/PluralOperands.hpp
+++ /dev/null
@@ -1,65 +0,0 @@
-#ifndef PluralOperands_HPP
-#define PluralOperands_HPP
-
-#include "PluralOperands.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "FixedDecimal.hpp"
-#include "FixedDecimalParseError.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_PluralOperands_from_string_mv1_result {union {diplomat::capi::PluralOperands* ok; diplomat::capi::FixedDecimalParseError err;}; bool is_ok;} icu4x_PluralOperands_from_string_mv1_result;
-    icu4x_PluralOperands_from_string_mv1_result icu4x_PluralOperands_from_string_mv1(const char* s_data, size_t s_len);
-    
-    diplomat::capi::PluralOperands* icu4x_PluralOperands_from_fixed_decimal_mv1(const diplomat::capi::FixedDecimal* x);
-    
-    
-    void icu4x_PluralOperands_destroy_mv1(PluralOperands* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<PluralOperands>, FixedDecimalParseError> PluralOperands::from_string(std::string_view s) {
-  auto result = diplomat::capi::icu4x_PluralOperands_from_string_mv1(s.data(),
-    s.size());
-  return result.is_ok ? diplomat::result<std::unique_ptr<PluralOperands>, FixedDecimalParseError>(diplomat::Ok<std::unique_ptr<PluralOperands>>(std::unique_ptr<PluralOperands>(PluralOperands::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<PluralOperands>, FixedDecimalParseError>(diplomat::Err<FixedDecimalParseError>(FixedDecimalParseError::FromFFI(result.err)));
-}
-
-inline std::unique_ptr<PluralOperands> PluralOperands::from_fixed_decimal(const FixedDecimal& x) {
-  auto result = diplomat::capi::icu4x_PluralOperands_from_fixed_decimal_mv1(x.AsFFI());
-  return std::unique_ptr<PluralOperands>(PluralOperands::FromFFI(result));
-}
-
-inline const diplomat::capi::PluralOperands* PluralOperands::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::PluralOperands*>(this);
-}
-
-inline diplomat::capi::PluralOperands* PluralOperands::AsFFI() {
-  return reinterpret_cast<diplomat::capi::PluralOperands*>(this);
-}
-
-inline const PluralOperands* PluralOperands::FromFFI(const diplomat::capi::PluralOperands* ptr) {
-  return reinterpret_cast<const PluralOperands*>(ptr);
-}
-
-inline PluralOperands* PluralOperands::FromFFI(diplomat::capi::PluralOperands* ptr) {
-  return reinterpret_cast<PluralOperands*>(ptr);
-}
-
-inline void PluralOperands::operator delete(void* ptr) {
-  diplomat::capi::icu4x_PluralOperands_destroy_mv1(reinterpret_cast<diplomat::capi::PluralOperands*>(ptr));
-}
-
-
-#endif // PluralOperands_HPP
diff --git a/ffi/capi/bindings/cpp/PluralRules.d.hpp b/ffi/capi/bindings/cpp/PluralRules.d.hpp
deleted file mode 100644
index 4581841983e..00000000000
--- a/ffi/capi/bindings/cpp/PluralRules.d.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef PluralRules_D_HPP
-#define PluralRules_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-namespace diplomat::capi { struct PluralOperands; }
-class PluralOperands;
-struct PluralCategories;
-class DataError;
-class PluralCategory;
-
-
-namespace diplomat {
-namespace capi {
-    struct PluralRules;
-} // namespace capi
-} // namespace
-
-class PluralRules {
-public:
-
-  inline static diplomat::result<std::unique_ptr<PluralRules>, DataError> create_cardinal(const DataProvider& provider, const Locale& locale);
-
-  inline static diplomat::result<std::unique_ptr<PluralRules>, DataError> create_ordinal(const DataProvider& provider, const Locale& locale);
-
-  inline PluralCategory category_for(const PluralOperands& op) const;
-
-  inline PluralCategories categories() const;
-
-  inline const diplomat::capi::PluralRules* AsFFI() const;
-  inline diplomat::capi::PluralRules* AsFFI();
-  inline static const PluralRules* FromFFI(const diplomat::capi::PluralRules* ptr);
-  inline static PluralRules* FromFFI(diplomat::capi::PluralRules* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  PluralRules() = delete;
-  PluralRules(const PluralRules&) = delete;
-  PluralRules(PluralRules&&) noexcept = delete;
-  PluralRules operator=(const PluralRules&) = delete;
-  PluralRules operator=(PluralRules&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // PluralRules_D_HPP
diff --git a/ffi/capi/bindings/cpp/PluralRules.hpp b/ffi/capi/bindings/cpp/PluralRules.hpp
deleted file mode 100644
index 8c42c73986b..00000000000
--- a/ffi/capi/bindings/cpp/PluralRules.hpp
+++ /dev/null
@@ -1,86 +0,0 @@
-#ifndef PluralRules_HPP
-#define PluralRules_HPP
-
-#include "PluralRules.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "Locale.hpp"
-#include "PluralCategories.hpp"
-#include "PluralCategory.hpp"
-#include "PluralOperands.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_PluralRules_create_cardinal_mv1_result {union {diplomat::capi::PluralRules* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_PluralRules_create_cardinal_mv1_result;
-    icu4x_PluralRules_create_cardinal_mv1_result icu4x_PluralRules_create_cardinal_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale);
-    
-    typedef struct icu4x_PluralRules_create_ordinal_mv1_result {union {diplomat::capi::PluralRules* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_PluralRules_create_ordinal_mv1_result;
-    icu4x_PluralRules_create_ordinal_mv1_result icu4x_PluralRules_create_ordinal_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale);
-    
-    diplomat::capi::PluralCategory icu4x_PluralRules_category_for_mv1(const diplomat::capi::PluralRules* self, const diplomat::capi::PluralOperands* op);
-    
-    diplomat::capi::PluralCategories icu4x_PluralRules_categories_mv1(const diplomat::capi::PluralRules* self);
-    
-    
-    void icu4x_PluralRules_destroy_mv1(PluralRules* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<PluralRules>, DataError> PluralRules::create_cardinal(const DataProvider& provider, const Locale& locale) {
-  auto result = diplomat::capi::icu4x_PluralRules_create_cardinal_mv1(provider.AsFFI(),
-    locale.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<PluralRules>, DataError>(diplomat::Ok<std::unique_ptr<PluralRules>>(std::unique_ptr<PluralRules>(PluralRules::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<PluralRules>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<PluralRules>, DataError> PluralRules::create_ordinal(const DataProvider& provider, const Locale& locale) {
-  auto result = diplomat::capi::icu4x_PluralRules_create_ordinal_mv1(provider.AsFFI(),
-    locale.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<PluralRules>, DataError>(diplomat::Ok<std::unique_ptr<PluralRules>>(std::unique_ptr<PluralRules>(PluralRules::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<PluralRules>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline PluralCategory PluralRules::category_for(const PluralOperands& op) const {
-  auto result = diplomat::capi::icu4x_PluralRules_category_for_mv1(this->AsFFI(),
-    op.AsFFI());
-  return PluralCategory::FromFFI(result);
-}
-
-inline PluralCategories PluralRules::categories() const {
-  auto result = diplomat::capi::icu4x_PluralRules_categories_mv1(this->AsFFI());
-  return PluralCategories::FromFFI(result);
-}
-
-inline const diplomat::capi::PluralRules* PluralRules::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::PluralRules*>(this);
-}
-
-inline diplomat::capi::PluralRules* PluralRules::AsFFI() {
-  return reinterpret_cast<diplomat::capi::PluralRules*>(this);
-}
-
-inline const PluralRules* PluralRules::FromFFI(const diplomat::capi::PluralRules* ptr) {
-  return reinterpret_cast<const PluralRules*>(ptr);
-}
-
-inline PluralRules* PluralRules::FromFFI(diplomat::capi::PluralRules* ptr) {
-  return reinterpret_cast<PluralRules*>(ptr);
-}
-
-inline void PluralRules::operator delete(void* ptr) {
-  diplomat::capi::icu4x_PluralRules_destroy_mv1(reinterpret_cast<diplomat::capi::PluralRules*>(ptr));
-}
-
-
-#endif // PluralRules_HPP
diff --git a/ffi/capi/bindings/cpp/PropertyValueNameToEnumMapper.d.hpp b/ffi/capi/bindings/cpp/PropertyValueNameToEnumMapper.d.hpp
deleted file mode 100644
index 8bacad106e5..00000000000
--- a/ffi/capi/bindings/cpp/PropertyValueNameToEnumMapper.d.hpp
+++ /dev/null
@@ -1,65 +0,0 @@
-#ifndef PropertyValueNameToEnumMapper_D_HPP
-#define PropertyValueNameToEnumMapper_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct PropertyValueNameToEnumMapper;
-} // namespace capi
-} // namespace
-
-class PropertyValueNameToEnumMapper {
-public:
-
-  inline int16_t get_strict(std::string_view name) const;
-
-  inline int16_t get_loose(std::string_view name) const;
-
-  inline static diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError> load_general_category(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError> load_hangul_syllable_type(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError> load_east_asian_width(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError> load_bidi_class(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError> load_indic_syllabic_category(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError> load_line_break(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError> load_grapheme_cluster_break(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError> load_word_break(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError> load_sentence_break(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError> load_script(const DataProvider& provider);
-
-  inline const diplomat::capi::PropertyValueNameToEnumMapper* AsFFI() const;
-  inline diplomat::capi::PropertyValueNameToEnumMapper* AsFFI();
-  inline static const PropertyValueNameToEnumMapper* FromFFI(const diplomat::capi::PropertyValueNameToEnumMapper* ptr);
-  inline static PropertyValueNameToEnumMapper* FromFFI(diplomat::capi::PropertyValueNameToEnumMapper* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  PropertyValueNameToEnumMapper() = delete;
-  PropertyValueNameToEnumMapper(const PropertyValueNameToEnumMapper&) = delete;
-  PropertyValueNameToEnumMapper(PropertyValueNameToEnumMapper&&) noexcept = delete;
-  PropertyValueNameToEnumMapper operator=(const PropertyValueNameToEnumMapper&) = delete;
-  PropertyValueNameToEnumMapper operator=(PropertyValueNameToEnumMapper&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // PropertyValueNameToEnumMapper_D_HPP
diff --git a/ffi/capi/bindings/cpp/PropertyValueNameToEnumMapper.hpp b/ffi/capi/bindings/cpp/PropertyValueNameToEnumMapper.hpp
deleted file mode 100644
index 06c89164d5e..00000000000
--- a/ffi/capi/bindings/cpp/PropertyValueNameToEnumMapper.hpp
+++ /dev/null
@@ -1,147 +0,0 @@
-#ifndef PropertyValueNameToEnumMapper_HPP
-#define PropertyValueNameToEnumMapper_HPP
-
-#include "PropertyValueNameToEnumMapper.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    int16_t icu4x_PropertyValueNameToEnumMapper_get_strict_mv1(const diplomat::capi::PropertyValueNameToEnumMapper* self, const char* name_data, size_t name_len);
-    
-    int16_t icu4x_PropertyValueNameToEnumMapper_get_loose_mv1(const diplomat::capi::PropertyValueNameToEnumMapper* self, const char* name_data, size_t name_len);
-    
-    typedef struct icu4x_PropertyValueNameToEnumMapper_load_general_category_mv1_result {union {diplomat::capi::PropertyValueNameToEnumMapper* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_PropertyValueNameToEnumMapper_load_general_category_mv1_result;
-    icu4x_PropertyValueNameToEnumMapper_load_general_category_mv1_result icu4x_PropertyValueNameToEnumMapper_load_general_category_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_PropertyValueNameToEnumMapper_load_hangul_syllable_type_mv1_result {union {diplomat::capi::PropertyValueNameToEnumMapper* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_PropertyValueNameToEnumMapper_load_hangul_syllable_type_mv1_result;
-    icu4x_PropertyValueNameToEnumMapper_load_hangul_syllable_type_mv1_result icu4x_PropertyValueNameToEnumMapper_load_hangul_syllable_type_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_PropertyValueNameToEnumMapper_load_east_asian_width_mv1_result {union {diplomat::capi::PropertyValueNameToEnumMapper* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_PropertyValueNameToEnumMapper_load_east_asian_width_mv1_result;
-    icu4x_PropertyValueNameToEnumMapper_load_east_asian_width_mv1_result icu4x_PropertyValueNameToEnumMapper_load_east_asian_width_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_PropertyValueNameToEnumMapper_load_bidi_class_mv1_result {union {diplomat::capi::PropertyValueNameToEnumMapper* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_PropertyValueNameToEnumMapper_load_bidi_class_mv1_result;
-    icu4x_PropertyValueNameToEnumMapper_load_bidi_class_mv1_result icu4x_PropertyValueNameToEnumMapper_load_bidi_class_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_PropertyValueNameToEnumMapper_load_indic_syllabic_category_mv1_result {union {diplomat::capi::PropertyValueNameToEnumMapper* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_PropertyValueNameToEnumMapper_load_indic_syllabic_category_mv1_result;
-    icu4x_PropertyValueNameToEnumMapper_load_indic_syllabic_category_mv1_result icu4x_PropertyValueNameToEnumMapper_load_indic_syllabic_category_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_PropertyValueNameToEnumMapper_load_line_break_mv1_result {union {diplomat::capi::PropertyValueNameToEnumMapper* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_PropertyValueNameToEnumMapper_load_line_break_mv1_result;
-    icu4x_PropertyValueNameToEnumMapper_load_line_break_mv1_result icu4x_PropertyValueNameToEnumMapper_load_line_break_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_PropertyValueNameToEnumMapper_load_grapheme_cluster_break_mv1_result {union {diplomat::capi::PropertyValueNameToEnumMapper* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_PropertyValueNameToEnumMapper_load_grapheme_cluster_break_mv1_result;
-    icu4x_PropertyValueNameToEnumMapper_load_grapheme_cluster_break_mv1_result icu4x_PropertyValueNameToEnumMapper_load_grapheme_cluster_break_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_PropertyValueNameToEnumMapper_load_word_break_mv1_result {union {diplomat::capi::PropertyValueNameToEnumMapper* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_PropertyValueNameToEnumMapper_load_word_break_mv1_result;
-    icu4x_PropertyValueNameToEnumMapper_load_word_break_mv1_result icu4x_PropertyValueNameToEnumMapper_load_word_break_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_PropertyValueNameToEnumMapper_load_sentence_break_mv1_result {union {diplomat::capi::PropertyValueNameToEnumMapper* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_PropertyValueNameToEnumMapper_load_sentence_break_mv1_result;
-    icu4x_PropertyValueNameToEnumMapper_load_sentence_break_mv1_result icu4x_PropertyValueNameToEnumMapper_load_sentence_break_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_PropertyValueNameToEnumMapper_load_script_mv1_result {union {diplomat::capi::PropertyValueNameToEnumMapper* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_PropertyValueNameToEnumMapper_load_script_mv1_result;
-    icu4x_PropertyValueNameToEnumMapper_load_script_mv1_result icu4x_PropertyValueNameToEnumMapper_load_script_mv1(const diplomat::capi::DataProvider* provider);
-    
-    
-    void icu4x_PropertyValueNameToEnumMapper_destroy_mv1(PropertyValueNameToEnumMapper* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline int16_t PropertyValueNameToEnumMapper::get_strict(std::string_view name) const {
-  auto result = diplomat::capi::icu4x_PropertyValueNameToEnumMapper_get_strict_mv1(this->AsFFI(),
-    name.data(),
-    name.size());
-  return result;
-}
-
-inline int16_t PropertyValueNameToEnumMapper::get_loose(std::string_view name) const {
-  auto result = diplomat::capi::icu4x_PropertyValueNameToEnumMapper_get_loose_mv1(this->AsFFI(),
-    name.data(),
-    name.size());
-  return result;
-}
-
-inline diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError> PropertyValueNameToEnumMapper::load_general_category(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_PropertyValueNameToEnumMapper_load_general_category_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError>(diplomat::Ok<std::unique_ptr<PropertyValueNameToEnumMapper>>(std::unique_ptr<PropertyValueNameToEnumMapper>(PropertyValueNameToEnumMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError> PropertyValueNameToEnumMapper::load_hangul_syllable_type(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_PropertyValueNameToEnumMapper_load_hangul_syllable_type_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError>(diplomat::Ok<std::unique_ptr<PropertyValueNameToEnumMapper>>(std::unique_ptr<PropertyValueNameToEnumMapper>(PropertyValueNameToEnumMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError> PropertyValueNameToEnumMapper::load_east_asian_width(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_PropertyValueNameToEnumMapper_load_east_asian_width_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError>(diplomat::Ok<std::unique_ptr<PropertyValueNameToEnumMapper>>(std::unique_ptr<PropertyValueNameToEnumMapper>(PropertyValueNameToEnumMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError> PropertyValueNameToEnumMapper::load_bidi_class(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_PropertyValueNameToEnumMapper_load_bidi_class_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError>(diplomat::Ok<std::unique_ptr<PropertyValueNameToEnumMapper>>(std::unique_ptr<PropertyValueNameToEnumMapper>(PropertyValueNameToEnumMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError> PropertyValueNameToEnumMapper::load_indic_syllabic_category(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_PropertyValueNameToEnumMapper_load_indic_syllabic_category_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError>(diplomat::Ok<std::unique_ptr<PropertyValueNameToEnumMapper>>(std::unique_ptr<PropertyValueNameToEnumMapper>(PropertyValueNameToEnumMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError> PropertyValueNameToEnumMapper::load_line_break(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_PropertyValueNameToEnumMapper_load_line_break_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError>(diplomat::Ok<std::unique_ptr<PropertyValueNameToEnumMapper>>(std::unique_ptr<PropertyValueNameToEnumMapper>(PropertyValueNameToEnumMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError> PropertyValueNameToEnumMapper::load_grapheme_cluster_break(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_PropertyValueNameToEnumMapper_load_grapheme_cluster_break_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError>(diplomat::Ok<std::unique_ptr<PropertyValueNameToEnumMapper>>(std::unique_ptr<PropertyValueNameToEnumMapper>(PropertyValueNameToEnumMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError> PropertyValueNameToEnumMapper::load_word_break(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_PropertyValueNameToEnumMapper_load_word_break_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError>(diplomat::Ok<std::unique_ptr<PropertyValueNameToEnumMapper>>(std::unique_ptr<PropertyValueNameToEnumMapper>(PropertyValueNameToEnumMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError> PropertyValueNameToEnumMapper::load_sentence_break(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_PropertyValueNameToEnumMapper_load_sentence_break_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError>(diplomat::Ok<std::unique_ptr<PropertyValueNameToEnumMapper>>(std::unique_ptr<PropertyValueNameToEnumMapper>(PropertyValueNameToEnumMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError> PropertyValueNameToEnumMapper::load_script(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_PropertyValueNameToEnumMapper_load_script_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError>(diplomat::Ok<std::unique_ptr<PropertyValueNameToEnumMapper>>(std::unique_ptr<PropertyValueNameToEnumMapper>(PropertyValueNameToEnumMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<PropertyValueNameToEnumMapper>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline const diplomat::capi::PropertyValueNameToEnumMapper* PropertyValueNameToEnumMapper::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::PropertyValueNameToEnumMapper*>(this);
-}
-
-inline diplomat::capi::PropertyValueNameToEnumMapper* PropertyValueNameToEnumMapper::AsFFI() {
-  return reinterpret_cast<diplomat::capi::PropertyValueNameToEnumMapper*>(this);
-}
-
-inline const PropertyValueNameToEnumMapper* PropertyValueNameToEnumMapper::FromFFI(const diplomat::capi::PropertyValueNameToEnumMapper* ptr) {
-  return reinterpret_cast<const PropertyValueNameToEnumMapper*>(ptr);
-}
-
-inline PropertyValueNameToEnumMapper* PropertyValueNameToEnumMapper::FromFFI(diplomat::capi::PropertyValueNameToEnumMapper* ptr) {
-  return reinterpret_cast<PropertyValueNameToEnumMapper*>(ptr);
-}
-
-inline void PropertyValueNameToEnumMapper::operator delete(void* ptr) {
-  diplomat::capi::icu4x_PropertyValueNameToEnumMapper_destroy_mv1(reinterpret_cast<diplomat::capi::PropertyValueNameToEnumMapper*>(ptr));
-}
-
-
-#endif // PropertyValueNameToEnumMapper_HPP
diff --git a/ffi/capi/bindings/cpp/RegionDisplayNames.d.hpp b/ffi/capi/bindings/cpp/RegionDisplayNames.d.hpp
deleted file mode 100644
index 818202d1e1d..00000000000
--- a/ffi/capi/bindings/cpp/RegionDisplayNames.d.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef RegionDisplayNames_D_HPP
-#define RegionDisplayNames_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-class DataError;
-class LocaleParseError;
-
-
-namespace diplomat {
-namespace capi {
-    struct RegionDisplayNames;
-} // namespace capi
-} // namespace
-
-class RegionDisplayNames {
-public:
-
-  inline static diplomat::result<std::unique_ptr<RegionDisplayNames>, DataError> create(const DataProvider& provider, const Locale& locale);
-
-  inline diplomat::result<std::string, LocaleParseError> of(std::string_view region) const;
-
-  inline const diplomat::capi::RegionDisplayNames* AsFFI() const;
-  inline diplomat::capi::RegionDisplayNames* AsFFI();
-  inline static const RegionDisplayNames* FromFFI(const diplomat::capi::RegionDisplayNames* ptr);
-  inline static RegionDisplayNames* FromFFI(diplomat::capi::RegionDisplayNames* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  RegionDisplayNames() = delete;
-  RegionDisplayNames(const RegionDisplayNames&) = delete;
-  RegionDisplayNames(RegionDisplayNames&&) noexcept = delete;
-  RegionDisplayNames operator=(const RegionDisplayNames&) = delete;
-  RegionDisplayNames operator=(RegionDisplayNames&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // RegionDisplayNames_D_HPP
diff --git a/ffi/capi/bindings/cpp/RegionDisplayNames.hpp b/ffi/capi/bindings/cpp/RegionDisplayNames.hpp
deleted file mode 100644
index 148e34f8b16..00000000000
--- a/ffi/capi/bindings/cpp/RegionDisplayNames.hpp
+++ /dev/null
@@ -1,73 +0,0 @@
-#ifndef RegionDisplayNames_HPP
-#define RegionDisplayNames_HPP
-
-#include "RegionDisplayNames.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "Locale.hpp"
-#include "LocaleParseError.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_RegionDisplayNames_create_mv1_result {union {diplomat::capi::RegionDisplayNames* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_RegionDisplayNames_create_mv1_result;
-    icu4x_RegionDisplayNames_create_mv1_result icu4x_RegionDisplayNames_create_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale);
-    
-    typedef struct icu4x_RegionDisplayNames_of_mv1_result {union { diplomat::capi::LocaleParseError err;}; bool is_ok;} icu4x_RegionDisplayNames_of_mv1_result;
-    icu4x_RegionDisplayNames_of_mv1_result icu4x_RegionDisplayNames_of_mv1(const diplomat::capi::RegionDisplayNames* self, const char* region_data, size_t region_len, diplomat::capi::DiplomatWrite* write);
-    
-    
-    void icu4x_RegionDisplayNames_destroy_mv1(RegionDisplayNames* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<RegionDisplayNames>, DataError> RegionDisplayNames::create(const DataProvider& provider, const Locale& locale) {
-  auto result = diplomat::capi::icu4x_RegionDisplayNames_create_mv1(provider.AsFFI(),
-    locale.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<RegionDisplayNames>, DataError>(diplomat::Ok<std::unique_ptr<RegionDisplayNames>>(std::unique_ptr<RegionDisplayNames>(RegionDisplayNames::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<RegionDisplayNames>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::string, LocaleParseError> RegionDisplayNames::of(std::string_view region) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_RegionDisplayNames_of_mv1(this->AsFFI(),
-    region.data(),
-    region.size(),
-    &write);
-  return result.is_ok ? diplomat::result<std::string, LocaleParseError>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, LocaleParseError>(diplomat::Err<LocaleParseError>(LocaleParseError::FromFFI(result.err)));
-}
-
-inline const diplomat::capi::RegionDisplayNames* RegionDisplayNames::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::RegionDisplayNames*>(this);
-}
-
-inline diplomat::capi::RegionDisplayNames* RegionDisplayNames::AsFFI() {
-  return reinterpret_cast<diplomat::capi::RegionDisplayNames*>(this);
-}
-
-inline const RegionDisplayNames* RegionDisplayNames::FromFFI(const diplomat::capi::RegionDisplayNames* ptr) {
-  return reinterpret_cast<const RegionDisplayNames*>(ptr);
-}
-
-inline RegionDisplayNames* RegionDisplayNames::FromFFI(diplomat::capi::RegionDisplayNames* ptr) {
-  return reinterpret_cast<RegionDisplayNames*>(ptr);
-}
-
-inline void RegionDisplayNames::operator delete(void* ptr) {
-  diplomat::capi::icu4x_RegionDisplayNames_destroy_mv1(reinterpret_cast<diplomat::capi::RegionDisplayNames*>(ptr));
-}
-
-
-#endif // RegionDisplayNames_HPP
diff --git a/ffi/capi/bindings/cpp/ReorderedIndexMap.d.hpp b/ffi/capi/bindings/cpp/ReorderedIndexMap.d.hpp
deleted file mode 100644
index e2b5fd23008..00000000000
--- a/ffi/capi/bindings/cpp/ReorderedIndexMap.d.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef ReorderedIndexMap_D_HPP
-#define ReorderedIndexMap_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    struct ReorderedIndexMap;
-} // namespace capi
-} // namespace
-
-class ReorderedIndexMap {
-public:
-
-  inline diplomat::span<const size_t> as_slice() const;
-
-  inline size_t len() const;
-
-  inline bool is_empty() const;
-
-  inline size_t get(size_t index) const;
-
-  inline const diplomat::capi::ReorderedIndexMap* AsFFI() const;
-  inline diplomat::capi::ReorderedIndexMap* AsFFI();
-  inline static const ReorderedIndexMap* FromFFI(const diplomat::capi::ReorderedIndexMap* ptr);
-  inline static ReorderedIndexMap* FromFFI(diplomat::capi::ReorderedIndexMap* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  ReorderedIndexMap() = delete;
-  ReorderedIndexMap(const ReorderedIndexMap&) = delete;
-  ReorderedIndexMap(ReorderedIndexMap&&) noexcept = delete;
-  ReorderedIndexMap operator=(const ReorderedIndexMap&) = delete;
-  ReorderedIndexMap operator=(ReorderedIndexMap&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // ReorderedIndexMap_D_HPP
diff --git a/ffi/capi/bindings/cpp/ReorderedIndexMap.hpp b/ffi/capi/bindings/cpp/ReorderedIndexMap.hpp
deleted file mode 100644
index 66fdd1f4061..00000000000
--- a/ffi/capi/bindings/cpp/ReorderedIndexMap.hpp
+++ /dev/null
@@ -1,76 +0,0 @@
-#ifndef ReorderedIndexMap_HPP
-#define ReorderedIndexMap_HPP
-
-#include "ReorderedIndexMap.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    diplomat::capi::DiplomatUsizeView icu4x_ReorderedIndexMap_as_slice_mv1(const diplomat::capi::ReorderedIndexMap* self);
-    
-    size_t icu4x_ReorderedIndexMap_len_mv1(const diplomat::capi::ReorderedIndexMap* self);
-    
-    bool icu4x_ReorderedIndexMap_is_empty_mv1(const diplomat::capi::ReorderedIndexMap* self);
-    
-    size_t icu4x_ReorderedIndexMap_get_mv1(const diplomat::capi::ReorderedIndexMap* self, size_t index);
-    
-    
-    void icu4x_ReorderedIndexMap_destroy_mv1(ReorderedIndexMap* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::span<const size_t> ReorderedIndexMap::as_slice() const {
-  auto result = diplomat::capi::icu4x_ReorderedIndexMap_as_slice_mv1(this->AsFFI());
-  return diplomat::span<const size_t>(result.data, result.len);
-}
-
-inline size_t ReorderedIndexMap::len() const {
-  auto result = diplomat::capi::icu4x_ReorderedIndexMap_len_mv1(this->AsFFI());
-  return result;
-}
-
-inline bool ReorderedIndexMap::is_empty() const {
-  auto result = diplomat::capi::icu4x_ReorderedIndexMap_is_empty_mv1(this->AsFFI());
-  return result;
-}
-
-inline size_t ReorderedIndexMap::get(size_t index) const {
-  auto result = diplomat::capi::icu4x_ReorderedIndexMap_get_mv1(this->AsFFI(),
-    index);
-  return result;
-}
-
-inline const diplomat::capi::ReorderedIndexMap* ReorderedIndexMap::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::ReorderedIndexMap*>(this);
-}
-
-inline diplomat::capi::ReorderedIndexMap* ReorderedIndexMap::AsFFI() {
-  return reinterpret_cast<diplomat::capi::ReorderedIndexMap*>(this);
-}
-
-inline const ReorderedIndexMap* ReorderedIndexMap::FromFFI(const diplomat::capi::ReorderedIndexMap* ptr) {
-  return reinterpret_cast<const ReorderedIndexMap*>(ptr);
-}
-
-inline ReorderedIndexMap* ReorderedIndexMap::FromFFI(diplomat::capi::ReorderedIndexMap* ptr) {
-  return reinterpret_cast<ReorderedIndexMap*>(ptr);
-}
-
-inline void ReorderedIndexMap::operator delete(void* ptr) {
-  diplomat::capi::icu4x_ReorderedIndexMap_destroy_mv1(reinterpret_cast<diplomat::capi::ReorderedIndexMap*>(ptr));
-}
-
-
-#endif // ReorderedIndexMap_HPP
diff --git a/ffi/capi/bindings/cpp/ScriptExtensionsSet.d.hpp b/ffi/capi/bindings/cpp/ScriptExtensionsSet.d.hpp
deleted file mode 100644
index 12c87dca853..00000000000
--- a/ffi/capi/bindings/cpp/ScriptExtensionsSet.d.hpp
+++ /dev/null
@@ -1,43 +0,0 @@
-#ifndef ScriptExtensionsSet_D_HPP
-#define ScriptExtensionsSet_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    struct ScriptExtensionsSet;
-} // namespace capi
-} // namespace
-
-class ScriptExtensionsSet {
-public:
-
-  inline bool contains(uint16_t script) const;
-
-  inline size_t count() const;
-
-  inline std::optional<uint16_t> script_at(size_t index) const;
-
-  inline const diplomat::capi::ScriptExtensionsSet* AsFFI() const;
-  inline diplomat::capi::ScriptExtensionsSet* AsFFI();
-  inline static const ScriptExtensionsSet* FromFFI(const diplomat::capi::ScriptExtensionsSet* ptr);
-  inline static ScriptExtensionsSet* FromFFI(diplomat::capi::ScriptExtensionsSet* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  ScriptExtensionsSet() = delete;
-  ScriptExtensionsSet(const ScriptExtensionsSet&) = delete;
-  ScriptExtensionsSet(ScriptExtensionsSet&&) noexcept = delete;
-  ScriptExtensionsSet operator=(const ScriptExtensionsSet&) = delete;
-  ScriptExtensionsSet operator=(ScriptExtensionsSet&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // ScriptExtensionsSet_D_HPP
diff --git a/ffi/capi/bindings/cpp/ScriptExtensionsSet.hpp b/ffi/capi/bindings/cpp/ScriptExtensionsSet.hpp
deleted file mode 100644
index b36d02c52e7..00000000000
--- a/ffi/capi/bindings/cpp/ScriptExtensionsSet.hpp
+++ /dev/null
@@ -1,71 +0,0 @@
-#ifndef ScriptExtensionsSet_HPP
-#define ScriptExtensionsSet_HPP
-
-#include "ScriptExtensionsSet.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    bool icu4x_ScriptExtensionsSet_contains_mv1(const diplomat::capi::ScriptExtensionsSet* self, uint16_t script);
-    
-    size_t icu4x_ScriptExtensionsSet_count_mv1(const diplomat::capi::ScriptExtensionsSet* self);
-    
-    typedef struct icu4x_ScriptExtensionsSet_script_at_mv1_result {union {uint16_t ok; }; bool is_ok;} icu4x_ScriptExtensionsSet_script_at_mv1_result;
-    icu4x_ScriptExtensionsSet_script_at_mv1_result icu4x_ScriptExtensionsSet_script_at_mv1(const diplomat::capi::ScriptExtensionsSet* self, size_t index);
-    
-    
-    void icu4x_ScriptExtensionsSet_destroy_mv1(ScriptExtensionsSet* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline bool ScriptExtensionsSet::contains(uint16_t script) const {
-  auto result = diplomat::capi::icu4x_ScriptExtensionsSet_contains_mv1(this->AsFFI(),
-    script);
-  return result;
-}
-
-inline size_t ScriptExtensionsSet::count() const {
-  auto result = diplomat::capi::icu4x_ScriptExtensionsSet_count_mv1(this->AsFFI());
-  return result;
-}
-
-inline std::optional<uint16_t> ScriptExtensionsSet::script_at(size_t index) const {
-  auto result = diplomat::capi::icu4x_ScriptExtensionsSet_script_at_mv1(this->AsFFI(),
-    index);
-  return result.is_ok ? std::optional<uint16_t>(result.ok) : std::nullopt;
-}
-
-inline const diplomat::capi::ScriptExtensionsSet* ScriptExtensionsSet::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::ScriptExtensionsSet*>(this);
-}
-
-inline diplomat::capi::ScriptExtensionsSet* ScriptExtensionsSet::AsFFI() {
-  return reinterpret_cast<diplomat::capi::ScriptExtensionsSet*>(this);
-}
-
-inline const ScriptExtensionsSet* ScriptExtensionsSet::FromFFI(const diplomat::capi::ScriptExtensionsSet* ptr) {
-  return reinterpret_cast<const ScriptExtensionsSet*>(ptr);
-}
-
-inline ScriptExtensionsSet* ScriptExtensionsSet::FromFFI(diplomat::capi::ScriptExtensionsSet* ptr) {
-  return reinterpret_cast<ScriptExtensionsSet*>(ptr);
-}
-
-inline void ScriptExtensionsSet::operator delete(void* ptr) {
-  diplomat::capi::icu4x_ScriptExtensionsSet_destroy_mv1(reinterpret_cast<diplomat::capi::ScriptExtensionsSet*>(ptr));
-}
-
-
-#endif // ScriptExtensionsSet_HPP
diff --git a/ffi/capi/bindings/cpp/ScriptWithExtensions.d.hpp b/ffi/capi/bindings/cpp/ScriptWithExtensions.d.hpp
deleted file mode 100644
index e2cf792a08f..00000000000
--- a/ffi/capi/bindings/cpp/ScriptWithExtensions.d.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef ScriptWithExtensions_D_HPP
-#define ScriptWithExtensions_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct CodePointRangeIterator; }
-class CodePointRangeIterator;
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct ScriptWithExtensionsBorrowed; }
-class ScriptWithExtensionsBorrowed;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct ScriptWithExtensions;
-} // namespace capi
-} // namespace
-
-class ScriptWithExtensions {
-public:
-
-  inline static diplomat::result<std::unique_ptr<ScriptWithExtensions>, DataError> create(const DataProvider& provider);
-
-  inline uint16_t get_script_val(uint32_t code_point) const;
-
-  inline bool has_script(uint32_t code_point, uint16_t script) const;
-
-  inline std::unique_ptr<ScriptWithExtensionsBorrowed> as_borrowed() const;
-
-  inline std::unique_ptr<CodePointRangeIterator> iter_ranges_for_script(uint16_t script) const;
-
-  inline const diplomat::capi::ScriptWithExtensions* AsFFI() const;
-  inline diplomat::capi::ScriptWithExtensions* AsFFI();
-  inline static const ScriptWithExtensions* FromFFI(const diplomat::capi::ScriptWithExtensions* ptr);
-  inline static ScriptWithExtensions* FromFFI(diplomat::capi::ScriptWithExtensions* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  ScriptWithExtensions() = delete;
-  ScriptWithExtensions(const ScriptWithExtensions&) = delete;
-  ScriptWithExtensions(ScriptWithExtensions&&) noexcept = delete;
-  ScriptWithExtensions operator=(const ScriptWithExtensions&) = delete;
-  ScriptWithExtensions operator=(ScriptWithExtensions&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // ScriptWithExtensions_D_HPP
diff --git a/ffi/capi/bindings/cpp/ScriptWithExtensions.hpp b/ffi/capi/bindings/cpp/ScriptWithExtensions.hpp
deleted file mode 100644
index 769ec234c05..00000000000
--- a/ffi/capi/bindings/cpp/ScriptWithExtensions.hpp
+++ /dev/null
@@ -1,91 +0,0 @@
-#ifndef ScriptWithExtensions_HPP
-#define ScriptWithExtensions_HPP
-
-#include "ScriptWithExtensions.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "CodePointRangeIterator.hpp"
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "ScriptWithExtensionsBorrowed.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_ScriptWithExtensions_create_mv1_result {union {diplomat::capi::ScriptWithExtensions* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_ScriptWithExtensions_create_mv1_result;
-    icu4x_ScriptWithExtensions_create_mv1_result icu4x_ScriptWithExtensions_create_mv1(const diplomat::capi::DataProvider* provider);
-    
-    uint16_t icu4x_ScriptWithExtensions_get_script_val_mv1(const diplomat::capi::ScriptWithExtensions* self, uint32_t code_point);
-    
-    bool icu4x_ScriptWithExtensions_has_script_mv1(const diplomat::capi::ScriptWithExtensions* self, uint32_t code_point, uint16_t script);
-    
-    diplomat::capi::ScriptWithExtensionsBorrowed* icu4x_ScriptWithExtensions_as_borrowed_mv1(const diplomat::capi::ScriptWithExtensions* self);
-    
-    diplomat::capi::CodePointRangeIterator* icu4x_ScriptWithExtensions_iter_ranges_for_script_mv1(const diplomat::capi::ScriptWithExtensions* self, uint16_t script);
-    
-    
-    void icu4x_ScriptWithExtensions_destroy_mv1(ScriptWithExtensions* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<ScriptWithExtensions>, DataError> ScriptWithExtensions::create(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_ScriptWithExtensions_create_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<ScriptWithExtensions>, DataError>(diplomat::Ok<std::unique_ptr<ScriptWithExtensions>>(std::unique_ptr<ScriptWithExtensions>(ScriptWithExtensions::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<ScriptWithExtensions>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline uint16_t ScriptWithExtensions::get_script_val(uint32_t code_point) const {
-  auto result = diplomat::capi::icu4x_ScriptWithExtensions_get_script_val_mv1(this->AsFFI(),
-    code_point);
-  return result;
-}
-
-inline bool ScriptWithExtensions::has_script(uint32_t code_point, uint16_t script) const {
-  auto result = diplomat::capi::icu4x_ScriptWithExtensions_has_script_mv1(this->AsFFI(),
-    code_point,
-    script);
-  return result;
-}
-
-inline std::unique_ptr<ScriptWithExtensionsBorrowed> ScriptWithExtensions::as_borrowed() const {
-  auto result = diplomat::capi::icu4x_ScriptWithExtensions_as_borrowed_mv1(this->AsFFI());
-  return std::unique_ptr<ScriptWithExtensionsBorrowed>(ScriptWithExtensionsBorrowed::FromFFI(result));
-}
-
-inline std::unique_ptr<CodePointRangeIterator> ScriptWithExtensions::iter_ranges_for_script(uint16_t script) const {
-  auto result = diplomat::capi::icu4x_ScriptWithExtensions_iter_ranges_for_script_mv1(this->AsFFI(),
-    script);
-  return std::unique_ptr<CodePointRangeIterator>(CodePointRangeIterator::FromFFI(result));
-}
-
-inline const diplomat::capi::ScriptWithExtensions* ScriptWithExtensions::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::ScriptWithExtensions*>(this);
-}
-
-inline diplomat::capi::ScriptWithExtensions* ScriptWithExtensions::AsFFI() {
-  return reinterpret_cast<diplomat::capi::ScriptWithExtensions*>(this);
-}
-
-inline const ScriptWithExtensions* ScriptWithExtensions::FromFFI(const diplomat::capi::ScriptWithExtensions* ptr) {
-  return reinterpret_cast<const ScriptWithExtensions*>(ptr);
-}
-
-inline ScriptWithExtensions* ScriptWithExtensions::FromFFI(diplomat::capi::ScriptWithExtensions* ptr) {
-  return reinterpret_cast<ScriptWithExtensions*>(ptr);
-}
-
-inline void ScriptWithExtensions::operator delete(void* ptr) {
-  diplomat::capi::icu4x_ScriptWithExtensions_destroy_mv1(reinterpret_cast<diplomat::capi::ScriptWithExtensions*>(ptr));
-}
-
-
-#endif // ScriptWithExtensions_HPP
diff --git a/ffi/capi/bindings/cpp/ScriptWithExtensionsBorrowed.d.hpp b/ffi/capi/bindings/cpp/ScriptWithExtensionsBorrowed.d.hpp
deleted file mode 100644
index 73db9b2e108..00000000000
--- a/ffi/capi/bindings/cpp/ScriptWithExtensionsBorrowed.d.hpp
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef ScriptWithExtensionsBorrowed_D_HPP
-#define ScriptWithExtensionsBorrowed_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct CodePointSetData; }
-class CodePointSetData;
-namespace diplomat::capi { struct ScriptExtensionsSet; }
-class ScriptExtensionsSet;
-
-
-namespace diplomat {
-namespace capi {
-    struct ScriptWithExtensionsBorrowed;
-} // namespace capi
-} // namespace
-
-class ScriptWithExtensionsBorrowed {
-public:
-
-  inline uint16_t get_script_val(uint32_t code_point) const;
-
-  inline std::unique_ptr<ScriptExtensionsSet> get_script_extensions_val(uint32_t code_point) const;
-
-  inline bool has_script(uint32_t code_point, uint16_t script) const;
-
-  inline std::unique_ptr<CodePointSetData> get_script_extensions_set(uint16_t script) const;
-
-  inline const diplomat::capi::ScriptWithExtensionsBorrowed* AsFFI() const;
-  inline diplomat::capi::ScriptWithExtensionsBorrowed* AsFFI();
-  inline static const ScriptWithExtensionsBorrowed* FromFFI(const diplomat::capi::ScriptWithExtensionsBorrowed* ptr);
-  inline static ScriptWithExtensionsBorrowed* FromFFI(diplomat::capi::ScriptWithExtensionsBorrowed* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  ScriptWithExtensionsBorrowed() = delete;
-  ScriptWithExtensionsBorrowed(const ScriptWithExtensionsBorrowed&) = delete;
-  ScriptWithExtensionsBorrowed(ScriptWithExtensionsBorrowed&&) noexcept = delete;
-  ScriptWithExtensionsBorrowed operator=(const ScriptWithExtensionsBorrowed&) = delete;
-  ScriptWithExtensionsBorrowed operator=(ScriptWithExtensionsBorrowed&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // ScriptWithExtensionsBorrowed_D_HPP
diff --git a/ffi/capi/bindings/cpp/ScriptWithExtensionsBorrowed.hpp b/ffi/capi/bindings/cpp/ScriptWithExtensionsBorrowed.hpp
deleted file mode 100644
index 23c0ab91c64..00000000000
--- a/ffi/capi/bindings/cpp/ScriptWithExtensionsBorrowed.hpp
+++ /dev/null
@@ -1,82 +0,0 @@
-#ifndef ScriptWithExtensionsBorrowed_HPP
-#define ScriptWithExtensionsBorrowed_HPP
-
-#include "ScriptWithExtensionsBorrowed.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "CodePointSetData.hpp"
-#include "ScriptExtensionsSet.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    uint16_t icu4x_ScriptWithExtensionsBorrowed_get_script_val_mv1(const diplomat::capi::ScriptWithExtensionsBorrowed* self, uint32_t code_point);
-    
-    diplomat::capi::ScriptExtensionsSet* icu4x_ScriptWithExtensionsBorrowed_get_script_extensions_val_mv1(const diplomat::capi::ScriptWithExtensionsBorrowed* self, uint32_t code_point);
-    
-    bool icu4x_ScriptWithExtensionsBorrowed_has_script_mv1(const diplomat::capi::ScriptWithExtensionsBorrowed* self, uint32_t code_point, uint16_t script);
-    
-    diplomat::capi::CodePointSetData* icu4x_ScriptWithExtensionsBorrowed_get_script_extensions_set_mv1(const diplomat::capi::ScriptWithExtensionsBorrowed* self, uint16_t script);
-    
-    
-    void icu4x_ScriptWithExtensionsBorrowed_destroy_mv1(ScriptWithExtensionsBorrowed* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline uint16_t ScriptWithExtensionsBorrowed::get_script_val(uint32_t code_point) const {
-  auto result = diplomat::capi::icu4x_ScriptWithExtensionsBorrowed_get_script_val_mv1(this->AsFFI(),
-    code_point);
-  return result;
-}
-
-inline std::unique_ptr<ScriptExtensionsSet> ScriptWithExtensionsBorrowed::get_script_extensions_val(uint32_t code_point) const {
-  auto result = diplomat::capi::icu4x_ScriptWithExtensionsBorrowed_get_script_extensions_val_mv1(this->AsFFI(),
-    code_point);
-  return std::unique_ptr<ScriptExtensionsSet>(ScriptExtensionsSet::FromFFI(result));
-}
-
-inline bool ScriptWithExtensionsBorrowed::has_script(uint32_t code_point, uint16_t script) const {
-  auto result = diplomat::capi::icu4x_ScriptWithExtensionsBorrowed_has_script_mv1(this->AsFFI(),
-    code_point,
-    script);
-  return result;
-}
-
-inline std::unique_ptr<CodePointSetData> ScriptWithExtensionsBorrowed::get_script_extensions_set(uint16_t script) const {
-  auto result = diplomat::capi::icu4x_ScriptWithExtensionsBorrowed_get_script_extensions_set_mv1(this->AsFFI(),
-    script);
-  return std::unique_ptr<CodePointSetData>(CodePointSetData::FromFFI(result));
-}
-
-inline const diplomat::capi::ScriptWithExtensionsBorrowed* ScriptWithExtensionsBorrowed::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::ScriptWithExtensionsBorrowed*>(this);
-}
-
-inline diplomat::capi::ScriptWithExtensionsBorrowed* ScriptWithExtensionsBorrowed::AsFFI() {
-  return reinterpret_cast<diplomat::capi::ScriptWithExtensionsBorrowed*>(this);
-}
-
-inline const ScriptWithExtensionsBorrowed* ScriptWithExtensionsBorrowed::FromFFI(const diplomat::capi::ScriptWithExtensionsBorrowed* ptr) {
-  return reinterpret_cast<const ScriptWithExtensionsBorrowed*>(ptr);
-}
-
-inline ScriptWithExtensionsBorrowed* ScriptWithExtensionsBorrowed::FromFFI(diplomat::capi::ScriptWithExtensionsBorrowed* ptr) {
-  return reinterpret_cast<ScriptWithExtensionsBorrowed*>(ptr);
-}
-
-inline void ScriptWithExtensionsBorrowed::operator delete(void* ptr) {
-  diplomat::capi::icu4x_ScriptWithExtensionsBorrowed_destroy_mv1(reinterpret_cast<diplomat::capi::ScriptWithExtensionsBorrowed*>(ptr));
-}
-
-
-#endif // ScriptWithExtensionsBorrowed_HPP
diff --git a/ffi/capi/bindings/cpp/SegmenterWordType.hpp b/ffi/capi/bindings/cpp/SegmenterWordType.hpp
deleted file mode 100644
index 39d9052371e..00000000000
--- a/ffi/capi/bindings/cpp/SegmenterWordType.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef SegmenterWordType_HPP
-#define SegmenterWordType_HPP
-
-#include "SegmenterWordType.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    bool icu4x_SegmenterWordType_is_word_like_mv1(diplomat::capi::SegmenterWordType self);
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::SegmenterWordType SegmenterWordType::AsFFI() const {
-  return static_cast<diplomat::capi::SegmenterWordType>(value);
-}
-
-inline SegmenterWordType SegmenterWordType::FromFFI(diplomat::capi::SegmenterWordType c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::SegmenterWordType_None:
-    case diplomat::capi::SegmenterWordType_Number:
-    case diplomat::capi::SegmenterWordType_Letter:
-      return static_cast<SegmenterWordType::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-
-inline bool SegmenterWordType::is_word_like() {
-  auto result = diplomat::capi::icu4x_SegmenterWordType_is_word_like_mv1(this->AsFFI());
-  return result;
-}
-#endif // SegmenterWordType_HPP
diff --git a/ffi/capi/bindings/cpp/SentenceBreakIteratorLatin1.d.hpp b/ffi/capi/bindings/cpp/SentenceBreakIteratorLatin1.d.hpp
deleted file mode 100644
index 0c6f17386aa..00000000000
--- a/ffi/capi/bindings/cpp/SentenceBreakIteratorLatin1.d.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef SentenceBreakIteratorLatin1_D_HPP
-#define SentenceBreakIteratorLatin1_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    struct SentenceBreakIteratorLatin1;
-} // namespace capi
-} // namespace
-
-class SentenceBreakIteratorLatin1 {
-public:
-
-  inline int32_t next();
-
-  inline const diplomat::capi::SentenceBreakIteratorLatin1* AsFFI() const;
-  inline diplomat::capi::SentenceBreakIteratorLatin1* AsFFI();
-  inline static const SentenceBreakIteratorLatin1* FromFFI(const diplomat::capi::SentenceBreakIteratorLatin1* ptr);
-  inline static SentenceBreakIteratorLatin1* FromFFI(diplomat::capi::SentenceBreakIteratorLatin1* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  SentenceBreakIteratorLatin1() = delete;
-  SentenceBreakIteratorLatin1(const SentenceBreakIteratorLatin1&) = delete;
-  SentenceBreakIteratorLatin1(SentenceBreakIteratorLatin1&&) noexcept = delete;
-  SentenceBreakIteratorLatin1 operator=(const SentenceBreakIteratorLatin1&) = delete;
-  SentenceBreakIteratorLatin1 operator=(SentenceBreakIteratorLatin1&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // SentenceBreakIteratorLatin1_D_HPP
diff --git a/ffi/capi/bindings/cpp/SentenceBreakIteratorLatin1.hpp b/ffi/capi/bindings/cpp/SentenceBreakIteratorLatin1.hpp
deleted file mode 100644
index d4394fb7ae3..00000000000
--- a/ffi/capi/bindings/cpp/SentenceBreakIteratorLatin1.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef SentenceBreakIteratorLatin1_HPP
-#define SentenceBreakIteratorLatin1_HPP
-
-#include "SentenceBreakIteratorLatin1.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    int32_t icu4x_SentenceBreakIteratorLatin1_next_mv1(diplomat::capi::SentenceBreakIteratorLatin1* self);
-    
-    
-    void icu4x_SentenceBreakIteratorLatin1_destroy_mv1(SentenceBreakIteratorLatin1* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline int32_t SentenceBreakIteratorLatin1::next() {
-  auto result = diplomat::capi::icu4x_SentenceBreakIteratorLatin1_next_mv1(this->AsFFI());
-  return result;
-}
-
-inline const diplomat::capi::SentenceBreakIteratorLatin1* SentenceBreakIteratorLatin1::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::SentenceBreakIteratorLatin1*>(this);
-}
-
-inline diplomat::capi::SentenceBreakIteratorLatin1* SentenceBreakIteratorLatin1::AsFFI() {
-  return reinterpret_cast<diplomat::capi::SentenceBreakIteratorLatin1*>(this);
-}
-
-inline const SentenceBreakIteratorLatin1* SentenceBreakIteratorLatin1::FromFFI(const diplomat::capi::SentenceBreakIteratorLatin1* ptr) {
-  return reinterpret_cast<const SentenceBreakIteratorLatin1*>(ptr);
-}
-
-inline SentenceBreakIteratorLatin1* SentenceBreakIteratorLatin1::FromFFI(diplomat::capi::SentenceBreakIteratorLatin1* ptr) {
-  return reinterpret_cast<SentenceBreakIteratorLatin1*>(ptr);
-}
-
-inline void SentenceBreakIteratorLatin1::operator delete(void* ptr) {
-  diplomat::capi::icu4x_SentenceBreakIteratorLatin1_destroy_mv1(reinterpret_cast<diplomat::capi::SentenceBreakIteratorLatin1*>(ptr));
-}
-
-
-#endif // SentenceBreakIteratorLatin1_HPP
diff --git a/ffi/capi/bindings/cpp/SentenceBreakIteratorUtf16.d.hpp b/ffi/capi/bindings/cpp/SentenceBreakIteratorUtf16.d.hpp
deleted file mode 100644
index b2991968b6e..00000000000
--- a/ffi/capi/bindings/cpp/SentenceBreakIteratorUtf16.d.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef SentenceBreakIteratorUtf16_D_HPP
-#define SentenceBreakIteratorUtf16_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    struct SentenceBreakIteratorUtf16;
-} // namespace capi
-} // namespace
-
-class SentenceBreakIteratorUtf16 {
-public:
-
-  inline int32_t next();
-
-  inline const diplomat::capi::SentenceBreakIteratorUtf16* AsFFI() const;
-  inline diplomat::capi::SentenceBreakIteratorUtf16* AsFFI();
-  inline static const SentenceBreakIteratorUtf16* FromFFI(const diplomat::capi::SentenceBreakIteratorUtf16* ptr);
-  inline static SentenceBreakIteratorUtf16* FromFFI(diplomat::capi::SentenceBreakIteratorUtf16* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  SentenceBreakIteratorUtf16() = delete;
-  SentenceBreakIteratorUtf16(const SentenceBreakIteratorUtf16&) = delete;
-  SentenceBreakIteratorUtf16(SentenceBreakIteratorUtf16&&) noexcept = delete;
-  SentenceBreakIteratorUtf16 operator=(const SentenceBreakIteratorUtf16&) = delete;
-  SentenceBreakIteratorUtf16 operator=(SentenceBreakIteratorUtf16&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // SentenceBreakIteratorUtf16_D_HPP
diff --git a/ffi/capi/bindings/cpp/SentenceBreakIteratorUtf16.hpp b/ffi/capi/bindings/cpp/SentenceBreakIteratorUtf16.hpp
deleted file mode 100644
index 5fc25028b5a..00000000000
--- a/ffi/capi/bindings/cpp/SentenceBreakIteratorUtf16.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef SentenceBreakIteratorUtf16_HPP
-#define SentenceBreakIteratorUtf16_HPP
-
-#include "SentenceBreakIteratorUtf16.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    int32_t icu4x_SentenceBreakIteratorUtf16_next_mv1(diplomat::capi::SentenceBreakIteratorUtf16* self);
-    
-    
-    void icu4x_SentenceBreakIteratorUtf16_destroy_mv1(SentenceBreakIteratorUtf16* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline int32_t SentenceBreakIteratorUtf16::next() {
-  auto result = diplomat::capi::icu4x_SentenceBreakIteratorUtf16_next_mv1(this->AsFFI());
-  return result;
-}
-
-inline const diplomat::capi::SentenceBreakIteratorUtf16* SentenceBreakIteratorUtf16::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::SentenceBreakIteratorUtf16*>(this);
-}
-
-inline diplomat::capi::SentenceBreakIteratorUtf16* SentenceBreakIteratorUtf16::AsFFI() {
-  return reinterpret_cast<diplomat::capi::SentenceBreakIteratorUtf16*>(this);
-}
-
-inline const SentenceBreakIteratorUtf16* SentenceBreakIteratorUtf16::FromFFI(const diplomat::capi::SentenceBreakIteratorUtf16* ptr) {
-  return reinterpret_cast<const SentenceBreakIteratorUtf16*>(ptr);
-}
-
-inline SentenceBreakIteratorUtf16* SentenceBreakIteratorUtf16::FromFFI(diplomat::capi::SentenceBreakIteratorUtf16* ptr) {
-  return reinterpret_cast<SentenceBreakIteratorUtf16*>(ptr);
-}
-
-inline void SentenceBreakIteratorUtf16::operator delete(void* ptr) {
-  diplomat::capi::icu4x_SentenceBreakIteratorUtf16_destroy_mv1(reinterpret_cast<diplomat::capi::SentenceBreakIteratorUtf16*>(ptr));
-}
-
-
-#endif // SentenceBreakIteratorUtf16_HPP
diff --git a/ffi/capi/bindings/cpp/SentenceBreakIteratorUtf8.d.hpp b/ffi/capi/bindings/cpp/SentenceBreakIteratorUtf8.d.hpp
deleted file mode 100644
index e48f79c9375..00000000000
--- a/ffi/capi/bindings/cpp/SentenceBreakIteratorUtf8.d.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef SentenceBreakIteratorUtf8_D_HPP
-#define SentenceBreakIteratorUtf8_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    struct SentenceBreakIteratorUtf8;
-} // namespace capi
-} // namespace
-
-class SentenceBreakIteratorUtf8 {
-public:
-
-  inline int32_t next();
-
-  inline const diplomat::capi::SentenceBreakIteratorUtf8* AsFFI() const;
-  inline diplomat::capi::SentenceBreakIteratorUtf8* AsFFI();
-  inline static const SentenceBreakIteratorUtf8* FromFFI(const diplomat::capi::SentenceBreakIteratorUtf8* ptr);
-  inline static SentenceBreakIteratorUtf8* FromFFI(diplomat::capi::SentenceBreakIteratorUtf8* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  SentenceBreakIteratorUtf8() = delete;
-  SentenceBreakIteratorUtf8(const SentenceBreakIteratorUtf8&) = delete;
-  SentenceBreakIteratorUtf8(SentenceBreakIteratorUtf8&&) noexcept = delete;
-  SentenceBreakIteratorUtf8 operator=(const SentenceBreakIteratorUtf8&) = delete;
-  SentenceBreakIteratorUtf8 operator=(SentenceBreakIteratorUtf8&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // SentenceBreakIteratorUtf8_D_HPP
diff --git a/ffi/capi/bindings/cpp/SentenceBreakIteratorUtf8.hpp b/ffi/capi/bindings/cpp/SentenceBreakIteratorUtf8.hpp
deleted file mode 100644
index f6a2c2d7499..00000000000
--- a/ffi/capi/bindings/cpp/SentenceBreakIteratorUtf8.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef SentenceBreakIteratorUtf8_HPP
-#define SentenceBreakIteratorUtf8_HPP
-
-#include "SentenceBreakIteratorUtf8.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    int32_t icu4x_SentenceBreakIteratorUtf8_next_mv1(diplomat::capi::SentenceBreakIteratorUtf8* self);
-    
-    
-    void icu4x_SentenceBreakIteratorUtf8_destroy_mv1(SentenceBreakIteratorUtf8* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline int32_t SentenceBreakIteratorUtf8::next() {
-  auto result = diplomat::capi::icu4x_SentenceBreakIteratorUtf8_next_mv1(this->AsFFI());
-  return result;
-}
-
-inline const diplomat::capi::SentenceBreakIteratorUtf8* SentenceBreakIteratorUtf8::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::SentenceBreakIteratorUtf8*>(this);
-}
-
-inline diplomat::capi::SentenceBreakIteratorUtf8* SentenceBreakIteratorUtf8::AsFFI() {
-  return reinterpret_cast<diplomat::capi::SentenceBreakIteratorUtf8*>(this);
-}
-
-inline const SentenceBreakIteratorUtf8* SentenceBreakIteratorUtf8::FromFFI(const diplomat::capi::SentenceBreakIteratorUtf8* ptr) {
-  return reinterpret_cast<const SentenceBreakIteratorUtf8*>(ptr);
-}
-
-inline SentenceBreakIteratorUtf8* SentenceBreakIteratorUtf8::FromFFI(diplomat::capi::SentenceBreakIteratorUtf8* ptr) {
-  return reinterpret_cast<SentenceBreakIteratorUtf8*>(ptr);
-}
-
-inline void SentenceBreakIteratorUtf8::operator delete(void* ptr) {
-  diplomat::capi::icu4x_SentenceBreakIteratorUtf8_destroy_mv1(reinterpret_cast<diplomat::capi::SentenceBreakIteratorUtf8*>(ptr));
-}
-
-
-#endif // SentenceBreakIteratorUtf8_HPP
diff --git a/ffi/capi/bindings/cpp/SentenceSegmenter.d.hpp b/ffi/capi/bindings/cpp/SentenceSegmenter.d.hpp
deleted file mode 100644
index 92361411d44..00000000000
--- a/ffi/capi/bindings/cpp/SentenceSegmenter.d.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef SentenceSegmenter_D_HPP
-#define SentenceSegmenter_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct SentenceBreakIteratorLatin1; }
-class SentenceBreakIteratorLatin1;
-namespace diplomat::capi { struct SentenceBreakIteratorUtf16; }
-class SentenceBreakIteratorUtf16;
-namespace diplomat::capi { struct SentenceBreakIteratorUtf8; }
-class SentenceBreakIteratorUtf8;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct SentenceSegmenter;
-} // namespace capi
-} // namespace
-
-class SentenceSegmenter {
-public:
-
-  inline static diplomat::result<std::unique_ptr<SentenceSegmenter>, DataError> create(const DataProvider& provider);
-
-  inline std::unique_ptr<SentenceBreakIteratorUtf8> segment(std::string_view input) const;
-
-  inline std::unique_ptr<SentenceBreakIteratorUtf16> segment16(std::u16string_view input) const;
-
-  inline std::unique_ptr<SentenceBreakIteratorLatin1> segment_latin1(diplomat::span<const uint8_t> input) const;
-
-  inline const diplomat::capi::SentenceSegmenter* AsFFI() const;
-  inline diplomat::capi::SentenceSegmenter* AsFFI();
-  inline static const SentenceSegmenter* FromFFI(const diplomat::capi::SentenceSegmenter* ptr);
-  inline static SentenceSegmenter* FromFFI(diplomat::capi::SentenceSegmenter* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  SentenceSegmenter() = delete;
-  SentenceSegmenter(const SentenceSegmenter&) = delete;
-  SentenceSegmenter(SentenceSegmenter&&) noexcept = delete;
-  SentenceSegmenter operator=(const SentenceSegmenter&) = delete;
-  SentenceSegmenter operator=(SentenceSegmenter&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // SentenceSegmenter_D_HPP
diff --git a/ffi/capi/bindings/cpp/SentenceSegmenter.hpp b/ffi/capi/bindings/cpp/SentenceSegmenter.hpp
deleted file mode 100644
index 0c0fff10307..00000000000
--- a/ffi/capi/bindings/cpp/SentenceSegmenter.hpp
+++ /dev/null
@@ -1,87 +0,0 @@
-#ifndef SentenceSegmenter_HPP
-#define SentenceSegmenter_HPP
-
-#include "SentenceSegmenter.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "SentenceBreakIteratorLatin1.hpp"
-#include "SentenceBreakIteratorUtf16.hpp"
-#include "SentenceBreakIteratorUtf8.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_SentenceSegmenter_create_mv1_result {union {diplomat::capi::SentenceSegmenter* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_SentenceSegmenter_create_mv1_result;
-    icu4x_SentenceSegmenter_create_mv1_result icu4x_SentenceSegmenter_create_mv1(const diplomat::capi::DataProvider* provider);
-    
-    diplomat::capi::SentenceBreakIteratorUtf8* icu4x_SentenceSegmenter_segment_utf8_mv1(const diplomat::capi::SentenceSegmenter* self, const char* input_data, size_t input_len);
-    
-    diplomat::capi::SentenceBreakIteratorUtf16* icu4x_SentenceSegmenter_segment_utf16_mv1(const diplomat::capi::SentenceSegmenter* self, const char16_t* input_data, size_t input_len);
-    
-    diplomat::capi::SentenceBreakIteratorLatin1* icu4x_SentenceSegmenter_segment_latin1_mv1(const diplomat::capi::SentenceSegmenter* self, const uint8_t* input_data, size_t input_len);
-    
-    
-    void icu4x_SentenceSegmenter_destroy_mv1(SentenceSegmenter* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<SentenceSegmenter>, DataError> SentenceSegmenter::create(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_SentenceSegmenter_create_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<SentenceSegmenter>, DataError>(diplomat::Ok<std::unique_ptr<SentenceSegmenter>>(std::unique_ptr<SentenceSegmenter>(SentenceSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<SentenceSegmenter>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline std::unique_ptr<SentenceBreakIteratorUtf8> SentenceSegmenter::segment(std::string_view input) const {
-  auto result = diplomat::capi::icu4x_SentenceSegmenter_segment_utf8_mv1(this->AsFFI(),
-    input.data(),
-    input.size());
-  return std::unique_ptr<SentenceBreakIteratorUtf8>(SentenceBreakIteratorUtf8::FromFFI(result));
-}
-
-inline std::unique_ptr<SentenceBreakIteratorUtf16> SentenceSegmenter::segment16(std::u16string_view input) const {
-  auto result = diplomat::capi::icu4x_SentenceSegmenter_segment_utf16_mv1(this->AsFFI(),
-    input.data(),
-    input.size());
-  return std::unique_ptr<SentenceBreakIteratorUtf16>(SentenceBreakIteratorUtf16::FromFFI(result));
-}
-
-inline std::unique_ptr<SentenceBreakIteratorLatin1> SentenceSegmenter::segment_latin1(diplomat::span<const uint8_t> input) const {
-  auto result = diplomat::capi::icu4x_SentenceSegmenter_segment_latin1_mv1(this->AsFFI(),
-    input.data(),
-    input.size());
-  return std::unique_ptr<SentenceBreakIteratorLatin1>(SentenceBreakIteratorLatin1::FromFFI(result));
-}
-
-inline const diplomat::capi::SentenceSegmenter* SentenceSegmenter::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::SentenceSegmenter*>(this);
-}
-
-inline diplomat::capi::SentenceSegmenter* SentenceSegmenter::AsFFI() {
-  return reinterpret_cast<diplomat::capi::SentenceSegmenter*>(this);
-}
-
-inline const SentenceSegmenter* SentenceSegmenter::FromFFI(const diplomat::capi::SentenceSegmenter* ptr) {
-  return reinterpret_cast<const SentenceSegmenter*>(ptr);
-}
-
-inline SentenceSegmenter* SentenceSegmenter::FromFFI(diplomat::capi::SentenceSegmenter* ptr) {
-  return reinterpret_cast<SentenceSegmenter*>(ptr);
-}
-
-inline void SentenceSegmenter::operator delete(void* ptr) {
-  diplomat::capi::icu4x_SentenceSegmenter_destroy_mv1(reinterpret_cast<diplomat::capi::SentenceSegmenter*>(ptr));
-}
-
-
-#endif // SentenceSegmenter_HPP
diff --git a/ffi/capi/bindings/cpp/Time.d.hpp b/ffi/capi/bindings/cpp/Time.d.hpp
deleted file mode 100644
index ee6323b2d03..00000000000
--- a/ffi/capi/bindings/cpp/Time.d.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef Time_D_HPP
-#define Time_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-class CalendarError;
-class CalendarParseError;
-
-
-namespace diplomat {
-namespace capi {
-    struct Time;
-} // namespace capi
-} // namespace
-
-class Time {
-public:
-
-  inline static diplomat::result<std::unique_ptr<Time>, CalendarError> create(uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond);
-
-  inline static diplomat::result<std::unique_ptr<Time>, CalendarParseError> from_string(std::string_view v);
-
-  inline static diplomat::result<std::unique_ptr<Time>, CalendarError> midnight();
-
-  inline uint8_t hour() const;
-
-  inline uint8_t minute() const;
-
-  inline uint8_t second() const;
-
-  inline uint32_t nanosecond() const;
-
-  inline const diplomat::capi::Time* AsFFI() const;
-  inline diplomat::capi::Time* AsFFI();
-  inline static const Time* FromFFI(const diplomat::capi::Time* ptr);
-  inline static Time* FromFFI(diplomat::capi::Time* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  Time() = delete;
-  Time(const Time&) = delete;
-  Time(Time&&) noexcept = delete;
-  Time operator=(const Time&) = delete;
-  Time operator=(Time&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // Time_D_HPP
diff --git a/ffi/capi/bindings/cpp/Time.hpp b/ffi/capi/bindings/cpp/Time.hpp
deleted file mode 100644
index 712e08f8dfa..00000000000
--- a/ffi/capi/bindings/cpp/Time.hpp
+++ /dev/null
@@ -1,105 +0,0 @@
-#ifndef Time_HPP
-#define Time_HPP
-
-#include "Time.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "CalendarError.hpp"
-#include "CalendarParseError.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_Time_create_mv1_result {union {diplomat::capi::Time* ok; diplomat::capi::CalendarError err;}; bool is_ok;} icu4x_Time_create_mv1_result;
-    icu4x_Time_create_mv1_result icu4x_Time_create_mv1(uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond);
-    
-    typedef struct icu4x_Time_from_string_mv1_result {union {diplomat::capi::Time* ok; diplomat::capi::CalendarParseError err;}; bool is_ok;} icu4x_Time_from_string_mv1_result;
-    icu4x_Time_from_string_mv1_result icu4x_Time_from_string_mv1(const char* v_data, size_t v_len);
-    
-    typedef struct icu4x_Time_midnight_mv1_result {union {diplomat::capi::Time* ok; diplomat::capi::CalendarError err;}; bool is_ok;} icu4x_Time_midnight_mv1_result;
-    icu4x_Time_midnight_mv1_result icu4x_Time_midnight_mv1(void);
-    
-    uint8_t icu4x_Time_hour_mv1(const diplomat::capi::Time* self);
-    
-    uint8_t icu4x_Time_minute_mv1(const diplomat::capi::Time* self);
-    
-    uint8_t icu4x_Time_second_mv1(const diplomat::capi::Time* self);
-    
-    uint32_t icu4x_Time_nanosecond_mv1(const diplomat::capi::Time* self);
-    
-    
-    void icu4x_Time_destroy_mv1(Time* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<Time>, CalendarError> Time::create(uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond) {
-  auto result = diplomat::capi::icu4x_Time_create_mv1(hour,
-    minute,
-    second,
-    nanosecond);
-  return result.is_ok ? diplomat::result<std::unique_ptr<Time>, CalendarError>(diplomat::Ok<std::unique_ptr<Time>>(std::unique_ptr<Time>(Time::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<Time>, CalendarError>(diplomat::Err<CalendarError>(CalendarError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<Time>, CalendarParseError> Time::from_string(std::string_view v) {
-  auto result = diplomat::capi::icu4x_Time_from_string_mv1(v.data(),
-    v.size());
-  return result.is_ok ? diplomat::result<std::unique_ptr<Time>, CalendarParseError>(diplomat::Ok<std::unique_ptr<Time>>(std::unique_ptr<Time>(Time::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<Time>, CalendarParseError>(diplomat::Err<CalendarParseError>(CalendarParseError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<Time>, CalendarError> Time::midnight() {
-  auto result = diplomat::capi::icu4x_Time_midnight_mv1();
-  return result.is_ok ? diplomat::result<std::unique_ptr<Time>, CalendarError>(diplomat::Ok<std::unique_ptr<Time>>(std::unique_ptr<Time>(Time::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<Time>, CalendarError>(diplomat::Err<CalendarError>(CalendarError::FromFFI(result.err)));
-}
-
-inline uint8_t Time::hour() const {
-  auto result = diplomat::capi::icu4x_Time_hour_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint8_t Time::minute() const {
-  auto result = diplomat::capi::icu4x_Time_minute_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint8_t Time::second() const {
-  auto result = diplomat::capi::icu4x_Time_second_mv1(this->AsFFI());
-  return result;
-}
-
-inline uint32_t Time::nanosecond() const {
-  auto result = diplomat::capi::icu4x_Time_nanosecond_mv1(this->AsFFI());
-  return result;
-}
-
-inline const diplomat::capi::Time* Time::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::Time*>(this);
-}
-
-inline diplomat::capi::Time* Time::AsFFI() {
-  return reinterpret_cast<diplomat::capi::Time*>(this);
-}
-
-inline const Time* Time::FromFFI(const diplomat::capi::Time* ptr) {
-  return reinterpret_cast<const Time*>(ptr);
-}
-
-inline Time* Time::FromFFI(diplomat::capi::Time* ptr) {
-  return reinterpret_cast<Time*>(ptr);
-}
-
-inline void Time::operator delete(void* ptr) {
-  diplomat::capi::icu4x_Time_destroy_mv1(reinterpret_cast<diplomat::capi::Time*>(ptr));
-}
-
-
-#endif // Time_HPP
diff --git a/ffi/capi/bindings/cpp/TimeFormatter.d.hpp b/ffi/capi/bindings/cpp/TimeFormatter.d.hpp
deleted file mode 100644
index a47d5aa488f..00000000000
--- a/ffi/capi/bindings/cpp/TimeFormatter.d.hpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef TimeFormatter_D_HPP
-#define TimeFormatter_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct DateTime; }
-class DateTime;
-namespace diplomat::capi { struct IsoDateTime; }
-class IsoDateTime;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-namespace diplomat::capi { struct Time; }
-class Time;
-class Error;
-class TimeLength;
-
-
-namespace diplomat {
-namespace capi {
-    struct TimeFormatter;
-} // namespace capi
-} // namespace
-
-class TimeFormatter {
-public:
-
-  inline static diplomat::result<std::unique_ptr<TimeFormatter>, Error> create_with_length(const DataProvider& provider, const Locale& locale, TimeLength length);
-
-  inline std::string format_time(const Time& value) const;
-
-  inline std::string format_datetime(const DateTime& value) const;
-
-  inline std::string format_iso_datetime(const IsoDateTime& value) const;
-
-  inline const diplomat::capi::TimeFormatter* AsFFI() const;
-  inline diplomat::capi::TimeFormatter* AsFFI();
-  inline static const TimeFormatter* FromFFI(const diplomat::capi::TimeFormatter* ptr);
-  inline static TimeFormatter* FromFFI(diplomat::capi::TimeFormatter* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  TimeFormatter() = delete;
-  TimeFormatter(const TimeFormatter&) = delete;
-  TimeFormatter(TimeFormatter&&) noexcept = delete;
-  TimeFormatter operator=(const TimeFormatter&) = delete;
-  TimeFormatter operator=(TimeFormatter&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // TimeFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/TimeFormatter.hpp b/ffi/capi/bindings/cpp/TimeFormatter.hpp
deleted file mode 100644
index 05371a5b195..00000000000
--- a/ffi/capi/bindings/cpp/TimeFormatter.hpp
+++ /dev/null
@@ -1,97 +0,0 @@
-#ifndef TimeFormatter_HPP
-#define TimeFormatter_HPP
-
-#include "TimeFormatter.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataProvider.hpp"
-#include "DateTime.hpp"
-#include "Error.hpp"
-#include "IsoDateTime.hpp"
-#include "Locale.hpp"
-#include "Time.hpp"
-#include "TimeLength.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_TimeFormatter_create_with_length_mv1_result {union {diplomat::capi::TimeFormatter* ok; diplomat::capi::Error err;}; bool is_ok;} icu4x_TimeFormatter_create_with_length_mv1_result;
-    icu4x_TimeFormatter_create_with_length_mv1_result icu4x_TimeFormatter_create_with_length_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale, diplomat::capi::TimeLength length);
-    
-    void icu4x_TimeFormatter_format_time_mv1(const diplomat::capi::TimeFormatter* self, const diplomat::capi::Time* value, diplomat::capi::DiplomatWrite* write);
-    
-    void icu4x_TimeFormatter_format_datetime_mv1(const diplomat::capi::TimeFormatter* self, const diplomat::capi::DateTime* value, diplomat::capi::DiplomatWrite* write);
-    
-    void icu4x_TimeFormatter_format_iso_datetime_mv1(const diplomat::capi::TimeFormatter* self, const diplomat::capi::IsoDateTime* value, diplomat::capi::DiplomatWrite* write);
-    
-    
-    void icu4x_TimeFormatter_destroy_mv1(TimeFormatter* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<TimeFormatter>, Error> TimeFormatter::create_with_length(const DataProvider& provider, const Locale& locale, TimeLength length) {
-  auto result = diplomat::capi::icu4x_TimeFormatter_create_with_length_mv1(provider.AsFFI(),
-    locale.AsFFI(),
-    length.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<TimeFormatter>, Error>(diplomat::Ok<std::unique_ptr<TimeFormatter>>(std::unique_ptr<TimeFormatter>(TimeFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<TimeFormatter>, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline std::string TimeFormatter::format_time(const Time& value) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_TimeFormatter_format_time_mv1(this->AsFFI(),
-    value.AsFFI(),
-    &write);
-  return output;
-}
-
-inline std::string TimeFormatter::format_datetime(const DateTime& value) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_TimeFormatter_format_datetime_mv1(this->AsFFI(),
-    value.AsFFI(),
-    &write);
-  return output;
-}
-
-inline std::string TimeFormatter::format_iso_datetime(const IsoDateTime& value) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_TimeFormatter_format_iso_datetime_mv1(this->AsFFI(),
-    value.AsFFI(),
-    &write);
-  return output;
-}
-
-inline const diplomat::capi::TimeFormatter* TimeFormatter::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::TimeFormatter*>(this);
-}
-
-inline diplomat::capi::TimeFormatter* TimeFormatter::AsFFI() {
-  return reinterpret_cast<diplomat::capi::TimeFormatter*>(this);
-}
-
-inline const TimeFormatter* TimeFormatter::FromFFI(const diplomat::capi::TimeFormatter* ptr) {
-  return reinterpret_cast<const TimeFormatter*>(ptr);
-}
-
-inline TimeFormatter* TimeFormatter::FromFFI(diplomat::capi::TimeFormatter* ptr) {
-  return reinterpret_cast<TimeFormatter*>(ptr);
-}
-
-inline void TimeFormatter::operator delete(void* ptr) {
-  diplomat::capi::icu4x_TimeFormatter_destroy_mv1(reinterpret_cast<diplomat::capi::TimeFormatter*>(ptr));
-}
-
-
-#endif // TimeFormatter_HPP
diff --git a/ffi/capi/bindings/cpp/TimeLength.hpp b/ffi/capi/bindings/cpp/TimeLength.hpp
deleted file mode 100644
index af606a5fe1b..00000000000
--- a/ffi/capi/bindings/cpp/TimeLength.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef TimeLength_HPP
-#define TimeLength_HPP
-
-#include "TimeLength.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::TimeLength TimeLength::AsFFI() const {
-  return static_cast<diplomat::capi::TimeLength>(value);
-}
-
-inline TimeLength TimeLength::FromFFI(diplomat::capi::TimeLength c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::TimeLength_Full:
-    case diplomat::capi::TimeLength_Long:
-    case diplomat::capi::TimeLength_Medium:
-    case diplomat::capi::TimeLength_Short:
-      return static_cast<TimeLength::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // TimeLength_HPP
diff --git a/ffi/capi/bindings/cpp/TimeZoneFormatter.d.hpp b/ffi/capi/bindings/cpp/TimeZoneFormatter.d.hpp
deleted file mode 100644
index 0a3c6d0320f..00000000000
--- a/ffi/capi/bindings/cpp/TimeZoneFormatter.d.hpp
+++ /dev/null
@@ -1,68 +0,0 @@
-#ifndef TimeZoneFormatter_D_HPP
-#define TimeZoneFormatter_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct CustomTimeZone; }
-class CustomTimeZone;
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-struct IsoTimeZoneOptions;
-class Error;
-
-
-namespace diplomat {
-namespace capi {
-    struct TimeZoneFormatter;
-} // namespace capi
-} // namespace
-
-class TimeZoneFormatter {
-public:
-
-  inline static diplomat::result<std::unique_ptr<TimeZoneFormatter>, Error> create_with_localized_gmt_fallback(const DataProvider& provider, const Locale& locale);
-
-  inline static diplomat::result<std::unique_ptr<TimeZoneFormatter>, Error> create_with_iso_8601_fallback(const DataProvider& provider, const Locale& locale, IsoTimeZoneOptions options);
-
-  inline diplomat::result<std::monostate, Error> load_generic_non_location_long(const DataProvider& provider);
-
-  inline diplomat::result<std::monostate, Error> load_generic_non_location_short(const DataProvider& provider);
-
-  inline diplomat::result<std::monostate, Error> load_specific_non_location_long(const DataProvider& provider);
-
-  inline diplomat::result<std::monostate, Error> load_specific_non_location_short(const DataProvider& provider);
-
-  inline diplomat::result<std::monostate, Error> load_generic_location_format(const DataProvider& provider);
-
-  inline diplomat::result<std::monostate, Error> include_localized_gmt_format();
-
-  inline diplomat::result<std::monostate, Error> load_iso_8601_format(IsoTimeZoneOptions options);
-
-  inline std::string format_custom_time_zone(const CustomTimeZone& value) const;
-
-  inline diplomat::result<std::string, Error> format_custom_time_zone_no_fallback(const CustomTimeZone& value) const;
-
-  inline const diplomat::capi::TimeZoneFormatter* AsFFI() const;
-  inline diplomat::capi::TimeZoneFormatter* AsFFI();
-  inline static const TimeZoneFormatter* FromFFI(const diplomat::capi::TimeZoneFormatter* ptr);
-  inline static TimeZoneFormatter* FromFFI(diplomat::capi::TimeZoneFormatter* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  TimeZoneFormatter() = delete;
-  TimeZoneFormatter(const TimeZoneFormatter&) = delete;
-  TimeZoneFormatter(TimeZoneFormatter&&) noexcept = delete;
-  TimeZoneFormatter operator=(const TimeZoneFormatter&) = delete;
-  TimeZoneFormatter operator=(TimeZoneFormatter&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // TimeZoneFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/TimeZoneFormatter.hpp b/ffi/capi/bindings/cpp/TimeZoneFormatter.hpp
deleted file mode 100644
index 9a9caf0e564..00000000000
--- a/ffi/capi/bindings/cpp/TimeZoneFormatter.hpp
+++ /dev/null
@@ -1,156 +0,0 @@
-#ifndef TimeZoneFormatter_HPP
-#define TimeZoneFormatter_HPP
-
-#include "TimeZoneFormatter.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "CustomTimeZone.hpp"
-#include "DataProvider.hpp"
-#include "Error.hpp"
-#include "IsoTimeZoneOptions.hpp"
-#include "Locale.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_TimeZoneFormatter_create_with_localized_gmt_fallback_mv1_result {union {diplomat::capi::TimeZoneFormatter* ok; diplomat::capi::Error err;}; bool is_ok;} icu4x_TimeZoneFormatter_create_with_localized_gmt_fallback_mv1_result;
-    icu4x_TimeZoneFormatter_create_with_localized_gmt_fallback_mv1_result icu4x_TimeZoneFormatter_create_with_localized_gmt_fallback_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale);
-    
-    typedef struct icu4x_TimeZoneFormatter_create_with_iso_8601_fallback_mv1_result {union {diplomat::capi::TimeZoneFormatter* ok; diplomat::capi::Error err;}; bool is_ok;} icu4x_TimeZoneFormatter_create_with_iso_8601_fallback_mv1_result;
-    icu4x_TimeZoneFormatter_create_with_iso_8601_fallback_mv1_result icu4x_TimeZoneFormatter_create_with_iso_8601_fallback_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale, diplomat::capi::IsoTimeZoneOptions options);
-    
-    typedef struct icu4x_TimeZoneFormatter_load_generic_non_location_long_mv1_result {union { diplomat::capi::Error err;}; bool is_ok;} icu4x_TimeZoneFormatter_load_generic_non_location_long_mv1_result;
-    icu4x_TimeZoneFormatter_load_generic_non_location_long_mv1_result icu4x_TimeZoneFormatter_load_generic_non_location_long_mv1(diplomat::capi::TimeZoneFormatter* self, const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_TimeZoneFormatter_load_generic_non_location_short_mv1_result {union { diplomat::capi::Error err;}; bool is_ok;} icu4x_TimeZoneFormatter_load_generic_non_location_short_mv1_result;
-    icu4x_TimeZoneFormatter_load_generic_non_location_short_mv1_result icu4x_TimeZoneFormatter_load_generic_non_location_short_mv1(diplomat::capi::TimeZoneFormatter* self, const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_TimeZoneFormatter_load_specific_non_location_long_mv1_result {union { diplomat::capi::Error err;}; bool is_ok;} icu4x_TimeZoneFormatter_load_specific_non_location_long_mv1_result;
-    icu4x_TimeZoneFormatter_load_specific_non_location_long_mv1_result icu4x_TimeZoneFormatter_load_specific_non_location_long_mv1(diplomat::capi::TimeZoneFormatter* self, const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_TimeZoneFormatter_load_specific_non_location_short_mv1_result {union { diplomat::capi::Error err;}; bool is_ok;} icu4x_TimeZoneFormatter_load_specific_non_location_short_mv1_result;
-    icu4x_TimeZoneFormatter_load_specific_non_location_short_mv1_result icu4x_TimeZoneFormatter_load_specific_non_location_short_mv1(diplomat::capi::TimeZoneFormatter* self, const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_TimeZoneFormatter_load_generic_location_format_mv1_result {union { diplomat::capi::Error err;}; bool is_ok;} icu4x_TimeZoneFormatter_load_generic_location_format_mv1_result;
-    icu4x_TimeZoneFormatter_load_generic_location_format_mv1_result icu4x_TimeZoneFormatter_load_generic_location_format_mv1(diplomat::capi::TimeZoneFormatter* self, const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_TimeZoneFormatter_include_localized_gmt_format_mv1_result {union { diplomat::capi::Error err;}; bool is_ok;} icu4x_TimeZoneFormatter_include_localized_gmt_format_mv1_result;
-    icu4x_TimeZoneFormatter_include_localized_gmt_format_mv1_result icu4x_TimeZoneFormatter_include_localized_gmt_format_mv1(diplomat::capi::TimeZoneFormatter* self);
-    
-    typedef struct icu4x_TimeZoneFormatter_load_iso_8601_format_mv1_result {union { diplomat::capi::Error err;}; bool is_ok;} icu4x_TimeZoneFormatter_load_iso_8601_format_mv1_result;
-    icu4x_TimeZoneFormatter_load_iso_8601_format_mv1_result icu4x_TimeZoneFormatter_load_iso_8601_format_mv1(diplomat::capi::TimeZoneFormatter* self, diplomat::capi::IsoTimeZoneOptions options);
-    
-    void icu4x_TimeZoneFormatter_format_custom_time_zone_mv1(const diplomat::capi::TimeZoneFormatter* self, const diplomat::capi::CustomTimeZone* value, diplomat::capi::DiplomatWrite* write);
-    
-    typedef struct icu4x_TimeZoneFormatter_format_custom_time_zone_no_fallback_mv1_result {union { diplomat::capi::Error err;}; bool is_ok;} icu4x_TimeZoneFormatter_format_custom_time_zone_no_fallback_mv1_result;
-    icu4x_TimeZoneFormatter_format_custom_time_zone_no_fallback_mv1_result icu4x_TimeZoneFormatter_format_custom_time_zone_no_fallback_mv1(const diplomat::capi::TimeZoneFormatter* self, const diplomat::capi::CustomTimeZone* value, diplomat::capi::DiplomatWrite* write);
-    
-    
-    void icu4x_TimeZoneFormatter_destroy_mv1(TimeZoneFormatter* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<TimeZoneFormatter>, Error> TimeZoneFormatter::create_with_localized_gmt_fallback(const DataProvider& provider, const Locale& locale) {
-  auto result = diplomat::capi::icu4x_TimeZoneFormatter_create_with_localized_gmt_fallback_mv1(provider.AsFFI(),
-    locale.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<TimeZoneFormatter>, Error>(diplomat::Ok<std::unique_ptr<TimeZoneFormatter>>(std::unique_ptr<TimeZoneFormatter>(TimeZoneFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<TimeZoneFormatter>, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<TimeZoneFormatter>, Error> TimeZoneFormatter::create_with_iso_8601_fallback(const DataProvider& provider, const Locale& locale, IsoTimeZoneOptions options) {
-  auto result = diplomat::capi::icu4x_TimeZoneFormatter_create_with_iso_8601_fallback_mv1(provider.AsFFI(),
-    locale.AsFFI(),
-    options.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<TimeZoneFormatter>, Error>(diplomat::Ok<std::unique_ptr<TimeZoneFormatter>>(std::unique_ptr<TimeZoneFormatter>(TimeZoneFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<TimeZoneFormatter>, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::monostate, Error> TimeZoneFormatter::load_generic_non_location_long(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_TimeZoneFormatter_load_generic_non_location_long_mv1(this->AsFFI(),
-    provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::monostate, Error>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::monostate, Error> TimeZoneFormatter::load_generic_non_location_short(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_TimeZoneFormatter_load_generic_non_location_short_mv1(this->AsFFI(),
-    provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::monostate, Error>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::monostate, Error> TimeZoneFormatter::load_specific_non_location_long(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_TimeZoneFormatter_load_specific_non_location_long_mv1(this->AsFFI(),
-    provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::monostate, Error>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::monostate, Error> TimeZoneFormatter::load_specific_non_location_short(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_TimeZoneFormatter_load_specific_non_location_short_mv1(this->AsFFI(),
-    provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::monostate, Error>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::monostate, Error> TimeZoneFormatter::load_generic_location_format(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_TimeZoneFormatter_load_generic_location_format_mv1(this->AsFFI(),
-    provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::monostate, Error>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::monostate, Error> TimeZoneFormatter::include_localized_gmt_format() {
-  auto result = diplomat::capi::icu4x_TimeZoneFormatter_include_localized_gmt_format_mv1(this->AsFFI());
-  return result.is_ok ? diplomat::result<std::monostate, Error>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::monostate, Error> TimeZoneFormatter::load_iso_8601_format(IsoTimeZoneOptions options) {
-  auto result = diplomat::capi::icu4x_TimeZoneFormatter_load_iso_8601_format_mv1(this->AsFFI(),
-    options.AsFFI());
-  return result.is_ok ? diplomat::result<std::monostate, Error>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline std::string TimeZoneFormatter::format_custom_time_zone(const CustomTimeZone& value) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_TimeZoneFormatter_format_custom_time_zone_mv1(this->AsFFI(),
-    value.AsFFI(),
-    &write);
-  return output;
-}
-
-inline diplomat::result<std::string, Error> TimeZoneFormatter::format_custom_time_zone_no_fallback(const CustomTimeZone& value) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_TimeZoneFormatter_format_custom_time_zone_no_fallback_mv1(this->AsFFI(),
-    value.AsFFI(),
-    &write);
-  return result.is_ok ? diplomat::result<std::string, Error>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline const diplomat::capi::TimeZoneFormatter* TimeZoneFormatter::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::TimeZoneFormatter*>(this);
-}
-
-inline diplomat::capi::TimeZoneFormatter* TimeZoneFormatter::AsFFI() {
-  return reinterpret_cast<diplomat::capi::TimeZoneFormatter*>(this);
-}
-
-inline const TimeZoneFormatter* TimeZoneFormatter::FromFFI(const diplomat::capi::TimeZoneFormatter* ptr) {
-  return reinterpret_cast<const TimeZoneFormatter*>(ptr);
-}
-
-inline TimeZoneFormatter* TimeZoneFormatter::FromFFI(diplomat::capi::TimeZoneFormatter* ptr) {
-  return reinterpret_cast<TimeZoneFormatter*>(ptr);
-}
-
-inline void TimeZoneFormatter::operator delete(void* ptr) {
-  diplomat::capi::icu4x_TimeZoneFormatter_destroy_mv1(reinterpret_cast<diplomat::capi::TimeZoneFormatter*>(ptr));
-}
-
-
-#endif // TimeZoneFormatter_HPP
diff --git a/ffi/capi/bindings/cpp/TimeZoneIdMapper.d.hpp b/ffi/capi/bindings/cpp/TimeZoneIdMapper.d.hpp
deleted file mode 100644
index 0c1d3af83b6..00000000000
--- a/ffi/capi/bindings/cpp/TimeZoneIdMapper.d.hpp
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef TimeZoneIdMapper_D_HPP
-#define TimeZoneIdMapper_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-struct TimeZoneInvalidIdError;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct TimeZoneIdMapper;
-} // namespace capi
-} // namespace
-
-class TimeZoneIdMapper {
-public:
-
-  inline static diplomat::result<std::unique_ptr<TimeZoneIdMapper>, DataError> create(const DataProvider& provider);
-
-  inline diplomat::result<std::string, TimeZoneInvalidIdError> iana_to_bcp47(std::string_view value) const;
-
-  inline diplomat::result<diplomat::result<std::string, TimeZoneInvalidIdError>, diplomat::Utf8Error> normalize_iana(std::string_view value) const;
-
-  inline diplomat::result<diplomat::result<std::string, TimeZoneInvalidIdError>, diplomat::Utf8Error> canonicalize_iana(std::string_view value) const;
-
-  inline diplomat::result<std::string, TimeZoneInvalidIdError> find_canonical_iana_from_bcp47(std::string_view value) const;
-
-  inline const diplomat::capi::TimeZoneIdMapper* AsFFI() const;
-  inline diplomat::capi::TimeZoneIdMapper* AsFFI();
-  inline static const TimeZoneIdMapper* FromFFI(const diplomat::capi::TimeZoneIdMapper* ptr);
-  inline static TimeZoneIdMapper* FromFFI(diplomat::capi::TimeZoneIdMapper* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  TimeZoneIdMapper() = delete;
-  TimeZoneIdMapper(const TimeZoneIdMapper&) = delete;
-  TimeZoneIdMapper(TimeZoneIdMapper&&) noexcept = delete;
-  TimeZoneIdMapper operator=(const TimeZoneIdMapper&) = delete;
-  TimeZoneIdMapper operator=(TimeZoneIdMapper&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // TimeZoneIdMapper_D_HPP
diff --git a/ffi/capi/bindings/cpp/TimeZoneIdMapper.hpp b/ffi/capi/bindings/cpp/TimeZoneIdMapper.hpp
deleted file mode 100644
index 94746fe0ee0..00000000000
--- a/ffi/capi/bindings/cpp/TimeZoneIdMapper.hpp
+++ /dev/null
@@ -1,116 +0,0 @@
-#ifndef TimeZoneIdMapper_HPP
-#define TimeZoneIdMapper_HPP
-
-#include "TimeZoneIdMapper.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "TimeZoneInvalidIdError.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_TimeZoneIdMapper_create_mv1_result {union {diplomat::capi::TimeZoneIdMapper* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_TimeZoneIdMapper_create_mv1_result;
-    icu4x_TimeZoneIdMapper_create_mv1_result icu4x_TimeZoneIdMapper_create_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_TimeZoneIdMapper_iana_to_bcp47_mv1_result { bool is_ok;} icu4x_TimeZoneIdMapper_iana_to_bcp47_mv1_result;
-    icu4x_TimeZoneIdMapper_iana_to_bcp47_mv1_result icu4x_TimeZoneIdMapper_iana_to_bcp47_mv1(const diplomat::capi::TimeZoneIdMapper* self, const char* value_data, size_t value_len, diplomat::capi::DiplomatWrite* write);
-    
-    typedef struct icu4x_TimeZoneIdMapper_normalize_iana_mv1_result { bool is_ok;} icu4x_TimeZoneIdMapper_normalize_iana_mv1_result;
-    icu4x_TimeZoneIdMapper_normalize_iana_mv1_result icu4x_TimeZoneIdMapper_normalize_iana_mv1(const diplomat::capi::TimeZoneIdMapper* self, const char* value_data, size_t value_len, diplomat::capi::DiplomatWrite* write);
-    
-    typedef struct icu4x_TimeZoneIdMapper_canonicalize_iana_mv1_result { bool is_ok;} icu4x_TimeZoneIdMapper_canonicalize_iana_mv1_result;
-    icu4x_TimeZoneIdMapper_canonicalize_iana_mv1_result icu4x_TimeZoneIdMapper_canonicalize_iana_mv1(const diplomat::capi::TimeZoneIdMapper* self, const char* value_data, size_t value_len, diplomat::capi::DiplomatWrite* write);
-    
-    typedef struct icu4x_TimeZoneIdMapper_find_canonical_iana_from_bcp47_mv1_result { bool is_ok;} icu4x_TimeZoneIdMapper_find_canonical_iana_from_bcp47_mv1_result;
-    icu4x_TimeZoneIdMapper_find_canonical_iana_from_bcp47_mv1_result icu4x_TimeZoneIdMapper_find_canonical_iana_from_bcp47_mv1(const diplomat::capi::TimeZoneIdMapper* self, const char* value_data, size_t value_len, diplomat::capi::DiplomatWrite* write);
-    
-    
-    void icu4x_TimeZoneIdMapper_destroy_mv1(TimeZoneIdMapper* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<TimeZoneIdMapper>, DataError> TimeZoneIdMapper::create(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_TimeZoneIdMapper_create_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<TimeZoneIdMapper>, DataError>(diplomat::Ok<std::unique_ptr<TimeZoneIdMapper>>(std::unique_ptr<TimeZoneIdMapper>(TimeZoneIdMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<TimeZoneIdMapper>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::string, TimeZoneInvalidIdError> TimeZoneIdMapper::iana_to_bcp47(std::string_view value) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_TimeZoneIdMapper_iana_to_bcp47_mv1(this->AsFFI(),
-    value.data(),
-    value.size(),
-    &write);
-  return result.is_ok ? diplomat::result<std::string, TimeZoneInvalidIdError>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, TimeZoneInvalidIdError>(diplomat::Err<TimeZoneInvalidIdError>(TimeZoneInvalidIdError {}));
-}
-
-inline diplomat::result<diplomat::result<std::string, TimeZoneInvalidIdError>, diplomat::Utf8Error> TimeZoneIdMapper::normalize_iana(std::string_view value) const {
-  if (!diplomat::capi::diplomat_is_str(value.data(), value.size())) {
-    return diplomat::Err<diplomat::Utf8Error>(diplomat::Utf8Error());
-  }
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_TimeZoneIdMapper_normalize_iana_mv1(this->AsFFI(),
-    value.data(),
-    value.size(),
-    &write);
-  return diplomat::Ok<diplomat::result<std::string, TimeZoneInvalidIdError>>(result.is_ok ? diplomat::result<std::string, TimeZoneInvalidIdError>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, TimeZoneInvalidIdError>(diplomat::Err<TimeZoneInvalidIdError>(TimeZoneInvalidIdError {})));
-}
-
-inline diplomat::result<diplomat::result<std::string, TimeZoneInvalidIdError>, diplomat::Utf8Error> TimeZoneIdMapper::canonicalize_iana(std::string_view value) const {
-  if (!diplomat::capi::diplomat_is_str(value.data(), value.size())) {
-    return diplomat::Err<diplomat::Utf8Error>(diplomat::Utf8Error());
-  }
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_TimeZoneIdMapper_canonicalize_iana_mv1(this->AsFFI(),
-    value.data(),
-    value.size(),
-    &write);
-  return diplomat::Ok<diplomat::result<std::string, TimeZoneInvalidIdError>>(result.is_ok ? diplomat::result<std::string, TimeZoneInvalidIdError>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, TimeZoneInvalidIdError>(diplomat::Err<TimeZoneInvalidIdError>(TimeZoneInvalidIdError {})));
-}
-
-inline diplomat::result<std::string, TimeZoneInvalidIdError> TimeZoneIdMapper::find_canonical_iana_from_bcp47(std::string_view value) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_TimeZoneIdMapper_find_canonical_iana_from_bcp47_mv1(this->AsFFI(),
-    value.data(),
-    value.size(),
-    &write);
-  return result.is_ok ? diplomat::result<std::string, TimeZoneInvalidIdError>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, TimeZoneInvalidIdError>(diplomat::Err<TimeZoneInvalidIdError>(TimeZoneInvalidIdError {}));
-}
-
-inline const diplomat::capi::TimeZoneIdMapper* TimeZoneIdMapper::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::TimeZoneIdMapper*>(this);
-}
-
-inline diplomat::capi::TimeZoneIdMapper* TimeZoneIdMapper::AsFFI() {
-  return reinterpret_cast<diplomat::capi::TimeZoneIdMapper*>(this);
-}
-
-inline const TimeZoneIdMapper* TimeZoneIdMapper::FromFFI(const diplomat::capi::TimeZoneIdMapper* ptr) {
-  return reinterpret_cast<const TimeZoneIdMapper*>(ptr);
-}
-
-inline TimeZoneIdMapper* TimeZoneIdMapper::FromFFI(diplomat::capi::TimeZoneIdMapper* ptr) {
-  return reinterpret_cast<TimeZoneIdMapper*>(ptr);
-}
-
-inline void TimeZoneIdMapper::operator delete(void* ptr) {
-  diplomat::capi::icu4x_TimeZoneIdMapper_destroy_mv1(reinterpret_cast<diplomat::capi::TimeZoneIdMapper*>(ptr));
-}
-
-
-#endif // TimeZoneIdMapper_HPP
diff --git a/ffi/capi/bindings/cpp/TimeZoneIdMapperWithFastCanonicalization.d.hpp b/ffi/capi/bindings/cpp/TimeZoneIdMapperWithFastCanonicalization.d.hpp
deleted file mode 100644
index c946b1cad95..00000000000
--- a/ffi/capi/bindings/cpp/TimeZoneIdMapperWithFastCanonicalization.d.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef TimeZoneIdMapperWithFastCanonicalization_D_HPP
-#define TimeZoneIdMapperWithFastCanonicalization_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-struct TimeZoneInvalidIdError;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct TimeZoneIdMapperWithFastCanonicalization;
-} // namespace capi
-} // namespace
-
-class TimeZoneIdMapperWithFastCanonicalization {
-public:
-
-  inline static diplomat::result<std::unique_ptr<TimeZoneIdMapperWithFastCanonicalization>, DataError> create(const DataProvider& provider);
-
-  inline diplomat::result<diplomat::result<std::string, TimeZoneInvalidIdError>, diplomat::Utf8Error> canonicalize_iana(std::string_view value) const;
-
-  inline diplomat::result<std::string, TimeZoneInvalidIdError> canonical_iana_from_bcp47(std::string_view value) const;
-
-  inline const diplomat::capi::TimeZoneIdMapperWithFastCanonicalization* AsFFI() const;
-  inline diplomat::capi::TimeZoneIdMapperWithFastCanonicalization* AsFFI();
-  inline static const TimeZoneIdMapperWithFastCanonicalization* FromFFI(const diplomat::capi::TimeZoneIdMapperWithFastCanonicalization* ptr);
-  inline static TimeZoneIdMapperWithFastCanonicalization* FromFFI(diplomat::capi::TimeZoneIdMapperWithFastCanonicalization* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  TimeZoneIdMapperWithFastCanonicalization() = delete;
-  TimeZoneIdMapperWithFastCanonicalization(const TimeZoneIdMapperWithFastCanonicalization&) = delete;
-  TimeZoneIdMapperWithFastCanonicalization(TimeZoneIdMapperWithFastCanonicalization&&) noexcept = delete;
-  TimeZoneIdMapperWithFastCanonicalization operator=(const TimeZoneIdMapperWithFastCanonicalization&) = delete;
-  TimeZoneIdMapperWithFastCanonicalization operator=(TimeZoneIdMapperWithFastCanonicalization&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // TimeZoneIdMapperWithFastCanonicalization_D_HPP
diff --git a/ffi/capi/bindings/cpp/TimeZoneIdMapperWithFastCanonicalization.hpp b/ffi/capi/bindings/cpp/TimeZoneIdMapperWithFastCanonicalization.hpp
deleted file mode 100644
index a70c31fdbf7..00000000000
--- a/ffi/capi/bindings/cpp/TimeZoneIdMapperWithFastCanonicalization.hpp
+++ /dev/null
@@ -1,87 +0,0 @@
-#ifndef TimeZoneIdMapperWithFastCanonicalization_HPP
-#define TimeZoneIdMapperWithFastCanonicalization_HPP
-
-#include "TimeZoneIdMapperWithFastCanonicalization.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "TimeZoneInvalidIdError.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_TimeZoneIdMapperWithFastCanonicalization_create_mv1_result {union {diplomat::capi::TimeZoneIdMapperWithFastCanonicalization* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_TimeZoneIdMapperWithFastCanonicalization_create_mv1_result;
-    icu4x_TimeZoneIdMapperWithFastCanonicalization_create_mv1_result icu4x_TimeZoneIdMapperWithFastCanonicalization_create_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_TimeZoneIdMapperWithFastCanonicalization_canonicalize_iana_mv1_result { bool is_ok;} icu4x_TimeZoneIdMapperWithFastCanonicalization_canonicalize_iana_mv1_result;
-    icu4x_TimeZoneIdMapperWithFastCanonicalization_canonicalize_iana_mv1_result icu4x_TimeZoneIdMapperWithFastCanonicalization_canonicalize_iana_mv1(const diplomat::capi::TimeZoneIdMapperWithFastCanonicalization* self, const char* value_data, size_t value_len, diplomat::capi::DiplomatWrite* write);
-    
-    typedef struct icu4x_TimeZoneIdMapperWithFastCanonicalization_canonical_iana_from_bcp47_mv1_result { bool is_ok;} icu4x_TimeZoneIdMapperWithFastCanonicalization_canonical_iana_from_bcp47_mv1_result;
-    icu4x_TimeZoneIdMapperWithFastCanonicalization_canonical_iana_from_bcp47_mv1_result icu4x_TimeZoneIdMapperWithFastCanonicalization_canonical_iana_from_bcp47_mv1(const diplomat::capi::TimeZoneIdMapperWithFastCanonicalization* self, const char* value_data, size_t value_len, diplomat::capi::DiplomatWrite* write);
-    
-    
-    void icu4x_TimeZoneIdMapperWithFastCanonicalization_destroy_mv1(TimeZoneIdMapperWithFastCanonicalization* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<TimeZoneIdMapperWithFastCanonicalization>, DataError> TimeZoneIdMapperWithFastCanonicalization::create(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_TimeZoneIdMapperWithFastCanonicalization_create_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<TimeZoneIdMapperWithFastCanonicalization>, DataError>(diplomat::Ok<std::unique_ptr<TimeZoneIdMapperWithFastCanonicalization>>(std::unique_ptr<TimeZoneIdMapperWithFastCanonicalization>(TimeZoneIdMapperWithFastCanonicalization::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<TimeZoneIdMapperWithFastCanonicalization>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<diplomat::result<std::string, TimeZoneInvalidIdError>, diplomat::Utf8Error> TimeZoneIdMapperWithFastCanonicalization::canonicalize_iana(std::string_view value) const {
-  if (!diplomat::capi::diplomat_is_str(value.data(), value.size())) {
-    return diplomat::Err<diplomat::Utf8Error>(diplomat::Utf8Error());
-  }
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_TimeZoneIdMapperWithFastCanonicalization_canonicalize_iana_mv1(this->AsFFI(),
-    value.data(),
-    value.size(),
-    &write);
-  return diplomat::Ok<diplomat::result<std::string, TimeZoneInvalidIdError>>(result.is_ok ? diplomat::result<std::string, TimeZoneInvalidIdError>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, TimeZoneInvalidIdError>(diplomat::Err<TimeZoneInvalidIdError>(TimeZoneInvalidIdError {})));
-}
-
-inline diplomat::result<std::string, TimeZoneInvalidIdError> TimeZoneIdMapperWithFastCanonicalization::canonical_iana_from_bcp47(std::string_view value) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_TimeZoneIdMapperWithFastCanonicalization_canonical_iana_from_bcp47_mv1(this->AsFFI(),
-    value.data(),
-    value.size(),
-    &write);
-  return result.is_ok ? diplomat::result<std::string, TimeZoneInvalidIdError>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, TimeZoneInvalidIdError>(diplomat::Err<TimeZoneInvalidIdError>(TimeZoneInvalidIdError {}));
-}
-
-inline const diplomat::capi::TimeZoneIdMapperWithFastCanonicalization* TimeZoneIdMapperWithFastCanonicalization::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::TimeZoneIdMapperWithFastCanonicalization*>(this);
-}
-
-inline diplomat::capi::TimeZoneIdMapperWithFastCanonicalization* TimeZoneIdMapperWithFastCanonicalization::AsFFI() {
-  return reinterpret_cast<diplomat::capi::TimeZoneIdMapperWithFastCanonicalization*>(this);
-}
-
-inline const TimeZoneIdMapperWithFastCanonicalization* TimeZoneIdMapperWithFastCanonicalization::FromFFI(const diplomat::capi::TimeZoneIdMapperWithFastCanonicalization* ptr) {
-  return reinterpret_cast<const TimeZoneIdMapperWithFastCanonicalization*>(ptr);
-}
-
-inline TimeZoneIdMapperWithFastCanonicalization* TimeZoneIdMapperWithFastCanonicalization::FromFFI(diplomat::capi::TimeZoneIdMapperWithFastCanonicalization* ptr) {
-  return reinterpret_cast<TimeZoneIdMapperWithFastCanonicalization*>(ptr);
-}
-
-inline void TimeZoneIdMapperWithFastCanonicalization::operator delete(void* ptr) {
-  diplomat::capi::icu4x_TimeZoneIdMapperWithFastCanonicalization_destroy_mv1(reinterpret_cast<diplomat::capi::TimeZoneIdMapperWithFastCanonicalization*>(ptr));
-}
-
-
-#endif // TimeZoneIdMapperWithFastCanonicalization_HPP
diff --git a/ffi/capi/bindings/cpp/TimeZoneInvalidOffsetError.d.hpp b/ffi/capi/bindings/cpp/TimeZoneInvalidOffsetError.d.hpp
deleted file mode 100644
index c60d2753e01..00000000000
--- a/ffi/capi/bindings/cpp/TimeZoneInvalidOffsetError.d.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef TimeZoneInvalidOffsetError_D_HPP
-#define TimeZoneInvalidOffsetError_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    
-} // namespace capi
-} // namespace
-
-
-struct TimeZoneInvalidOffsetError {
-
-};
-
-
-#endif // TimeZoneInvalidOffsetError_D_HPP
diff --git a/ffi/capi/bindings/cpp/TitlecaseMapper.d.hpp b/ffi/capi/bindings/cpp/TitlecaseMapper.d.hpp
deleted file mode 100644
index 5be8beba9bf..00000000000
--- a/ffi/capi/bindings/cpp/TitlecaseMapper.d.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef TitlecaseMapper_D_HPP
-#define TitlecaseMapper_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-struct TitlecaseOptionsV1;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct TitlecaseMapper;
-} // namespace capi
-} // namespace
-
-class TitlecaseMapper {
-public:
-
-  inline static diplomat::result<std::unique_ptr<TitlecaseMapper>, DataError> create(const DataProvider& provider);
-
-  inline diplomat::result<std::string, diplomat::Utf8Error> titlecase_segment_v1(std::string_view s, const Locale& locale, TitlecaseOptionsV1 options) const;
-
-  inline const diplomat::capi::TitlecaseMapper* AsFFI() const;
-  inline diplomat::capi::TitlecaseMapper* AsFFI();
-  inline static const TitlecaseMapper* FromFFI(const diplomat::capi::TitlecaseMapper* ptr);
-  inline static TitlecaseMapper* FromFFI(diplomat::capi::TitlecaseMapper* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  TitlecaseMapper() = delete;
-  TitlecaseMapper(const TitlecaseMapper&) = delete;
-  TitlecaseMapper(TitlecaseMapper&&) noexcept = delete;
-  TitlecaseMapper operator=(const TitlecaseMapper&) = delete;
-  TitlecaseMapper operator=(TitlecaseMapper&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // TitlecaseMapper_D_HPP
diff --git a/ffi/capi/bindings/cpp/TitlecaseMapper.hpp b/ffi/capi/bindings/cpp/TitlecaseMapper.hpp
deleted file mode 100644
index 5b2a5082fdf..00000000000
--- a/ffi/capi/bindings/cpp/TitlecaseMapper.hpp
+++ /dev/null
@@ -1,76 +0,0 @@
-#ifndef TitlecaseMapper_HPP
-#define TitlecaseMapper_HPP
-
-#include "TitlecaseMapper.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "Locale.hpp"
-#include "TitlecaseOptionsV1.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_TitlecaseMapper_create_mv1_result {union {diplomat::capi::TitlecaseMapper* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_TitlecaseMapper_create_mv1_result;
-    icu4x_TitlecaseMapper_create_mv1_result icu4x_TitlecaseMapper_create_mv1(const diplomat::capi::DataProvider* provider);
-    
-    void icu4x_TitlecaseMapper_titlecase_segment_v1_mv1(const diplomat::capi::TitlecaseMapper* self, const char* s_data, size_t s_len, const diplomat::capi::Locale* locale, diplomat::capi::TitlecaseOptionsV1 options, diplomat::capi::DiplomatWrite* write);
-    
-    
-    void icu4x_TitlecaseMapper_destroy_mv1(TitlecaseMapper* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<TitlecaseMapper>, DataError> TitlecaseMapper::create(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_TitlecaseMapper_create_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<TitlecaseMapper>, DataError>(diplomat::Ok<std::unique_ptr<TitlecaseMapper>>(std::unique_ptr<TitlecaseMapper>(TitlecaseMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<TitlecaseMapper>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::string, diplomat::Utf8Error> TitlecaseMapper::titlecase_segment_v1(std::string_view s, const Locale& locale, TitlecaseOptionsV1 options) const {
-  if (!diplomat::capi::diplomat_is_str(s.data(), s.size())) {
-    return diplomat::Err<diplomat::Utf8Error>(diplomat::Utf8Error());
-  }
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  diplomat::capi::icu4x_TitlecaseMapper_titlecase_segment_v1_mv1(this->AsFFI(),
-    s.data(),
-    s.size(),
-    locale.AsFFI(),
-    options.AsFFI(),
-    &write);
-  return diplomat::Ok<std::string>(std::move(output));
-}
-
-inline const diplomat::capi::TitlecaseMapper* TitlecaseMapper::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::TitlecaseMapper*>(this);
-}
-
-inline diplomat::capi::TitlecaseMapper* TitlecaseMapper::AsFFI() {
-  return reinterpret_cast<diplomat::capi::TitlecaseMapper*>(this);
-}
-
-inline const TitlecaseMapper* TitlecaseMapper::FromFFI(const diplomat::capi::TitlecaseMapper* ptr) {
-  return reinterpret_cast<const TitlecaseMapper*>(ptr);
-}
-
-inline TitlecaseMapper* TitlecaseMapper::FromFFI(diplomat::capi::TitlecaseMapper* ptr) {
-  return reinterpret_cast<TitlecaseMapper*>(ptr);
-}
-
-inline void TitlecaseMapper::operator delete(void* ptr) {
-  diplomat::capi::icu4x_TitlecaseMapper_destroy_mv1(reinterpret_cast<diplomat::capi::TitlecaseMapper*>(ptr));
-}
-
-
-#endif // TitlecaseMapper_HPP
diff --git a/ffi/capi/bindings/cpp/TitlecaseOptionsV1.d.hpp b/ffi/capi/bindings/cpp/TitlecaseOptionsV1.d.hpp
deleted file mode 100644
index 30d41d5b92a..00000000000
--- a/ffi/capi/bindings/cpp/TitlecaseOptionsV1.d.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef TitlecaseOptionsV1_D_HPP
-#define TitlecaseOptionsV1_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "LeadingAdjustment.d.hpp"
-#include "TrailingCase.d.hpp"
-#include "diplomat_runtime.hpp"
-
-class LeadingAdjustment;
-class TrailingCase;
-
-
-namespace diplomat {
-namespace capi {
-    struct TitlecaseOptionsV1 {
-      diplomat::capi::LeadingAdjustment leading_adjustment;
-      diplomat::capi::TrailingCase trailing_case;
-    };
-} // namespace capi
-} // namespace
-
-
-struct TitlecaseOptionsV1 {
-  LeadingAdjustment leading_adjustment;
-  TrailingCase trailing_case;
-
-  inline static TitlecaseOptionsV1 default_options();
-
-  inline diplomat::capi::TitlecaseOptionsV1 AsFFI() const;
-  inline static TitlecaseOptionsV1 FromFFI(diplomat::capi::TitlecaseOptionsV1 c_struct);
-};
-
-
-#endif // TitlecaseOptionsV1_D_HPP
diff --git a/ffi/capi/bindings/cpp/TitlecaseOptionsV1.hpp b/ffi/capi/bindings/cpp/TitlecaseOptionsV1.hpp
deleted file mode 100644
index abff0fa8fc6..00000000000
--- a/ffi/capi/bindings/cpp/TitlecaseOptionsV1.hpp
+++ /dev/null
@@ -1,49 +0,0 @@
-#ifndef TitlecaseOptionsV1_HPP
-#define TitlecaseOptionsV1_HPP
-
-#include "TitlecaseOptionsV1.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "LeadingAdjustment.hpp"
-#include "TrailingCase.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    diplomat::capi::TitlecaseOptionsV1 icu4x_TitlecaseOptionsV1_default_mv1(void);
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline TitlecaseOptionsV1 TitlecaseOptionsV1::default_options() {
-  auto result = diplomat::capi::icu4x_TitlecaseOptionsV1_default_mv1();
-  return TitlecaseOptionsV1::FromFFI(result);
-}
-
-
-inline diplomat::capi::TitlecaseOptionsV1 TitlecaseOptionsV1::AsFFI() const {
-  return diplomat::capi::TitlecaseOptionsV1 {
-    /* .leading_adjustment = */ leading_adjustment.AsFFI(),
-    /* .trailing_case = */ trailing_case.AsFFI(),
-  };
-}
-
-inline TitlecaseOptionsV1 TitlecaseOptionsV1::FromFFI(diplomat::capi::TitlecaseOptionsV1 c_struct) {
-  return TitlecaseOptionsV1 {
-    /* .leading_adjustment = */ LeadingAdjustment::FromFFI(c_struct.leading_adjustment),
-    /* .trailing_case = */ TrailingCase::FromFFI(c_struct.trailing_case),
-  };
-}
-
-
-#endif // TitlecaseOptionsV1_HPP
diff --git a/ffi/capi/bindings/cpp/TrailingCase.hpp b/ffi/capi/bindings/cpp/TrailingCase.hpp
deleted file mode 100644
index e95f11d947e..00000000000
--- a/ffi/capi/bindings/cpp/TrailingCase.hpp
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef TrailingCase_HPP
-#define TrailingCase_HPP
-
-#include "TrailingCase.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::TrailingCase TrailingCase::AsFFI() const {
-  return static_cast<diplomat::capi::TrailingCase>(value);
-}
-
-inline TrailingCase TrailingCase::FromFFI(diplomat::capi::TrailingCase c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::TrailingCase_Lower:
-    case diplomat::capi::TrailingCase_Unchanged:
-      return static_cast<TrailingCase::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // TrailingCase_HPP
diff --git a/ffi/capi/bindings/cpp/TransformResult.hpp b/ffi/capi/bindings/cpp/TransformResult.hpp
deleted file mode 100644
index ea8f53b8656..00000000000
--- a/ffi/capi/bindings/cpp/TransformResult.hpp
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef TransformResult_HPP
-#define TransformResult_HPP
-
-#include "TransformResult.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::TransformResult TransformResult::AsFFI() const {
-  return static_cast<diplomat::capi::TransformResult>(value);
-}
-
-inline TransformResult TransformResult::FromFFI(diplomat::capi::TransformResult c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::TransformResult_Modified:
-    case diplomat::capi::TransformResult_Unmodified:
-      return static_cast<TransformResult::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // TransformResult_HPP
diff --git a/ffi/capi/bindings/cpp/UnicodeSetData.d.hpp b/ffi/capi/bindings/cpp/UnicodeSetData.d.hpp
deleted file mode 100644
index 6c5eb06a91d..00000000000
--- a/ffi/capi/bindings/cpp/UnicodeSetData.d.hpp
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef UnicodeSetData_D_HPP
-#define UnicodeSetData_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct UnicodeSetData;
-} // namespace capi
-} // namespace
-
-class UnicodeSetData {
-public:
-
-  inline bool contains(std::string_view s) const;
-
-  inline bool contains_char(char32_t cp) const;
-
-  inline static diplomat::result<std::unique_ptr<UnicodeSetData>, DataError> load_basic_emoji(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<UnicodeSetData>, DataError> load_exemplars_main(const DataProvider& provider, const Locale& locale);
-
-  inline static diplomat::result<std::unique_ptr<UnicodeSetData>, DataError> load_exemplars_auxiliary(const DataProvider& provider, const Locale& locale);
-
-  inline static diplomat::result<std::unique_ptr<UnicodeSetData>, DataError> load_exemplars_punctuation(const DataProvider& provider, const Locale& locale);
-
-  inline static diplomat::result<std::unique_ptr<UnicodeSetData>, DataError> load_exemplars_numbers(const DataProvider& provider, const Locale& locale);
-
-  inline static diplomat::result<std::unique_ptr<UnicodeSetData>, DataError> load_exemplars_index(const DataProvider& provider, const Locale& locale);
-
-  inline const diplomat::capi::UnicodeSetData* AsFFI() const;
-  inline diplomat::capi::UnicodeSetData* AsFFI();
-  inline static const UnicodeSetData* FromFFI(const diplomat::capi::UnicodeSetData* ptr);
-  inline static UnicodeSetData* FromFFI(diplomat::capi::UnicodeSetData* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  UnicodeSetData() = delete;
-  UnicodeSetData(const UnicodeSetData&) = delete;
-  UnicodeSetData(UnicodeSetData&&) noexcept = delete;
-  UnicodeSetData operator=(const UnicodeSetData&) = delete;
-  UnicodeSetData operator=(UnicodeSetData&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // UnicodeSetData_D_HPP
diff --git a/ffi/capi/bindings/cpp/UnicodeSetData.hpp b/ffi/capi/bindings/cpp/UnicodeSetData.hpp
deleted file mode 100644
index 1fa4c247928..00000000000
--- a/ffi/capi/bindings/cpp/UnicodeSetData.hpp
+++ /dev/null
@@ -1,120 +0,0 @@
-#ifndef UnicodeSetData_HPP
-#define UnicodeSetData_HPP
-
-#include "UnicodeSetData.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "Locale.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    bool icu4x_UnicodeSetData_contains_mv1(const diplomat::capi::UnicodeSetData* self, const char* s_data, size_t s_len);
-    
-    bool icu4x_UnicodeSetData_contains_char_mv1(const diplomat::capi::UnicodeSetData* self, char32_t cp);
-    
-    typedef struct icu4x_UnicodeSetData_load_basic_emoji_mv1_result {union {diplomat::capi::UnicodeSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_UnicodeSetData_load_basic_emoji_mv1_result;
-    icu4x_UnicodeSetData_load_basic_emoji_mv1_result icu4x_UnicodeSetData_load_basic_emoji_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_UnicodeSetData_load_exemplars_main_mv1_result {union {diplomat::capi::UnicodeSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_UnicodeSetData_load_exemplars_main_mv1_result;
-    icu4x_UnicodeSetData_load_exemplars_main_mv1_result icu4x_UnicodeSetData_load_exemplars_main_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale);
-    
-    typedef struct icu4x_UnicodeSetData_load_exemplars_auxiliary_mv1_result {union {diplomat::capi::UnicodeSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_UnicodeSetData_load_exemplars_auxiliary_mv1_result;
-    icu4x_UnicodeSetData_load_exemplars_auxiliary_mv1_result icu4x_UnicodeSetData_load_exemplars_auxiliary_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale);
-    
-    typedef struct icu4x_UnicodeSetData_load_exemplars_punctuation_mv1_result {union {diplomat::capi::UnicodeSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_UnicodeSetData_load_exemplars_punctuation_mv1_result;
-    icu4x_UnicodeSetData_load_exemplars_punctuation_mv1_result icu4x_UnicodeSetData_load_exemplars_punctuation_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale);
-    
-    typedef struct icu4x_UnicodeSetData_load_exemplars_numbers_mv1_result {union {diplomat::capi::UnicodeSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_UnicodeSetData_load_exemplars_numbers_mv1_result;
-    icu4x_UnicodeSetData_load_exemplars_numbers_mv1_result icu4x_UnicodeSetData_load_exemplars_numbers_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale);
-    
-    typedef struct icu4x_UnicodeSetData_load_exemplars_index_mv1_result {union {diplomat::capi::UnicodeSetData* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_UnicodeSetData_load_exemplars_index_mv1_result;
-    icu4x_UnicodeSetData_load_exemplars_index_mv1_result icu4x_UnicodeSetData_load_exemplars_index_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale);
-    
-    
-    void icu4x_UnicodeSetData_destroy_mv1(UnicodeSetData* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline bool UnicodeSetData::contains(std::string_view s) const {
-  auto result = diplomat::capi::icu4x_UnicodeSetData_contains_mv1(this->AsFFI(),
-    s.data(),
-    s.size());
-  return result;
-}
-
-inline bool UnicodeSetData::contains_char(char32_t cp) const {
-  auto result = diplomat::capi::icu4x_UnicodeSetData_contains_char_mv1(this->AsFFI(),
-    cp);
-  return result;
-}
-
-inline diplomat::result<std::unique_ptr<UnicodeSetData>, DataError> UnicodeSetData::load_basic_emoji(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_UnicodeSetData_load_basic_emoji_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<UnicodeSetData>, DataError>(diplomat::Ok<std::unique_ptr<UnicodeSetData>>(std::unique_ptr<UnicodeSetData>(UnicodeSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<UnicodeSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<UnicodeSetData>, DataError> UnicodeSetData::load_exemplars_main(const DataProvider& provider, const Locale& locale) {
-  auto result = diplomat::capi::icu4x_UnicodeSetData_load_exemplars_main_mv1(provider.AsFFI(),
-    locale.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<UnicodeSetData>, DataError>(diplomat::Ok<std::unique_ptr<UnicodeSetData>>(std::unique_ptr<UnicodeSetData>(UnicodeSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<UnicodeSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<UnicodeSetData>, DataError> UnicodeSetData::load_exemplars_auxiliary(const DataProvider& provider, const Locale& locale) {
-  auto result = diplomat::capi::icu4x_UnicodeSetData_load_exemplars_auxiliary_mv1(provider.AsFFI(),
-    locale.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<UnicodeSetData>, DataError>(diplomat::Ok<std::unique_ptr<UnicodeSetData>>(std::unique_ptr<UnicodeSetData>(UnicodeSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<UnicodeSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<UnicodeSetData>, DataError> UnicodeSetData::load_exemplars_punctuation(const DataProvider& provider, const Locale& locale) {
-  auto result = diplomat::capi::icu4x_UnicodeSetData_load_exemplars_punctuation_mv1(provider.AsFFI(),
-    locale.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<UnicodeSetData>, DataError>(diplomat::Ok<std::unique_ptr<UnicodeSetData>>(std::unique_ptr<UnicodeSetData>(UnicodeSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<UnicodeSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<UnicodeSetData>, DataError> UnicodeSetData::load_exemplars_numbers(const DataProvider& provider, const Locale& locale) {
-  auto result = diplomat::capi::icu4x_UnicodeSetData_load_exemplars_numbers_mv1(provider.AsFFI(),
-    locale.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<UnicodeSetData>, DataError>(diplomat::Ok<std::unique_ptr<UnicodeSetData>>(std::unique_ptr<UnicodeSetData>(UnicodeSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<UnicodeSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<UnicodeSetData>, DataError> UnicodeSetData::load_exemplars_index(const DataProvider& provider, const Locale& locale) {
-  auto result = diplomat::capi::icu4x_UnicodeSetData_load_exemplars_index_mv1(provider.AsFFI(),
-    locale.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<UnicodeSetData>, DataError>(diplomat::Ok<std::unique_ptr<UnicodeSetData>>(std::unique_ptr<UnicodeSetData>(UnicodeSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<UnicodeSetData>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline const diplomat::capi::UnicodeSetData* UnicodeSetData::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::UnicodeSetData*>(this);
-}
-
-inline diplomat::capi::UnicodeSetData* UnicodeSetData::AsFFI() {
-  return reinterpret_cast<diplomat::capi::UnicodeSetData*>(this);
-}
-
-inline const UnicodeSetData* UnicodeSetData::FromFFI(const diplomat::capi::UnicodeSetData* ptr) {
-  return reinterpret_cast<const UnicodeSetData*>(ptr);
-}
-
-inline UnicodeSetData* UnicodeSetData::FromFFI(diplomat::capi::UnicodeSetData* ptr) {
-  return reinterpret_cast<UnicodeSetData*>(ptr);
-}
-
-inline void UnicodeSetData::operator delete(void* ptr) {
-  diplomat::capi::icu4x_UnicodeSetData_destroy_mv1(reinterpret_cast<diplomat::capi::UnicodeSetData*>(ptr));
-}
-
-
-#endif // UnicodeSetData_HPP
diff --git a/ffi/capi/bindings/cpp/UnitsConverter.d.hpp b/ffi/capi/bindings/cpp/UnitsConverter.d.hpp
deleted file mode 100644
index f0e823d34b0..00000000000
--- a/ffi/capi/bindings/cpp/UnitsConverter.d.hpp
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef UnitsConverter_D_HPP
-#define UnitsConverter_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    struct UnitsConverter;
-} // namespace capi
-} // namespace
-
-class UnitsConverter {
-public:
-
-  inline double convert(double value) const;
-
-  inline std::unique_ptr<UnitsConverter> clone() const;
-
-  inline const diplomat::capi::UnitsConverter* AsFFI() const;
-  inline diplomat::capi::UnitsConverter* AsFFI();
-  inline static const UnitsConverter* FromFFI(const diplomat::capi::UnitsConverter* ptr);
-  inline static UnitsConverter* FromFFI(diplomat::capi::UnitsConverter* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  UnitsConverter() = delete;
-  UnitsConverter(const UnitsConverter&) = delete;
-  UnitsConverter(UnitsConverter&&) noexcept = delete;
-  UnitsConverter operator=(const UnitsConverter&) = delete;
-  UnitsConverter operator=(UnitsConverter&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // UnitsConverter_D_HPP
diff --git a/ffi/capi/bindings/cpp/UnitsConverter.hpp b/ffi/capi/bindings/cpp/UnitsConverter.hpp
deleted file mode 100644
index 369b044d77d..00000000000
--- a/ffi/capi/bindings/cpp/UnitsConverter.hpp
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef UnitsConverter_HPP
-#define UnitsConverter_HPP
-
-#include "UnitsConverter.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    double icu4x_UnitsConverter_convert_double_mv1(const diplomat::capi::UnitsConverter* self, double value);
-    
-    diplomat::capi::UnitsConverter* icu4x_UnitsConverter_clone_mv1(const diplomat::capi::UnitsConverter* self);
-    
-    
-    void icu4x_UnitsConverter_destroy_mv1(UnitsConverter* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline double UnitsConverter::convert(double value) const {
-  auto result = diplomat::capi::icu4x_UnitsConverter_convert_double_mv1(this->AsFFI(),
-    value);
-  return result;
-}
-
-inline std::unique_ptr<UnitsConverter> UnitsConverter::clone() const {
-  auto result = diplomat::capi::icu4x_UnitsConverter_clone_mv1(this->AsFFI());
-  return std::unique_ptr<UnitsConverter>(UnitsConverter::FromFFI(result));
-}
-
-inline const diplomat::capi::UnitsConverter* UnitsConverter::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::UnitsConverter*>(this);
-}
-
-inline diplomat::capi::UnitsConverter* UnitsConverter::AsFFI() {
-  return reinterpret_cast<diplomat::capi::UnitsConverter*>(this);
-}
-
-inline const UnitsConverter* UnitsConverter::FromFFI(const diplomat::capi::UnitsConverter* ptr) {
-  return reinterpret_cast<const UnitsConverter*>(ptr);
-}
-
-inline UnitsConverter* UnitsConverter::FromFFI(diplomat::capi::UnitsConverter* ptr) {
-  return reinterpret_cast<UnitsConverter*>(ptr);
-}
-
-inline void UnitsConverter::operator delete(void* ptr) {
-  diplomat::capi::icu4x_UnitsConverter_destroy_mv1(reinterpret_cast<diplomat::capi::UnitsConverter*>(ptr));
-}
-
-
-#endif // UnitsConverter_HPP
diff --git a/ffi/capi/bindings/cpp/UnitsConverterFactory.d.hpp b/ffi/capi/bindings/cpp/UnitsConverterFactory.d.hpp
deleted file mode 100644
index 901a594ee36..00000000000
--- a/ffi/capi/bindings/cpp/UnitsConverterFactory.d.hpp
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef UnitsConverterFactory_D_HPP
-#define UnitsConverterFactory_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct MeasureUnit; }
-class MeasureUnit;
-namespace diplomat::capi { struct MeasureUnitParser; }
-class MeasureUnitParser;
-namespace diplomat::capi { struct UnitsConverter; }
-class UnitsConverter;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct UnitsConverterFactory;
-} // namespace capi
-} // namespace
-
-class UnitsConverterFactory {
-public:
-
-  inline static diplomat::result<std::unique_ptr<UnitsConverterFactory>, DataError> create(const DataProvider& provider);
-
-  inline std::unique_ptr<UnitsConverter> converter(const MeasureUnit& from, const MeasureUnit& to) const;
-
-  inline std::unique_ptr<MeasureUnitParser> parser() const;
-
-  inline const diplomat::capi::UnitsConverterFactory* AsFFI() const;
-  inline diplomat::capi::UnitsConverterFactory* AsFFI();
-  inline static const UnitsConverterFactory* FromFFI(const diplomat::capi::UnitsConverterFactory* ptr);
-  inline static UnitsConverterFactory* FromFFI(diplomat::capi::UnitsConverterFactory* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  UnitsConverterFactory() = delete;
-  UnitsConverterFactory(const UnitsConverterFactory&) = delete;
-  UnitsConverterFactory(UnitsConverterFactory&&) noexcept = delete;
-  UnitsConverterFactory operator=(const UnitsConverterFactory&) = delete;
-  UnitsConverterFactory operator=(UnitsConverterFactory&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // UnitsConverterFactory_D_HPP
diff --git a/ffi/capi/bindings/cpp/UnitsConverterFactory.hpp b/ffi/capi/bindings/cpp/UnitsConverterFactory.hpp
deleted file mode 100644
index 315c6c8c511..00000000000
--- a/ffi/capi/bindings/cpp/UnitsConverterFactory.hpp
+++ /dev/null
@@ -1,76 +0,0 @@
-#ifndef UnitsConverterFactory_HPP
-#define UnitsConverterFactory_HPP
-
-#include "UnitsConverterFactory.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "MeasureUnit.hpp"
-#include "MeasureUnitParser.hpp"
-#include "UnitsConverter.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_UnitsConverterFactory_create_mv1_result {union {diplomat::capi::UnitsConverterFactory* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_UnitsConverterFactory_create_mv1_result;
-    icu4x_UnitsConverterFactory_create_mv1_result icu4x_UnitsConverterFactory_create_mv1(const diplomat::capi::DataProvider* provider);
-    
-    diplomat::capi::UnitsConverter* icu4x_UnitsConverterFactory_converter_mv1(const diplomat::capi::UnitsConverterFactory* self, const diplomat::capi::MeasureUnit* from, const diplomat::capi::MeasureUnit* to);
-    
-    diplomat::capi::MeasureUnitParser* icu4x_UnitsConverterFactory_parser_mv1(const diplomat::capi::UnitsConverterFactory* self);
-    
-    
-    void icu4x_UnitsConverterFactory_destroy_mv1(UnitsConverterFactory* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<UnitsConverterFactory>, DataError> UnitsConverterFactory::create(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_UnitsConverterFactory_create_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<UnitsConverterFactory>, DataError>(diplomat::Ok<std::unique_ptr<UnitsConverterFactory>>(std::unique_ptr<UnitsConverterFactory>(UnitsConverterFactory::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<UnitsConverterFactory>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline std::unique_ptr<UnitsConverter> UnitsConverterFactory::converter(const MeasureUnit& from, const MeasureUnit& to) const {
-  auto result = diplomat::capi::icu4x_UnitsConverterFactory_converter_mv1(this->AsFFI(),
-    from.AsFFI(),
-    to.AsFFI());
-  return std::unique_ptr<UnitsConverter>(UnitsConverter::FromFFI(result));
-}
-
-inline std::unique_ptr<MeasureUnitParser> UnitsConverterFactory::parser() const {
-  auto result = diplomat::capi::icu4x_UnitsConverterFactory_parser_mv1(this->AsFFI());
-  return std::unique_ptr<MeasureUnitParser>(MeasureUnitParser::FromFFI(result));
-}
-
-inline const diplomat::capi::UnitsConverterFactory* UnitsConverterFactory::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::UnitsConverterFactory*>(this);
-}
-
-inline diplomat::capi::UnitsConverterFactory* UnitsConverterFactory::AsFFI() {
-  return reinterpret_cast<diplomat::capi::UnitsConverterFactory*>(this);
-}
-
-inline const UnitsConverterFactory* UnitsConverterFactory::FromFFI(const diplomat::capi::UnitsConverterFactory* ptr) {
-  return reinterpret_cast<const UnitsConverterFactory*>(ptr);
-}
-
-inline UnitsConverterFactory* UnitsConverterFactory::FromFFI(diplomat::capi::UnitsConverterFactory* ptr) {
-  return reinterpret_cast<UnitsConverterFactory*>(ptr);
-}
-
-inline void UnitsConverterFactory::operator delete(void* ptr) {
-  diplomat::capi::icu4x_UnitsConverterFactory_destroy_mv1(reinterpret_cast<diplomat::capi::UnitsConverterFactory*>(ptr));
-}
-
-
-#endif // UnitsConverterFactory_HPP
diff --git a/ffi/capi/bindings/cpp/WeekCalculator.d.hpp b/ffi/capi/bindings/cpp/WeekCalculator.d.hpp
deleted file mode 100644
index e32452d30fb..00000000000
--- a/ffi/capi/bindings/cpp/WeekCalculator.d.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef WeekCalculator_D_HPP
-#define WeekCalculator_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-struct WeekendContainsDay;
-class DataError;
-class IsoWeekday;
-
-
-namespace diplomat {
-namespace capi {
-    struct WeekCalculator;
-} // namespace capi
-} // namespace
-
-class WeekCalculator {
-public:
-
-  inline static diplomat::result<std::unique_ptr<WeekCalculator>, DataError> create(const DataProvider& provider, const Locale& locale);
-
-  inline static std::unique_ptr<WeekCalculator> from_first_day_of_week_and_min_week_days(IsoWeekday first_weekday, uint8_t min_week_days);
-
-  inline IsoWeekday first_weekday() const;
-
-  inline uint8_t min_week_days() const;
-
-  inline WeekendContainsDay weekend() const;
-
-  inline const diplomat::capi::WeekCalculator* AsFFI() const;
-  inline diplomat::capi::WeekCalculator* AsFFI();
-  inline static const WeekCalculator* FromFFI(const diplomat::capi::WeekCalculator* ptr);
-  inline static WeekCalculator* FromFFI(diplomat::capi::WeekCalculator* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  WeekCalculator() = delete;
-  WeekCalculator(const WeekCalculator&) = delete;
-  WeekCalculator(WeekCalculator&&) noexcept = delete;
-  WeekCalculator operator=(const WeekCalculator&) = delete;
-  WeekCalculator operator=(WeekCalculator&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // WeekCalculator_D_HPP
diff --git a/ffi/capi/bindings/cpp/WeekCalculator.hpp b/ffi/capi/bindings/cpp/WeekCalculator.hpp
deleted file mode 100644
index 3473f030412..00000000000
--- a/ffi/capi/bindings/cpp/WeekCalculator.hpp
+++ /dev/null
@@ -1,90 +0,0 @@
-#ifndef WeekCalculator_HPP
-#define WeekCalculator_HPP
-
-#include "WeekCalculator.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "IsoWeekday.hpp"
-#include "Locale.hpp"
-#include "WeekendContainsDay.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_WeekCalculator_create_mv1_result {union {diplomat::capi::WeekCalculator* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_WeekCalculator_create_mv1_result;
-    icu4x_WeekCalculator_create_mv1_result icu4x_WeekCalculator_create_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale);
-    
-    diplomat::capi::WeekCalculator* icu4x_WeekCalculator_from_first_day_of_week_and_min_week_days_mv1(diplomat::capi::IsoWeekday first_weekday, uint8_t min_week_days);
-    
-    diplomat::capi::IsoWeekday icu4x_WeekCalculator_first_weekday_mv1(const diplomat::capi::WeekCalculator* self);
-    
-    uint8_t icu4x_WeekCalculator_min_week_days_mv1(const diplomat::capi::WeekCalculator* self);
-    
-    diplomat::capi::WeekendContainsDay icu4x_WeekCalculator_weekend_mv1(const diplomat::capi::WeekCalculator* self);
-    
-    
-    void icu4x_WeekCalculator_destroy_mv1(WeekCalculator* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<WeekCalculator>, DataError> WeekCalculator::create(const DataProvider& provider, const Locale& locale) {
-  auto result = diplomat::capi::icu4x_WeekCalculator_create_mv1(provider.AsFFI(),
-    locale.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<WeekCalculator>, DataError>(diplomat::Ok<std::unique_ptr<WeekCalculator>>(std::unique_ptr<WeekCalculator>(WeekCalculator::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<WeekCalculator>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline std::unique_ptr<WeekCalculator> WeekCalculator::from_first_day_of_week_and_min_week_days(IsoWeekday first_weekday, uint8_t min_week_days) {
-  auto result = diplomat::capi::icu4x_WeekCalculator_from_first_day_of_week_and_min_week_days_mv1(first_weekday.AsFFI(),
-    min_week_days);
-  return std::unique_ptr<WeekCalculator>(WeekCalculator::FromFFI(result));
-}
-
-inline IsoWeekday WeekCalculator::first_weekday() const {
-  auto result = diplomat::capi::icu4x_WeekCalculator_first_weekday_mv1(this->AsFFI());
-  return IsoWeekday::FromFFI(result);
-}
-
-inline uint8_t WeekCalculator::min_week_days() const {
-  auto result = diplomat::capi::icu4x_WeekCalculator_min_week_days_mv1(this->AsFFI());
-  return result;
-}
-
-inline WeekendContainsDay WeekCalculator::weekend() const {
-  auto result = diplomat::capi::icu4x_WeekCalculator_weekend_mv1(this->AsFFI());
-  return WeekendContainsDay::FromFFI(result);
-}
-
-inline const diplomat::capi::WeekCalculator* WeekCalculator::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::WeekCalculator*>(this);
-}
-
-inline diplomat::capi::WeekCalculator* WeekCalculator::AsFFI() {
-  return reinterpret_cast<diplomat::capi::WeekCalculator*>(this);
-}
-
-inline const WeekCalculator* WeekCalculator::FromFFI(const diplomat::capi::WeekCalculator* ptr) {
-  return reinterpret_cast<const WeekCalculator*>(ptr);
-}
-
-inline WeekCalculator* WeekCalculator::FromFFI(diplomat::capi::WeekCalculator* ptr) {
-  return reinterpret_cast<WeekCalculator*>(ptr);
-}
-
-inline void WeekCalculator::operator delete(void* ptr) {
-  diplomat::capi::icu4x_WeekCalculator_destroy_mv1(reinterpret_cast<diplomat::capi::WeekCalculator*>(ptr));
-}
-
-
-#endif // WeekCalculator_HPP
diff --git a/ffi/capi/bindings/cpp/WeekOf.d.hpp b/ffi/capi/bindings/cpp/WeekOf.d.hpp
deleted file mode 100644
index 200183d3eb7..00000000000
--- a/ffi/capi/bindings/cpp/WeekOf.d.hpp
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef WeekOf_D_HPP
-#define WeekOf_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "WeekRelativeUnit.d.hpp"
-#include "diplomat_runtime.hpp"
-
-class WeekRelativeUnit;
-
-
-namespace diplomat {
-namespace capi {
-    struct WeekOf {
-      uint16_t week;
-      diplomat::capi::WeekRelativeUnit unit;
-    };
-} // namespace capi
-} // namespace
-
-
-struct WeekOf {
-  uint16_t week;
-  WeekRelativeUnit unit;
-
-  inline diplomat::capi::WeekOf AsFFI() const;
-  inline static WeekOf FromFFI(diplomat::capi::WeekOf c_struct);
-};
-
-
-#endif // WeekOf_D_HPP
diff --git a/ffi/capi/bindings/cpp/WeekOf.hpp b/ffi/capi/bindings/cpp/WeekOf.hpp
deleted file mode 100644
index 454e4a94459..00000000000
--- a/ffi/capi/bindings/cpp/WeekOf.hpp
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef WeekOf_HPP
-#define WeekOf_HPP
-
-#include "WeekOf.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "WeekRelativeUnit.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-
-inline diplomat::capi::WeekOf WeekOf::AsFFI() const {
-  return diplomat::capi::WeekOf {
-    /* .week = */ week,
-    /* .unit = */ unit.AsFFI(),
-  };
-}
-
-inline WeekOf WeekOf::FromFFI(diplomat::capi::WeekOf c_struct) {
-  return WeekOf {
-    /* .week = */ c_struct.week,
-    /* .unit = */ WeekRelativeUnit::FromFFI(c_struct.unit),
-  };
-}
-
-
-#endif // WeekOf_HPP
diff --git a/ffi/capi/bindings/cpp/WeekRelativeUnit.hpp b/ffi/capi/bindings/cpp/WeekRelativeUnit.hpp
deleted file mode 100644
index 0ec80dfe5d3..00000000000
--- a/ffi/capi/bindings/cpp/WeekRelativeUnit.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef WeekRelativeUnit_HPP
-#define WeekRelativeUnit_HPP
-
-#include "WeekRelativeUnit.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::capi::WeekRelativeUnit WeekRelativeUnit::AsFFI() const {
-  return static_cast<diplomat::capi::WeekRelativeUnit>(value);
-}
-
-inline WeekRelativeUnit WeekRelativeUnit::FromFFI(diplomat::capi::WeekRelativeUnit c_enum) {
-  switch (c_enum) {
-    case diplomat::capi::WeekRelativeUnit_Previous:
-    case diplomat::capi::WeekRelativeUnit_Current:
-    case diplomat::capi::WeekRelativeUnit_Next:
-      return static_cast<WeekRelativeUnit::Value>(c_enum);
-    default:
-      abort();
-  }
-}
-#endif // WeekRelativeUnit_HPP
diff --git a/ffi/capi/bindings/cpp/WordBreakIteratorLatin1.d.hpp b/ffi/capi/bindings/cpp/WordBreakIteratorLatin1.d.hpp
deleted file mode 100644
index c3fdb31b5f6..00000000000
--- a/ffi/capi/bindings/cpp/WordBreakIteratorLatin1.d.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef WordBreakIteratorLatin1_D_HPP
-#define WordBreakIteratorLatin1_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-class SegmenterWordType;
-
-
-namespace diplomat {
-namespace capi {
-    struct WordBreakIteratorLatin1;
-} // namespace capi
-} // namespace
-
-class WordBreakIteratorLatin1 {
-public:
-
-  inline int32_t next();
-
-  inline SegmenterWordType word_type() const;
-
-  inline bool is_word_like() const;
-
-  inline const diplomat::capi::WordBreakIteratorLatin1* AsFFI() const;
-  inline diplomat::capi::WordBreakIteratorLatin1* AsFFI();
-  inline static const WordBreakIteratorLatin1* FromFFI(const diplomat::capi::WordBreakIteratorLatin1* ptr);
-  inline static WordBreakIteratorLatin1* FromFFI(diplomat::capi::WordBreakIteratorLatin1* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  WordBreakIteratorLatin1() = delete;
-  WordBreakIteratorLatin1(const WordBreakIteratorLatin1&) = delete;
-  WordBreakIteratorLatin1(WordBreakIteratorLatin1&&) noexcept = delete;
-  WordBreakIteratorLatin1 operator=(const WordBreakIteratorLatin1&) = delete;
-  WordBreakIteratorLatin1 operator=(WordBreakIteratorLatin1&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // WordBreakIteratorLatin1_D_HPP
diff --git a/ffi/capi/bindings/cpp/WordBreakIteratorLatin1.hpp b/ffi/capi/bindings/cpp/WordBreakIteratorLatin1.hpp
deleted file mode 100644
index 19f9ed0722f..00000000000
--- a/ffi/capi/bindings/cpp/WordBreakIteratorLatin1.hpp
+++ /dev/null
@@ -1,69 +0,0 @@
-#ifndef WordBreakIteratorLatin1_HPP
-#define WordBreakIteratorLatin1_HPP
-
-#include "WordBreakIteratorLatin1.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "SegmenterWordType.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    int32_t icu4x_WordBreakIteratorLatin1_next_mv1(diplomat::capi::WordBreakIteratorLatin1* self);
-    
-    diplomat::capi::SegmenterWordType icu4x_WordBreakIteratorLatin1_word_type_mv1(const diplomat::capi::WordBreakIteratorLatin1* self);
-    
-    bool icu4x_WordBreakIteratorLatin1_is_word_like_mv1(const diplomat::capi::WordBreakIteratorLatin1* self);
-    
-    
-    void icu4x_WordBreakIteratorLatin1_destroy_mv1(WordBreakIteratorLatin1* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline int32_t WordBreakIteratorLatin1::next() {
-  auto result = diplomat::capi::icu4x_WordBreakIteratorLatin1_next_mv1(this->AsFFI());
-  return result;
-}
-
-inline SegmenterWordType WordBreakIteratorLatin1::word_type() const {
-  auto result = diplomat::capi::icu4x_WordBreakIteratorLatin1_word_type_mv1(this->AsFFI());
-  return SegmenterWordType::FromFFI(result);
-}
-
-inline bool WordBreakIteratorLatin1::is_word_like() const {
-  auto result = diplomat::capi::icu4x_WordBreakIteratorLatin1_is_word_like_mv1(this->AsFFI());
-  return result;
-}
-
-inline const diplomat::capi::WordBreakIteratorLatin1* WordBreakIteratorLatin1::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::WordBreakIteratorLatin1*>(this);
-}
-
-inline diplomat::capi::WordBreakIteratorLatin1* WordBreakIteratorLatin1::AsFFI() {
-  return reinterpret_cast<diplomat::capi::WordBreakIteratorLatin1*>(this);
-}
-
-inline const WordBreakIteratorLatin1* WordBreakIteratorLatin1::FromFFI(const diplomat::capi::WordBreakIteratorLatin1* ptr) {
-  return reinterpret_cast<const WordBreakIteratorLatin1*>(ptr);
-}
-
-inline WordBreakIteratorLatin1* WordBreakIteratorLatin1::FromFFI(diplomat::capi::WordBreakIteratorLatin1* ptr) {
-  return reinterpret_cast<WordBreakIteratorLatin1*>(ptr);
-}
-
-inline void WordBreakIteratorLatin1::operator delete(void* ptr) {
-  diplomat::capi::icu4x_WordBreakIteratorLatin1_destroy_mv1(reinterpret_cast<diplomat::capi::WordBreakIteratorLatin1*>(ptr));
-}
-
-
-#endif // WordBreakIteratorLatin1_HPP
diff --git a/ffi/capi/bindings/cpp/WordBreakIteratorUtf16.d.hpp b/ffi/capi/bindings/cpp/WordBreakIteratorUtf16.d.hpp
deleted file mode 100644
index 9d1d2490034..00000000000
--- a/ffi/capi/bindings/cpp/WordBreakIteratorUtf16.d.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef WordBreakIteratorUtf16_D_HPP
-#define WordBreakIteratorUtf16_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-class SegmenterWordType;
-
-
-namespace diplomat {
-namespace capi {
-    struct WordBreakIteratorUtf16;
-} // namespace capi
-} // namespace
-
-class WordBreakIteratorUtf16 {
-public:
-
-  inline int32_t next();
-
-  inline SegmenterWordType word_type() const;
-
-  inline bool is_word_like() const;
-
-  inline const diplomat::capi::WordBreakIteratorUtf16* AsFFI() const;
-  inline diplomat::capi::WordBreakIteratorUtf16* AsFFI();
-  inline static const WordBreakIteratorUtf16* FromFFI(const diplomat::capi::WordBreakIteratorUtf16* ptr);
-  inline static WordBreakIteratorUtf16* FromFFI(diplomat::capi::WordBreakIteratorUtf16* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  WordBreakIteratorUtf16() = delete;
-  WordBreakIteratorUtf16(const WordBreakIteratorUtf16&) = delete;
-  WordBreakIteratorUtf16(WordBreakIteratorUtf16&&) noexcept = delete;
-  WordBreakIteratorUtf16 operator=(const WordBreakIteratorUtf16&) = delete;
-  WordBreakIteratorUtf16 operator=(WordBreakIteratorUtf16&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // WordBreakIteratorUtf16_D_HPP
diff --git a/ffi/capi/bindings/cpp/WordBreakIteratorUtf16.hpp b/ffi/capi/bindings/cpp/WordBreakIteratorUtf16.hpp
deleted file mode 100644
index d07d09424fd..00000000000
--- a/ffi/capi/bindings/cpp/WordBreakIteratorUtf16.hpp
+++ /dev/null
@@ -1,69 +0,0 @@
-#ifndef WordBreakIteratorUtf16_HPP
-#define WordBreakIteratorUtf16_HPP
-
-#include "WordBreakIteratorUtf16.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "SegmenterWordType.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    int32_t icu4x_WordBreakIteratorUtf16_next_mv1(diplomat::capi::WordBreakIteratorUtf16* self);
-    
-    diplomat::capi::SegmenterWordType icu4x_WordBreakIteratorUtf16_word_type_mv1(const diplomat::capi::WordBreakIteratorUtf16* self);
-    
-    bool icu4x_WordBreakIteratorUtf16_is_word_like_mv1(const diplomat::capi::WordBreakIteratorUtf16* self);
-    
-    
-    void icu4x_WordBreakIteratorUtf16_destroy_mv1(WordBreakIteratorUtf16* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline int32_t WordBreakIteratorUtf16::next() {
-  auto result = diplomat::capi::icu4x_WordBreakIteratorUtf16_next_mv1(this->AsFFI());
-  return result;
-}
-
-inline SegmenterWordType WordBreakIteratorUtf16::word_type() const {
-  auto result = diplomat::capi::icu4x_WordBreakIteratorUtf16_word_type_mv1(this->AsFFI());
-  return SegmenterWordType::FromFFI(result);
-}
-
-inline bool WordBreakIteratorUtf16::is_word_like() const {
-  auto result = diplomat::capi::icu4x_WordBreakIteratorUtf16_is_word_like_mv1(this->AsFFI());
-  return result;
-}
-
-inline const diplomat::capi::WordBreakIteratorUtf16* WordBreakIteratorUtf16::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::WordBreakIteratorUtf16*>(this);
-}
-
-inline diplomat::capi::WordBreakIteratorUtf16* WordBreakIteratorUtf16::AsFFI() {
-  return reinterpret_cast<diplomat::capi::WordBreakIteratorUtf16*>(this);
-}
-
-inline const WordBreakIteratorUtf16* WordBreakIteratorUtf16::FromFFI(const diplomat::capi::WordBreakIteratorUtf16* ptr) {
-  return reinterpret_cast<const WordBreakIteratorUtf16*>(ptr);
-}
-
-inline WordBreakIteratorUtf16* WordBreakIteratorUtf16::FromFFI(diplomat::capi::WordBreakIteratorUtf16* ptr) {
-  return reinterpret_cast<WordBreakIteratorUtf16*>(ptr);
-}
-
-inline void WordBreakIteratorUtf16::operator delete(void* ptr) {
-  diplomat::capi::icu4x_WordBreakIteratorUtf16_destroy_mv1(reinterpret_cast<diplomat::capi::WordBreakIteratorUtf16*>(ptr));
-}
-
-
-#endif // WordBreakIteratorUtf16_HPP
diff --git a/ffi/capi/bindings/cpp/WordBreakIteratorUtf8.d.hpp b/ffi/capi/bindings/cpp/WordBreakIteratorUtf8.d.hpp
deleted file mode 100644
index e517aa672bd..00000000000
--- a/ffi/capi/bindings/cpp/WordBreakIteratorUtf8.d.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef WordBreakIteratorUtf8_D_HPP
-#define WordBreakIteratorUtf8_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-class SegmenterWordType;
-
-
-namespace diplomat {
-namespace capi {
-    struct WordBreakIteratorUtf8;
-} // namespace capi
-} // namespace
-
-class WordBreakIteratorUtf8 {
-public:
-
-  inline int32_t next();
-
-  inline SegmenterWordType word_type() const;
-
-  inline bool is_word_like() const;
-
-  inline const diplomat::capi::WordBreakIteratorUtf8* AsFFI() const;
-  inline diplomat::capi::WordBreakIteratorUtf8* AsFFI();
-  inline static const WordBreakIteratorUtf8* FromFFI(const diplomat::capi::WordBreakIteratorUtf8* ptr);
-  inline static WordBreakIteratorUtf8* FromFFI(diplomat::capi::WordBreakIteratorUtf8* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  WordBreakIteratorUtf8() = delete;
-  WordBreakIteratorUtf8(const WordBreakIteratorUtf8&) = delete;
-  WordBreakIteratorUtf8(WordBreakIteratorUtf8&&) noexcept = delete;
-  WordBreakIteratorUtf8 operator=(const WordBreakIteratorUtf8&) = delete;
-  WordBreakIteratorUtf8 operator=(WordBreakIteratorUtf8&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // WordBreakIteratorUtf8_D_HPP
diff --git a/ffi/capi/bindings/cpp/WordBreakIteratorUtf8.hpp b/ffi/capi/bindings/cpp/WordBreakIteratorUtf8.hpp
deleted file mode 100644
index ec85fddaccc..00000000000
--- a/ffi/capi/bindings/cpp/WordBreakIteratorUtf8.hpp
+++ /dev/null
@@ -1,69 +0,0 @@
-#ifndef WordBreakIteratorUtf8_HPP
-#define WordBreakIteratorUtf8_HPP
-
-#include "WordBreakIteratorUtf8.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "SegmenterWordType.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    int32_t icu4x_WordBreakIteratorUtf8_next_mv1(diplomat::capi::WordBreakIteratorUtf8* self);
-    
-    diplomat::capi::SegmenterWordType icu4x_WordBreakIteratorUtf8_word_type_mv1(const diplomat::capi::WordBreakIteratorUtf8* self);
-    
-    bool icu4x_WordBreakIteratorUtf8_is_word_like_mv1(const diplomat::capi::WordBreakIteratorUtf8* self);
-    
-    
-    void icu4x_WordBreakIteratorUtf8_destroy_mv1(WordBreakIteratorUtf8* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline int32_t WordBreakIteratorUtf8::next() {
-  auto result = diplomat::capi::icu4x_WordBreakIteratorUtf8_next_mv1(this->AsFFI());
-  return result;
-}
-
-inline SegmenterWordType WordBreakIteratorUtf8::word_type() const {
-  auto result = diplomat::capi::icu4x_WordBreakIteratorUtf8_word_type_mv1(this->AsFFI());
-  return SegmenterWordType::FromFFI(result);
-}
-
-inline bool WordBreakIteratorUtf8::is_word_like() const {
-  auto result = diplomat::capi::icu4x_WordBreakIteratorUtf8_is_word_like_mv1(this->AsFFI());
-  return result;
-}
-
-inline const diplomat::capi::WordBreakIteratorUtf8* WordBreakIteratorUtf8::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::WordBreakIteratorUtf8*>(this);
-}
-
-inline diplomat::capi::WordBreakIteratorUtf8* WordBreakIteratorUtf8::AsFFI() {
-  return reinterpret_cast<diplomat::capi::WordBreakIteratorUtf8*>(this);
-}
-
-inline const WordBreakIteratorUtf8* WordBreakIteratorUtf8::FromFFI(const diplomat::capi::WordBreakIteratorUtf8* ptr) {
-  return reinterpret_cast<const WordBreakIteratorUtf8*>(ptr);
-}
-
-inline WordBreakIteratorUtf8* WordBreakIteratorUtf8::FromFFI(diplomat::capi::WordBreakIteratorUtf8* ptr) {
-  return reinterpret_cast<WordBreakIteratorUtf8*>(ptr);
-}
-
-inline void WordBreakIteratorUtf8::operator delete(void* ptr) {
-  diplomat::capi::icu4x_WordBreakIteratorUtf8_destroy_mv1(reinterpret_cast<diplomat::capi::WordBreakIteratorUtf8*>(ptr));
-}
-
-
-#endif // WordBreakIteratorUtf8_HPP
diff --git a/ffi/capi/bindings/cpp/WordSegmenter.d.hpp b/ffi/capi/bindings/cpp/WordSegmenter.d.hpp
deleted file mode 100644
index fbc7a111b6a..00000000000
--- a/ffi/capi/bindings/cpp/WordSegmenter.d.hpp
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef WordSegmenter_D_HPP
-#define WordSegmenter_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct WordBreakIteratorLatin1; }
-class WordBreakIteratorLatin1;
-namespace diplomat::capi { struct WordBreakIteratorUtf16; }
-class WordBreakIteratorUtf16;
-namespace diplomat::capi { struct WordBreakIteratorUtf8; }
-class WordBreakIteratorUtf8;
-class DataError;
-
-
-namespace diplomat {
-namespace capi {
-    struct WordSegmenter;
-} // namespace capi
-} // namespace
-
-class WordSegmenter {
-public:
-
-  inline static diplomat::result<std::unique_ptr<WordSegmenter>, DataError> create_auto(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<WordSegmenter>, DataError> create_lstm(const DataProvider& provider);
-
-  inline static diplomat::result<std::unique_ptr<WordSegmenter>, DataError> create_dictionary(const DataProvider& provider);
-
-  inline std::unique_ptr<WordBreakIteratorUtf8> segment(std::string_view input) const;
-
-  inline std::unique_ptr<WordBreakIteratorUtf16> segment16(std::u16string_view input) const;
-
-  inline std::unique_ptr<WordBreakIteratorLatin1> segment_latin1(diplomat::span<const uint8_t> input) const;
-
-  inline const diplomat::capi::WordSegmenter* AsFFI() const;
-  inline diplomat::capi::WordSegmenter* AsFFI();
-  inline static const WordSegmenter* FromFFI(const diplomat::capi::WordSegmenter* ptr);
-  inline static WordSegmenter* FromFFI(diplomat::capi::WordSegmenter* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  WordSegmenter() = delete;
-  WordSegmenter(const WordSegmenter&) = delete;
-  WordSegmenter(WordSegmenter&&) noexcept = delete;
-  WordSegmenter operator=(const WordSegmenter&) = delete;
-  WordSegmenter operator=(WordSegmenter&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // WordSegmenter_D_HPP
diff --git a/ffi/capi/bindings/cpp/WordSegmenter.hpp b/ffi/capi/bindings/cpp/WordSegmenter.hpp
deleted file mode 100644
index ca24fd5fa7a..00000000000
--- a/ffi/capi/bindings/cpp/WordSegmenter.hpp
+++ /dev/null
@@ -1,103 +0,0 @@
-#ifndef WordSegmenter_HPP
-#define WordSegmenter_HPP
-
-#include "WordSegmenter.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "DataError.hpp"
-#include "DataProvider.hpp"
-#include "WordBreakIteratorLatin1.hpp"
-#include "WordBreakIteratorUtf16.hpp"
-#include "WordBreakIteratorUtf8.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_WordSegmenter_create_auto_mv1_result {union {diplomat::capi::WordSegmenter* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_WordSegmenter_create_auto_mv1_result;
-    icu4x_WordSegmenter_create_auto_mv1_result icu4x_WordSegmenter_create_auto_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_WordSegmenter_create_lstm_mv1_result {union {diplomat::capi::WordSegmenter* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_WordSegmenter_create_lstm_mv1_result;
-    icu4x_WordSegmenter_create_lstm_mv1_result icu4x_WordSegmenter_create_lstm_mv1(const diplomat::capi::DataProvider* provider);
-    
-    typedef struct icu4x_WordSegmenter_create_dictionary_mv1_result {union {diplomat::capi::WordSegmenter* ok; diplomat::capi::DataError err;}; bool is_ok;} icu4x_WordSegmenter_create_dictionary_mv1_result;
-    icu4x_WordSegmenter_create_dictionary_mv1_result icu4x_WordSegmenter_create_dictionary_mv1(const diplomat::capi::DataProvider* provider);
-    
-    diplomat::capi::WordBreakIteratorUtf8* icu4x_WordSegmenter_segment_utf8_mv1(const diplomat::capi::WordSegmenter* self, const char* input_data, size_t input_len);
-    
-    diplomat::capi::WordBreakIteratorUtf16* icu4x_WordSegmenter_segment_utf16_mv1(const diplomat::capi::WordSegmenter* self, const char16_t* input_data, size_t input_len);
-    
-    diplomat::capi::WordBreakIteratorLatin1* icu4x_WordSegmenter_segment_latin1_mv1(const diplomat::capi::WordSegmenter* self, const uint8_t* input_data, size_t input_len);
-    
-    
-    void icu4x_WordSegmenter_destroy_mv1(WordSegmenter* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<WordSegmenter>, DataError> WordSegmenter::create_auto(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_WordSegmenter_create_auto_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<WordSegmenter>, DataError>(diplomat::Ok<std::unique_ptr<WordSegmenter>>(std::unique_ptr<WordSegmenter>(WordSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<WordSegmenter>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<WordSegmenter>, DataError> WordSegmenter::create_lstm(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_WordSegmenter_create_lstm_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<WordSegmenter>, DataError>(diplomat::Ok<std::unique_ptr<WordSegmenter>>(std::unique_ptr<WordSegmenter>(WordSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<WordSegmenter>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<WordSegmenter>, DataError> WordSegmenter::create_dictionary(const DataProvider& provider) {
-  auto result = diplomat::capi::icu4x_WordSegmenter_create_dictionary_mv1(provider.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<WordSegmenter>, DataError>(diplomat::Ok<std::unique_ptr<WordSegmenter>>(std::unique_ptr<WordSegmenter>(WordSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<WordSegmenter>, DataError>(diplomat::Err<DataError>(DataError::FromFFI(result.err)));
-}
-
-inline std::unique_ptr<WordBreakIteratorUtf8> WordSegmenter::segment(std::string_view input) const {
-  auto result = diplomat::capi::icu4x_WordSegmenter_segment_utf8_mv1(this->AsFFI(),
-    input.data(),
-    input.size());
-  return std::unique_ptr<WordBreakIteratorUtf8>(WordBreakIteratorUtf8::FromFFI(result));
-}
-
-inline std::unique_ptr<WordBreakIteratorUtf16> WordSegmenter::segment16(std::u16string_view input) const {
-  auto result = diplomat::capi::icu4x_WordSegmenter_segment_utf16_mv1(this->AsFFI(),
-    input.data(),
-    input.size());
-  return std::unique_ptr<WordBreakIteratorUtf16>(WordBreakIteratorUtf16::FromFFI(result));
-}
-
-inline std::unique_ptr<WordBreakIteratorLatin1> WordSegmenter::segment_latin1(diplomat::span<const uint8_t> input) const {
-  auto result = diplomat::capi::icu4x_WordSegmenter_segment_latin1_mv1(this->AsFFI(),
-    input.data(),
-    input.size());
-  return std::unique_ptr<WordBreakIteratorLatin1>(WordBreakIteratorLatin1::FromFFI(result));
-}
-
-inline const diplomat::capi::WordSegmenter* WordSegmenter::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::WordSegmenter*>(this);
-}
-
-inline diplomat::capi::WordSegmenter* WordSegmenter::AsFFI() {
-  return reinterpret_cast<diplomat::capi::WordSegmenter*>(this);
-}
-
-inline const WordSegmenter* WordSegmenter::FromFFI(const diplomat::capi::WordSegmenter* ptr) {
-  return reinterpret_cast<const WordSegmenter*>(ptr);
-}
-
-inline WordSegmenter* WordSegmenter::FromFFI(diplomat::capi::WordSegmenter* ptr) {
-  return reinterpret_cast<WordSegmenter*>(ptr);
-}
-
-inline void WordSegmenter::operator delete(void* ptr) {
-  diplomat::capi::icu4x_WordSegmenter_destroy_mv1(reinterpret_cast<diplomat::capi::WordSegmenter*>(ptr));
-}
-
-
-#endif // WordSegmenter_HPP
diff --git a/ffi/capi/bindings/cpp/ZonedDateTimeFormatter.d.hpp b/ffi/capi/bindings/cpp/ZonedDateTimeFormatter.d.hpp
deleted file mode 100644
index a774aea9a48..00000000000
--- a/ffi/capi/bindings/cpp/ZonedDateTimeFormatter.d.hpp
+++ /dev/null
@@ -1,60 +0,0 @@
-#ifndef ZonedDateTimeFormatter_D_HPP
-#define ZonedDateTimeFormatter_D_HPP
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "diplomat_runtime.hpp"
-
-namespace diplomat::capi { struct CustomTimeZone; }
-class CustomTimeZone;
-namespace diplomat::capi { struct DataProvider; }
-class DataProvider;
-namespace diplomat::capi { struct DateTime; }
-class DateTime;
-namespace diplomat::capi { struct IsoDateTime; }
-class IsoDateTime;
-namespace diplomat::capi { struct Locale; }
-class Locale;
-struct IsoTimeZoneOptions;
-class DateLength;
-class Error;
-class TimeLength;
-
-
-namespace diplomat {
-namespace capi {
-    struct ZonedDateTimeFormatter;
-} // namespace capi
-} // namespace
-
-class ZonedDateTimeFormatter {
-public:
-
-  inline static diplomat::result<std::unique_ptr<ZonedDateTimeFormatter>, Error> create_with_lengths(const DataProvider& provider, const Locale& locale, DateLength date_length, TimeLength time_length);
-
-  inline static diplomat::result<std::unique_ptr<ZonedDateTimeFormatter>, Error> create_with_lengths_and_iso_8601_time_zone_fallback(const DataProvider& provider, const Locale& locale, DateLength date_length, TimeLength time_length, IsoTimeZoneOptions zone_options);
-
-  inline diplomat::result<std::string, Error> format_datetime_with_custom_time_zone(const DateTime& datetime, const CustomTimeZone& time_zone) const;
-
-  inline diplomat::result<std::string, Error> format_iso_datetime_with_custom_time_zone(const IsoDateTime& datetime, const CustomTimeZone& time_zone) const;
-
-  inline const diplomat::capi::ZonedDateTimeFormatter* AsFFI() const;
-  inline diplomat::capi::ZonedDateTimeFormatter* AsFFI();
-  inline static const ZonedDateTimeFormatter* FromFFI(const diplomat::capi::ZonedDateTimeFormatter* ptr);
-  inline static ZonedDateTimeFormatter* FromFFI(diplomat::capi::ZonedDateTimeFormatter* ptr);
-  inline static void operator delete(void* ptr);
-private:
-  ZonedDateTimeFormatter() = delete;
-  ZonedDateTimeFormatter(const ZonedDateTimeFormatter&) = delete;
-  ZonedDateTimeFormatter(ZonedDateTimeFormatter&&) noexcept = delete;
-  ZonedDateTimeFormatter operator=(const ZonedDateTimeFormatter&) = delete;
-  ZonedDateTimeFormatter operator=(ZonedDateTimeFormatter&&) noexcept = delete;
-  static void operator delete[](void*, size_t) = delete;
-};
-
-
-#endif // ZonedDateTimeFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/ZonedDateTimeFormatter.hpp b/ffi/capi/bindings/cpp/ZonedDateTimeFormatter.hpp
deleted file mode 100644
index 1da8a0dfefc..00000000000
--- a/ffi/capi/bindings/cpp/ZonedDateTimeFormatter.hpp
+++ /dev/null
@@ -1,105 +0,0 @@
-#ifndef ZonedDateTimeFormatter_HPP
-#define ZonedDateTimeFormatter_HPP
-
-#include "ZonedDateTimeFormatter.d.hpp"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include <memory>
-#include <optional>
-#include "CustomTimeZone.hpp"
-#include "DataProvider.hpp"
-#include "DateLength.hpp"
-#include "DateTime.hpp"
-#include "Error.hpp"
-#include "IsoDateTime.hpp"
-#include "IsoTimeZoneOptions.hpp"
-#include "Locale.hpp"
-#include "TimeLength.hpp"
-#include "diplomat_runtime.hpp"
-
-
-namespace diplomat {
-namespace capi {
-    extern "C" {
-    
-    typedef struct icu4x_ZonedDateTimeFormatter_create_with_lengths_mv1_result {union {diplomat::capi::ZonedDateTimeFormatter* ok; diplomat::capi::Error err;}; bool is_ok;} icu4x_ZonedDateTimeFormatter_create_with_lengths_mv1_result;
-    icu4x_ZonedDateTimeFormatter_create_with_lengths_mv1_result icu4x_ZonedDateTimeFormatter_create_with_lengths_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale, diplomat::capi::DateLength date_length, diplomat::capi::TimeLength time_length);
-    
-    typedef struct icu4x_ZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback_mv1_result {union {diplomat::capi::ZonedDateTimeFormatter* ok; diplomat::capi::Error err;}; bool is_ok;} icu4x_ZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback_mv1_result;
-    icu4x_ZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback_mv1_result icu4x_ZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback_mv1(const diplomat::capi::DataProvider* provider, const diplomat::capi::Locale* locale, diplomat::capi::DateLength date_length, diplomat::capi::TimeLength time_length, diplomat::capi::IsoTimeZoneOptions zone_options);
-    
-    typedef struct icu4x_ZonedDateTimeFormatter_format_datetime_with_custom_time_zone_mv1_result {union { diplomat::capi::Error err;}; bool is_ok;} icu4x_ZonedDateTimeFormatter_format_datetime_with_custom_time_zone_mv1_result;
-    icu4x_ZonedDateTimeFormatter_format_datetime_with_custom_time_zone_mv1_result icu4x_ZonedDateTimeFormatter_format_datetime_with_custom_time_zone_mv1(const diplomat::capi::ZonedDateTimeFormatter* self, const diplomat::capi::DateTime* datetime, const diplomat::capi::CustomTimeZone* time_zone, diplomat::capi::DiplomatWrite* write);
-    
-    typedef struct icu4x_ZonedDateTimeFormatter_format_iso_datetime_with_custom_time_zone_mv1_result {union { diplomat::capi::Error err;}; bool is_ok;} icu4x_ZonedDateTimeFormatter_format_iso_datetime_with_custom_time_zone_mv1_result;
-    icu4x_ZonedDateTimeFormatter_format_iso_datetime_with_custom_time_zone_mv1_result icu4x_ZonedDateTimeFormatter_format_iso_datetime_with_custom_time_zone_mv1(const diplomat::capi::ZonedDateTimeFormatter* self, const diplomat::capi::IsoDateTime* datetime, const diplomat::capi::CustomTimeZone* time_zone, diplomat::capi::DiplomatWrite* write);
-    
-    
-    void icu4x_ZonedDateTimeFormatter_destroy_mv1(ZonedDateTimeFormatter* self);
-    
-    } // extern "C"
-} // namespace capi
-} // namespace
-
-inline diplomat::result<std::unique_ptr<ZonedDateTimeFormatter>, Error> ZonedDateTimeFormatter::create_with_lengths(const DataProvider& provider, const Locale& locale, DateLength date_length, TimeLength time_length) {
-  auto result = diplomat::capi::icu4x_ZonedDateTimeFormatter_create_with_lengths_mv1(provider.AsFFI(),
-    locale.AsFFI(),
-    date_length.AsFFI(),
-    time_length.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<ZonedDateTimeFormatter>, Error>(diplomat::Ok<std::unique_ptr<ZonedDateTimeFormatter>>(std::unique_ptr<ZonedDateTimeFormatter>(ZonedDateTimeFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<ZonedDateTimeFormatter>, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::unique_ptr<ZonedDateTimeFormatter>, Error> ZonedDateTimeFormatter::create_with_lengths_and_iso_8601_time_zone_fallback(const DataProvider& provider, const Locale& locale, DateLength date_length, TimeLength time_length, IsoTimeZoneOptions zone_options) {
-  auto result = diplomat::capi::icu4x_ZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback_mv1(provider.AsFFI(),
-    locale.AsFFI(),
-    date_length.AsFFI(),
-    time_length.AsFFI(),
-    zone_options.AsFFI());
-  return result.is_ok ? diplomat::result<std::unique_ptr<ZonedDateTimeFormatter>, Error>(diplomat::Ok<std::unique_ptr<ZonedDateTimeFormatter>>(std::unique_ptr<ZonedDateTimeFormatter>(ZonedDateTimeFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<ZonedDateTimeFormatter>, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::string, Error> ZonedDateTimeFormatter::format_datetime_with_custom_time_zone(const DateTime& datetime, const CustomTimeZone& time_zone) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_ZonedDateTimeFormatter_format_datetime_with_custom_time_zone_mv1(this->AsFFI(),
-    datetime.AsFFI(),
-    time_zone.AsFFI(),
-    &write);
-  return result.is_ok ? diplomat::result<std::string, Error>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline diplomat::result<std::string, Error> ZonedDateTimeFormatter::format_iso_datetime_with_custom_time_zone(const IsoDateTime& datetime, const CustomTimeZone& time_zone) const {
-  std::string output;
-  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
-  auto result = diplomat::capi::icu4x_ZonedDateTimeFormatter_format_iso_datetime_with_custom_time_zone_mv1(this->AsFFI(),
-    datetime.AsFFI(),
-    time_zone.AsFFI(),
-    &write);
-  return result.is_ok ? diplomat::result<std::string, Error>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, Error>(diplomat::Err<Error>(Error::FromFFI(result.err)));
-}
-
-inline const diplomat::capi::ZonedDateTimeFormatter* ZonedDateTimeFormatter::AsFFI() const {
-  return reinterpret_cast<const diplomat::capi::ZonedDateTimeFormatter*>(this);
-}
-
-inline diplomat::capi::ZonedDateTimeFormatter* ZonedDateTimeFormatter::AsFFI() {
-  return reinterpret_cast<diplomat::capi::ZonedDateTimeFormatter*>(this);
-}
-
-inline const ZonedDateTimeFormatter* ZonedDateTimeFormatter::FromFFI(const diplomat::capi::ZonedDateTimeFormatter* ptr) {
-  return reinterpret_cast<const ZonedDateTimeFormatter*>(ptr);
-}
-
-inline ZonedDateTimeFormatter* ZonedDateTimeFormatter::FromFFI(diplomat::capi::ZonedDateTimeFormatter* ptr) {
-  return reinterpret_cast<ZonedDateTimeFormatter*>(ptr);
-}
-
-inline void ZonedDateTimeFormatter::operator delete(void* ptr) {
-  diplomat::capi::icu4x_ZonedDateTimeFormatter_destroy_mv1(reinterpret_cast<diplomat::capi::ZonedDateTimeFormatter*>(ptr));
-}
-
-
-#endif // ZonedDateTimeFormatter_HPP
diff --git a/ffi/capi/bindings/cpp/AnyCalendarKind.d.hpp b/ffi/capi/bindings/cpp/icu4x/AnyCalendarKind.d.hpp
similarity index 73%
rename from ffi/capi/bindings/cpp/AnyCalendarKind.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/AnyCalendarKind.d.hpp
index 56161870b80..9cce1ea8d58 100644
--- a/ffi/capi/bindings/cpp/AnyCalendarKind.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/AnyCalendarKind.d.hpp
@@ -1,5 +1,5 @@
-#ifndef AnyCalendarKind_D_HPP
-#define AnyCalendarKind_D_HPP
+#ifndef icu4x_AnyCalendarKind_D_HPP
+#define icu4x_AnyCalendarKind_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,13 +7,16 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
-namespace diplomat::capi { struct Locale; }
+namespace icu4x {
+namespace capi { struct Locale; }
 class Locale;
+class AnyCalendarKind;
+}
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum AnyCalendarKind {
       AnyCalendarKind_Iso = 0,
@@ -38,6 +41,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class AnyCalendarKind {
 public:
   enum Value {
@@ -68,17 +72,17 @@ class AnyCalendarKind {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline static std::optional<AnyCalendarKind> get_for_locale(const Locale& locale);
+  inline static std::optional<icu4x::AnyCalendarKind> get_for_locale(const icu4x::Locale& locale);
 
-  inline static std::optional<AnyCalendarKind> get_for_bcp47(std::string_view s);
+  inline static std::optional<icu4x::AnyCalendarKind> get_for_bcp47(std::string_view s);
 
   inline std::string bcp47();
 
-  inline diplomat::capi::AnyCalendarKind AsFFI() const;
-  inline static AnyCalendarKind FromFFI(diplomat::capi::AnyCalendarKind c_enum);
+  inline icu4x::capi::AnyCalendarKind AsFFI() const;
+  inline static icu4x::AnyCalendarKind FromFFI(icu4x::capi::AnyCalendarKind c_enum);
 private:
     Value value;
 };
 
-
-#endif // AnyCalendarKind_D_HPP
+} // namespace
+#endif // icu4x_AnyCalendarKind_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/AnyCalendarKind.hpp b/ffi/capi/bindings/cpp/icu4x/AnyCalendarKind.hpp
new file mode 100644
index 00000000000..ba16b64f320
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/AnyCalendarKind.hpp
@@ -0,0 +1,81 @@
+#ifndef icu4x_AnyCalendarKind_HPP
+#define icu4x_AnyCalendarKind_HPP
+
+#include "AnyCalendarKind.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "Locale.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_AnyCalendarKind_get_for_locale_mv1_result {union {icu4x::capi::AnyCalendarKind ok; }; bool is_ok;} icu4x_AnyCalendarKind_get_for_locale_mv1_result;
+    icu4x_AnyCalendarKind_get_for_locale_mv1_result icu4x_AnyCalendarKind_get_for_locale_mv1(const icu4x::capi::Locale* locale);
+    
+    typedef struct icu4x_AnyCalendarKind_get_for_bcp47_mv1_result {union {icu4x::capi::AnyCalendarKind ok; }; bool is_ok;} icu4x_AnyCalendarKind_get_for_bcp47_mv1_result;
+    icu4x_AnyCalendarKind_get_for_bcp47_mv1_result icu4x_AnyCalendarKind_get_for_bcp47_mv1(const char* s_data, size_t s_len);
+    
+    void icu4x_AnyCalendarKind_bcp47_mv1(icu4x::capi::AnyCalendarKind self, diplomat::capi::DiplomatWrite* write);
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::AnyCalendarKind icu4x::AnyCalendarKind::AsFFI() const {
+  return static_cast<icu4x::capi::AnyCalendarKind>(value);
+}
+
+inline icu4x::AnyCalendarKind icu4x::AnyCalendarKind::FromFFI(icu4x::capi::AnyCalendarKind c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::AnyCalendarKind_Iso:
+    case icu4x::capi::AnyCalendarKind_Gregorian:
+    case icu4x::capi::AnyCalendarKind_Buddhist:
+    case icu4x::capi::AnyCalendarKind_Japanese:
+    case icu4x::capi::AnyCalendarKind_JapaneseExtended:
+    case icu4x::capi::AnyCalendarKind_Ethiopian:
+    case icu4x::capi::AnyCalendarKind_EthiopianAmeteAlem:
+    case icu4x::capi::AnyCalendarKind_Indian:
+    case icu4x::capi::AnyCalendarKind_Coptic:
+    case icu4x::capi::AnyCalendarKind_Dangi:
+    case icu4x::capi::AnyCalendarKind_Chinese:
+    case icu4x::capi::AnyCalendarKind_Hebrew:
+    case icu4x::capi::AnyCalendarKind_IslamicCivil:
+    case icu4x::capi::AnyCalendarKind_IslamicObservational:
+    case icu4x::capi::AnyCalendarKind_IslamicTabular:
+    case icu4x::capi::AnyCalendarKind_IslamicUmmAlQura:
+    case icu4x::capi::AnyCalendarKind_Persian:
+    case icu4x::capi::AnyCalendarKind_Roc:
+      return static_cast<icu4x::AnyCalendarKind::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+
+inline std::optional<icu4x::AnyCalendarKind> icu4x::AnyCalendarKind::get_for_locale(const icu4x::Locale& locale) {
+  auto result = icu4x::capi::icu4x_AnyCalendarKind_get_for_locale_mv1(locale.AsFFI());
+  return result.is_ok ? std::optional<icu4x::AnyCalendarKind>(icu4x::AnyCalendarKind::FromFFI(result.ok)) : std::nullopt;
+}
+
+inline std::optional<icu4x::AnyCalendarKind> icu4x::AnyCalendarKind::get_for_bcp47(std::string_view s) {
+  auto result = icu4x::capi::icu4x_AnyCalendarKind_get_for_bcp47_mv1(s.data(),
+    s.size());
+  return result.is_ok ? std::optional<icu4x::AnyCalendarKind>(icu4x::AnyCalendarKind::FromFFI(result.ok)) : std::nullopt;
+}
+
+inline std::string icu4x::AnyCalendarKind::bcp47() {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_AnyCalendarKind_bcp47_mv1(this->AsFFI(),
+    &write);
+  return output;
+}
+#endif // icu4x_AnyCalendarKind_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/Bidi.d.hpp b/ffi/capi/bindings/cpp/icu4x/Bidi.d.hpp
new file mode 100644
index 00000000000..18c40287733
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/Bidi.d.hpp
@@ -0,0 +1,64 @@
+#ifndef icu4x_Bidi_D_HPP
+#define icu4x_Bidi_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct Bidi; }
+class Bidi;
+namespace capi { struct BidiInfo; }
+class BidiInfo;
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct ReorderedIndexMap; }
+class ReorderedIndexMap;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct Bidi;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class Bidi {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::Bidi>, icu4x::DataError> create(const icu4x::DataProvider& provider);
+
+  inline std::unique_ptr<icu4x::BidiInfo> for_text(std::string_view text, uint8_t default_level) const;
+
+  inline std::unique_ptr<icu4x::ReorderedIndexMap> reorder_visual(diplomat::span<const uint8_t> levels) const;
+
+  inline static bool level_is_rtl(uint8_t level);
+
+  inline static bool level_is_ltr(uint8_t level);
+
+  inline static uint8_t level_rtl();
+
+  inline static uint8_t level_ltr();
+
+  inline const icu4x::capi::Bidi* AsFFI() const;
+  inline icu4x::capi::Bidi* AsFFI();
+  inline static const icu4x::Bidi* FromFFI(const icu4x::capi::Bidi* ptr);
+  inline static icu4x::Bidi* FromFFI(icu4x::capi::Bidi* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  Bidi() = delete;
+  Bidi(const icu4x::Bidi&) = delete;
+  Bidi(icu4x::Bidi&&) noexcept = delete;
+  Bidi operator=(const icu4x::Bidi&) = delete;
+  Bidi operator=(icu4x::Bidi&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_Bidi_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/Bidi.hpp b/ffi/capi/bindings/cpp/icu4x/Bidi.hpp
new file mode 100644
index 00000000000..fa60d7ac710
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/Bidi.hpp
@@ -0,0 +1,106 @@
+#ifndef icu4x_Bidi_HPP
+#define icu4x_Bidi_HPP
+
+#include "Bidi.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "BidiInfo.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "ReorderedIndexMap.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_Bidi_create_mv1_result {union {icu4x::capi::Bidi* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_Bidi_create_mv1_result;
+    icu4x_Bidi_create_mv1_result icu4x_Bidi_create_mv1(const icu4x::capi::DataProvider* provider);
+    
+    icu4x::capi::BidiInfo* icu4x_Bidi_for_text_utf8_mv1(const icu4x::capi::Bidi* self, const char* text_data, size_t text_len, uint8_t default_level);
+    
+    icu4x::capi::ReorderedIndexMap* icu4x_Bidi_reorder_visual_mv1(const icu4x::capi::Bidi* self, const uint8_t* levels_data, size_t levels_len);
+    
+    bool icu4x_Bidi_level_is_rtl_mv1(uint8_t level);
+    
+    bool icu4x_Bidi_level_is_ltr_mv1(uint8_t level);
+    
+    uint8_t icu4x_Bidi_level_rtl_mv1(void);
+    
+    uint8_t icu4x_Bidi_level_ltr_mv1(void);
+    
+    
+    void icu4x_Bidi_destroy_mv1(Bidi* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::Bidi>, icu4x::DataError> icu4x::Bidi::create(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_Bidi_create_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::Bidi>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::Bidi>>(std::unique_ptr<icu4x::Bidi>(icu4x::Bidi::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::Bidi>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline std::unique_ptr<icu4x::BidiInfo> icu4x::Bidi::for_text(std::string_view text, uint8_t default_level) const {
+  auto result = icu4x::capi::icu4x_Bidi_for_text_utf8_mv1(this->AsFFI(),
+    text.data(),
+    text.size(),
+    default_level);
+  return std::unique_ptr<icu4x::BidiInfo>(icu4x::BidiInfo::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::ReorderedIndexMap> icu4x::Bidi::reorder_visual(diplomat::span<const uint8_t> levels) const {
+  auto result = icu4x::capi::icu4x_Bidi_reorder_visual_mv1(this->AsFFI(),
+    levels.data(),
+    levels.size());
+  return std::unique_ptr<icu4x::ReorderedIndexMap>(icu4x::ReorderedIndexMap::FromFFI(result));
+}
+
+inline bool icu4x::Bidi::level_is_rtl(uint8_t level) {
+  auto result = icu4x::capi::icu4x_Bidi_level_is_rtl_mv1(level);
+  return result;
+}
+
+inline bool icu4x::Bidi::level_is_ltr(uint8_t level) {
+  auto result = icu4x::capi::icu4x_Bidi_level_is_ltr_mv1(level);
+  return result;
+}
+
+inline uint8_t icu4x::Bidi::level_rtl() {
+  auto result = icu4x::capi::icu4x_Bidi_level_rtl_mv1();
+  return result;
+}
+
+inline uint8_t icu4x::Bidi::level_ltr() {
+  auto result = icu4x::capi::icu4x_Bidi_level_ltr_mv1();
+  return result;
+}
+
+inline const icu4x::capi::Bidi* icu4x::Bidi::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::Bidi*>(this);
+}
+
+inline icu4x::capi::Bidi* icu4x::Bidi::AsFFI() {
+  return reinterpret_cast<icu4x::capi::Bidi*>(this);
+}
+
+inline const icu4x::Bidi* icu4x::Bidi::FromFFI(const icu4x::capi::Bidi* ptr) {
+  return reinterpret_cast<const icu4x::Bidi*>(ptr);
+}
+
+inline icu4x::Bidi* icu4x::Bidi::FromFFI(icu4x::capi::Bidi* ptr) {
+  return reinterpret_cast<icu4x::Bidi*>(ptr);
+}
+
+inline void icu4x::Bidi::operator delete(void* ptr) {
+  icu4x::capi::icu4x_Bidi_destroy_mv1(reinterpret_cast<icu4x::capi::Bidi*>(ptr));
+}
+
+
+#endif // icu4x_Bidi_HPP
diff --git a/ffi/capi/bindings/cpp/BidiDirection.d.hpp b/ffi/capi/bindings/cpp/icu4x/BidiDirection.d.hpp
similarity index 67%
rename from ffi/capi/bindings/cpp/BidiDirection.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/BidiDirection.d.hpp
index b017c432261..264cede14f7 100644
--- a/ffi/capi/bindings/cpp/BidiDirection.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/BidiDirection.d.hpp
@@ -1,5 +1,5 @@
-#ifndef BidiDirection_D_HPP
-#define BidiDirection_D_HPP
+#ifndef icu4x_BidiDirection_D_HPP
+#define icu4x_BidiDirection_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum BidiDirection {
       BidiDirection_Ltr = 0,
@@ -20,6 +20,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class BidiDirection {
 public:
   enum Value {
@@ -35,11 +36,11 @@ class BidiDirection {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::BidiDirection AsFFI() const;
-  inline static BidiDirection FromFFI(diplomat::capi::BidiDirection c_enum);
+  inline icu4x::capi::BidiDirection AsFFI() const;
+  inline static icu4x::BidiDirection FromFFI(icu4x::capi::BidiDirection c_enum);
 private:
     Value value;
 };
 
-
-#endif // BidiDirection_D_HPP
+} // namespace
+#endif // icu4x_BidiDirection_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/BidiDirection.hpp b/ffi/capi/bindings/cpp/icu4x/BidiDirection.hpp
new file mode 100644
index 00000000000..b23920c3a49
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/BidiDirection.hpp
@@ -0,0 +1,38 @@
+#ifndef icu4x_BidiDirection_HPP
+#define icu4x_BidiDirection_HPP
+
+#include "BidiDirection.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::BidiDirection icu4x::BidiDirection::AsFFI() const {
+  return static_cast<icu4x::capi::BidiDirection>(value);
+}
+
+inline icu4x::BidiDirection icu4x::BidiDirection::FromFFI(icu4x::capi::BidiDirection c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::BidiDirection_Ltr:
+    case icu4x::capi::BidiDirection_Rtl:
+    case icu4x::capi::BidiDirection_Mixed:
+      return static_cast<icu4x::BidiDirection::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_BidiDirection_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/BidiInfo.d.hpp b/ffi/capi/bindings/cpp/icu4x/BidiInfo.d.hpp
new file mode 100644
index 00000000000..e042aeb28bf
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/BidiInfo.d.hpp
@@ -0,0 +1,51 @@
+#ifndef icu4x_BidiInfo_D_HPP
+#define icu4x_BidiInfo_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct BidiParagraph; }
+class BidiParagraph;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct BidiInfo;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class BidiInfo {
+public:
+
+  inline size_t paragraph_count() const;
+
+  inline std::unique_ptr<icu4x::BidiParagraph> paragraph_at(size_t n) const;
+
+  inline size_t size() const;
+
+  inline uint8_t level_at(size_t pos) const;
+
+  inline const icu4x::capi::BidiInfo* AsFFI() const;
+  inline icu4x::capi::BidiInfo* AsFFI();
+  inline static const icu4x::BidiInfo* FromFFI(const icu4x::capi::BidiInfo* ptr);
+  inline static icu4x::BidiInfo* FromFFI(icu4x::capi::BidiInfo* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  BidiInfo() = delete;
+  BidiInfo(const icu4x::BidiInfo&) = delete;
+  BidiInfo(icu4x::BidiInfo&&) noexcept = delete;
+  BidiInfo operator=(const icu4x::BidiInfo&) = delete;
+  BidiInfo operator=(icu4x::BidiInfo&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_BidiInfo_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/BidiInfo.hpp b/ffi/capi/bindings/cpp/icu4x/BidiInfo.hpp
new file mode 100644
index 00000000000..338c8909b26
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/BidiInfo.hpp
@@ -0,0 +1,78 @@
+#ifndef icu4x_BidiInfo_HPP
+#define icu4x_BidiInfo_HPP
+
+#include "BidiInfo.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "BidiParagraph.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    size_t icu4x_BidiInfo_paragraph_count_mv1(const icu4x::capi::BidiInfo* self);
+    
+    icu4x::capi::BidiParagraph* icu4x_BidiInfo_paragraph_at_mv1(const icu4x::capi::BidiInfo* self, size_t n);
+    
+    size_t icu4x_BidiInfo_size_mv1(const icu4x::capi::BidiInfo* self);
+    
+    uint8_t icu4x_BidiInfo_level_at_mv1(const icu4x::capi::BidiInfo* self, size_t pos);
+    
+    
+    void icu4x_BidiInfo_destroy_mv1(BidiInfo* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline size_t icu4x::BidiInfo::paragraph_count() const {
+  auto result = icu4x::capi::icu4x_BidiInfo_paragraph_count_mv1(this->AsFFI());
+  return result;
+}
+
+inline std::unique_ptr<icu4x::BidiParagraph> icu4x::BidiInfo::paragraph_at(size_t n) const {
+  auto result = icu4x::capi::icu4x_BidiInfo_paragraph_at_mv1(this->AsFFI(),
+    n);
+  return std::unique_ptr<icu4x::BidiParagraph>(icu4x::BidiParagraph::FromFFI(result));
+}
+
+inline size_t icu4x::BidiInfo::size() const {
+  auto result = icu4x::capi::icu4x_BidiInfo_size_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint8_t icu4x::BidiInfo::level_at(size_t pos) const {
+  auto result = icu4x::capi::icu4x_BidiInfo_level_at_mv1(this->AsFFI(),
+    pos);
+  return result;
+}
+
+inline const icu4x::capi::BidiInfo* icu4x::BidiInfo::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::BidiInfo*>(this);
+}
+
+inline icu4x::capi::BidiInfo* icu4x::BidiInfo::AsFFI() {
+  return reinterpret_cast<icu4x::capi::BidiInfo*>(this);
+}
+
+inline const icu4x::BidiInfo* icu4x::BidiInfo::FromFFI(const icu4x::capi::BidiInfo* ptr) {
+  return reinterpret_cast<const icu4x::BidiInfo*>(ptr);
+}
+
+inline icu4x::BidiInfo* icu4x::BidiInfo::FromFFI(icu4x::capi::BidiInfo* ptr) {
+  return reinterpret_cast<icu4x::BidiInfo*>(ptr);
+}
+
+inline void icu4x::BidiInfo::operator delete(void* ptr) {
+  icu4x::capi::icu4x_BidiInfo_destroy_mv1(reinterpret_cast<icu4x::capi::BidiInfo*>(ptr));
+}
+
+
+#endif // icu4x_BidiInfo_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/BidiParagraph.d.hpp b/ffi/capi/bindings/cpp/icu4x/BidiParagraph.d.hpp
new file mode 100644
index 00000000000..5ff85277602
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/BidiParagraph.d.hpp
@@ -0,0 +1,56 @@
+#ifndef icu4x_BidiParagraph_D_HPP
+#define icu4x_BidiParagraph_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+class BidiDirection;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct BidiParagraph;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class BidiParagraph {
+public:
+
+  inline bool set_paragraph_in_text(size_t n);
+
+  inline icu4x::BidiDirection direction() const;
+
+  inline size_t size() const;
+
+  inline size_t range_start() const;
+
+  inline size_t range_end() const;
+
+  inline std::optional<std::string> reorder_line(size_t range_start, size_t range_end) const;
+
+  inline uint8_t level_at(size_t pos) const;
+
+  inline const icu4x::capi::BidiParagraph* AsFFI() const;
+  inline icu4x::capi::BidiParagraph* AsFFI();
+  inline static const icu4x::BidiParagraph* FromFFI(const icu4x::capi::BidiParagraph* ptr);
+  inline static icu4x::BidiParagraph* FromFFI(icu4x::capi::BidiParagraph* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  BidiParagraph() = delete;
+  BidiParagraph(const icu4x::BidiParagraph&) = delete;
+  BidiParagraph(icu4x::BidiParagraph&&) noexcept = delete;
+  BidiParagraph operator=(const icu4x::BidiParagraph&) = delete;
+  BidiParagraph operator=(icu4x::BidiParagraph&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_BidiParagraph_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/BidiParagraph.hpp b/ffi/capi/bindings/cpp/icu4x/BidiParagraph.hpp
new file mode 100644
index 00000000000..78cf2f018d0
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/BidiParagraph.hpp
@@ -0,0 +1,105 @@
+#ifndef icu4x_BidiParagraph_HPP
+#define icu4x_BidiParagraph_HPP
+
+#include "BidiParagraph.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "BidiDirection.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    bool icu4x_BidiParagraph_set_paragraph_in_text_mv1(icu4x::capi::BidiParagraph* self, size_t n);
+    
+    icu4x::capi::BidiDirection icu4x_BidiParagraph_direction_mv1(const icu4x::capi::BidiParagraph* self);
+    
+    size_t icu4x_BidiParagraph_size_mv1(const icu4x::capi::BidiParagraph* self);
+    
+    size_t icu4x_BidiParagraph_range_start_mv1(const icu4x::capi::BidiParagraph* self);
+    
+    size_t icu4x_BidiParagraph_range_end_mv1(const icu4x::capi::BidiParagraph* self);
+    
+    typedef struct icu4x_BidiParagraph_reorder_line_mv1_result { bool is_ok;} icu4x_BidiParagraph_reorder_line_mv1_result;
+    icu4x_BidiParagraph_reorder_line_mv1_result icu4x_BidiParagraph_reorder_line_mv1(const icu4x::capi::BidiParagraph* self, size_t range_start, size_t range_end, diplomat::capi::DiplomatWrite* write);
+    
+    uint8_t icu4x_BidiParagraph_level_at_mv1(const icu4x::capi::BidiParagraph* self, size_t pos);
+    
+    
+    void icu4x_BidiParagraph_destroy_mv1(BidiParagraph* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline bool icu4x::BidiParagraph::set_paragraph_in_text(size_t n) {
+  auto result = icu4x::capi::icu4x_BidiParagraph_set_paragraph_in_text_mv1(this->AsFFI(),
+    n);
+  return result;
+}
+
+inline icu4x::BidiDirection icu4x::BidiParagraph::direction() const {
+  auto result = icu4x::capi::icu4x_BidiParagraph_direction_mv1(this->AsFFI());
+  return icu4x::BidiDirection::FromFFI(result);
+}
+
+inline size_t icu4x::BidiParagraph::size() const {
+  auto result = icu4x::capi::icu4x_BidiParagraph_size_mv1(this->AsFFI());
+  return result;
+}
+
+inline size_t icu4x::BidiParagraph::range_start() const {
+  auto result = icu4x::capi::icu4x_BidiParagraph_range_start_mv1(this->AsFFI());
+  return result;
+}
+
+inline size_t icu4x::BidiParagraph::range_end() const {
+  auto result = icu4x::capi::icu4x_BidiParagraph_range_end_mv1(this->AsFFI());
+  return result;
+}
+
+inline std::optional<std::string> icu4x::BidiParagraph::reorder_line(size_t range_start, size_t range_end) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_BidiParagraph_reorder_line_mv1(this->AsFFI(),
+    range_start,
+    range_end,
+    &write);
+  return result.is_ok ? std::optional<std::string>(std::move(output)) : std::nullopt;
+}
+
+inline uint8_t icu4x::BidiParagraph::level_at(size_t pos) const {
+  auto result = icu4x::capi::icu4x_BidiParagraph_level_at_mv1(this->AsFFI(),
+    pos);
+  return result;
+}
+
+inline const icu4x::capi::BidiParagraph* icu4x::BidiParagraph::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::BidiParagraph*>(this);
+}
+
+inline icu4x::capi::BidiParagraph* icu4x::BidiParagraph::AsFFI() {
+  return reinterpret_cast<icu4x::capi::BidiParagraph*>(this);
+}
+
+inline const icu4x::BidiParagraph* icu4x::BidiParagraph::FromFFI(const icu4x::capi::BidiParagraph* ptr) {
+  return reinterpret_cast<const icu4x::BidiParagraph*>(ptr);
+}
+
+inline icu4x::BidiParagraph* icu4x::BidiParagraph::FromFFI(icu4x::capi::BidiParagraph* ptr) {
+  return reinterpret_cast<icu4x::BidiParagraph*>(ptr);
+}
+
+inline void icu4x::BidiParagraph::operator delete(void* ptr) {
+  icu4x::capi::icu4x_BidiParagraph_destroy_mv1(reinterpret_cast<icu4x::capi::BidiParagraph*>(ptr));
+}
+
+
+#endif // icu4x_BidiParagraph_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/Calendar.d.hpp b/ffi/capi/bindings/cpp/icu4x/Calendar.d.hpp
new file mode 100644
index 00000000000..75e6a75b08b
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/Calendar.d.hpp
@@ -0,0 +1,55 @@
+#ifndef icu4x_Calendar_D_HPP
+#define icu4x_Calendar_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct Calendar; }
+class Calendar;
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct Locale; }
+class Locale;
+class AnyCalendarKind;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct Calendar;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class Calendar {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::Calendar>, icu4x::DataError> create_for_locale(const icu4x::DataProvider& provider, const icu4x::Locale& locale);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::Calendar>, icu4x::DataError> create_for_kind(const icu4x::DataProvider& provider, icu4x::AnyCalendarKind kind);
+
+  inline icu4x::AnyCalendarKind kind() const;
+
+  inline const icu4x::capi::Calendar* AsFFI() const;
+  inline icu4x::capi::Calendar* AsFFI();
+  inline static const icu4x::Calendar* FromFFI(const icu4x::capi::Calendar* ptr);
+  inline static icu4x::Calendar* FromFFI(icu4x::capi::Calendar* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  Calendar() = delete;
+  Calendar(const icu4x::Calendar&) = delete;
+  Calendar(icu4x::Calendar&&) noexcept = delete;
+  Calendar operator=(const icu4x::Calendar&) = delete;
+  Calendar operator=(icu4x::Calendar&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_Calendar_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/Calendar.hpp b/ffi/capi/bindings/cpp/icu4x/Calendar.hpp
new file mode 100644
index 00000000000..c249c733b3c
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/Calendar.hpp
@@ -0,0 +1,76 @@
+#ifndef icu4x_Calendar_HPP
+#define icu4x_Calendar_HPP
+
+#include "Calendar.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "AnyCalendarKind.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "Locale.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_Calendar_create_for_locale_mv1_result {union {icu4x::capi::Calendar* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_Calendar_create_for_locale_mv1_result;
+    icu4x_Calendar_create_for_locale_mv1_result icu4x_Calendar_create_for_locale_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale);
+    
+    typedef struct icu4x_Calendar_create_for_kind_mv1_result {union {icu4x::capi::Calendar* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_Calendar_create_for_kind_mv1_result;
+    icu4x_Calendar_create_for_kind_mv1_result icu4x_Calendar_create_for_kind_mv1(const icu4x::capi::DataProvider* provider, icu4x::capi::AnyCalendarKind kind);
+    
+    icu4x::capi::AnyCalendarKind icu4x_Calendar_kind_mv1(const icu4x::capi::Calendar* self);
+    
+    
+    void icu4x_Calendar_destroy_mv1(Calendar* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::Calendar>, icu4x::DataError> icu4x::Calendar::create_for_locale(const icu4x::DataProvider& provider, const icu4x::Locale& locale) {
+  auto result = icu4x::capi::icu4x_Calendar_create_for_locale_mv1(provider.AsFFI(),
+    locale.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::Calendar>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::Calendar>>(std::unique_ptr<icu4x::Calendar>(icu4x::Calendar::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::Calendar>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::Calendar>, icu4x::DataError> icu4x::Calendar::create_for_kind(const icu4x::DataProvider& provider, icu4x::AnyCalendarKind kind) {
+  auto result = icu4x::capi::icu4x_Calendar_create_for_kind_mv1(provider.AsFFI(),
+    kind.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::Calendar>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::Calendar>>(std::unique_ptr<icu4x::Calendar>(icu4x::Calendar::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::Calendar>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline icu4x::AnyCalendarKind icu4x::Calendar::kind() const {
+  auto result = icu4x::capi::icu4x_Calendar_kind_mv1(this->AsFFI());
+  return icu4x::AnyCalendarKind::FromFFI(result);
+}
+
+inline const icu4x::capi::Calendar* icu4x::Calendar::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::Calendar*>(this);
+}
+
+inline icu4x::capi::Calendar* icu4x::Calendar::AsFFI() {
+  return reinterpret_cast<icu4x::capi::Calendar*>(this);
+}
+
+inline const icu4x::Calendar* icu4x::Calendar::FromFFI(const icu4x::capi::Calendar* ptr) {
+  return reinterpret_cast<const icu4x::Calendar*>(ptr);
+}
+
+inline icu4x::Calendar* icu4x::Calendar::FromFFI(icu4x::capi::Calendar* ptr) {
+  return reinterpret_cast<icu4x::Calendar*>(ptr);
+}
+
+inline void icu4x::Calendar::operator delete(void* ptr) {
+  icu4x::capi::icu4x_Calendar_destroy_mv1(reinterpret_cast<icu4x::capi::Calendar*>(ptr));
+}
+
+
+#endif // icu4x_Calendar_HPP
diff --git a/ffi/capi/bindings/cpp/CalendarError.d.hpp b/ffi/capi/bindings/cpp/icu4x/CalendarError.d.hpp
similarity index 70%
rename from ffi/capi/bindings/cpp/CalendarError.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/CalendarError.d.hpp
index 22394482149..0818c2903b2 100644
--- a/ffi/capi/bindings/cpp/CalendarError.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/CalendarError.d.hpp
@@ -1,5 +1,5 @@
-#ifndef CalendarError_D_HPP
-#define CalendarError_D_HPP
+#ifndef icu4x_CalendarError_D_HPP
+#define icu4x_CalendarError_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum CalendarError {
       CalendarError_Unknown = 0,
@@ -21,6 +21,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class CalendarError {
 public:
   enum Value {
@@ -37,11 +38,11 @@ class CalendarError {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::CalendarError AsFFI() const;
-  inline static CalendarError FromFFI(diplomat::capi::CalendarError c_enum);
+  inline icu4x::capi::CalendarError AsFFI() const;
+  inline static icu4x::CalendarError FromFFI(icu4x::capi::CalendarError c_enum);
 private:
     Value value;
 };
 
-
-#endif // CalendarError_D_HPP
+} // namespace
+#endif // icu4x_CalendarError_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CalendarError.hpp b/ffi/capi/bindings/cpp/icu4x/CalendarError.hpp
new file mode 100644
index 00000000000..65510a2a581
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CalendarError.hpp
@@ -0,0 +1,39 @@
+#ifndef icu4x_CalendarError_HPP
+#define icu4x_CalendarError_HPP
+
+#include "CalendarError.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::CalendarError icu4x::CalendarError::AsFFI() const {
+  return static_cast<icu4x::capi::CalendarError>(value);
+}
+
+inline icu4x::CalendarError icu4x::CalendarError::FromFFI(icu4x::capi::CalendarError c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::CalendarError_Unknown:
+    case icu4x::capi::CalendarError_OutOfRange:
+    case icu4x::capi::CalendarError_UnknownEra:
+    case icu4x::capi::CalendarError_UnknownMonthCode:
+      return static_cast<icu4x::CalendarError::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_CalendarError_HPP
diff --git a/ffi/capi/bindings/cpp/CalendarParseError.d.hpp b/ffi/capi/bindings/cpp/icu4x/CalendarParseError.d.hpp
similarity index 71%
rename from ffi/capi/bindings/cpp/CalendarParseError.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/CalendarParseError.d.hpp
index e09b4c50d6b..b2e60c471ff 100644
--- a/ffi/capi/bindings/cpp/CalendarParseError.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/CalendarParseError.d.hpp
@@ -1,5 +1,5 @@
-#ifndef CalendarParseError_D_HPP
-#define CalendarParseError_D_HPP
+#ifndef icu4x_CalendarParseError_D_HPP
+#define icu4x_CalendarParseError_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum CalendarParseError {
       CalendarParseError_Unknown = 0,
@@ -22,6 +22,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class CalendarParseError {
 public:
   enum Value {
@@ -39,11 +40,11 @@ class CalendarParseError {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::CalendarParseError AsFFI() const;
-  inline static CalendarParseError FromFFI(diplomat::capi::CalendarParseError c_enum);
+  inline icu4x::capi::CalendarParseError AsFFI() const;
+  inline static icu4x::CalendarParseError FromFFI(icu4x::capi::CalendarParseError c_enum);
 private:
     Value value;
 };
 
-
-#endif // CalendarParseError_D_HPP
+} // namespace
+#endif // icu4x_CalendarParseError_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CalendarParseError.hpp b/ffi/capi/bindings/cpp/icu4x/CalendarParseError.hpp
new file mode 100644
index 00000000000..fa89386bfb3
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CalendarParseError.hpp
@@ -0,0 +1,40 @@
+#ifndef icu4x_CalendarParseError_HPP
+#define icu4x_CalendarParseError_HPP
+
+#include "CalendarParseError.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::CalendarParseError icu4x::CalendarParseError::AsFFI() const {
+  return static_cast<icu4x::capi::CalendarParseError>(value);
+}
+
+inline icu4x::CalendarParseError icu4x::CalendarParseError::FromFFI(icu4x::capi::CalendarParseError c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::CalendarParseError_Unknown:
+    case icu4x::capi::CalendarParseError_InvalidSyntax:
+    case icu4x::capi::CalendarParseError_OutOfRange:
+    case icu4x::capi::CalendarParseError_MissingFields:
+    case icu4x::capi::CalendarParseError_UnknownCalendar:
+      return static_cast<icu4x::CalendarParseError::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_CalendarParseError_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CanonicalCombiningClassMap.d.hpp b/ffi/capi/bindings/cpp/icu4x/CanonicalCombiningClassMap.d.hpp
new file mode 100644
index 00000000000..86240acf18d
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CanonicalCombiningClassMap.d.hpp
@@ -0,0 +1,50 @@
+#ifndef icu4x_CanonicalCombiningClassMap_D_HPP
+#define icu4x_CanonicalCombiningClassMap_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct CanonicalCombiningClassMap; }
+class CanonicalCombiningClassMap;
+namespace capi { struct DataProvider; }
+class DataProvider;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct CanonicalCombiningClassMap;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class CanonicalCombiningClassMap {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CanonicalCombiningClassMap>, icu4x::DataError> create(const icu4x::DataProvider& provider);
+
+  inline uint8_t get(char32_t ch) const;
+
+  inline const icu4x::capi::CanonicalCombiningClassMap* AsFFI() const;
+  inline icu4x::capi::CanonicalCombiningClassMap* AsFFI();
+  inline static const icu4x::CanonicalCombiningClassMap* FromFFI(const icu4x::capi::CanonicalCombiningClassMap* ptr);
+  inline static icu4x::CanonicalCombiningClassMap* FromFFI(icu4x::capi::CanonicalCombiningClassMap* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  CanonicalCombiningClassMap() = delete;
+  CanonicalCombiningClassMap(const icu4x::CanonicalCombiningClassMap&) = delete;
+  CanonicalCombiningClassMap(icu4x::CanonicalCombiningClassMap&&) noexcept = delete;
+  CanonicalCombiningClassMap operator=(const icu4x::CanonicalCombiningClassMap&) = delete;
+  CanonicalCombiningClassMap operator=(icu4x::CanonicalCombiningClassMap&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_CanonicalCombiningClassMap_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CanonicalCombiningClassMap.hpp b/ffi/capi/bindings/cpp/icu4x/CanonicalCombiningClassMap.hpp
new file mode 100644
index 00000000000..168e813fc27
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CanonicalCombiningClassMap.hpp
@@ -0,0 +1,65 @@
+#ifndef icu4x_CanonicalCombiningClassMap_HPP
+#define icu4x_CanonicalCombiningClassMap_HPP
+
+#include "CanonicalCombiningClassMap.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_CanonicalCombiningClassMap_create_mv1_result {union {icu4x::capi::CanonicalCombiningClassMap* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CanonicalCombiningClassMap_create_mv1_result;
+    icu4x_CanonicalCombiningClassMap_create_mv1_result icu4x_CanonicalCombiningClassMap_create_mv1(const icu4x::capi::DataProvider* provider);
+    
+    uint8_t icu4x_CanonicalCombiningClassMap_get_mv1(const icu4x::capi::CanonicalCombiningClassMap* self, char32_t ch);
+    
+    
+    void icu4x_CanonicalCombiningClassMap_destroy_mv1(CanonicalCombiningClassMap* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::CanonicalCombiningClassMap>, icu4x::DataError> icu4x::CanonicalCombiningClassMap::create(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CanonicalCombiningClassMap_create_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CanonicalCombiningClassMap>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CanonicalCombiningClassMap>>(std::unique_ptr<icu4x::CanonicalCombiningClassMap>(icu4x::CanonicalCombiningClassMap::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CanonicalCombiningClassMap>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline uint8_t icu4x::CanonicalCombiningClassMap::get(char32_t ch) const {
+  auto result = icu4x::capi::icu4x_CanonicalCombiningClassMap_get_mv1(this->AsFFI(),
+    ch);
+  return result;
+}
+
+inline const icu4x::capi::CanonicalCombiningClassMap* icu4x::CanonicalCombiningClassMap::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::CanonicalCombiningClassMap*>(this);
+}
+
+inline icu4x::capi::CanonicalCombiningClassMap* icu4x::CanonicalCombiningClassMap::AsFFI() {
+  return reinterpret_cast<icu4x::capi::CanonicalCombiningClassMap*>(this);
+}
+
+inline const icu4x::CanonicalCombiningClassMap* icu4x::CanonicalCombiningClassMap::FromFFI(const icu4x::capi::CanonicalCombiningClassMap* ptr) {
+  return reinterpret_cast<const icu4x::CanonicalCombiningClassMap*>(ptr);
+}
+
+inline icu4x::CanonicalCombiningClassMap* icu4x::CanonicalCombiningClassMap::FromFFI(icu4x::capi::CanonicalCombiningClassMap* ptr) {
+  return reinterpret_cast<icu4x::CanonicalCombiningClassMap*>(ptr);
+}
+
+inline void icu4x::CanonicalCombiningClassMap::operator delete(void* ptr) {
+  icu4x::capi::icu4x_CanonicalCombiningClassMap_destroy_mv1(reinterpret_cast<icu4x::capi::CanonicalCombiningClassMap*>(ptr));
+}
+
+
+#endif // icu4x_CanonicalCombiningClassMap_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CanonicalComposition.d.hpp b/ffi/capi/bindings/cpp/icu4x/CanonicalComposition.d.hpp
new file mode 100644
index 00000000000..bcd68180a19
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CanonicalComposition.d.hpp
@@ -0,0 +1,50 @@
+#ifndef icu4x_CanonicalComposition_D_HPP
+#define icu4x_CanonicalComposition_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct CanonicalComposition; }
+class CanonicalComposition;
+namespace capi { struct DataProvider; }
+class DataProvider;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct CanonicalComposition;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class CanonicalComposition {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CanonicalComposition>, icu4x::DataError> create(const icu4x::DataProvider& provider);
+
+  inline char32_t compose(char32_t starter, char32_t second) const;
+
+  inline const icu4x::capi::CanonicalComposition* AsFFI() const;
+  inline icu4x::capi::CanonicalComposition* AsFFI();
+  inline static const icu4x::CanonicalComposition* FromFFI(const icu4x::capi::CanonicalComposition* ptr);
+  inline static icu4x::CanonicalComposition* FromFFI(icu4x::capi::CanonicalComposition* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  CanonicalComposition() = delete;
+  CanonicalComposition(const icu4x::CanonicalComposition&) = delete;
+  CanonicalComposition(icu4x::CanonicalComposition&&) noexcept = delete;
+  CanonicalComposition operator=(const icu4x::CanonicalComposition&) = delete;
+  CanonicalComposition operator=(icu4x::CanonicalComposition&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_CanonicalComposition_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CanonicalComposition.hpp b/ffi/capi/bindings/cpp/icu4x/CanonicalComposition.hpp
new file mode 100644
index 00000000000..b51c2d0b171
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CanonicalComposition.hpp
@@ -0,0 +1,66 @@
+#ifndef icu4x_CanonicalComposition_HPP
+#define icu4x_CanonicalComposition_HPP
+
+#include "CanonicalComposition.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_CanonicalComposition_create_mv1_result {union {icu4x::capi::CanonicalComposition* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CanonicalComposition_create_mv1_result;
+    icu4x_CanonicalComposition_create_mv1_result icu4x_CanonicalComposition_create_mv1(const icu4x::capi::DataProvider* provider);
+    
+    char32_t icu4x_CanonicalComposition_compose_mv1(const icu4x::capi::CanonicalComposition* self, char32_t starter, char32_t second);
+    
+    
+    void icu4x_CanonicalComposition_destroy_mv1(CanonicalComposition* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::CanonicalComposition>, icu4x::DataError> icu4x::CanonicalComposition::create(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CanonicalComposition_create_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CanonicalComposition>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CanonicalComposition>>(std::unique_ptr<icu4x::CanonicalComposition>(icu4x::CanonicalComposition::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CanonicalComposition>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline char32_t icu4x::CanonicalComposition::compose(char32_t starter, char32_t second) const {
+  auto result = icu4x::capi::icu4x_CanonicalComposition_compose_mv1(this->AsFFI(),
+    starter,
+    second);
+  return result;
+}
+
+inline const icu4x::capi::CanonicalComposition* icu4x::CanonicalComposition::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::CanonicalComposition*>(this);
+}
+
+inline icu4x::capi::CanonicalComposition* icu4x::CanonicalComposition::AsFFI() {
+  return reinterpret_cast<icu4x::capi::CanonicalComposition*>(this);
+}
+
+inline const icu4x::CanonicalComposition* icu4x::CanonicalComposition::FromFFI(const icu4x::capi::CanonicalComposition* ptr) {
+  return reinterpret_cast<const icu4x::CanonicalComposition*>(ptr);
+}
+
+inline icu4x::CanonicalComposition* icu4x::CanonicalComposition::FromFFI(icu4x::capi::CanonicalComposition* ptr) {
+  return reinterpret_cast<icu4x::CanonicalComposition*>(ptr);
+}
+
+inline void icu4x::CanonicalComposition::operator delete(void* ptr) {
+  icu4x::capi::icu4x_CanonicalComposition_destroy_mv1(reinterpret_cast<icu4x::capi::CanonicalComposition*>(ptr));
+}
+
+
+#endif // icu4x_CanonicalComposition_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CanonicalDecomposition.d.hpp b/ffi/capi/bindings/cpp/icu4x/CanonicalDecomposition.d.hpp
new file mode 100644
index 00000000000..6472966147d
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CanonicalDecomposition.d.hpp
@@ -0,0 +1,51 @@
+#ifndef icu4x_CanonicalDecomposition_D_HPP
+#define icu4x_CanonicalDecomposition_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct CanonicalDecomposition; }
+class CanonicalDecomposition;
+namespace capi { struct DataProvider; }
+class DataProvider;
+struct Decomposed;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct CanonicalDecomposition;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class CanonicalDecomposition {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CanonicalDecomposition>, icu4x::DataError> create(const icu4x::DataProvider& provider);
+
+  inline icu4x::Decomposed decompose(char32_t c) const;
+
+  inline const icu4x::capi::CanonicalDecomposition* AsFFI() const;
+  inline icu4x::capi::CanonicalDecomposition* AsFFI();
+  inline static const icu4x::CanonicalDecomposition* FromFFI(const icu4x::capi::CanonicalDecomposition* ptr);
+  inline static icu4x::CanonicalDecomposition* FromFFI(icu4x::capi::CanonicalDecomposition* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  CanonicalDecomposition() = delete;
+  CanonicalDecomposition(const icu4x::CanonicalDecomposition&) = delete;
+  CanonicalDecomposition(icu4x::CanonicalDecomposition&&) noexcept = delete;
+  CanonicalDecomposition operator=(const icu4x::CanonicalDecomposition&) = delete;
+  CanonicalDecomposition operator=(icu4x::CanonicalDecomposition&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_CanonicalDecomposition_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CanonicalDecomposition.hpp b/ffi/capi/bindings/cpp/icu4x/CanonicalDecomposition.hpp
new file mode 100644
index 00000000000..a1af16b3d9a
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CanonicalDecomposition.hpp
@@ -0,0 +1,66 @@
+#ifndef icu4x_CanonicalDecomposition_HPP
+#define icu4x_CanonicalDecomposition_HPP
+
+#include "CanonicalDecomposition.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "Decomposed.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_CanonicalDecomposition_create_mv1_result {union {icu4x::capi::CanonicalDecomposition* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CanonicalDecomposition_create_mv1_result;
+    icu4x_CanonicalDecomposition_create_mv1_result icu4x_CanonicalDecomposition_create_mv1(const icu4x::capi::DataProvider* provider);
+    
+    icu4x::capi::Decomposed icu4x_CanonicalDecomposition_decompose_mv1(const icu4x::capi::CanonicalDecomposition* self, char32_t c);
+    
+    
+    void icu4x_CanonicalDecomposition_destroy_mv1(CanonicalDecomposition* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::CanonicalDecomposition>, icu4x::DataError> icu4x::CanonicalDecomposition::create(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CanonicalDecomposition_create_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CanonicalDecomposition>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CanonicalDecomposition>>(std::unique_ptr<icu4x::CanonicalDecomposition>(icu4x::CanonicalDecomposition::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CanonicalDecomposition>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline icu4x::Decomposed icu4x::CanonicalDecomposition::decompose(char32_t c) const {
+  auto result = icu4x::capi::icu4x_CanonicalDecomposition_decompose_mv1(this->AsFFI(),
+    c);
+  return icu4x::Decomposed::FromFFI(result);
+}
+
+inline const icu4x::capi::CanonicalDecomposition* icu4x::CanonicalDecomposition::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::CanonicalDecomposition*>(this);
+}
+
+inline icu4x::capi::CanonicalDecomposition* icu4x::CanonicalDecomposition::AsFFI() {
+  return reinterpret_cast<icu4x::capi::CanonicalDecomposition*>(this);
+}
+
+inline const icu4x::CanonicalDecomposition* icu4x::CanonicalDecomposition::FromFFI(const icu4x::capi::CanonicalDecomposition* ptr) {
+  return reinterpret_cast<const icu4x::CanonicalDecomposition*>(ptr);
+}
+
+inline icu4x::CanonicalDecomposition* icu4x::CanonicalDecomposition::FromFFI(icu4x::capi::CanonicalDecomposition* ptr) {
+  return reinterpret_cast<icu4x::CanonicalDecomposition*>(ptr);
+}
+
+inline void icu4x::CanonicalDecomposition::operator delete(void* ptr) {
+  icu4x::capi::icu4x_CanonicalDecomposition_destroy_mv1(reinterpret_cast<icu4x::capi::CanonicalDecomposition*>(ptr));
+}
+
+
+#endif // icu4x_CanonicalDecomposition_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CaseMapCloser.d.hpp b/ffi/capi/bindings/cpp/icu4x/CaseMapCloser.d.hpp
new file mode 100644
index 00000000000..67471bd5c10
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CaseMapCloser.d.hpp
@@ -0,0 +1,54 @@
+#ifndef icu4x_CaseMapCloser_D_HPP
+#define icu4x_CaseMapCloser_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct CaseMapCloser; }
+class CaseMapCloser;
+namespace capi { struct CodePointSetBuilder; }
+class CodePointSetBuilder;
+namespace capi { struct DataProvider; }
+class DataProvider;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct CaseMapCloser;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class CaseMapCloser {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CaseMapCloser>, icu4x::DataError> create(const icu4x::DataProvider& provider);
+
+  inline void add_case_closure_to(char32_t c, icu4x::CodePointSetBuilder& builder) const;
+
+  inline bool add_string_case_closure_to(std::string_view s, icu4x::CodePointSetBuilder& builder) const;
+
+  inline const icu4x::capi::CaseMapCloser* AsFFI() const;
+  inline icu4x::capi::CaseMapCloser* AsFFI();
+  inline static const icu4x::CaseMapCloser* FromFFI(const icu4x::capi::CaseMapCloser* ptr);
+  inline static icu4x::CaseMapCloser* FromFFI(icu4x::capi::CaseMapCloser* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  CaseMapCloser() = delete;
+  CaseMapCloser(const icu4x::CaseMapCloser&) = delete;
+  CaseMapCloser(icu4x::CaseMapCloser&&) noexcept = delete;
+  CaseMapCloser operator=(const icu4x::CaseMapCloser&) = delete;
+  CaseMapCloser operator=(icu4x::CaseMapCloser&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_CaseMapCloser_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CaseMapCloser.hpp b/ffi/capi/bindings/cpp/icu4x/CaseMapCloser.hpp
new file mode 100644
index 00000000000..0b7c443830b
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CaseMapCloser.hpp
@@ -0,0 +1,76 @@
+#ifndef icu4x_CaseMapCloser_HPP
+#define icu4x_CaseMapCloser_HPP
+
+#include "CaseMapCloser.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "CodePointSetBuilder.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_CaseMapCloser_create_mv1_result {union {icu4x::capi::CaseMapCloser* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CaseMapCloser_create_mv1_result;
+    icu4x_CaseMapCloser_create_mv1_result icu4x_CaseMapCloser_create_mv1(const icu4x::capi::DataProvider* provider);
+    
+    void icu4x_CaseMapCloser_add_case_closure_to_mv1(const icu4x::capi::CaseMapCloser* self, char32_t c, icu4x::capi::CodePointSetBuilder* builder);
+    
+    bool icu4x_CaseMapCloser_add_string_case_closure_to_mv1(const icu4x::capi::CaseMapCloser* self, const char* s_data, size_t s_len, icu4x::capi::CodePointSetBuilder* builder);
+    
+    
+    void icu4x_CaseMapCloser_destroy_mv1(CaseMapCloser* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::CaseMapCloser>, icu4x::DataError> icu4x::CaseMapCloser::create(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CaseMapCloser_create_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CaseMapCloser>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CaseMapCloser>>(std::unique_ptr<icu4x::CaseMapCloser>(icu4x::CaseMapCloser::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CaseMapCloser>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline void icu4x::CaseMapCloser::add_case_closure_to(char32_t c, icu4x::CodePointSetBuilder& builder) const {
+  icu4x::capi::icu4x_CaseMapCloser_add_case_closure_to_mv1(this->AsFFI(),
+    c,
+    builder.AsFFI());
+}
+
+inline bool icu4x::CaseMapCloser::add_string_case_closure_to(std::string_view s, icu4x::CodePointSetBuilder& builder) const {
+  auto result = icu4x::capi::icu4x_CaseMapCloser_add_string_case_closure_to_mv1(this->AsFFI(),
+    s.data(),
+    s.size(),
+    builder.AsFFI());
+  return result;
+}
+
+inline const icu4x::capi::CaseMapCloser* icu4x::CaseMapCloser::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::CaseMapCloser*>(this);
+}
+
+inline icu4x::capi::CaseMapCloser* icu4x::CaseMapCloser::AsFFI() {
+  return reinterpret_cast<icu4x::capi::CaseMapCloser*>(this);
+}
+
+inline const icu4x::CaseMapCloser* icu4x::CaseMapCloser::FromFFI(const icu4x::capi::CaseMapCloser* ptr) {
+  return reinterpret_cast<const icu4x::CaseMapCloser*>(ptr);
+}
+
+inline icu4x::CaseMapCloser* icu4x::CaseMapCloser::FromFFI(icu4x::capi::CaseMapCloser* ptr) {
+  return reinterpret_cast<icu4x::CaseMapCloser*>(ptr);
+}
+
+inline void icu4x::CaseMapCloser::operator delete(void* ptr) {
+  icu4x::capi::icu4x_CaseMapCloser_destroy_mv1(reinterpret_cast<icu4x::capi::CaseMapCloser*>(ptr));
+}
+
+
+#endif // icu4x_CaseMapCloser_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CaseMapper.d.hpp b/ffi/capi/bindings/cpp/icu4x/CaseMapper.d.hpp
new file mode 100644
index 00000000000..2992b011179
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CaseMapper.d.hpp
@@ -0,0 +1,75 @@
+#ifndef icu4x_CaseMapper_D_HPP
+#define icu4x_CaseMapper_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct CaseMapper; }
+class CaseMapper;
+namespace capi { struct CodePointSetBuilder; }
+class CodePointSetBuilder;
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct Locale; }
+class Locale;
+struct TitlecaseOptionsV1;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct CaseMapper;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class CaseMapper {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CaseMapper>, icu4x::DataError> create(const icu4x::DataProvider& provider);
+
+  inline diplomat::result<std::string, diplomat::Utf8Error> lowercase(std::string_view s, const icu4x::Locale& locale) const;
+
+  inline diplomat::result<std::string, diplomat::Utf8Error> uppercase(std::string_view s, const icu4x::Locale& locale) const;
+
+  inline diplomat::result<std::string, diplomat::Utf8Error> titlecase_segment_with_only_case_data_v1(std::string_view s, const icu4x::Locale& locale, icu4x::TitlecaseOptionsV1 options) const;
+
+  inline diplomat::result<std::string, diplomat::Utf8Error> fold(std::string_view s) const;
+
+  inline diplomat::result<std::string, diplomat::Utf8Error> fold_turkic(std::string_view s) const;
+
+  inline void add_case_closure_to(char32_t c, icu4x::CodePointSetBuilder& builder) const;
+
+  inline char32_t simple_lowercase(char32_t ch) const;
+
+  inline char32_t simple_uppercase(char32_t ch) const;
+
+  inline char32_t simple_titlecase(char32_t ch) const;
+
+  inline char32_t simple_fold(char32_t ch) const;
+
+  inline char32_t simple_fold_turkic(char32_t ch) const;
+
+  inline const icu4x::capi::CaseMapper* AsFFI() const;
+  inline icu4x::capi::CaseMapper* AsFFI();
+  inline static const icu4x::CaseMapper* FromFFI(const icu4x::capi::CaseMapper* ptr);
+  inline static icu4x::CaseMapper* FromFFI(icu4x::capi::CaseMapper* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  CaseMapper() = delete;
+  CaseMapper(const icu4x::CaseMapper&) = delete;
+  CaseMapper(icu4x::CaseMapper&&) noexcept = delete;
+  CaseMapper operator=(const icu4x::CaseMapper&) = delete;
+  CaseMapper operator=(icu4x::CaseMapper&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_CaseMapper_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CaseMapper.hpp b/ffi/capi/bindings/cpp/icu4x/CaseMapper.hpp
new file mode 100644
index 00000000000..2d0a74edc5e
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CaseMapper.hpp
@@ -0,0 +1,187 @@
+#ifndef icu4x_CaseMapper_HPP
+#define icu4x_CaseMapper_HPP
+
+#include "CaseMapper.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "CodePointSetBuilder.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "Locale.hpp"
+#include "TitlecaseOptionsV1.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_CaseMapper_create_mv1_result {union {icu4x::capi::CaseMapper* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CaseMapper_create_mv1_result;
+    icu4x_CaseMapper_create_mv1_result icu4x_CaseMapper_create_mv1(const icu4x::capi::DataProvider* provider);
+    
+    void icu4x_CaseMapper_lowercase_mv1(const icu4x::capi::CaseMapper* self, const char* s_data, size_t s_len, const icu4x::capi::Locale* locale, diplomat::capi::DiplomatWrite* write);
+    
+    void icu4x_CaseMapper_uppercase_mv1(const icu4x::capi::CaseMapper* self, const char* s_data, size_t s_len, const icu4x::capi::Locale* locale, diplomat::capi::DiplomatWrite* write);
+    
+    void icu4x_CaseMapper_titlecase_segment_with_only_case_data_v1_mv1(const icu4x::capi::CaseMapper* self, const char* s_data, size_t s_len, const icu4x::capi::Locale* locale, icu4x::capi::TitlecaseOptionsV1 options, diplomat::capi::DiplomatWrite* write);
+    
+    void icu4x_CaseMapper_fold_mv1(const icu4x::capi::CaseMapper* self, const char* s_data, size_t s_len, diplomat::capi::DiplomatWrite* write);
+    
+    void icu4x_CaseMapper_fold_turkic_mv1(const icu4x::capi::CaseMapper* self, const char* s_data, size_t s_len, diplomat::capi::DiplomatWrite* write);
+    
+    void icu4x_CaseMapper_add_case_closure_to_mv1(const icu4x::capi::CaseMapper* self, char32_t c, icu4x::capi::CodePointSetBuilder* builder);
+    
+    char32_t icu4x_CaseMapper_simple_lowercase_mv1(const icu4x::capi::CaseMapper* self, char32_t ch);
+    
+    char32_t icu4x_CaseMapper_simple_uppercase_mv1(const icu4x::capi::CaseMapper* self, char32_t ch);
+    
+    char32_t icu4x_CaseMapper_simple_titlecase_mv1(const icu4x::capi::CaseMapper* self, char32_t ch);
+    
+    char32_t icu4x_CaseMapper_simple_fold_mv1(const icu4x::capi::CaseMapper* self, char32_t ch);
+    
+    char32_t icu4x_CaseMapper_simple_fold_turkic_mv1(const icu4x::capi::CaseMapper* self, char32_t ch);
+    
+    
+    void icu4x_CaseMapper_destroy_mv1(CaseMapper* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::CaseMapper>, icu4x::DataError> icu4x::CaseMapper::create(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CaseMapper_create_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CaseMapper>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CaseMapper>>(std::unique_ptr<icu4x::CaseMapper>(icu4x::CaseMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CaseMapper>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::string, diplomat::Utf8Error> icu4x::CaseMapper::lowercase(std::string_view s, const icu4x::Locale& locale) const {
+  if (!diplomat::capi::diplomat_is_str(s.data(), s.size())) {
+    return diplomat::Err<diplomat::Utf8Error>(diplomat::Utf8Error());
+  }
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_CaseMapper_lowercase_mv1(this->AsFFI(),
+    s.data(),
+    s.size(),
+    locale.AsFFI(),
+    &write);
+  return diplomat::Ok<std::string>(std::move(output));
+}
+
+inline diplomat::result<std::string, diplomat::Utf8Error> icu4x::CaseMapper::uppercase(std::string_view s, const icu4x::Locale& locale) const {
+  if (!diplomat::capi::diplomat_is_str(s.data(), s.size())) {
+    return diplomat::Err<diplomat::Utf8Error>(diplomat::Utf8Error());
+  }
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_CaseMapper_uppercase_mv1(this->AsFFI(),
+    s.data(),
+    s.size(),
+    locale.AsFFI(),
+    &write);
+  return diplomat::Ok<std::string>(std::move(output));
+}
+
+inline diplomat::result<std::string, diplomat::Utf8Error> icu4x::CaseMapper::titlecase_segment_with_only_case_data_v1(std::string_view s, const icu4x::Locale& locale, icu4x::TitlecaseOptionsV1 options) const {
+  if (!diplomat::capi::diplomat_is_str(s.data(), s.size())) {
+    return diplomat::Err<diplomat::Utf8Error>(diplomat::Utf8Error());
+  }
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_CaseMapper_titlecase_segment_with_only_case_data_v1_mv1(this->AsFFI(),
+    s.data(),
+    s.size(),
+    locale.AsFFI(),
+    options.AsFFI(),
+    &write);
+  return diplomat::Ok<std::string>(std::move(output));
+}
+
+inline diplomat::result<std::string, diplomat::Utf8Error> icu4x::CaseMapper::fold(std::string_view s) const {
+  if (!diplomat::capi::diplomat_is_str(s.data(), s.size())) {
+    return diplomat::Err<diplomat::Utf8Error>(diplomat::Utf8Error());
+  }
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_CaseMapper_fold_mv1(this->AsFFI(),
+    s.data(),
+    s.size(),
+    &write);
+  return diplomat::Ok<std::string>(std::move(output));
+}
+
+inline diplomat::result<std::string, diplomat::Utf8Error> icu4x::CaseMapper::fold_turkic(std::string_view s) const {
+  if (!diplomat::capi::diplomat_is_str(s.data(), s.size())) {
+    return diplomat::Err<diplomat::Utf8Error>(diplomat::Utf8Error());
+  }
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_CaseMapper_fold_turkic_mv1(this->AsFFI(),
+    s.data(),
+    s.size(),
+    &write);
+  return diplomat::Ok<std::string>(std::move(output));
+}
+
+inline void icu4x::CaseMapper::add_case_closure_to(char32_t c, icu4x::CodePointSetBuilder& builder) const {
+  icu4x::capi::icu4x_CaseMapper_add_case_closure_to_mv1(this->AsFFI(),
+    c,
+    builder.AsFFI());
+}
+
+inline char32_t icu4x::CaseMapper::simple_lowercase(char32_t ch) const {
+  auto result = icu4x::capi::icu4x_CaseMapper_simple_lowercase_mv1(this->AsFFI(),
+    ch);
+  return result;
+}
+
+inline char32_t icu4x::CaseMapper::simple_uppercase(char32_t ch) const {
+  auto result = icu4x::capi::icu4x_CaseMapper_simple_uppercase_mv1(this->AsFFI(),
+    ch);
+  return result;
+}
+
+inline char32_t icu4x::CaseMapper::simple_titlecase(char32_t ch) const {
+  auto result = icu4x::capi::icu4x_CaseMapper_simple_titlecase_mv1(this->AsFFI(),
+    ch);
+  return result;
+}
+
+inline char32_t icu4x::CaseMapper::simple_fold(char32_t ch) const {
+  auto result = icu4x::capi::icu4x_CaseMapper_simple_fold_mv1(this->AsFFI(),
+    ch);
+  return result;
+}
+
+inline char32_t icu4x::CaseMapper::simple_fold_turkic(char32_t ch) const {
+  auto result = icu4x::capi::icu4x_CaseMapper_simple_fold_turkic_mv1(this->AsFFI(),
+    ch);
+  return result;
+}
+
+inline const icu4x::capi::CaseMapper* icu4x::CaseMapper::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::CaseMapper*>(this);
+}
+
+inline icu4x::capi::CaseMapper* icu4x::CaseMapper::AsFFI() {
+  return reinterpret_cast<icu4x::capi::CaseMapper*>(this);
+}
+
+inline const icu4x::CaseMapper* icu4x::CaseMapper::FromFFI(const icu4x::capi::CaseMapper* ptr) {
+  return reinterpret_cast<const icu4x::CaseMapper*>(ptr);
+}
+
+inline icu4x::CaseMapper* icu4x::CaseMapper::FromFFI(icu4x::capi::CaseMapper* ptr) {
+  return reinterpret_cast<icu4x::CaseMapper*>(ptr);
+}
+
+inline void icu4x::CaseMapper::operator delete(void* ptr) {
+  icu4x::capi::icu4x_CaseMapper_destroy_mv1(reinterpret_cast<icu4x::capi::CaseMapper*>(ptr));
+}
+
+
+#endif // icu4x_CaseMapper_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CodePointMapData16.d.hpp b/ffi/capi/bindings/cpp/icu4x/CodePointMapData16.d.hpp
new file mode 100644
index 00000000000..afb0b70918c
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CodePointMapData16.d.hpp
@@ -0,0 +1,60 @@
+#ifndef icu4x_CodePointMapData16_D_HPP
+#define icu4x_CodePointMapData16_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct CodePointMapData16; }
+class CodePointMapData16;
+namespace capi { struct CodePointRangeIterator; }
+class CodePointRangeIterator;
+namespace capi { struct CodePointSetData; }
+class CodePointSetData;
+namespace capi { struct DataProvider; }
+class DataProvider;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct CodePointMapData16;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class CodePointMapData16 {
+public:
+
+  inline uint16_t get(char32_t cp) const;
+
+  inline std::unique_ptr<icu4x::CodePointRangeIterator> iter_ranges_for_value(uint16_t value) const;
+
+  inline std::unique_ptr<icu4x::CodePointRangeIterator> iter_ranges_for_value_complemented(uint16_t value) const;
+
+  inline std::unique_ptr<icu4x::CodePointSetData> get_set_for_value(uint16_t value) const;
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointMapData16>, icu4x::DataError> load_script(const icu4x::DataProvider& provider);
+
+  inline const icu4x::capi::CodePointMapData16* AsFFI() const;
+  inline icu4x::capi::CodePointMapData16* AsFFI();
+  inline static const icu4x::CodePointMapData16* FromFFI(const icu4x::capi::CodePointMapData16* ptr);
+  inline static icu4x::CodePointMapData16* FromFFI(icu4x::capi::CodePointMapData16* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  CodePointMapData16() = delete;
+  CodePointMapData16(const icu4x::CodePointMapData16&) = delete;
+  CodePointMapData16(icu4x::CodePointMapData16&&) noexcept = delete;
+  CodePointMapData16 operator=(const icu4x::CodePointMapData16&) = delete;
+  CodePointMapData16 operator=(icu4x::CodePointMapData16&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_CodePointMapData16_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CodePointMapData16.hpp b/ffi/capi/bindings/cpp/icu4x/CodePointMapData16.hpp
new file mode 100644
index 00000000000..6f2bfb7fbaf
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CodePointMapData16.hpp
@@ -0,0 +1,91 @@
+#ifndef icu4x_CodePointMapData16_HPP
+#define icu4x_CodePointMapData16_HPP
+
+#include "CodePointMapData16.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "CodePointRangeIterator.hpp"
+#include "CodePointSetData.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    uint16_t icu4x_CodePointMapData16_get_mv1(const icu4x::capi::CodePointMapData16* self, char32_t cp);
+    
+    icu4x::capi::CodePointRangeIterator* icu4x_CodePointMapData16_iter_ranges_for_value_mv1(const icu4x::capi::CodePointMapData16* self, uint16_t value);
+    
+    icu4x::capi::CodePointRangeIterator* icu4x_CodePointMapData16_iter_ranges_for_value_complemented_mv1(const icu4x::capi::CodePointMapData16* self, uint16_t value);
+    
+    icu4x::capi::CodePointSetData* icu4x_CodePointMapData16_get_set_for_value_mv1(const icu4x::capi::CodePointMapData16* self, uint16_t value);
+    
+    typedef struct icu4x_CodePointMapData16_load_script_mv1_result {union {icu4x::capi::CodePointMapData16* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData16_load_script_mv1_result;
+    icu4x_CodePointMapData16_load_script_mv1_result icu4x_CodePointMapData16_load_script_mv1(const icu4x::capi::DataProvider* provider);
+    
+    
+    void icu4x_CodePointMapData16_destroy_mv1(CodePointMapData16* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline uint16_t icu4x::CodePointMapData16::get(char32_t cp) const {
+  auto result = icu4x::capi::icu4x_CodePointMapData16_get_mv1(this->AsFFI(),
+    cp);
+  return result;
+}
+
+inline std::unique_ptr<icu4x::CodePointRangeIterator> icu4x::CodePointMapData16::iter_ranges_for_value(uint16_t value) const {
+  auto result = icu4x::capi::icu4x_CodePointMapData16_iter_ranges_for_value_mv1(this->AsFFI(),
+    value);
+  return std::unique_ptr<icu4x::CodePointRangeIterator>(icu4x::CodePointRangeIterator::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::CodePointRangeIterator> icu4x::CodePointMapData16::iter_ranges_for_value_complemented(uint16_t value) const {
+  auto result = icu4x::capi::icu4x_CodePointMapData16_iter_ranges_for_value_complemented_mv1(this->AsFFI(),
+    value);
+  return std::unique_ptr<icu4x::CodePointRangeIterator>(icu4x::CodePointRangeIterator::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::CodePointSetData> icu4x::CodePointMapData16::get_set_for_value(uint16_t value) const {
+  auto result = icu4x::capi::icu4x_CodePointMapData16_get_set_for_value_mv1(this->AsFFI(),
+    value);
+  return std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointMapData16>, icu4x::DataError> icu4x::CodePointMapData16::load_script(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointMapData16_load_script_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointMapData16>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointMapData16>>(std::unique_ptr<icu4x::CodePointMapData16>(icu4x::CodePointMapData16::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointMapData16>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline const icu4x::capi::CodePointMapData16* icu4x::CodePointMapData16::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::CodePointMapData16*>(this);
+}
+
+inline icu4x::capi::CodePointMapData16* icu4x::CodePointMapData16::AsFFI() {
+  return reinterpret_cast<icu4x::capi::CodePointMapData16*>(this);
+}
+
+inline const icu4x::CodePointMapData16* icu4x::CodePointMapData16::FromFFI(const icu4x::capi::CodePointMapData16* ptr) {
+  return reinterpret_cast<const icu4x::CodePointMapData16*>(ptr);
+}
+
+inline icu4x::CodePointMapData16* icu4x::CodePointMapData16::FromFFI(icu4x::capi::CodePointMapData16* ptr) {
+  return reinterpret_cast<icu4x::CodePointMapData16*>(ptr);
+}
+
+inline void icu4x::CodePointMapData16::operator delete(void* ptr) {
+  icu4x::capi::icu4x_CodePointMapData16_destroy_mv1(reinterpret_cast<icu4x::capi::CodePointMapData16*>(ptr));
+}
+
+
+#endif // icu4x_CodePointMapData16_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CodePointMapData8.d.hpp b/ffi/capi/bindings/cpp/icu4x/CodePointMapData8.d.hpp
new file mode 100644
index 00000000000..2c61573d905
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CodePointMapData8.d.hpp
@@ -0,0 +1,82 @@
+#ifndef icu4x_CodePointMapData8_D_HPP
+#define icu4x_CodePointMapData8_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct CodePointMapData8; }
+class CodePointMapData8;
+namespace capi { struct CodePointRangeIterator; }
+class CodePointRangeIterator;
+namespace capi { struct CodePointSetData; }
+class CodePointSetData;
+namespace capi { struct DataProvider; }
+class DataProvider;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct CodePointMapData8;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class CodePointMapData8 {
+public:
+
+  inline uint8_t get(char32_t cp) const;
+
+  inline static uint32_t general_category_to_mask(uint8_t gc);
+
+  inline std::unique_ptr<icu4x::CodePointRangeIterator> iter_ranges_for_value(uint8_t value) const;
+
+  inline std::unique_ptr<icu4x::CodePointRangeIterator> iter_ranges_for_value_complemented(uint8_t value) const;
+
+  inline std::unique_ptr<icu4x::CodePointRangeIterator> iter_ranges_for_mask(uint32_t mask) const;
+
+  inline std::unique_ptr<icu4x::CodePointSetData> get_set_for_value(uint8_t value) const;
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError> load_general_category(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError> load_bidi_class(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError> load_east_asian_width(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError> load_hangul_syllable_type(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError> load_indic_syllabic_category(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError> load_line_break(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError> try_grapheme_cluster_break(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError> load_word_break(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError> load_sentence_break(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError> load_joining_type(const icu4x::DataProvider& provider);
+
+  inline const icu4x::capi::CodePointMapData8* AsFFI() const;
+  inline icu4x::capi::CodePointMapData8* AsFFI();
+  inline static const icu4x::CodePointMapData8* FromFFI(const icu4x::capi::CodePointMapData8* ptr);
+  inline static icu4x::CodePointMapData8* FromFFI(icu4x::capi::CodePointMapData8* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  CodePointMapData8() = delete;
+  CodePointMapData8(const icu4x::CodePointMapData8&) = delete;
+  CodePointMapData8(icu4x::CodePointMapData8&&) noexcept = delete;
+  CodePointMapData8 operator=(const icu4x::CodePointMapData8&) = delete;
+  CodePointMapData8 operator=(icu4x::CodePointMapData8&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_CodePointMapData8_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CodePointMapData8.hpp b/ffi/capi/bindings/cpp/icu4x/CodePointMapData8.hpp
new file mode 100644
index 00000000000..b45d05531b5
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CodePointMapData8.hpp
@@ -0,0 +1,178 @@
+#ifndef icu4x_CodePointMapData8_HPP
+#define icu4x_CodePointMapData8_HPP
+
+#include "CodePointMapData8.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "CodePointRangeIterator.hpp"
+#include "CodePointSetData.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    uint8_t icu4x_CodePointMapData8_get_mv1(const icu4x::capi::CodePointMapData8* self, char32_t cp);
+    
+    uint32_t icu4x_CodePointMapData8_general_category_to_mask_mv1(uint8_t gc);
+    
+    icu4x::capi::CodePointRangeIterator* icu4x_CodePointMapData8_iter_ranges_for_value_mv1(const icu4x::capi::CodePointMapData8* self, uint8_t value);
+    
+    icu4x::capi::CodePointRangeIterator* icu4x_CodePointMapData8_iter_ranges_for_value_complemented_mv1(const icu4x::capi::CodePointMapData8* self, uint8_t value);
+    
+    icu4x::capi::CodePointRangeIterator* icu4x_CodePointMapData8_iter_ranges_for_mask_mv1(const icu4x::capi::CodePointMapData8* self, uint32_t mask);
+    
+    icu4x::capi::CodePointSetData* icu4x_CodePointMapData8_get_set_for_value_mv1(const icu4x::capi::CodePointMapData8* self, uint8_t value);
+    
+    typedef struct icu4x_CodePointMapData8_load_general_category_mv1_result {union {icu4x::capi::CodePointMapData8* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData8_load_general_category_mv1_result;
+    icu4x_CodePointMapData8_load_general_category_mv1_result icu4x_CodePointMapData8_load_general_category_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointMapData8_load_bidi_class_mv1_result {union {icu4x::capi::CodePointMapData8* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData8_load_bidi_class_mv1_result;
+    icu4x_CodePointMapData8_load_bidi_class_mv1_result icu4x_CodePointMapData8_load_bidi_class_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointMapData8_load_east_asian_width_mv1_result {union {icu4x::capi::CodePointMapData8* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData8_load_east_asian_width_mv1_result;
+    icu4x_CodePointMapData8_load_east_asian_width_mv1_result icu4x_CodePointMapData8_load_east_asian_width_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointMapData8_load_hangul_syllable_type_mv1_result {union {icu4x::capi::CodePointMapData8* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData8_load_hangul_syllable_type_mv1_result;
+    icu4x_CodePointMapData8_load_hangul_syllable_type_mv1_result icu4x_CodePointMapData8_load_hangul_syllable_type_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointMapData8_load_indic_syllabic_category_mv1_result {union {icu4x::capi::CodePointMapData8* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData8_load_indic_syllabic_category_mv1_result;
+    icu4x_CodePointMapData8_load_indic_syllabic_category_mv1_result icu4x_CodePointMapData8_load_indic_syllabic_category_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointMapData8_load_line_break_mv1_result {union {icu4x::capi::CodePointMapData8* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData8_load_line_break_mv1_result;
+    icu4x_CodePointMapData8_load_line_break_mv1_result icu4x_CodePointMapData8_load_line_break_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointMapData8_try_grapheme_cluster_break_mv1_result {union {icu4x::capi::CodePointMapData8* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData8_try_grapheme_cluster_break_mv1_result;
+    icu4x_CodePointMapData8_try_grapheme_cluster_break_mv1_result icu4x_CodePointMapData8_try_grapheme_cluster_break_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointMapData8_load_word_break_mv1_result {union {icu4x::capi::CodePointMapData8* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData8_load_word_break_mv1_result;
+    icu4x_CodePointMapData8_load_word_break_mv1_result icu4x_CodePointMapData8_load_word_break_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointMapData8_load_sentence_break_mv1_result {union {icu4x::capi::CodePointMapData8* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData8_load_sentence_break_mv1_result;
+    icu4x_CodePointMapData8_load_sentence_break_mv1_result icu4x_CodePointMapData8_load_sentence_break_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointMapData8_load_joining_type_mv1_result {union {icu4x::capi::CodePointMapData8* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointMapData8_load_joining_type_mv1_result;
+    icu4x_CodePointMapData8_load_joining_type_mv1_result icu4x_CodePointMapData8_load_joining_type_mv1(const icu4x::capi::DataProvider* provider);
+    
+    
+    void icu4x_CodePointMapData8_destroy_mv1(CodePointMapData8* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline uint8_t icu4x::CodePointMapData8::get(char32_t cp) const {
+  auto result = icu4x::capi::icu4x_CodePointMapData8_get_mv1(this->AsFFI(),
+    cp);
+  return result;
+}
+
+inline uint32_t icu4x::CodePointMapData8::general_category_to_mask(uint8_t gc) {
+  auto result = icu4x::capi::icu4x_CodePointMapData8_general_category_to_mask_mv1(gc);
+  return result;
+}
+
+inline std::unique_ptr<icu4x::CodePointRangeIterator> icu4x::CodePointMapData8::iter_ranges_for_value(uint8_t value) const {
+  auto result = icu4x::capi::icu4x_CodePointMapData8_iter_ranges_for_value_mv1(this->AsFFI(),
+    value);
+  return std::unique_ptr<icu4x::CodePointRangeIterator>(icu4x::CodePointRangeIterator::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::CodePointRangeIterator> icu4x::CodePointMapData8::iter_ranges_for_value_complemented(uint8_t value) const {
+  auto result = icu4x::capi::icu4x_CodePointMapData8_iter_ranges_for_value_complemented_mv1(this->AsFFI(),
+    value);
+  return std::unique_ptr<icu4x::CodePointRangeIterator>(icu4x::CodePointRangeIterator::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::CodePointRangeIterator> icu4x::CodePointMapData8::iter_ranges_for_mask(uint32_t mask) const {
+  auto result = icu4x::capi::icu4x_CodePointMapData8_iter_ranges_for_mask_mv1(this->AsFFI(),
+    mask);
+  return std::unique_ptr<icu4x::CodePointRangeIterator>(icu4x::CodePointRangeIterator::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::CodePointSetData> icu4x::CodePointMapData8::get_set_for_value(uint8_t value) const {
+  auto result = icu4x::capi::icu4x_CodePointMapData8_get_set_for_value_mv1(this->AsFFI(),
+    value);
+  return std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError> icu4x::CodePointMapData8::load_general_category(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointMapData8_load_general_category_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointMapData8>>(std::unique_ptr<icu4x::CodePointMapData8>(icu4x::CodePointMapData8::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError> icu4x::CodePointMapData8::load_bidi_class(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointMapData8_load_bidi_class_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointMapData8>>(std::unique_ptr<icu4x::CodePointMapData8>(icu4x::CodePointMapData8::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError> icu4x::CodePointMapData8::load_east_asian_width(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointMapData8_load_east_asian_width_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointMapData8>>(std::unique_ptr<icu4x::CodePointMapData8>(icu4x::CodePointMapData8::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError> icu4x::CodePointMapData8::load_hangul_syllable_type(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointMapData8_load_hangul_syllable_type_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointMapData8>>(std::unique_ptr<icu4x::CodePointMapData8>(icu4x::CodePointMapData8::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError> icu4x::CodePointMapData8::load_indic_syllabic_category(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointMapData8_load_indic_syllabic_category_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointMapData8>>(std::unique_ptr<icu4x::CodePointMapData8>(icu4x::CodePointMapData8::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError> icu4x::CodePointMapData8::load_line_break(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointMapData8_load_line_break_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointMapData8>>(std::unique_ptr<icu4x::CodePointMapData8>(icu4x::CodePointMapData8::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError> icu4x::CodePointMapData8::try_grapheme_cluster_break(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointMapData8_try_grapheme_cluster_break_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointMapData8>>(std::unique_ptr<icu4x::CodePointMapData8>(icu4x::CodePointMapData8::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError> icu4x::CodePointMapData8::load_word_break(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointMapData8_load_word_break_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointMapData8>>(std::unique_ptr<icu4x::CodePointMapData8>(icu4x::CodePointMapData8::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError> icu4x::CodePointMapData8::load_sentence_break(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointMapData8_load_sentence_break_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointMapData8>>(std::unique_ptr<icu4x::CodePointMapData8>(icu4x::CodePointMapData8::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError> icu4x::CodePointMapData8::load_joining_type(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointMapData8_load_joining_type_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointMapData8>>(std::unique_ptr<icu4x::CodePointMapData8>(icu4x::CodePointMapData8::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointMapData8>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline const icu4x::capi::CodePointMapData8* icu4x::CodePointMapData8::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::CodePointMapData8*>(this);
+}
+
+inline icu4x::capi::CodePointMapData8* icu4x::CodePointMapData8::AsFFI() {
+  return reinterpret_cast<icu4x::capi::CodePointMapData8*>(this);
+}
+
+inline const icu4x::CodePointMapData8* icu4x::CodePointMapData8::FromFFI(const icu4x::capi::CodePointMapData8* ptr) {
+  return reinterpret_cast<const icu4x::CodePointMapData8*>(ptr);
+}
+
+inline icu4x::CodePointMapData8* icu4x::CodePointMapData8::FromFFI(icu4x::capi::CodePointMapData8* ptr) {
+  return reinterpret_cast<icu4x::CodePointMapData8*>(ptr);
+}
+
+inline void icu4x::CodePointMapData8::operator delete(void* ptr) {
+  icu4x::capi::icu4x_CodePointMapData8_destroy_mv1(reinterpret_cast<icu4x::capi::CodePointMapData8*>(ptr));
+}
+
+
+#endif // icu4x_CodePointMapData8_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CodePointRangeIterator.d.hpp b/ffi/capi/bindings/cpp/icu4x/CodePointRangeIterator.d.hpp
new file mode 100644
index 00000000000..0d50179066e
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CodePointRangeIterator.d.hpp
@@ -0,0 +1,44 @@
+#ifndef icu4x_CodePointRangeIterator_D_HPP
+#define icu4x_CodePointRangeIterator_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+struct CodePointRangeIteratorResult;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct CodePointRangeIterator;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class CodePointRangeIterator {
+public:
+
+  inline icu4x::CodePointRangeIteratorResult next();
+
+  inline const icu4x::capi::CodePointRangeIterator* AsFFI() const;
+  inline icu4x::capi::CodePointRangeIterator* AsFFI();
+  inline static const icu4x::CodePointRangeIterator* FromFFI(const icu4x::capi::CodePointRangeIterator* ptr);
+  inline static icu4x::CodePointRangeIterator* FromFFI(icu4x::capi::CodePointRangeIterator* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  CodePointRangeIterator() = delete;
+  CodePointRangeIterator(const icu4x::CodePointRangeIterator&) = delete;
+  CodePointRangeIterator(icu4x::CodePointRangeIterator&&) noexcept = delete;
+  CodePointRangeIterator operator=(const icu4x::CodePointRangeIterator&) = delete;
+  CodePointRangeIterator operator=(icu4x::CodePointRangeIterator&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_CodePointRangeIterator_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CodePointRangeIterator.hpp b/ffi/capi/bindings/cpp/icu4x/CodePointRangeIterator.hpp
new file mode 100644
index 00000000000..34a8b048c86
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CodePointRangeIterator.hpp
@@ -0,0 +1,55 @@
+#ifndef icu4x_CodePointRangeIterator_HPP
+#define icu4x_CodePointRangeIterator_HPP
+
+#include "CodePointRangeIterator.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "CodePointRangeIteratorResult.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    icu4x::capi::CodePointRangeIteratorResult icu4x_CodePointRangeIterator_next_mv1(icu4x::capi::CodePointRangeIterator* self);
+    
+    
+    void icu4x_CodePointRangeIterator_destroy_mv1(CodePointRangeIterator* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::CodePointRangeIteratorResult icu4x::CodePointRangeIterator::next() {
+  auto result = icu4x::capi::icu4x_CodePointRangeIterator_next_mv1(this->AsFFI());
+  return icu4x::CodePointRangeIteratorResult::FromFFI(result);
+}
+
+inline const icu4x::capi::CodePointRangeIterator* icu4x::CodePointRangeIterator::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::CodePointRangeIterator*>(this);
+}
+
+inline icu4x::capi::CodePointRangeIterator* icu4x::CodePointRangeIterator::AsFFI() {
+  return reinterpret_cast<icu4x::capi::CodePointRangeIterator*>(this);
+}
+
+inline const icu4x::CodePointRangeIterator* icu4x::CodePointRangeIterator::FromFFI(const icu4x::capi::CodePointRangeIterator* ptr) {
+  return reinterpret_cast<const icu4x::CodePointRangeIterator*>(ptr);
+}
+
+inline icu4x::CodePointRangeIterator* icu4x::CodePointRangeIterator::FromFFI(icu4x::capi::CodePointRangeIterator* ptr) {
+  return reinterpret_cast<icu4x::CodePointRangeIterator*>(ptr);
+}
+
+inline void icu4x::CodePointRangeIterator::operator delete(void* ptr) {
+  icu4x::capi::icu4x_CodePointRangeIterator_destroy_mv1(reinterpret_cast<icu4x::capi::CodePointRangeIterator*>(ptr));
+}
+
+
+#endif // icu4x_CodePointRangeIterator_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CodePointRangeIteratorResult.d.hpp b/ffi/capi/bindings/cpp/icu4x/CodePointRangeIteratorResult.d.hpp
new file mode 100644
index 00000000000..69834e83819
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CodePointRangeIteratorResult.d.hpp
@@ -0,0 +1,35 @@
+#ifndef icu4x_CodePointRangeIteratorResult_D_HPP
+#define icu4x_CodePointRangeIteratorResult_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    struct CodePointRangeIteratorResult {
+      uint32_t start;
+      uint32_t end;
+      bool done;
+    };
+} // namespace capi
+} // namespace
+
+
+namespace icu4x {
+struct CodePointRangeIteratorResult {
+  uint32_t start;
+  uint32_t end;
+  bool done;
+
+  inline icu4x::capi::CodePointRangeIteratorResult AsFFI() const;
+  inline static icu4x::CodePointRangeIteratorResult FromFFI(icu4x::capi::CodePointRangeIteratorResult c_struct);
+};
+
+} // namespace
+#endif // icu4x_CodePointRangeIteratorResult_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CodePointRangeIteratorResult.hpp b/ffi/capi/bindings/cpp/icu4x/CodePointRangeIteratorResult.hpp
new file mode 100644
index 00000000000..466d507e1ed
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CodePointRangeIteratorResult.hpp
@@ -0,0 +1,42 @@
+#ifndef icu4x_CodePointRangeIteratorResult_HPP
+#define icu4x_CodePointRangeIteratorResult_HPP
+
+#include "CodePointRangeIteratorResult.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+
+inline icu4x::capi::CodePointRangeIteratorResult icu4x::CodePointRangeIteratorResult::AsFFI() const {
+  return icu4x::capi::CodePointRangeIteratorResult {
+    /* .start = */ start,
+    /* .end = */ end,
+    /* .done = */ done,
+  };
+}
+
+inline icu4x::CodePointRangeIteratorResult icu4x::CodePointRangeIteratorResult::FromFFI(icu4x::capi::CodePointRangeIteratorResult c_struct) {
+  return icu4x::CodePointRangeIteratorResult {
+    /* .start = */ c_struct.start,
+    /* .end = */ c_struct.end,
+    /* .done = */ c_struct.done,
+  };
+}
+
+
+#endif // icu4x_CodePointRangeIteratorResult_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CodePointSetBuilder.d.hpp b/ffi/capi/bindings/cpp/icu4x/CodePointSetBuilder.d.hpp
new file mode 100644
index 00000000000..51df25f9490
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CodePointSetBuilder.d.hpp
@@ -0,0 +1,77 @@
+#ifndef icu4x_CodePointSetBuilder_D_HPP
+#define icu4x_CodePointSetBuilder_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct CodePointSetBuilder; }
+class CodePointSetBuilder;
+namespace capi { struct CodePointSetData; }
+class CodePointSetData;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct CodePointSetBuilder;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class CodePointSetBuilder {
+public:
+
+  inline static std::unique_ptr<icu4x::CodePointSetBuilder> create();
+
+  inline std::unique_ptr<icu4x::CodePointSetData> build();
+
+  inline void complement();
+
+  inline bool is_empty() const;
+
+  inline void add_char(char32_t ch);
+
+  inline void add_inclusive_range(char32_t start, char32_t end);
+
+  inline void add_set(const icu4x::CodePointSetData& data);
+
+  inline void remove_char(char32_t ch);
+
+  inline void remove_inclusive_range(char32_t start, char32_t end);
+
+  inline void remove_set(const icu4x::CodePointSetData& data);
+
+  inline void retain_char(char32_t ch);
+
+  inline void retain_inclusive_range(char32_t start, char32_t end);
+
+  inline void retain_set(const icu4x::CodePointSetData& data);
+
+  inline void complement_char(char32_t ch);
+
+  inline void complement_inclusive_range(char32_t start, char32_t end);
+
+  inline void complement_set(const icu4x::CodePointSetData& data);
+
+  inline const icu4x::capi::CodePointSetBuilder* AsFFI() const;
+  inline icu4x::capi::CodePointSetBuilder* AsFFI();
+  inline static const icu4x::CodePointSetBuilder* FromFFI(const icu4x::capi::CodePointSetBuilder* ptr);
+  inline static icu4x::CodePointSetBuilder* FromFFI(icu4x::capi::CodePointSetBuilder* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  CodePointSetBuilder() = delete;
+  CodePointSetBuilder(const icu4x::CodePointSetBuilder&) = delete;
+  CodePointSetBuilder(icu4x::CodePointSetBuilder&&) noexcept = delete;
+  CodePointSetBuilder operator=(const icu4x::CodePointSetBuilder&) = delete;
+  CodePointSetBuilder operator=(icu4x::CodePointSetBuilder&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_CodePointSetBuilder_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CodePointSetBuilder.hpp b/ffi/capi/bindings/cpp/icu4x/CodePointSetBuilder.hpp
new file mode 100644
index 00000000000..de66cf9a83d
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CodePointSetBuilder.hpp
@@ -0,0 +1,163 @@
+#ifndef icu4x_CodePointSetBuilder_HPP
+#define icu4x_CodePointSetBuilder_HPP
+
+#include "CodePointSetBuilder.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "CodePointSetData.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    icu4x::capi::CodePointSetBuilder* icu4x_CodePointSetBuilder_create_mv1(void);
+    
+    icu4x::capi::CodePointSetData* icu4x_CodePointSetBuilder_build_mv1(icu4x::capi::CodePointSetBuilder* self);
+    
+    void icu4x_CodePointSetBuilder_complement_mv1(icu4x::capi::CodePointSetBuilder* self);
+    
+    bool icu4x_CodePointSetBuilder_is_empty_mv1(const icu4x::capi::CodePointSetBuilder* self);
+    
+    void icu4x_CodePointSetBuilder_add_char_mv1(icu4x::capi::CodePointSetBuilder* self, char32_t ch);
+    
+    void icu4x_CodePointSetBuilder_add_inclusive_range_mv1(icu4x::capi::CodePointSetBuilder* self, char32_t start, char32_t end);
+    
+    void icu4x_CodePointSetBuilder_add_set_mv1(icu4x::capi::CodePointSetBuilder* self, const icu4x::capi::CodePointSetData* data);
+    
+    void icu4x_CodePointSetBuilder_remove_char_mv1(icu4x::capi::CodePointSetBuilder* self, char32_t ch);
+    
+    void icu4x_CodePointSetBuilder_remove_inclusive_range_mv1(icu4x::capi::CodePointSetBuilder* self, char32_t start, char32_t end);
+    
+    void icu4x_CodePointSetBuilder_remove_set_mv1(icu4x::capi::CodePointSetBuilder* self, const icu4x::capi::CodePointSetData* data);
+    
+    void icu4x_CodePointSetBuilder_retain_char_mv1(icu4x::capi::CodePointSetBuilder* self, char32_t ch);
+    
+    void icu4x_CodePointSetBuilder_retain_inclusive_range_mv1(icu4x::capi::CodePointSetBuilder* self, char32_t start, char32_t end);
+    
+    void icu4x_CodePointSetBuilder_retain_set_mv1(icu4x::capi::CodePointSetBuilder* self, const icu4x::capi::CodePointSetData* data);
+    
+    void icu4x_CodePointSetBuilder_complement_char_mv1(icu4x::capi::CodePointSetBuilder* self, char32_t ch);
+    
+    void icu4x_CodePointSetBuilder_complement_inclusive_range_mv1(icu4x::capi::CodePointSetBuilder* self, char32_t start, char32_t end);
+    
+    void icu4x_CodePointSetBuilder_complement_set_mv1(icu4x::capi::CodePointSetBuilder* self, const icu4x::capi::CodePointSetData* data);
+    
+    
+    void icu4x_CodePointSetBuilder_destroy_mv1(CodePointSetBuilder* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline std::unique_ptr<icu4x::CodePointSetBuilder> icu4x::CodePointSetBuilder::create() {
+  auto result = icu4x::capi::icu4x_CodePointSetBuilder_create_mv1();
+  return std::unique_ptr<icu4x::CodePointSetBuilder>(icu4x::CodePointSetBuilder::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::CodePointSetData> icu4x::CodePointSetBuilder::build() {
+  auto result = icu4x::capi::icu4x_CodePointSetBuilder_build_mv1(this->AsFFI());
+  return std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result));
+}
+
+inline void icu4x::CodePointSetBuilder::complement() {
+  icu4x::capi::icu4x_CodePointSetBuilder_complement_mv1(this->AsFFI());
+}
+
+inline bool icu4x::CodePointSetBuilder::is_empty() const {
+  auto result = icu4x::capi::icu4x_CodePointSetBuilder_is_empty_mv1(this->AsFFI());
+  return result;
+}
+
+inline void icu4x::CodePointSetBuilder::add_char(char32_t ch) {
+  icu4x::capi::icu4x_CodePointSetBuilder_add_char_mv1(this->AsFFI(),
+    ch);
+}
+
+inline void icu4x::CodePointSetBuilder::add_inclusive_range(char32_t start, char32_t end) {
+  icu4x::capi::icu4x_CodePointSetBuilder_add_inclusive_range_mv1(this->AsFFI(),
+    start,
+    end);
+}
+
+inline void icu4x::CodePointSetBuilder::add_set(const icu4x::CodePointSetData& data) {
+  icu4x::capi::icu4x_CodePointSetBuilder_add_set_mv1(this->AsFFI(),
+    data.AsFFI());
+}
+
+inline void icu4x::CodePointSetBuilder::remove_char(char32_t ch) {
+  icu4x::capi::icu4x_CodePointSetBuilder_remove_char_mv1(this->AsFFI(),
+    ch);
+}
+
+inline void icu4x::CodePointSetBuilder::remove_inclusive_range(char32_t start, char32_t end) {
+  icu4x::capi::icu4x_CodePointSetBuilder_remove_inclusive_range_mv1(this->AsFFI(),
+    start,
+    end);
+}
+
+inline void icu4x::CodePointSetBuilder::remove_set(const icu4x::CodePointSetData& data) {
+  icu4x::capi::icu4x_CodePointSetBuilder_remove_set_mv1(this->AsFFI(),
+    data.AsFFI());
+}
+
+inline void icu4x::CodePointSetBuilder::retain_char(char32_t ch) {
+  icu4x::capi::icu4x_CodePointSetBuilder_retain_char_mv1(this->AsFFI(),
+    ch);
+}
+
+inline void icu4x::CodePointSetBuilder::retain_inclusive_range(char32_t start, char32_t end) {
+  icu4x::capi::icu4x_CodePointSetBuilder_retain_inclusive_range_mv1(this->AsFFI(),
+    start,
+    end);
+}
+
+inline void icu4x::CodePointSetBuilder::retain_set(const icu4x::CodePointSetData& data) {
+  icu4x::capi::icu4x_CodePointSetBuilder_retain_set_mv1(this->AsFFI(),
+    data.AsFFI());
+}
+
+inline void icu4x::CodePointSetBuilder::complement_char(char32_t ch) {
+  icu4x::capi::icu4x_CodePointSetBuilder_complement_char_mv1(this->AsFFI(),
+    ch);
+}
+
+inline void icu4x::CodePointSetBuilder::complement_inclusive_range(char32_t start, char32_t end) {
+  icu4x::capi::icu4x_CodePointSetBuilder_complement_inclusive_range_mv1(this->AsFFI(),
+    start,
+    end);
+}
+
+inline void icu4x::CodePointSetBuilder::complement_set(const icu4x::CodePointSetData& data) {
+  icu4x::capi::icu4x_CodePointSetBuilder_complement_set_mv1(this->AsFFI(),
+    data.AsFFI());
+}
+
+inline const icu4x::capi::CodePointSetBuilder* icu4x::CodePointSetBuilder::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::CodePointSetBuilder*>(this);
+}
+
+inline icu4x::capi::CodePointSetBuilder* icu4x::CodePointSetBuilder::AsFFI() {
+  return reinterpret_cast<icu4x::capi::CodePointSetBuilder*>(this);
+}
+
+inline const icu4x::CodePointSetBuilder* icu4x::CodePointSetBuilder::FromFFI(const icu4x::capi::CodePointSetBuilder* ptr) {
+  return reinterpret_cast<const icu4x::CodePointSetBuilder*>(ptr);
+}
+
+inline icu4x::CodePointSetBuilder* icu4x::CodePointSetBuilder::FromFFI(icu4x::capi::CodePointSetBuilder* ptr) {
+  return reinterpret_cast<icu4x::CodePointSetBuilder*>(ptr);
+}
+
+inline void icu4x::CodePointSetBuilder::operator delete(void* ptr) {
+  icu4x::capi::icu4x_CodePointSetBuilder_destroy_mv1(reinterpret_cast<icu4x::capi::CodePointSetBuilder*>(ptr));
+}
+
+
+#endif // icu4x_CodePointSetBuilder_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CodePointSetData.d.hpp b/ffi/capi/bindings/cpp/icu4x/CodePointSetData.d.hpp
new file mode 100644
index 00000000000..f7229e25afd
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CodePointSetData.d.hpp
@@ -0,0 +1,189 @@
+#ifndef icu4x_CodePointSetData_D_HPP
+#define icu4x_CodePointSetData_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct CodePointRangeIterator; }
+class CodePointRangeIterator;
+namespace capi { struct CodePointSetData; }
+class CodePointSetData;
+namespace capi { struct DataProvider; }
+class DataProvider;
+class DataError;
+class Error;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct CodePointSetData;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class CodePointSetData {
+public:
+
+  inline bool contains(char32_t cp) const;
+
+  inline std::unique_ptr<icu4x::CodePointRangeIterator> iter_ranges() const;
+
+  inline std::unique_ptr<icu4x::CodePointRangeIterator> iter_ranges_complemented() const;
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_for_general_category_group(const icu4x::DataProvider& provider, uint32_t group);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_ascii_hex_digit(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_alnum(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_alphabetic(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_bidi_control(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_bidi_mirrored(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_blank(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_cased(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_case_ignorable(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_full_composition_exclusion(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_changes_when_casefolded(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_changes_when_casemapped(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_changes_when_nfkc_casefolded(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_changes_when_lowercased(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_changes_when_titlecased(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_changes_when_uppercased(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_dash(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_deprecated(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_default_ignorable_code_point(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_diacritic(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_emoji_modifier_base(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_emoji_component(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_emoji_modifier(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_emoji(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_emoji_presentation(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_extender(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_extended_pictographic(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_graph(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_grapheme_base(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_grapheme_extend(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_grapheme_link(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_hex_digit(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_hyphen(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_id_continue(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_ideographic(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_id_start(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_ids_binary_operator(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_ids_trinary_operator(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_join_control(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_logical_order_exception(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_lowercase(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_math(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_noncharacter_code_point(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_nfc_inert(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_nfd_inert(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_nfkc_inert(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_nfkd_inert(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_pattern_syntax(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_pattern_white_space(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_prepended_concatenation_mark(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_print(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_quotation_mark(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_radical(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_regional_indicator(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_soft_dotted(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_segment_starter(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_case_sensitive(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_sentence_terminal(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_terminal_punctuation(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_unified_ideograph(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_uppercase(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_variation_selector(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_white_space(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_xdigit(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_xid_continue(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> load_xid_start(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::Error>, diplomat::Utf8Error> load_for_ecma262(const icu4x::DataProvider& provider, std::string_view property_name);
+
+  inline const icu4x::capi::CodePointSetData* AsFFI() const;
+  inline icu4x::capi::CodePointSetData* AsFFI();
+  inline static const icu4x::CodePointSetData* FromFFI(const icu4x::capi::CodePointSetData* ptr);
+  inline static icu4x::CodePointSetData* FromFFI(icu4x::capi::CodePointSetData* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  CodePointSetData() = delete;
+  CodePointSetData(const icu4x::CodePointSetData&) = delete;
+  CodePointSetData(icu4x::CodePointSetData&&) noexcept = delete;
+  CodePointSetData operator=(const icu4x::CodePointSetData&) = delete;
+  CodePointSetData operator=(icu4x::CodePointSetData&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_CodePointSetData_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CodePointSetData.hpp b/ffi/capi/bindings/cpp/icu4x/CodePointSetData.hpp
new file mode 100644
index 00000000000..88b6f6365e3
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CodePointSetData.hpp
@@ -0,0 +1,615 @@
+#ifndef icu4x_CodePointSetData_HPP
+#define icu4x_CodePointSetData_HPP
+
+#include "CodePointSetData.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "CodePointRangeIterator.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "Error.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    bool icu4x_CodePointSetData_contains_mv1(const icu4x::capi::CodePointSetData* self, char32_t cp);
+    
+    icu4x::capi::CodePointRangeIterator* icu4x_CodePointSetData_iter_ranges_mv1(const icu4x::capi::CodePointSetData* self);
+    
+    icu4x::capi::CodePointRangeIterator* icu4x_CodePointSetData_iter_ranges_complemented_mv1(const icu4x::capi::CodePointSetData* self);
+    
+    typedef struct icu4x_CodePointSetData_load_for_general_category_group_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_for_general_category_group_mv1_result;
+    icu4x_CodePointSetData_load_for_general_category_group_mv1_result icu4x_CodePointSetData_load_for_general_category_group_mv1(const icu4x::capi::DataProvider* provider, uint32_t group);
+    
+    typedef struct icu4x_CodePointSetData_load_ascii_hex_digit_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_ascii_hex_digit_mv1_result;
+    icu4x_CodePointSetData_load_ascii_hex_digit_mv1_result icu4x_CodePointSetData_load_ascii_hex_digit_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_alnum_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_alnum_mv1_result;
+    icu4x_CodePointSetData_load_alnum_mv1_result icu4x_CodePointSetData_load_alnum_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_alphabetic_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_alphabetic_mv1_result;
+    icu4x_CodePointSetData_load_alphabetic_mv1_result icu4x_CodePointSetData_load_alphabetic_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_bidi_control_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_bidi_control_mv1_result;
+    icu4x_CodePointSetData_load_bidi_control_mv1_result icu4x_CodePointSetData_load_bidi_control_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_bidi_mirrored_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_bidi_mirrored_mv1_result;
+    icu4x_CodePointSetData_load_bidi_mirrored_mv1_result icu4x_CodePointSetData_load_bidi_mirrored_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_blank_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_blank_mv1_result;
+    icu4x_CodePointSetData_load_blank_mv1_result icu4x_CodePointSetData_load_blank_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_cased_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_cased_mv1_result;
+    icu4x_CodePointSetData_load_cased_mv1_result icu4x_CodePointSetData_load_cased_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_case_ignorable_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_case_ignorable_mv1_result;
+    icu4x_CodePointSetData_load_case_ignorable_mv1_result icu4x_CodePointSetData_load_case_ignorable_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_full_composition_exclusion_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_full_composition_exclusion_mv1_result;
+    icu4x_CodePointSetData_load_full_composition_exclusion_mv1_result icu4x_CodePointSetData_load_full_composition_exclusion_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_changes_when_casefolded_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_changes_when_casefolded_mv1_result;
+    icu4x_CodePointSetData_load_changes_when_casefolded_mv1_result icu4x_CodePointSetData_load_changes_when_casefolded_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_changes_when_casemapped_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_changes_when_casemapped_mv1_result;
+    icu4x_CodePointSetData_load_changes_when_casemapped_mv1_result icu4x_CodePointSetData_load_changes_when_casemapped_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_changes_when_nfkc_casefolded_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_changes_when_nfkc_casefolded_mv1_result;
+    icu4x_CodePointSetData_load_changes_when_nfkc_casefolded_mv1_result icu4x_CodePointSetData_load_changes_when_nfkc_casefolded_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_changes_when_lowercased_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_changes_when_lowercased_mv1_result;
+    icu4x_CodePointSetData_load_changes_when_lowercased_mv1_result icu4x_CodePointSetData_load_changes_when_lowercased_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_changes_when_titlecased_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_changes_when_titlecased_mv1_result;
+    icu4x_CodePointSetData_load_changes_when_titlecased_mv1_result icu4x_CodePointSetData_load_changes_when_titlecased_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_changes_when_uppercased_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_changes_when_uppercased_mv1_result;
+    icu4x_CodePointSetData_load_changes_when_uppercased_mv1_result icu4x_CodePointSetData_load_changes_when_uppercased_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_dash_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_dash_mv1_result;
+    icu4x_CodePointSetData_load_dash_mv1_result icu4x_CodePointSetData_load_dash_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_deprecated_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_deprecated_mv1_result;
+    icu4x_CodePointSetData_load_deprecated_mv1_result icu4x_CodePointSetData_load_deprecated_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_default_ignorable_code_point_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_default_ignorable_code_point_mv1_result;
+    icu4x_CodePointSetData_load_default_ignorable_code_point_mv1_result icu4x_CodePointSetData_load_default_ignorable_code_point_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_diacritic_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_diacritic_mv1_result;
+    icu4x_CodePointSetData_load_diacritic_mv1_result icu4x_CodePointSetData_load_diacritic_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_emoji_modifier_base_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_emoji_modifier_base_mv1_result;
+    icu4x_CodePointSetData_load_emoji_modifier_base_mv1_result icu4x_CodePointSetData_load_emoji_modifier_base_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_emoji_component_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_emoji_component_mv1_result;
+    icu4x_CodePointSetData_load_emoji_component_mv1_result icu4x_CodePointSetData_load_emoji_component_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_emoji_modifier_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_emoji_modifier_mv1_result;
+    icu4x_CodePointSetData_load_emoji_modifier_mv1_result icu4x_CodePointSetData_load_emoji_modifier_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_emoji_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_emoji_mv1_result;
+    icu4x_CodePointSetData_load_emoji_mv1_result icu4x_CodePointSetData_load_emoji_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_emoji_presentation_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_emoji_presentation_mv1_result;
+    icu4x_CodePointSetData_load_emoji_presentation_mv1_result icu4x_CodePointSetData_load_emoji_presentation_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_extender_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_extender_mv1_result;
+    icu4x_CodePointSetData_load_extender_mv1_result icu4x_CodePointSetData_load_extender_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_extended_pictographic_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_extended_pictographic_mv1_result;
+    icu4x_CodePointSetData_load_extended_pictographic_mv1_result icu4x_CodePointSetData_load_extended_pictographic_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_graph_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_graph_mv1_result;
+    icu4x_CodePointSetData_load_graph_mv1_result icu4x_CodePointSetData_load_graph_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_grapheme_base_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_grapheme_base_mv1_result;
+    icu4x_CodePointSetData_load_grapheme_base_mv1_result icu4x_CodePointSetData_load_grapheme_base_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_grapheme_extend_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_grapheme_extend_mv1_result;
+    icu4x_CodePointSetData_load_grapheme_extend_mv1_result icu4x_CodePointSetData_load_grapheme_extend_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_grapheme_link_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_grapheme_link_mv1_result;
+    icu4x_CodePointSetData_load_grapheme_link_mv1_result icu4x_CodePointSetData_load_grapheme_link_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_hex_digit_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_hex_digit_mv1_result;
+    icu4x_CodePointSetData_load_hex_digit_mv1_result icu4x_CodePointSetData_load_hex_digit_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_hyphen_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_hyphen_mv1_result;
+    icu4x_CodePointSetData_load_hyphen_mv1_result icu4x_CodePointSetData_load_hyphen_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_id_continue_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_id_continue_mv1_result;
+    icu4x_CodePointSetData_load_id_continue_mv1_result icu4x_CodePointSetData_load_id_continue_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_ideographic_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_ideographic_mv1_result;
+    icu4x_CodePointSetData_load_ideographic_mv1_result icu4x_CodePointSetData_load_ideographic_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_id_start_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_id_start_mv1_result;
+    icu4x_CodePointSetData_load_id_start_mv1_result icu4x_CodePointSetData_load_id_start_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_ids_binary_operator_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_ids_binary_operator_mv1_result;
+    icu4x_CodePointSetData_load_ids_binary_operator_mv1_result icu4x_CodePointSetData_load_ids_binary_operator_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_ids_trinary_operator_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_ids_trinary_operator_mv1_result;
+    icu4x_CodePointSetData_load_ids_trinary_operator_mv1_result icu4x_CodePointSetData_load_ids_trinary_operator_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_join_control_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_join_control_mv1_result;
+    icu4x_CodePointSetData_load_join_control_mv1_result icu4x_CodePointSetData_load_join_control_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_logical_order_exception_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_logical_order_exception_mv1_result;
+    icu4x_CodePointSetData_load_logical_order_exception_mv1_result icu4x_CodePointSetData_load_logical_order_exception_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_lowercase_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_lowercase_mv1_result;
+    icu4x_CodePointSetData_load_lowercase_mv1_result icu4x_CodePointSetData_load_lowercase_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_math_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_math_mv1_result;
+    icu4x_CodePointSetData_load_math_mv1_result icu4x_CodePointSetData_load_math_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_noncharacter_code_point_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_noncharacter_code_point_mv1_result;
+    icu4x_CodePointSetData_load_noncharacter_code_point_mv1_result icu4x_CodePointSetData_load_noncharacter_code_point_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_nfc_inert_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_nfc_inert_mv1_result;
+    icu4x_CodePointSetData_load_nfc_inert_mv1_result icu4x_CodePointSetData_load_nfc_inert_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_nfd_inert_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_nfd_inert_mv1_result;
+    icu4x_CodePointSetData_load_nfd_inert_mv1_result icu4x_CodePointSetData_load_nfd_inert_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_nfkc_inert_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_nfkc_inert_mv1_result;
+    icu4x_CodePointSetData_load_nfkc_inert_mv1_result icu4x_CodePointSetData_load_nfkc_inert_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_nfkd_inert_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_nfkd_inert_mv1_result;
+    icu4x_CodePointSetData_load_nfkd_inert_mv1_result icu4x_CodePointSetData_load_nfkd_inert_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_pattern_syntax_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_pattern_syntax_mv1_result;
+    icu4x_CodePointSetData_load_pattern_syntax_mv1_result icu4x_CodePointSetData_load_pattern_syntax_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_pattern_white_space_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_pattern_white_space_mv1_result;
+    icu4x_CodePointSetData_load_pattern_white_space_mv1_result icu4x_CodePointSetData_load_pattern_white_space_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_prepended_concatenation_mark_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_prepended_concatenation_mark_mv1_result;
+    icu4x_CodePointSetData_load_prepended_concatenation_mark_mv1_result icu4x_CodePointSetData_load_prepended_concatenation_mark_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_print_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_print_mv1_result;
+    icu4x_CodePointSetData_load_print_mv1_result icu4x_CodePointSetData_load_print_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_quotation_mark_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_quotation_mark_mv1_result;
+    icu4x_CodePointSetData_load_quotation_mark_mv1_result icu4x_CodePointSetData_load_quotation_mark_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_radical_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_radical_mv1_result;
+    icu4x_CodePointSetData_load_radical_mv1_result icu4x_CodePointSetData_load_radical_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_regional_indicator_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_regional_indicator_mv1_result;
+    icu4x_CodePointSetData_load_regional_indicator_mv1_result icu4x_CodePointSetData_load_regional_indicator_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_soft_dotted_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_soft_dotted_mv1_result;
+    icu4x_CodePointSetData_load_soft_dotted_mv1_result icu4x_CodePointSetData_load_soft_dotted_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_segment_starter_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_segment_starter_mv1_result;
+    icu4x_CodePointSetData_load_segment_starter_mv1_result icu4x_CodePointSetData_load_segment_starter_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_case_sensitive_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_case_sensitive_mv1_result;
+    icu4x_CodePointSetData_load_case_sensitive_mv1_result icu4x_CodePointSetData_load_case_sensitive_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_sentence_terminal_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_sentence_terminal_mv1_result;
+    icu4x_CodePointSetData_load_sentence_terminal_mv1_result icu4x_CodePointSetData_load_sentence_terminal_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_terminal_punctuation_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_terminal_punctuation_mv1_result;
+    icu4x_CodePointSetData_load_terminal_punctuation_mv1_result icu4x_CodePointSetData_load_terminal_punctuation_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_unified_ideograph_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_unified_ideograph_mv1_result;
+    icu4x_CodePointSetData_load_unified_ideograph_mv1_result icu4x_CodePointSetData_load_unified_ideograph_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_uppercase_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_uppercase_mv1_result;
+    icu4x_CodePointSetData_load_uppercase_mv1_result icu4x_CodePointSetData_load_uppercase_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_variation_selector_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_variation_selector_mv1_result;
+    icu4x_CodePointSetData_load_variation_selector_mv1_result icu4x_CodePointSetData_load_variation_selector_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_white_space_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_white_space_mv1_result;
+    icu4x_CodePointSetData_load_white_space_mv1_result icu4x_CodePointSetData_load_white_space_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_xdigit_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_xdigit_mv1_result;
+    icu4x_CodePointSetData_load_xdigit_mv1_result icu4x_CodePointSetData_load_xdigit_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_xid_continue_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_xid_continue_mv1_result;
+    icu4x_CodePointSetData_load_xid_continue_mv1_result icu4x_CodePointSetData_load_xid_continue_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_xid_start_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_CodePointSetData_load_xid_start_mv1_result;
+    icu4x_CodePointSetData_load_xid_start_mv1_result icu4x_CodePointSetData_load_xid_start_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_CodePointSetData_load_for_ecma262_mv1_result {union {icu4x::capi::CodePointSetData* ok; icu4x::capi::Error err;}; bool is_ok;} icu4x_CodePointSetData_load_for_ecma262_mv1_result;
+    icu4x_CodePointSetData_load_for_ecma262_mv1_result icu4x_CodePointSetData_load_for_ecma262_mv1(const icu4x::capi::DataProvider* provider, const char* property_name_data, size_t property_name_len);
+    
+    
+    void icu4x_CodePointSetData_destroy_mv1(CodePointSetData* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline bool icu4x::CodePointSetData::contains(char32_t cp) const {
+  auto result = icu4x::capi::icu4x_CodePointSetData_contains_mv1(this->AsFFI(),
+    cp);
+  return result;
+}
+
+inline std::unique_ptr<icu4x::CodePointRangeIterator> icu4x::CodePointSetData::iter_ranges() const {
+  auto result = icu4x::capi::icu4x_CodePointSetData_iter_ranges_mv1(this->AsFFI());
+  return std::unique_ptr<icu4x::CodePointRangeIterator>(icu4x::CodePointRangeIterator::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::CodePointRangeIterator> icu4x::CodePointSetData::iter_ranges_complemented() const {
+  auto result = icu4x::capi::icu4x_CodePointSetData_iter_ranges_complemented_mv1(this->AsFFI());
+  return std::unique_ptr<icu4x::CodePointRangeIterator>(icu4x::CodePointRangeIterator::FromFFI(result));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_for_general_category_group(const icu4x::DataProvider& provider, uint32_t group) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_for_general_category_group_mv1(provider.AsFFI(),
+    group);
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_ascii_hex_digit(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_ascii_hex_digit_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_alnum(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_alnum_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_alphabetic(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_alphabetic_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_bidi_control(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_bidi_control_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_bidi_mirrored(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_bidi_mirrored_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_blank(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_blank_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_cased(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_cased_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_case_ignorable(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_case_ignorable_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_full_composition_exclusion(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_full_composition_exclusion_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_changes_when_casefolded(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_changes_when_casefolded_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_changes_when_casemapped(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_changes_when_casemapped_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_changes_when_nfkc_casefolded(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_changes_when_nfkc_casefolded_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_changes_when_lowercased(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_changes_when_lowercased_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_changes_when_titlecased(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_changes_when_titlecased_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_changes_when_uppercased(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_changes_when_uppercased_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_dash(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_dash_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_deprecated(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_deprecated_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_default_ignorable_code_point(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_default_ignorable_code_point_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_diacritic(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_diacritic_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_emoji_modifier_base(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_emoji_modifier_base_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_emoji_component(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_emoji_component_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_emoji_modifier(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_emoji_modifier_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_emoji(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_emoji_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_emoji_presentation(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_emoji_presentation_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_extender(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_extender_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_extended_pictographic(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_extended_pictographic_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_graph(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_graph_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_grapheme_base(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_grapheme_base_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_grapheme_extend(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_grapheme_extend_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_grapheme_link(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_grapheme_link_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_hex_digit(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_hex_digit_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_hyphen(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_hyphen_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_id_continue(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_id_continue_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_ideographic(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_ideographic_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_id_start(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_id_start_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_ids_binary_operator(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_ids_binary_operator_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_ids_trinary_operator(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_ids_trinary_operator_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_join_control(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_join_control_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_logical_order_exception(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_logical_order_exception_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_lowercase(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_lowercase_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_math(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_math_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_noncharacter_code_point(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_noncharacter_code_point_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_nfc_inert(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_nfc_inert_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_nfd_inert(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_nfd_inert_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_nfkc_inert(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_nfkc_inert_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_nfkd_inert(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_nfkd_inert_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_pattern_syntax(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_pattern_syntax_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_pattern_white_space(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_pattern_white_space_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_prepended_concatenation_mark(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_prepended_concatenation_mark_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_print(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_print_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_quotation_mark(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_quotation_mark_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_radical(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_radical_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_regional_indicator(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_regional_indicator_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_soft_dotted(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_soft_dotted_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_segment_starter(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_segment_starter_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_case_sensitive(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_case_sensitive_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_sentence_terminal(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_sentence_terminal_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_terminal_punctuation(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_terminal_punctuation_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_unified_ideograph(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_unified_ideograph_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_uppercase(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_uppercase_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_variation_selector(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_variation_selector_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_white_space(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_white_space_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_xdigit(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_xdigit_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_xid_continue(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_xid_continue_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError> icu4x::CodePointSetData::load_xid_start(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_xid_start_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::Error>, diplomat::Utf8Error> icu4x::CodePointSetData::load_for_ecma262(const icu4x::DataProvider& provider, std::string_view property_name) {
+  if (!diplomat::capi::diplomat_is_str(property_name.data(), property_name.size())) {
+    return diplomat::Err<diplomat::Utf8Error>(diplomat::Utf8Error());
+  }
+  auto result = icu4x::capi::icu4x_CodePointSetData_load_for_ecma262_mv1(provider.AsFFI(),
+    property_name.data(),
+    property_name.size());
+  return diplomat::Ok<diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::Error>>(result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::Error>(diplomat::Ok<std::unique_ptr<icu4x::CodePointSetData>>(std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CodePointSetData>, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err))));
+}
+
+inline const icu4x::capi::CodePointSetData* icu4x::CodePointSetData::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::CodePointSetData*>(this);
+}
+
+inline icu4x::capi::CodePointSetData* icu4x::CodePointSetData::AsFFI() {
+  return reinterpret_cast<icu4x::capi::CodePointSetData*>(this);
+}
+
+inline const icu4x::CodePointSetData* icu4x::CodePointSetData::FromFFI(const icu4x::capi::CodePointSetData* ptr) {
+  return reinterpret_cast<const icu4x::CodePointSetData*>(ptr);
+}
+
+inline icu4x::CodePointSetData* icu4x::CodePointSetData::FromFFI(icu4x::capi::CodePointSetData* ptr) {
+  return reinterpret_cast<icu4x::CodePointSetData*>(ptr);
+}
+
+inline void icu4x::CodePointSetData::operator delete(void* ptr) {
+  icu4x::capi::icu4x_CodePointSetData_destroy_mv1(reinterpret_cast<icu4x::capi::CodePointSetData*>(ptr));
+}
+
+
+#endif // icu4x_CodePointSetData_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/Collator.d.hpp b/ffi/capi/bindings/cpp/icu4x/Collator.d.hpp
new file mode 100644
index 00000000000..bcf74ce1aac
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/Collator.d.hpp
@@ -0,0 +1,58 @@
+#ifndef icu4x_Collator_D_HPP
+#define icu4x_Collator_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct Collator; }
+class Collator;
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct Locale; }
+class Locale;
+struct CollatorOptionsV1;
+struct CollatorResolvedOptionsV1;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct Collator;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class Collator {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::Collator>, icu4x::DataError> create_v1(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::CollatorOptionsV1 options);
+
+  inline int8_t compare(std::string_view left, std::string_view right) const;
+
+  inline int8_t compare16(std::u16string_view left, std::u16string_view right) const;
+
+  inline icu4x::CollatorResolvedOptionsV1 resolved_options_v1() const;
+
+  inline const icu4x::capi::Collator* AsFFI() const;
+  inline icu4x::capi::Collator* AsFFI();
+  inline static const icu4x::Collator* FromFFI(const icu4x::capi::Collator* ptr);
+  inline static icu4x::Collator* FromFFI(icu4x::capi::Collator* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  Collator() = delete;
+  Collator(const icu4x::Collator&) = delete;
+  Collator(icu4x::Collator&&) noexcept = delete;
+  Collator operator=(const icu4x::Collator&) = delete;
+  Collator operator=(icu4x::Collator&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_Collator_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/Collator.hpp b/ffi/capi/bindings/cpp/icu4x/Collator.hpp
new file mode 100644
index 00000000000..8a829a5a6f2
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/Collator.hpp
@@ -0,0 +1,91 @@
+#ifndef icu4x_Collator_HPP
+#define icu4x_Collator_HPP
+
+#include "Collator.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "CollatorOptionsV1.hpp"
+#include "CollatorResolvedOptionsV1.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "Locale.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_Collator_create_v1_mv1_result {union {icu4x::capi::Collator* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_Collator_create_v1_mv1_result;
+    icu4x_Collator_create_v1_mv1_result icu4x_Collator_create_v1_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale, icu4x::capi::CollatorOptionsV1 options);
+    
+    int8_t icu4x_Collator_compare_utf8_mv1(const icu4x::capi::Collator* self, const char* left_data, size_t left_len, const char* right_data, size_t right_len);
+    
+    int8_t icu4x_Collator_compare_utf16_mv1(const icu4x::capi::Collator* self, const char16_t* left_data, size_t left_len, const char16_t* right_data, size_t right_len);
+    
+    icu4x::capi::CollatorResolvedOptionsV1 icu4x_Collator_resolved_options_v1_mv1(const icu4x::capi::Collator* self);
+    
+    
+    void icu4x_Collator_destroy_mv1(Collator* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::Collator>, icu4x::DataError> icu4x::Collator::create_v1(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::CollatorOptionsV1 options) {
+  auto result = icu4x::capi::icu4x_Collator_create_v1_mv1(provider.AsFFI(),
+    locale.AsFFI(),
+    options.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::Collator>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::Collator>>(std::unique_ptr<icu4x::Collator>(icu4x::Collator::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::Collator>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline int8_t icu4x::Collator::compare(std::string_view left, std::string_view right) const {
+  auto result = icu4x::capi::icu4x_Collator_compare_utf8_mv1(this->AsFFI(),
+    left.data(),
+    left.size(),
+    right.data(),
+    right.size());
+  return result;
+}
+
+inline int8_t icu4x::Collator::compare16(std::u16string_view left, std::u16string_view right) const {
+  auto result = icu4x::capi::icu4x_Collator_compare_utf16_mv1(this->AsFFI(),
+    left.data(),
+    left.size(),
+    right.data(),
+    right.size());
+  return result;
+}
+
+inline icu4x::CollatorResolvedOptionsV1 icu4x::Collator::resolved_options_v1() const {
+  auto result = icu4x::capi::icu4x_Collator_resolved_options_v1_mv1(this->AsFFI());
+  return icu4x::CollatorResolvedOptionsV1::FromFFI(result);
+}
+
+inline const icu4x::capi::Collator* icu4x::Collator::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::Collator*>(this);
+}
+
+inline icu4x::capi::Collator* icu4x::Collator::AsFFI() {
+  return reinterpret_cast<icu4x::capi::Collator*>(this);
+}
+
+inline const icu4x::Collator* icu4x::Collator::FromFFI(const icu4x::capi::Collator* ptr) {
+  return reinterpret_cast<const icu4x::Collator*>(ptr);
+}
+
+inline icu4x::Collator* icu4x::Collator::FromFFI(icu4x::capi::Collator* ptr) {
+  return reinterpret_cast<icu4x::Collator*>(ptr);
+}
+
+inline void icu4x::Collator::operator delete(void* ptr) {
+  icu4x::capi::icu4x_Collator_destroy_mv1(reinterpret_cast<icu4x::capi::Collator*>(ptr));
+}
+
+
+#endif // icu4x_Collator_HPP
diff --git a/ffi/capi/bindings/cpp/CollatorAlternateHandling.d.hpp b/ffi/capi/bindings/cpp/icu4x/CollatorAlternateHandling.d.hpp
similarity index 66%
rename from ffi/capi/bindings/cpp/CollatorAlternateHandling.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/CollatorAlternateHandling.d.hpp
index 14ae3134ad8..09eb91a4945 100644
--- a/ffi/capi/bindings/cpp/CollatorAlternateHandling.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/CollatorAlternateHandling.d.hpp
@@ -1,5 +1,5 @@
-#ifndef CollatorAlternateHandling_D_HPP
-#define CollatorAlternateHandling_D_HPP
+#ifndef icu4x_CollatorAlternateHandling_D_HPP
+#define icu4x_CollatorAlternateHandling_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum CollatorAlternateHandling {
       CollatorAlternateHandling_Auto = 0,
@@ -20,6 +20,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class CollatorAlternateHandling {
 public:
   enum Value {
@@ -35,11 +36,11 @@ class CollatorAlternateHandling {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::CollatorAlternateHandling AsFFI() const;
-  inline static CollatorAlternateHandling FromFFI(diplomat::capi::CollatorAlternateHandling c_enum);
+  inline icu4x::capi::CollatorAlternateHandling AsFFI() const;
+  inline static icu4x::CollatorAlternateHandling FromFFI(icu4x::capi::CollatorAlternateHandling c_enum);
 private:
     Value value;
 };
 
-
-#endif // CollatorAlternateHandling_D_HPP
+} // namespace
+#endif // icu4x_CollatorAlternateHandling_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CollatorAlternateHandling.hpp b/ffi/capi/bindings/cpp/icu4x/CollatorAlternateHandling.hpp
new file mode 100644
index 00000000000..3227ad2ffd2
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CollatorAlternateHandling.hpp
@@ -0,0 +1,38 @@
+#ifndef icu4x_CollatorAlternateHandling_HPP
+#define icu4x_CollatorAlternateHandling_HPP
+
+#include "CollatorAlternateHandling.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::CollatorAlternateHandling icu4x::CollatorAlternateHandling::AsFFI() const {
+  return static_cast<icu4x::capi::CollatorAlternateHandling>(value);
+}
+
+inline icu4x::CollatorAlternateHandling icu4x::CollatorAlternateHandling::FromFFI(icu4x::capi::CollatorAlternateHandling c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::CollatorAlternateHandling_Auto:
+    case icu4x::capi::CollatorAlternateHandling_NonIgnorable:
+    case icu4x::capi::CollatorAlternateHandling_Shifted:
+      return static_cast<icu4x::CollatorAlternateHandling::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_CollatorAlternateHandling_HPP
diff --git a/ffi/capi/bindings/cpp/CollatorBackwardSecondLevel.d.hpp b/ffi/capi/bindings/cpp/icu4x/CollatorBackwardSecondLevel.d.hpp
similarity index 65%
rename from ffi/capi/bindings/cpp/CollatorBackwardSecondLevel.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/CollatorBackwardSecondLevel.d.hpp
index d573e531d8d..4e8d722fd50 100644
--- a/ffi/capi/bindings/cpp/CollatorBackwardSecondLevel.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/CollatorBackwardSecondLevel.d.hpp
@@ -1,5 +1,5 @@
-#ifndef CollatorBackwardSecondLevel_D_HPP
-#define CollatorBackwardSecondLevel_D_HPP
+#ifndef icu4x_CollatorBackwardSecondLevel_D_HPP
+#define icu4x_CollatorBackwardSecondLevel_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum CollatorBackwardSecondLevel {
       CollatorBackwardSecondLevel_Auto = 0,
@@ -20,6 +20,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class CollatorBackwardSecondLevel {
 public:
   enum Value {
@@ -35,11 +36,11 @@ class CollatorBackwardSecondLevel {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::CollatorBackwardSecondLevel AsFFI() const;
-  inline static CollatorBackwardSecondLevel FromFFI(diplomat::capi::CollatorBackwardSecondLevel c_enum);
+  inline icu4x::capi::CollatorBackwardSecondLevel AsFFI() const;
+  inline static icu4x::CollatorBackwardSecondLevel FromFFI(icu4x::capi::CollatorBackwardSecondLevel c_enum);
 private:
     Value value;
 };
 
-
-#endif // CollatorBackwardSecondLevel_D_HPP
+} // namespace
+#endif // icu4x_CollatorBackwardSecondLevel_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CollatorBackwardSecondLevel.hpp b/ffi/capi/bindings/cpp/icu4x/CollatorBackwardSecondLevel.hpp
new file mode 100644
index 00000000000..cc38ba79acf
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CollatorBackwardSecondLevel.hpp
@@ -0,0 +1,38 @@
+#ifndef icu4x_CollatorBackwardSecondLevel_HPP
+#define icu4x_CollatorBackwardSecondLevel_HPP
+
+#include "CollatorBackwardSecondLevel.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::CollatorBackwardSecondLevel icu4x::CollatorBackwardSecondLevel::AsFFI() const {
+  return static_cast<icu4x::capi::CollatorBackwardSecondLevel>(value);
+}
+
+inline icu4x::CollatorBackwardSecondLevel icu4x::CollatorBackwardSecondLevel::FromFFI(icu4x::capi::CollatorBackwardSecondLevel c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::CollatorBackwardSecondLevel_Auto:
+    case icu4x::capi::CollatorBackwardSecondLevel_Off:
+    case icu4x::capi::CollatorBackwardSecondLevel_On:
+      return static_cast<icu4x::CollatorBackwardSecondLevel::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_CollatorBackwardSecondLevel_HPP
diff --git a/ffi/capi/bindings/cpp/CollatorCaseFirst.d.hpp b/ffi/capi/bindings/cpp/icu4x/CollatorCaseFirst.d.hpp
similarity index 69%
rename from ffi/capi/bindings/cpp/CollatorCaseFirst.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/CollatorCaseFirst.d.hpp
index 962a5b0b0aa..be5b70becd2 100644
--- a/ffi/capi/bindings/cpp/CollatorCaseFirst.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/CollatorCaseFirst.d.hpp
@@ -1,5 +1,5 @@
-#ifndef CollatorCaseFirst_D_HPP
-#define CollatorCaseFirst_D_HPP
+#ifndef icu4x_CollatorCaseFirst_D_HPP
+#define icu4x_CollatorCaseFirst_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum CollatorCaseFirst {
       CollatorCaseFirst_Auto = 0,
@@ -21,6 +21,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class CollatorCaseFirst {
 public:
   enum Value {
@@ -37,11 +38,11 @@ class CollatorCaseFirst {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::CollatorCaseFirst AsFFI() const;
-  inline static CollatorCaseFirst FromFFI(diplomat::capi::CollatorCaseFirst c_enum);
+  inline icu4x::capi::CollatorCaseFirst AsFFI() const;
+  inline static icu4x::CollatorCaseFirst FromFFI(icu4x::capi::CollatorCaseFirst c_enum);
 private:
     Value value;
 };
 
-
-#endif // CollatorCaseFirst_D_HPP
+} // namespace
+#endif // icu4x_CollatorCaseFirst_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CollatorCaseFirst.hpp b/ffi/capi/bindings/cpp/icu4x/CollatorCaseFirst.hpp
new file mode 100644
index 00000000000..fbeba8f1a94
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CollatorCaseFirst.hpp
@@ -0,0 +1,39 @@
+#ifndef icu4x_CollatorCaseFirst_HPP
+#define icu4x_CollatorCaseFirst_HPP
+
+#include "CollatorCaseFirst.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::CollatorCaseFirst icu4x::CollatorCaseFirst::AsFFI() const {
+  return static_cast<icu4x::capi::CollatorCaseFirst>(value);
+}
+
+inline icu4x::CollatorCaseFirst icu4x::CollatorCaseFirst::FromFFI(icu4x::capi::CollatorCaseFirst c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::CollatorCaseFirst_Auto:
+    case icu4x::capi::CollatorCaseFirst_Off:
+    case icu4x::capi::CollatorCaseFirst_LowerFirst:
+    case icu4x::capi::CollatorCaseFirst_UpperFirst:
+      return static_cast<icu4x::CollatorCaseFirst::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_CollatorCaseFirst_HPP
diff --git a/ffi/capi/bindings/cpp/CollatorCaseLevel.d.hpp b/ffi/capi/bindings/cpp/icu4x/CollatorCaseLevel.d.hpp
similarity index 67%
rename from ffi/capi/bindings/cpp/CollatorCaseLevel.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/CollatorCaseLevel.d.hpp
index ed58f66402b..2c0cc7dd468 100644
--- a/ffi/capi/bindings/cpp/CollatorCaseLevel.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/CollatorCaseLevel.d.hpp
@@ -1,5 +1,5 @@
-#ifndef CollatorCaseLevel_D_HPP
-#define CollatorCaseLevel_D_HPP
+#ifndef icu4x_CollatorCaseLevel_D_HPP
+#define icu4x_CollatorCaseLevel_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum CollatorCaseLevel {
       CollatorCaseLevel_Auto = 0,
@@ -20,6 +20,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class CollatorCaseLevel {
 public:
   enum Value {
@@ -35,11 +36,11 @@ class CollatorCaseLevel {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::CollatorCaseLevel AsFFI() const;
-  inline static CollatorCaseLevel FromFFI(diplomat::capi::CollatorCaseLevel c_enum);
+  inline icu4x::capi::CollatorCaseLevel AsFFI() const;
+  inline static icu4x::CollatorCaseLevel FromFFI(icu4x::capi::CollatorCaseLevel c_enum);
 private:
     Value value;
 };
 
-
-#endif // CollatorCaseLevel_D_HPP
+} // namespace
+#endif // icu4x_CollatorCaseLevel_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CollatorCaseLevel.hpp b/ffi/capi/bindings/cpp/icu4x/CollatorCaseLevel.hpp
new file mode 100644
index 00000000000..8904a14918b
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CollatorCaseLevel.hpp
@@ -0,0 +1,38 @@
+#ifndef icu4x_CollatorCaseLevel_HPP
+#define icu4x_CollatorCaseLevel_HPP
+
+#include "CollatorCaseLevel.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::CollatorCaseLevel icu4x::CollatorCaseLevel::AsFFI() const {
+  return static_cast<icu4x::capi::CollatorCaseLevel>(value);
+}
+
+inline icu4x::CollatorCaseLevel icu4x::CollatorCaseLevel::FromFFI(icu4x::capi::CollatorCaseLevel c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::CollatorCaseLevel_Auto:
+    case icu4x::capi::CollatorCaseLevel_Off:
+    case icu4x::capi::CollatorCaseLevel_On:
+      return static_cast<icu4x::CollatorCaseLevel::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_CollatorCaseLevel_HPP
diff --git a/ffi/capi/bindings/cpp/CollatorMaxVariable.d.hpp b/ffi/capi/bindings/cpp/icu4x/CollatorMaxVariable.d.hpp
similarity index 70%
rename from ffi/capi/bindings/cpp/CollatorMaxVariable.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/CollatorMaxVariable.d.hpp
index 17ec788682f..20ca2edc751 100644
--- a/ffi/capi/bindings/cpp/CollatorMaxVariable.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/CollatorMaxVariable.d.hpp
@@ -1,5 +1,5 @@
-#ifndef CollatorMaxVariable_D_HPP
-#define CollatorMaxVariable_D_HPP
+#ifndef icu4x_CollatorMaxVariable_D_HPP
+#define icu4x_CollatorMaxVariable_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum CollatorMaxVariable {
       CollatorMaxVariable_Auto = 0,
@@ -22,6 +22,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class CollatorMaxVariable {
 public:
   enum Value {
@@ -39,11 +40,11 @@ class CollatorMaxVariable {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::CollatorMaxVariable AsFFI() const;
-  inline static CollatorMaxVariable FromFFI(diplomat::capi::CollatorMaxVariable c_enum);
+  inline icu4x::capi::CollatorMaxVariable AsFFI() const;
+  inline static icu4x::CollatorMaxVariable FromFFI(icu4x::capi::CollatorMaxVariable c_enum);
 private:
     Value value;
 };
 
-
-#endif // CollatorMaxVariable_D_HPP
+} // namespace
+#endif // icu4x_CollatorMaxVariable_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CollatorMaxVariable.hpp b/ffi/capi/bindings/cpp/icu4x/CollatorMaxVariable.hpp
new file mode 100644
index 00000000000..853d12cbc35
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CollatorMaxVariable.hpp
@@ -0,0 +1,40 @@
+#ifndef icu4x_CollatorMaxVariable_HPP
+#define icu4x_CollatorMaxVariable_HPP
+
+#include "CollatorMaxVariable.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::CollatorMaxVariable icu4x::CollatorMaxVariable::AsFFI() const {
+  return static_cast<icu4x::capi::CollatorMaxVariable>(value);
+}
+
+inline icu4x::CollatorMaxVariable icu4x::CollatorMaxVariable::FromFFI(icu4x::capi::CollatorMaxVariable c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::CollatorMaxVariable_Auto:
+    case icu4x::capi::CollatorMaxVariable_Space:
+    case icu4x::capi::CollatorMaxVariable_Punctuation:
+    case icu4x::capi::CollatorMaxVariable_Symbol:
+    case icu4x::capi::CollatorMaxVariable_Currency:
+      return static_cast<icu4x::CollatorMaxVariable::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_CollatorMaxVariable_HPP
diff --git a/ffi/capi/bindings/cpp/CollatorNumeric.d.hpp b/ffi/capi/bindings/cpp/icu4x/CollatorNumeric.d.hpp
similarity index 67%
rename from ffi/capi/bindings/cpp/CollatorNumeric.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/CollatorNumeric.d.hpp
index fd16f904299..dfe921080bc 100644
--- a/ffi/capi/bindings/cpp/CollatorNumeric.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/CollatorNumeric.d.hpp
@@ -1,5 +1,5 @@
-#ifndef CollatorNumeric_D_HPP
-#define CollatorNumeric_D_HPP
+#ifndef icu4x_CollatorNumeric_D_HPP
+#define icu4x_CollatorNumeric_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum CollatorNumeric {
       CollatorNumeric_Auto = 0,
@@ -20,6 +20,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class CollatorNumeric {
 public:
   enum Value {
@@ -35,11 +36,11 @@ class CollatorNumeric {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::CollatorNumeric AsFFI() const;
-  inline static CollatorNumeric FromFFI(diplomat::capi::CollatorNumeric c_enum);
+  inline icu4x::capi::CollatorNumeric AsFFI() const;
+  inline static icu4x::CollatorNumeric FromFFI(icu4x::capi::CollatorNumeric c_enum);
 private:
     Value value;
 };
 
-
-#endif // CollatorNumeric_D_HPP
+} // namespace
+#endif // icu4x_CollatorNumeric_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CollatorNumeric.hpp b/ffi/capi/bindings/cpp/icu4x/CollatorNumeric.hpp
new file mode 100644
index 00000000000..33bfcbff85e
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CollatorNumeric.hpp
@@ -0,0 +1,38 @@
+#ifndef icu4x_CollatorNumeric_HPP
+#define icu4x_CollatorNumeric_HPP
+
+#include "CollatorNumeric.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::CollatorNumeric icu4x::CollatorNumeric::AsFFI() const {
+  return static_cast<icu4x::capi::CollatorNumeric>(value);
+}
+
+inline icu4x::CollatorNumeric icu4x::CollatorNumeric::FromFFI(icu4x::capi::CollatorNumeric c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::CollatorNumeric_Auto:
+    case icu4x::capi::CollatorNumeric_Off:
+    case icu4x::capi::CollatorNumeric_On:
+      return static_cast<icu4x::CollatorNumeric::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_CollatorNumeric_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CollatorOptionsV1.d.hpp b/ffi/capi/bindings/cpp/icu4x/CollatorOptionsV1.d.hpp
new file mode 100644
index 00000000000..beb7afd3a96
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CollatorOptionsV1.d.hpp
@@ -0,0 +1,60 @@
+#ifndef icu4x_CollatorOptionsV1_D_HPP
+#define icu4x_CollatorOptionsV1_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "CollatorAlternateHandling.d.hpp"
+#include "CollatorBackwardSecondLevel.d.hpp"
+#include "CollatorCaseFirst.d.hpp"
+#include "CollatorCaseLevel.d.hpp"
+#include "CollatorMaxVariable.d.hpp"
+#include "CollatorNumeric.d.hpp"
+#include "CollatorStrength.d.hpp"
+
+namespace icu4x {
+class CollatorAlternateHandling;
+class CollatorBackwardSecondLevel;
+class CollatorCaseFirst;
+class CollatorCaseLevel;
+class CollatorMaxVariable;
+class CollatorNumeric;
+class CollatorStrength;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct CollatorOptionsV1 {
+      icu4x::capi::CollatorStrength strength;
+      icu4x::capi::CollatorAlternateHandling alternate_handling;
+      icu4x::capi::CollatorCaseFirst case_first;
+      icu4x::capi::CollatorMaxVariable max_variable;
+      icu4x::capi::CollatorCaseLevel case_level;
+      icu4x::capi::CollatorNumeric numeric;
+      icu4x::capi::CollatorBackwardSecondLevel backward_second_level;
+    };
+} // namespace capi
+} // namespace
+
+
+namespace icu4x {
+struct CollatorOptionsV1 {
+  icu4x::CollatorStrength strength;
+  icu4x::CollatorAlternateHandling alternate_handling;
+  icu4x::CollatorCaseFirst case_first;
+  icu4x::CollatorMaxVariable max_variable;
+  icu4x::CollatorCaseLevel case_level;
+  icu4x::CollatorNumeric numeric;
+  icu4x::CollatorBackwardSecondLevel backward_second_level;
+
+  inline icu4x::capi::CollatorOptionsV1 AsFFI() const;
+  inline static icu4x::CollatorOptionsV1 FromFFI(icu4x::capi::CollatorOptionsV1 c_struct);
+};
+
+} // namespace
+#endif // icu4x_CollatorOptionsV1_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CollatorOptionsV1.hpp b/ffi/capi/bindings/cpp/icu4x/CollatorOptionsV1.hpp
new file mode 100644
index 00000000000..d87788b101f
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CollatorOptionsV1.hpp
@@ -0,0 +1,57 @@
+#ifndef icu4x_CollatorOptionsV1_HPP
+#define icu4x_CollatorOptionsV1_HPP
+
+#include "CollatorOptionsV1.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "CollatorAlternateHandling.hpp"
+#include "CollatorBackwardSecondLevel.hpp"
+#include "CollatorCaseFirst.hpp"
+#include "CollatorCaseLevel.hpp"
+#include "CollatorMaxVariable.hpp"
+#include "CollatorNumeric.hpp"
+#include "CollatorStrength.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+
+inline icu4x::capi::CollatorOptionsV1 icu4x::CollatorOptionsV1::AsFFI() const {
+  return icu4x::capi::CollatorOptionsV1 {
+    /* .strength = */ strength.AsFFI(),
+    /* .alternate_handling = */ alternate_handling.AsFFI(),
+    /* .case_first = */ case_first.AsFFI(),
+    /* .max_variable = */ max_variable.AsFFI(),
+    /* .case_level = */ case_level.AsFFI(),
+    /* .numeric = */ numeric.AsFFI(),
+    /* .backward_second_level = */ backward_second_level.AsFFI(),
+  };
+}
+
+inline icu4x::CollatorOptionsV1 icu4x::CollatorOptionsV1::FromFFI(icu4x::capi::CollatorOptionsV1 c_struct) {
+  return icu4x::CollatorOptionsV1 {
+    /* .strength = */ icu4x::CollatorStrength::FromFFI(c_struct.strength),
+    /* .alternate_handling = */ icu4x::CollatorAlternateHandling::FromFFI(c_struct.alternate_handling),
+    /* .case_first = */ icu4x::CollatorCaseFirst::FromFFI(c_struct.case_first),
+    /* .max_variable = */ icu4x::CollatorMaxVariable::FromFFI(c_struct.max_variable),
+    /* .case_level = */ icu4x::CollatorCaseLevel::FromFFI(c_struct.case_level),
+    /* .numeric = */ icu4x::CollatorNumeric::FromFFI(c_struct.numeric),
+    /* .backward_second_level = */ icu4x::CollatorBackwardSecondLevel::FromFFI(c_struct.backward_second_level),
+  };
+}
+
+
+#endif // icu4x_CollatorOptionsV1_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CollatorResolvedOptionsV1.d.hpp b/ffi/capi/bindings/cpp/icu4x/CollatorResolvedOptionsV1.d.hpp
new file mode 100644
index 00000000000..01cf05db28c
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CollatorResolvedOptionsV1.d.hpp
@@ -0,0 +1,60 @@
+#ifndef icu4x_CollatorResolvedOptionsV1_D_HPP
+#define icu4x_CollatorResolvedOptionsV1_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "CollatorAlternateHandling.d.hpp"
+#include "CollatorBackwardSecondLevel.d.hpp"
+#include "CollatorCaseFirst.d.hpp"
+#include "CollatorCaseLevel.d.hpp"
+#include "CollatorMaxVariable.d.hpp"
+#include "CollatorNumeric.d.hpp"
+#include "CollatorStrength.d.hpp"
+
+namespace icu4x {
+class CollatorAlternateHandling;
+class CollatorBackwardSecondLevel;
+class CollatorCaseFirst;
+class CollatorCaseLevel;
+class CollatorMaxVariable;
+class CollatorNumeric;
+class CollatorStrength;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct CollatorResolvedOptionsV1 {
+      icu4x::capi::CollatorStrength strength;
+      icu4x::capi::CollatorAlternateHandling alternate_handling;
+      icu4x::capi::CollatorCaseFirst case_first;
+      icu4x::capi::CollatorMaxVariable max_variable;
+      icu4x::capi::CollatorCaseLevel case_level;
+      icu4x::capi::CollatorNumeric numeric;
+      icu4x::capi::CollatorBackwardSecondLevel backward_second_level;
+    };
+} // namespace capi
+} // namespace
+
+
+namespace icu4x {
+struct CollatorResolvedOptionsV1 {
+  icu4x::CollatorStrength strength;
+  icu4x::CollatorAlternateHandling alternate_handling;
+  icu4x::CollatorCaseFirst case_first;
+  icu4x::CollatorMaxVariable max_variable;
+  icu4x::CollatorCaseLevel case_level;
+  icu4x::CollatorNumeric numeric;
+  icu4x::CollatorBackwardSecondLevel backward_second_level;
+
+  inline icu4x::capi::CollatorResolvedOptionsV1 AsFFI() const;
+  inline static icu4x::CollatorResolvedOptionsV1 FromFFI(icu4x::capi::CollatorResolvedOptionsV1 c_struct);
+};
+
+} // namespace
+#endif // icu4x_CollatorResolvedOptionsV1_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CollatorResolvedOptionsV1.hpp b/ffi/capi/bindings/cpp/icu4x/CollatorResolvedOptionsV1.hpp
new file mode 100644
index 00000000000..c49af04ccc9
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CollatorResolvedOptionsV1.hpp
@@ -0,0 +1,57 @@
+#ifndef icu4x_CollatorResolvedOptionsV1_HPP
+#define icu4x_CollatorResolvedOptionsV1_HPP
+
+#include "CollatorResolvedOptionsV1.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "CollatorAlternateHandling.hpp"
+#include "CollatorBackwardSecondLevel.hpp"
+#include "CollatorCaseFirst.hpp"
+#include "CollatorCaseLevel.hpp"
+#include "CollatorMaxVariable.hpp"
+#include "CollatorNumeric.hpp"
+#include "CollatorStrength.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+
+inline icu4x::capi::CollatorResolvedOptionsV1 icu4x::CollatorResolvedOptionsV1::AsFFI() const {
+  return icu4x::capi::CollatorResolvedOptionsV1 {
+    /* .strength = */ strength.AsFFI(),
+    /* .alternate_handling = */ alternate_handling.AsFFI(),
+    /* .case_first = */ case_first.AsFFI(),
+    /* .max_variable = */ max_variable.AsFFI(),
+    /* .case_level = */ case_level.AsFFI(),
+    /* .numeric = */ numeric.AsFFI(),
+    /* .backward_second_level = */ backward_second_level.AsFFI(),
+  };
+}
+
+inline icu4x::CollatorResolvedOptionsV1 icu4x::CollatorResolvedOptionsV1::FromFFI(icu4x::capi::CollatorResolvedOptionsV1 c_struct) {
+  return icu4x::CollatorResolvedOptionsV1 {
+    /* .strength = */ icu4x::CollatorStrength::FromFFI(c_struct.strength),
+    /* .alternate_handling = */ icu4x::CollatorAlternateHandling::FromFFI(c_struct.alternate_handling),
+    /* .case_first = */ icu4x::CollatorCaseFirst::FromFFI(c_struct.case_first),
+    /* .max_variable = */ icu4x::CollatorMaxVariable::FromFFI(c_struct.max_variable),
+    /* .case_level = */ icu4x::CollatorCaseLevel::FromFFI(c_struct.case_level),
+    /* .numeric = */ icu4x::CollatorNumeric::FromFFI(c_struct.numeric),
+    /* .backward_second_level = */ icu4x::CollatorBackwardSecondLevel::FromFFI(c_struct.backward_second_level),
+  };
+}
+
+
+#endif // icu4x_CollatorResolvedOptionsV1_HPP
diff --git a/ffi/capi/bindings/cpp/CollatorStrength.d.hpp b/ffi/capi/bindings/cpp/icu4x/CollatorStrength.d.hpp
similarity index 72%
rename from ffi/capi/bindings/cpp/CollatorStrength.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/CollatorStrength.d.hpp
index 50baafe0986..8e691591760 100644
--- a/ffi/capi/bindings/cpp/CollatorStrength.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/CollatorStrength.d.hpp
@@ -1,5 +1,5 @@
-#ifndef CollatorStrength_D_HPP
-#define CollatorStrength_D_HPP
+#ifndef icu4x_CollatorStrength_D_HPP
+#define icu4x_CollatorStrength_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum CollatorStrength {
       CollatorStrength_Auto = 0,
@@ -23,6 +23,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class CollatorStrength {
 public:
   enum Value {
@@ -41,11 +42,11 @@ class CollatorStrength {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::CollatorStrength AsFFI() const;
-  inline static CollatorStrength FromFFI(diplomat::capi::CollatorStrength c_enum);
+  inline icu4x::capi::CollatorStrength AsFFI() const;
+  inline static icu4x::CollatorStrength FromFFI(icu4x::capi::CollatorStrength c_enum);
 private:
     Value value;
 };
 
-
-#endif // CollatorStrength_D_HPP
+} // namespace
+#endif // icu4x_CollatorStrength_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CollatorStrength.hpp b/ffi/capi/bindings/cpp/icu4x/CollatorStrength.hpp
new file mode 100644
index 00000000000..d9d61015d51
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CollatorStrength.hpp
@@ -0,0 +1,41 @@
+#ifndef icu4x_CollatorStrength_HPP
+#define icu4x_CollatorStrength_HPP
+
+#include "CollatorStrength.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::CollatorStrength icu4x::CollatorStrength::AsFFI() const {
+  return static_cast<icu4x::capi::CollatorStrength>(value);
+}
+
+inline icu4x::CollatorStrength icu4x::CollatorStrength::FromFFI(icu4x::capi::CollatorStrength c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::CollatorStrength_Auto:
+    case icu4x::capi::CollatorStrength_Primary:
+    case icu4x::capi::CollatorStrength_Secondary:
+    case icu4x::capi::CollatorStrength_Tertiary:
+    case icu4x::capi::CollatorStrength_Quaternary:
+    case icu4x::capi::CollatorStrength_Identical:
+      return static_cast<icu4x::CollatorStrength::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_CollatorStrength_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/ComposingNormalizer.d.hpp b/ffi/capi/bindings/cpp/icu4x/ComposingNormalizer.d.hpp
new file mode 100644
index 00000000000..46820e9afe7
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/ComposingNormalizer.d.hpp
@@ -0,0 +1,60 @@
+#ifndef icu4x_ComposingNormalizer_D_HPP
+#define icu4x_ComposingNormalizer_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct ComposingNormalizer; }
+class ComposingNormalizer;
+namespace capi { struct DataProvider; }
+class DataProvider;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct ComposingNormalizer;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class ComposingNormalizer {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::ComposingNormalizer>, icu4x::DataError> create_nfc(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::ComposingNormalizer>, icu4x::DataError> create_nfkc(const icu4x::DataProvider& provider);
+
+  inline std::string normalize(std::string_view s) const;
+
+  inline bool is_normalized(std::string_view s) const;
+
+  inline bool is_normalized16(std::u16string_view s) const;
+
+  inline size_t is_normalized_up_to(std::string_view s) const;
+
+  inline size_t is_normalized16_up_to(std::u16string_view s) const;
+
+  inline const icu4x::capi::ComposingNormalizer* AsFFI() const;
+  inline icu4x::capi::ComposingNormalizer* AsFFI();
+  inline static const icu4x::ComposingNormalizer* FromFFI(const icu4x::capi::ComposingNormalizer* ptr);
+  inline static icu4x::ComposingNormalizer* FromFFI(icu4x::capi::ComposingNormalizer* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  ComposingNormalizer() = delete;
+  ComposingNormalizer(const icu4x::ComposingNormalizer&) = delete;
+  ComposingNormalizer(icu4x::ComposingNormalizer&&) noexcept = delete;
+  ComposingNormalizer operator=(const icu4x::ComposingNormalizer&) = delete;
+  ComposingNormalizer operator=(icu4x::ComposingNormalizer&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_ComposingNormalizer_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/ComposingNormalizer.hpp b/ffi/capi/bindings/cpp/icu4x/ComposingNormalizer.hpp
new file mode 100644
index 00000000000..c54c610cfd7
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/ComposingNormalizer.hpp
@@ -0,0 +1,113 @@
+#ifndef icu4x_ComposingNormalizer_HPP
+#define icu4x_ComposingNormalizer_HPP
+
+#include "ComposingNormalizer.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_ComposingNormalizer_create_nfc_mv1_result {union {icu4x::capi::ComposingNormalizer* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_ComposingNormalizer_create_nfc_mv1_result;
+    icu4x_ComposingNormalizer_create_nfc_mv1_result icu4x_ComposingNormalizer_create_nfc_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_ComposingNormalizer_create_nfkc_mv1_result {union {icu4x::capi::ComposingNormalizer* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_ComposingNormalizer_create_nfkc_mv1_result;
+    icu4x_ComposingNormalizer_create_nfkc_mv1_result icu4x_ComposingNormalizer_create_nfkc_mv1(const icu4x::capi::DataProvider* provider);
+    
+    void icu4x_ComposingNormalizer_normalize_mv1(const icu4x::capi::ComposingNormalizer* self, const char* s_data, size_t s_len, diplomat::capi::DiplomatWrite* write);
+    
+    bool icu4x_ComposingNormalizer_is_normalized_utf8_mv1(const icu4x::capi::ComposingNormalizer* self, const char* s_data, size_t s_len);
+    
+    bool icu4x_ComposingNormalizer_is_normalized_utf16_mv1(const icu4x::capi::ComposingNormalizer* self, const char16_t* s_data, size_t s_len);
+    
+    size_t icu4x_ComposingNormalizer_is_normalized_utf8_up_to_mv1(const icu4x::capi::ComposingNormalizer* self, const char* s_data, size_t s_len);
+    
+    size_t icu4x_ComposingNormalizer_is_normalized_utf16_up_to_mv1(const icu4x::capi::ComposingNormalizer* self, const char16_t* s_data, size_t s_len);
+    
+    
+    void icu4x_ComposingNormalizer_destroy_mv1(ComposingNormalizer* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::ComposingNormalizer>, icu4x::DataError> icu4x::ComposingNormalizer::create_nfc(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_ComposingNormalizer_create_nfc_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::ComposingNormalizer>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::ComposingNormalizer>>(std::unique_ptr<icu4x::ComposingNormalizer>(icu4x::ComposingNormalizer::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::ComposingNormalizer>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::ComposingNormalizer>, icu4x::DataError> icu4x::ComposingNormalizer::create_nfkc(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_ComposingNormalizer_create_nfkc_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::ComposingNormalizer>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::ComposingNormalizer>>(std::unique_ptr<icu4x::ComposingNormalizer>(icu4x::ComposingNormalizer::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::ComposingNormalizer>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline std::string icu4x::ComposingNormalizer::normalize(std::string_view s) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_ComposingNormalizer_normalize_mv1(this->AsFFI(),
+    s.data(),
+    s.size(),
+    &write);
+  return output;
+}
+
+inline bool icu4x::ComposingNormalizer::is_normalized(std::string_view s) const {
+  auto result = icu4x::capi::icu4x_ComposingNormalizer_is_normalized_utf8_mv1(this->AsFFI(),
+    s.data(),
+    s.size());
+  return result;
+}
+
+inline bool icu4x::ComposingNormalizer::is_normalized16(std::u16string_view s) const {
+  auto result = icu4x::capi::icu4x_ComposingNormalizer_is_normalized_utf16_mv1(this->AsFFI(),
+    s.data(),
+    s.size());
+  return result;
+}
+
+inline size_t icu4x::ComposingNormalizer::is_normalized_up_to(std::string_view s) const {
+  auto result = icu4x::capi::icu4x_ComposingNormalizer_is_normalized_utf8_up_to_mv1(this->AsFFI(),
+    s.data(),
+    s.size());
+  return result;
+}
+
+inline size_t icu4x::ComposingNormalizer::is_normalized16_up_to(std::u16string_view s) const {
+  auto result = icu4x::capi::icu4x_ComposingNormalizer_is_normalized_utf16_up_to_mv1(this->AsFFI(),
+    s.data(),
+    s.size());
+  return result;
+}
+
+inline const icu4x::capi::ComposingNormalizer* icu4x::ComposingNormalizer::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::ComposingNormalizer*>(this);
+}
+
+inline icu4x::capi::ComposingNormalizer* icu4x::ComposingNormalizer::AsFFI() {
+  return reinterpret_cast<icu4x::capi::ComposingNormalizer*>(this);
+}
+
+inline const icu4x::ComposingNormalizer* icu4x::ComposingNormalizer::FromFFI(const icu4x::capi::ComposingNormalizer* ptr) {
+  return reinterpret_cast<const icu4x::ComposingNormalizer*>(ptr);
+}
+
+inline icu4x::ComposingNormalizer* icu4x::ComposingNormalizer::FromFFI(icu4x::capi::ComposingNormalizer* ptr) {
+  return reinterpret_cast<icu4x::ComposingNormalizer*>(ptr);
+}
+
+inline void icu4x::ComposingNormalizer::operator delete(void* ptr) {
+  icu4x::capi::icu4x_ComposingNormalizer_destroy_mv1(reinterpret_cast<icu4x::capi::ComposingNormalizer*>(ptr));
+}
+
+
+#endif // icu4x_ComposingNormalizer_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CustomTimeZone.d.hpp b/ffi/capi/bindings/cpp/icu4x/CustomTimeZone.d.hpp
new file mode 100644
index 00000000000..de656240f78
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CustomTimeZone.d.hpp
@@ -0,0 +1,107 @@
+#ifndef icu4x_CustomTimeZone_D_HPP
+#define icu4x_CustomTimeZone_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct CustomTimeZone; }
+class CustomTimeZone;
+namespace capi { struct IsoDateTime; }
+class IsoDateTime;
+namespace capi { struct MetazoneCalculator; }
+class MetazoneCalculator;
+namespace capi { struct TimeZoneIdMapper; }
+class TimeZoneIdMapper;
+struct TimeZoneInvalidIdError;
+struct TimeZoneInvalidOffsetError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct CustomTimeZone;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class CustomTimeZone {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::CustomTimeZone>, icu4x::TimeZoneInvalidOffsetError> from_string(std::string_view s);
+
+  inline static std::unique_ptr<icu4x::CustomTimeZone> empty();
+
+  inline static std::unique_ptr<icu4x::CustomTimeZone> utc();
+
+  inline static std::unique_ptr<icu4x::CustomTimeZone> gmt();
+
+  inline static std::unique_ptr<icu4x::CustomTimeZone> bst();
+
+  inline diplomat::result<std::monostate, icu4x::TimeZoneInvalidOffsetError> try_set_gmt_offset_seconds(int32_t offset_seconds);
+
+  inline void set_gmt_offset_eighths_of_hour(int8_t offset_eighths_of_hour);
+
+  inline void clear_gmt_offset();
+
+  inline std::optional<int32_t> gmt_offset_seconds() const;
+
+  inline std::optional<bool> is_gmt_offset_positive() const;
+
+  inline std::optional<bool> is_gmt_offset_zero() const;
+
+  inline std::optional<bool> gmt_offset_has_minutes() const;
+
+  inline std::optional<bool> gmt_offset_has_seconds() const;
+
+  inline diplomat::result<std::monostate, icu4x::TimeZoneInvalidIdError> try_set_time_zone_id(std::string_view id);
+
+  inline diplomat::result<std::monostate, icu4x::TimeZoneInvalidIdError> try_set_iana_time_zone_id(const icu4x::TimeZoneIdMapper& mapper, std::string_view id);
+
+  inline void clear_time_zone_id();
+
+  inline std::optional<std::string> time_zone_id() const;
+
+  inline diplomat::result<std::monostate, icu4x::TimeZoneInvalidIdError> try_set_metazone_id(std::string_view id);
+
+  inline void clear_metazone_id();
+
+  inline std::optional<std::string> metazone_id() const;
+
+  inline std::optional<std::monostate> try_set_zone_variant(std::string_view id);
+
+  inline void clear_zone_variant();
+
+  inline std::optional<std::string> zone_variant() const;
+
+  inline void set_standard_time();
+
+  inline void set_daylight_time();
+
+  inline std::optional<bool> is_standard_time() const;
+
+  inline std::optional<bool> is_daylight_time() const;
+
+  inline void maybe_calculate_metazone(const icu4x::MetazoneCalculator& metazone_calculator, const icu4x::IsoDateTime& local_datetime);
+
+  inline const icu4x::capi::CustomTimeZone* AsFFI() const;
+  inline icu4x::capi::CustomTimeZone* AsFFI();
+  inline static const icu4x::CustomTimeZone* FromFFI(const icu4x::capi::CustomTimeZone* ptr);
+  inline static icu4x::CustomTimeZone* FromFFI(icu4x::capi::CustomTimeZone* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  CustomTimeZone() = delete;
+  CustomTimeZone(const icu4x::CustomTimeZone&) = delete;
+  CustomTimeZone(icu4x::CustomTimeZone&&) noexcept = delete;
+  CustomTimeZone operator=(const icu4x::CustomTimeZone&) = delete;
+  CustomTimeZone operator=(icu4x::CustomTimeZone&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_CustomTimeZone_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/CustomTimeZone.hpp b/ffi/capi/bindings/cpp/icu4x/CustomTimeZone.hpp
new file mode 100644
index 00000000000..883fd388e7b
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/CustomTimeZone.hpp
@@ -0,0 +1,279 @@
+#ifndef icu4x_CustomTimeZone_HPP
+#define icu4x_CustomTimeZone_HPP
+
+#include "CustomTimeZone.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "IsoDateTime.hpp"
+#include "MetazoneCalculator.hpp"
+#include "TimeZoneIdMapper.hpp"
+#include "TimeZoneInvalidIdError.hpp"
+#include "TimeZoneInvalidOffsetError.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_CustomTimeZone_from_string_mv1_result {union {icu4x::capi::CustomTimeZone* ok; }; bool is_ok;} icu4x_CustomTimeZone_from_string_mv1_result;
+    icu4x_CustomTimeZone_from_string_mv1_result icu4x_CustomTimeZone_from_string_mv1(const char* s_data, size_t s_len);
+    
+    icu4x::capi::CustomTimeZone* icu4x_CustomTimeZone_empty_mv1(void);
+    
+    icu4x::capi::CustomTimeZone* icu4x_CustomTimeZone_utc_mv1(void);
+    
+    icu4x::capi::CustomTimeZone* icu4x_CustomTimeZone_gmt_mv1(void);
+    
+    icu4x::capi::CustomTimeZone* icu4x_CustomTimeZone_bst_mv1(void);
+    
+    typedef struct icu4x_CustomTimeZone_try_set_gmt_offset_seconds_mv1_result { bool is_ok;} icu4x_CustomTimeZone_try_set_gmt_offset_seconds_mv1_result;
+    icu4x_CustomTimeZone_try_set_gmt_offset_seconds_mv1_result icu4x_CustomTimeZone_try_set_gmt_offset_seconds_mv1(icu4x::capi::CustomTimeZone* self, int32_t offset_seconds);
+    
+    void icu4x_CustomTimeZone_set_gmt_offset_eighths_of_hour_mv1(icu4x::capi::CustomTimeZone* self, int8_t offset_eighths_of_hour);
+    
+    void icu4x_CustomTimeZone_clear_gmt_offset_mv1(icu4x::capi::CustomTimeZone* self);
+    
+    typedef struct icu4x_CustomTimeZone_gmt_offset_seconds_mv1_result {union {int32_t ok; }; bool is_ok;} icu4x_CustomTimeZone_gmt_offset_seconds_mv1_result;
+    icu4x_CustomTimeZone_gmt_offset_seconds_mv1_result icu4x_CustomTimeZone_gmt_offset_seconds_mv1(const icu4x::capi::CustomTimeZone* self);
+    
+    typedef struct icu4x_CustomTimeZone_is_gmt_offset_positive_mv1_result {union {bool ok; }; bool is_ok;} icu4x_CustomTimeZone_is_gmt_offset_positive_mv1_result;
+    icu4x_CustomTimeZone_is_gmt_offset_positive_mv1_result icu4x_CustomTimeZone_is_gmt_offset_positive_mv1(const icu4x::capi::CustomTimeZone* self);
+    
+    typedef struct icu4x_CustomTimeZone_is_gmt_offset_zero_mv1_result {union {bool ok; }; bool is_ok;} icu4x_CustomTimeZone_is_gmt_offset_zero_mv1_result;
+    icu4x_CustomTimeZone_is_gmt_offset_zero_mv1_result icu4x_CustomTimeZone_is_gmt_offset_zero_mv1(const icu4x::capi::CustomTimeZone* self);
+    
+    typedef struct icu4x_CustomTimeZone_gmt_offset_has_minutes_mv1_result {union {bool ok; }; bool is_ok;} icu4x_CustomTimeZone_gmt_offset_has_minutes_mv1_result;
+    icu4x_CustomTimeZone_gmt_offset_has_minutes_mv1_result icu4x_CustomTimeZone_gmt_offset_has_minutes_mv1(const icu4x::capi::CustomTimeZone* self);
+    
+    typedef struct icu4x_CustomTimeZone_gmt_offset_has_seconds_mv1_result {union {bool ok; }; bool is_ok;} icu4x_CustomTimeZone_gmt_offset_has_seconds_mv1_result;
+    icu4x_CustomTimeZone_gmt_offset_has_seconds_mv1_result icu4x_CustomTimeZone_gmt_offset_has_seconds_mv1(const icu4x::capi::CustomTimeZone* self);
+    
+    typedef struct icu4x_CustomTimeZone_try_set_time_zone_id_mv1_result { bool is_ok;} icu4x_CustomTimeZone_try_set_time_zone_id_mv1_result;
+    icu4x_CustomTimeZone_try_set_time_zone_id_mv1_result icu4x_CustomTimeZone_try_set_time_zone_id_mv1(icu4x::capi::CustomTimeZone* self, const char* id_data, size_t id_len);
+    
+    typedef struct icu4x_CustomTimeZone_try_set_iana_time_zone_id_mv1_result { bool is_ok;} icu4x_CustomTimeZone_try_set_iana_time_zone_id_mv1_result;
+    icu4x_CustomTimeZone_try_set_iana_time_zone_id_mv1_result icu4x_CustomTimeZone_try_set_iana_time_zone_id_mv1(icu4x::capi::CustomTimeZone* self, const icu4x::capi::TimeZoneIdMapper* mapper, const char* id_data, size_t id_len);
+    
+    void icu4x_CustomTimeZone_clear_time_zone_id_mv1(icu4x::capi::CustomTimeZone* self);
+    
+    typedef struct icu4x_CustomTimeZone_time_zone_id_mv1_result { bool is_ok;} icu4x_CustomTimeZone_time_zone_id_mv1_result;
+    icu4x_CustomTimeZone_time_zone_id_mv1_result icu4x_CustomTimeZone_time_zone_id_mv1(const icu4x::capi::CustomTimeZone* self, diplomat::capi::DiplomatWrite* write);
+    
+    typedef struct icu4x_CustomTimeZone_try_set_metazone_id_mv1_result { bool is_ok;} icu4x_CustomTimeZone_try_set_metazone_id_mv1_result;
+    icu4x_CustomTimeZone_try_set_metazone_id_mv1_result icu4x_CustomTimeZone_try_set_metazone_id_mv1(icu4x::capi::CustomTimeZone* self, const char* id_data, size_t id_len);
+    
+    void icu4x_CustomTimeZone_clear_metazone_id_mv1(icu4x::capi::CustomTimeZone* self);
+    
+    typedef struct icu4x_CustomTimeZone_metazone_id_mv1_result { bool is_ok;} icu4x_CustomTimeZone_metazone_id_mv1_result;
+    icu4x_CustomTimeZone_metazone_id_mv1_result icu4x_CustomTimeZone_metazone_id_mv1(const icu4x::capi::CustomTimeZone* self, diplomat::capi::DiplomatWrite* write);
+    
+    typedef struct icu4x_CustomTimeZone_try_set_zone_variant_mv1_result { bool is_ok;} icu4x_CustomTimeZone_try_set_zone_variant_mv1_result;
+    icu4x_CustomTimeZone_try_set_zone_variant_mv1_result icu4x_CustomTimeZone_try_set_zone_variant_mv1(icu4x::capi::CustomTimeZone* self, const char* id_data, size_t id_len);
+    
+    void icu4x_CustomTimeZone_clear_zone_variant_mv1(icu4x::capi::CustomTimeZone* self);
+    
+    typedef struct icu4x_CustomTimeZone_zone_variant_mv1_result { bool is_ok;} icu4x_CustomTimeZone_zone_variant_mv1_result;
+    icu4x_CustomTimeZone_zone_variant_mv1_result icu4x_CustomTimeZone_zone_variant_mv1(const icu4x::capi::CustomTimeZone* self, diplomat::capi::DiplomatWrite* write);
+    
+    void icu4x_CustomTimeZone_set_standard_time_mv1(icu4x::capi::CustomTimeZone* self);
+    
+    void icu4x_CustomTimeZone_set_daylight_time_mv1(icu4x::capi::CustomTimeZone* self);
+    
+    typedef struct icu4x_CustomTimeZone_is_standard_time_mv1_result {union {bool ok; }; bool is_ok;} icu4x_CustomTimeZone_is_standard_time_mv1_result;
+    icu4x_CustomTimeZone_is_standard_time_mv1_result icu4x_CustomTimeZone_is_standard_time_mv1(const icu4x::capi::CustomTimeZone* self);
+    
+    typedef struct icu4x_CustomTimeZone_is_daylight_time_mv1_result {union {bool ok; }; bool is_ok;} icu4x_CustomTimeZone_is_daylight_time_mv1_result;
+    icu4x_CustomTimeZone_is_daylight_time_mv1_result icu4x_CustomTimeZone_is_daylight_time_mv1(const icu4x::capi::CustomTimeZone* self);
+    
+    void icu4x_CustomTimeZone_maybe_calculate_metazone_mv1(icu4x::capi::CustomTimeZone* self, const icu4x::capi::MetazoneCalculator* metazone_calculator, const icu4x::capi::IsoDateTime* local_datetime);
+    
+    
+    void icu4x_CustomTimeZone_destroy_mv1(CustomTimeZone* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::CustomTimeZone>, icu4x::TimeZoneInvalidOffsetError> icu4x::CustomTimeZone::from_string(std::string_view s) {
+  auto result = icu4x::capi::icu4x_CustomTimeZone_from_string_mv1(s.data(),
+    s.size());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::CustomTimeZone>, icu4x::TimeZoneInvalidOffsetError>(diplomat::Ok<std::unique_ptr<icu4x::CustomTimeZone>>(std::unique_ptr<icu4x::CustomTimeZone>(icu4x::CustomTimeZone::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::CustomTimeZone>, icu4x::TimeZoneInvalidOffsetError>(diplomat::Err<icu4x::TimeZoneInvalidOffsetError>(icu4x::TimeZoneInvalidOffsetError {}));
+}
+
+inline std::unique_ptr<icu4x::CustomTimeZone> icu4x::CustomTimeZone::empty() {
+  auto result = icu4x::capi::icu4x_CustomTimeZone_empty_mv1();
+  return std::unique_ptr<icu4x::CustomTimeZone>(icu4x::CustomTimeZone::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::CustomTimeZone> icu4x::CustomTimeZone::utc() {
+  auto result = icu4x::capi::icu4x_CustomTimeZone_utc_mv1();
+  return std::unique_ptr<icu4x::CustomTimeZone>(icu4x::CustomTimeZone::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::CustomTimeZone> icu4x::CustomTimeZone::gmt() {
+  auto result = icu4x::capi::icu4x_CustomTimeZone_gmt_mv1();
+  return std::unique_ptr<icu4x::CustomTimeZone>(icu4x::CustomTimeZone::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::CustomTimeZone> icu4x::CustomTimeZone::bst() {
+  auto result = icu4x::capi::icu4x_CustomTimeZone_bst_mv1();
+  return std::unique_ptr<icu4x::CustomTimeZone>(icu4x::CustomTimeZone::FromFFI(result));
+}
+
+inline diplomat::result<std::monostate, icu4x::TimeZoneInvalidOffsetError> icu4x::CustomTimeZone::try_set_gmt_offset_seconds(int32_t offset_seconds) {
+  auto result = icu4x::capi::icu4x_CustomTimeZone_try_set_gmt_offset_seconds_mv1(this->AsFFI(),
+    offset_seconds);
+  return result.is_ok ? diplomat::result<std::monostate, icu4x::TimeZoneInvalidOffsetError>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, icu4x::TimeZoneInvalidOffsetError>(diplomat::Err<icu4x::TimeZoneInvalidOffsetError>(icu4x::TimeZoneInvalidOffsetError {}));
+}
+
+inline void icu4x::CustomTimeZone::set_gmt_offset_eighths_of_hour(int8_t offset_eighths_of_hour) {
+  icu4x::capi::icu4x_CustomTimeZone_set_gmt_offset_eighths_of_hour_mv1(this->AsFFI(),
+    offset_eighths_of_hour);
+}
+
+inline void icu4x::CustomTimeZone::clear_gmt_offset() {
+  icu4x::capi::icu4x_CustomTimeZone_clear_gmt_offset_mv1(this->AsFFI());
+}
+
+inline std::optional<int32_t> icu4x::CustomTimeZone::gmt_offset_seconds() const {
+  auto result = icu4x::capi::icu4x_CustomTimeZone_gmt_offset_seconds_mv1(this->AsFFI());
+  return result.is_ok ? std::optional<int32_t>(result.ok) : std::nullopt;
+}
+
+inline std::optional<bool> icu4x::CustomTimeZone::is_gmt_offset_positive() const {
+  auto result = icu4x::capi::icu4x_CustomTimeZone_is_gmt_offset_positive_mv1(this->AsFFI());
+  return result.is_ok ? std::optional<bool>(result.ok) : std::nullopt;
+}
+
+inline std::optional<bool> icu4x::CustomTimeZone::is_gmt_offset_zero() const {
+  auto result = icu4x::capi::icu4x_CustomTimeZone_is_gmt_offset_zero_mv1(this->AsFFI());
+  return result.is_ok ? std::optional<bool>(result.ok) : std::nullopt;
+}
+
+inline std::optional<bool> icu4x::CustomTimeZone::gmt_offset_has_minutes() const {
+  auto result = icu4x::capi::icu4x_CustomTimeZone_gmt_offset_has_minutes_mv1(this->AsFFI());
+  return result.is_ok ? std::optional<bool>(result.ok) : std::nullopt;
+}
+
+inline std::optional<bool> icu4x::CustomTimeZone::gmt_offset_has_seconds() const {
+  auto result = icu4x::capi::icu4x_CustomTimeZone_gmt_offset_has_seconds_mv1(this->AsFFI());
+  return result.is_ok ? std::optional<bool>(result.ok) : std::nullopt;
+}
+
+inline diplomat::result<std::monostate, icu4x::TimeZoneInvalidIdError> icu4x::CustomTimeZone::try_set_time_zone_id(std::string_view id) {
+  auto result = icu4x::capi::icu4x_CustomTimeZone_try_set_time_zone_id_mv1(this->AsFFI(),
+    id.data(),
+    id.size());
+  return result.is_ok ? diplomat::result<std::monostate, icu4x::TimeZoneInvalidIdError>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, icu4x::TimeZoneInvalidIdError>(diplomat::Err<icu4x::TimeZoneInvalidIdError>(icu4x::TimeZoneInvalidIdError {}));
+}
+
+inline diplomat::result<std::monostate, icu4x::TimeZoneInvalidIdError> icu4x::CustomTimeZone::try_set_iana_time_zone_id(const icu4x::TimeZoneIdMapper& mapper, std::string_view id) {
+  auto result = icu4x::capi::icu4x_CustomTimeZone_try_set_iana_time_zone_id_mv1(this->AsFFI(),
+    mapper.AsFFI(),
+    id.data(),
+    id.size());
+  return result.is_ok ? diplomat::result<std::monostate, icu4x::TimeZoneInvalidIdError>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, icu4x::TimeZoneInvalidIdError>(diplomat::Err<icu4x::TimeZoneInvalidIdError>(icu4x::TimeZoneInvalidIdError {}));
+}
+
+inline void icu4x::CustomTimeZone::clear_time_zone_id() {
+  icu4x::capi::icu4x_CustomTimeZone_clear_time_zone_id_mv1(this->AsFFI());
+}
+
+inline std::optional<std::string> icu4x::CustomTimeZone::time_zone_id() const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_CustomTimeZone_time_zone_id_mv1(this->AsFFI(),
+    &write);
+  return result.is_ok ? std::optional<std::string>(std::move(output)) : std::nullopt;
+}
+
+inline diplomat::result<std::monostate, icu4x::TimeZoneInvalidIdError> icu4x::CustomTimeZone::try_set_metazone_id(std::string_view id) {
+  auto result = icu4x::capi::icu4x_CustomTimeZone_try_set_metazone_id_mv1(this->AsFFI(),
+    id.data(),
+    id.size());
+  return result.is_ok ? diplomat::result<std::monostate, icu4x::TimeZoneInvalidIdError>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, icu4x::TimeZoneInvalidIdError>(diplomat::Err<icu4x::TimeZoneInvalidIdError>(icu4x::TimeZoneInvalidIdError {}));
+}
+
+inline void icu4x::CustomTimeZone::clear_metazone_id() {
+  icu4x::capi::icu4x_CustomTimeZone_clear_metazone_id_mv1(this->AsFFI());
+}
+
+inline std::optional<std::string> icu4x::CustomTimeZone::metazone_id() const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_CustomTimeZone_metazone_id_mv1(this->AsFFI(),
+    &write);
+  return result.is_ok ? std::optional<std::string>(std::move(output)) : std::nullopt;
+}
+
+inline std::optional<std::monostate> icu4x::CustomTimeZone::try_set_zone_variant(std::string_view id) {
+  auto result = icu4x::capi::icu4x_CustomTimeZone_try_set_zone_variant_mv1(this->AsFFI(),
+    id.data(),
+    id.size());
+  return result.is_ok ? std::optional<std::monostate>() : std::nullopt;
+}
+
+inline void icu4x::CustomTimeZone::clear_zone_variant() {
+  icu4x::capi::icu4x_CustomTimeZone_clear_zone_variant_mv1(this->AsFFI());
+}
+
+inline std::optional<std::string> icu4x::CustomTimeZone::zone_variant() const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_CustomTimeZone_zone_variant_mv1(this->AsFFI(),
+    &write);
+  return result.is_ok ? std::optional<std::string>(std::move(output)) : std::nullopt;
+}
+
+inline void icu4x::CustomTimeZone::set_standard_time() {
+  icu4x::capi::icu4x_CustomTimeZone_set_standard_time_mv1(this->AsFFI());
+}
+
+inline void icu4x::CustomTimeZone::set_daylight_time() {
+  icu4x::capi::icu4x_CustomTimeZone_set_daylight_time_mv1(this->AsFFI());
+}
+
+inline std::optional<bool> icu4x::CustomTimeZone::is_standard_time() const {
+  auto result = icu4x::capi::icu4x_CustomTimeZone_is_standard_time_mv1(this->AsFFI());
+  return result.is_ok ? std::optional<bool>(result.ok) : std::nullopt;
+}
+
+inline std::optional<bool> icu4x::CustomTimeZone::is_daylight_time() const {
+  auto result = icu4x::capi::icu4x_CustomTimeZone_is_daylight_time_mv1(this->AsFFI());
+  return result.is_ok ? std::optional<bool>(result.ok) : std::nullopt;
+}
+
+inline void icu4x::CustomTimeZone::maybe_calculate_metazone(const icu4x::MetazoneCalculator& metazone_calculator, const icu4x::IsoDateTime& local_datetime) {
+  icu4x::capi::icu4x_CustomTimeZone_maybe_calculate_metazone_mv1(this->AsFFI(),
+    metazone_calculator.AsFFI(),
+    local_datetime.AsFFI());
+}
+
+inline const icu4x::capi::CustomTimeZone* icu4x::CustomTimeZone::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::CustomTimeZone*>(this);
+}
+
+inline icu4x::capi::CustomTimeZone* icu4x::CustomTimeZone::AsFFI() {
+  return reinterpret_cast<icu4x::capi::CustomTimeZone*>(this);
+}
+
+inline const icu4x::CustomTimeZone* icu4x::CustomTimeZone::FromFFI(const icu4x::capi::CustomTimeZone* ptr) {
+  return reinterpret_cast<const icu4x::CustomTimeZone*>(ptr);
+}
+
+inline icu4x::CustomTimeZone* icu4x::CustomTimeZone::FromFFI(icu4x::capi::CustomTimeZone* ptr) {
+  return reinterpret_cast<icu4x::CustomTimeZone*>(ptr);
+}
+
+inline void icu4x::CustomTimeZone::operator delete(void* ptr) {
+  icu4x::capi::icu4x_CustomTimeZone_destroy_mv1(reinterpret_cast<icu4x::capi::CustomTimeZone*>(ptr));
+}
+
+
+#endif // icu4x_CustomTimeZone_HPP
diff --git a/ffi/capi/bindings/cpp/DataError.d.hpp b/ffi/capi/bindings/cpp/icu4x/DataError.d.hpp
similarity index 77%
rename from ffi/capi/bindings/cpp/DataError.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/DataError.d.hpp
index f9b78f1325f..403ef66e3a4 100644
--- a/ffi/capi/bindings/cpp/DataError.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/DataError.d.hpp
@@ -1,5 +1,5 @@
-#ifndef DataError_D_HPP
-#define DataError_D_HPP
+#ifndef icu4x_DataError_D_HPP
+#define icu4x_DataError_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum DataError {
       DataError_Unknown = 0,
@@ -26,6 +26,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class DataError {
 public:
   enum Value {
@@ -47,11 +48,11 @@ class DataError {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::DataError AsFFI() const;
-  inline static DataError FromFFI(diplomat::capi::DataError c_enum);
+  inline icu4x::capi::DataError AsFFI() const;
+  inline static icu4x::DataError FromFFI(icu4x::capi::DataError c_enum);
 private:
     Value value;
 };
 
-
-#endif // DataError_D_HPP
+} // namespace
+#endif // icu4x_DataError_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/DataError.hpp b/ffi/capi/bindings/cpp/icu4x/DataError.hpp
new file mode 100644
index 00000000000..0f82ec219b4
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/DataError.hpp
@@ -0,0 +1,44 @@
+#ifndef icu4x_DataError_HPP
+#define icu4x_DataError_HPP
+
+#include "DataError.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::DataError icu4x::DataError::AsFFI() const {
+  return static_cast<icu4x::capi::DataError>(value);
+}
+
+inline icu4x::DataError icu4x::DataError::FromFFI(icu4x::capi::DataError c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::DataError_Unknown:
+    case icu4x::capi::DataError_MarkerNotFound:
+    case icu4x::capi::DataError_IdentifierNotFound:
+    case icu4x::capi::DataError_InvalidRequest:
+    case icu4x::capi::DataError_InconsistentData:
+    case icu4x::capi::DataError_Downcast:
+    case icu4x::capi::DataError_Deserialize:
+    case icu4x::capi::DataError_Custom:
+    case icu4x::capi::DataError_Io:
+      return static_cast<icu4x::DataError::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_DataError_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/DataProvider.d.hpp b/ffi/capi/bindings/cpp/icu4x/DataProvider.d.hpp
new file mode 100644
index 00000000000..9bca1b49c01
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/DataProvider.d.hpp
@@ -0,0 +1,60 @@
+#ifndef icu4x_DataProvider_D_HPP
+#define icu4x_DataProvider_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct LocaleFallbacker; }
+class LocaleFallbacker;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct DataProvider;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class DataProvider {
+public:
+
+  inline static std::unique_ptr<icu4x::DataProvider> compiled();
+
+  inline static diplomat::result<std::unique_ptr<icu4x::DataProvider>, icu4x::DataError> from_fs(std::string_view path);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::DataProvider>, icu4x::DataError> from_byte_slice(diplomat::span<const uint8_t> blob);
+
+  inline static std::unique_ptr<icu4x::DataProvider> empty();
+
+  inline diplomat::result<std::monostate, icu4x::DataError> fork_by_key(icu4x::DataProvider& other);
+
+  inline diplomat::result<std::monostate, icu4x::DataError> fork_by_locale(icu4x::DataProvider& other);
+
+  inline diplomat::result<std::monostate, icu4x::DataError> enable_locale_fallback_with(const icu4x::LocaleFallbacker& fallbacker);
+
+  inline const icu4x::capi::DataProvider* AsFFI() const;
+  inline icu4x::capi::DataProvider* AsFFI();
+  inline static const icu4x::DataProvider* FromFFI(const icu4x::capi::DataProvider* ptr);
+  inline static icu4x::DataProvider* FromFFI(icu4x::capi::DataProvider* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  DataProvider() = delete;
+  DataProvider(const icu4x::DataProvider&) = delete;
+  DataProvider(icu4x::DataProvider&&) noexcept = delete;
+  DataProvider operator=(const icu4x::DataProvider&) = delete;
+  DataProvider operator=(icu4x::DataProvider&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_DataProvider_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/DataProvider.hpp b/ffi/capi/bindings/cpp/icu4x/DataProvider.hpp
new file mode 100644
index 00000000000..cf59b326375
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/DataProvider.hpp
@@ -0,0 +1,108 @@
+#ifndef icu4x_DataProvider_HPP
+#define icu4x_DataProvider_HPP
+
+#include "DataProvider.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "LocaleFallbacker.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    icu4x::capi::DataProvider* icu4x_DataProvider_compiled_mv1(void);
+    
+    typedef struct icu4x_DataProvider_from_fs_mv1_result {union {icu4x::capi::DataProvider* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_DataProvider_from_fs_mv1_result;
+    icu4x_DataProvider_from_fs_mv1_result icu4x_DataProvider_from_fs_mv1(const char* path_data, size_t path_len);
+    
+    typedef struct icu4x_DataProvider_from_byte_slice_mv1_result {union {icu4x::capi::DataProvider* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_DataProvider_from_byte_slice_mv1_result;
+    icu4x_DataProvider_from_byte_slice_mv1_result icu4x_DataProvider_from_byte_slice_mv1(const uint8_t* blob_data, size_t blob_len);
+    
+    icu4x::capi::DataProvider* icu4x_DataProvider_empty_mv1(void);
+    
+    typedef struct icu4x_DataProvider_fork_by_key_mv1_result {union { icu4x::capi::DataError err;}; bool is_ok;} icu4x_DataProvider_fork_by_key_mv1_result;
+    icu4x_DataProvider_fork_by_key_mv1_result icu4x_DataProvider_fork_by_key_mv1(icu4x::capi::DataProvider* self, icu4x::capi::DataProvider* other);
+    
+    typedef struct icu4x_DataProvider_fork_by_locale_mv1_result {union { icu4x::capi::DataError err;}; bool is_ok;} icu4x_DataProvider_fork_by_locale_mv1_result;
+    icu4x_DataProvider_fork_by_locale_mv1_result icu4x_DataProvider_fork_by_locale_mv1(icu4x::capi::DataProvider* self, icu4x::capi::DataProvider* other);
+    
+    typedef struct icu4x_DataProvider_enable_locale_fallback_with_mv1_result {union { icu4x::capi::DataError err;}; bool is_ok;} icu4x_DataProvider_enable_locale_fallback_with_mv1_result;
+    icu4x_DataProvider_enable_locale_fallback_with_mv1_result icu4x_DataProvider_enable_locale_fallback_with_mv1(icu4x::capi::DataProvider* self, const icu4x::capi::LocaleFallbacker* fallbacker);
+    
+    
+    void icu4x_DataProvider_destroy_mv1(DataProvider* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline std::unique_ptr<icu4x::DataProvider> icu4x::DataProvider::compiled() {
+  auto result = icu4x::capi::icu4x_DataProvider_compiled_mv1();
+  return std::unique_ptr<icu4x::DataProvider>(icu4x::DataProvider::FromFFI(result));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::DataProvider>, icu4x::DataError> icu4x::DataProvider::from_fs(std::string_view path) {
+  auto result = icu4x::capi::icu4x_DataProvider_from_fs_mv1(path.data(),
+    path.size());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::DataProvider>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::DataProvider>>(std::unique_ptr<icu4x::DataProvider>(icu4x::DataProvider::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::DataProvider>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::DataProvider>, icu4x::DataError> icu4x::DataProvider::from_byte_slice(diplomat::span<const uint8_t> blob) {
+  auto result = icu4x::capi::icu4x_DataProvider_from_byte_slice_mv1(blob.data(),
+    blob.size());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::DataProvider>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::DataProvider>>(std::unique_ptr<icu4x::DataProvider>(icu4x::DataProvider::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::DataProvider>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline std::unique_ptr<icu4x::DataProvider> icu4x::DataProvider::empty() {
+  auto result = icu4x::capi::icu4x_DataProvider_empty_mv1();
+  return std::unique_ptr<icu4x::DataProvider>(icu4x::DataProvider::FromFFI(result));
+}
+
+inline diplomat::result<std::monostate, icu4x::DataError> icu4x::DataProvider::fork_by_key(icu4x::DataProvider& other) {
+  auto result = icu4x::capi::icu4x_DataProvider_fork_by_key_mv1(this->AsFFI(),
+    other.AsFFI());
+  return result.is_ok ? diplomat::result<std::monostate, icu4x::DataError>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::monostate, icu4x::DataError> icu4x::DataProvider::fork_by_locale(icu4x::DataProvider& other) {
+  auto result = icu4x::capi::icu4x_DataProvider_fork_by_locale_mv1(this->AsFFI(),
+    other.AsFFI());
+  return result.is_ok ? diplomat::result<std::monostate, icu4x::DataError>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::monostate, icu4x::DataError> icu4x::DataProvider::enable_locale_fallback_with(const icu4x::LocaleFallbacker& fallbacker) {
+  auto result = icu4x::capi::icu4x_DataProvider_enable_locale_fallback_with_mv1(this->AsFFI(),
+    fallbacker.AsFFI());
+  return result.is_ok ? diplomat::result<std::monostate, icu4x::DataError>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline const icu4x::capi::DataProvider* icu4x::DataProvider::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::DataProvider*>(this);
+}
+
+inline icu4x::capi::DataProvider* icu4x::DataProvider::AsFFI() {
+  return reinterpret_cast<icu4x::capi::DataProvider*>(this);
+}
+
+inline const icu4x::DataProvider* icu4x::DataProvider::FromFFI(const icu4x::capi::DataProvider* ptr) {
+  return reinterpret_cast<const icu4x::DataProvider*>(ptr);
+}
+
+inline icu4x::DataProvider* icu4x::DataProvider::FromFFI(icu4x::capi::DataProvider* ptr) {
+  return reinterpret_cast<icu4x::DataProvider*>(ptr);
+}
+
+inline void icu4x::DataProvider::operator delete(void* ptr) {
+  icu4x::capi::icu4x_DataProvider_destroy_mv1(reinterpret_cast<icu4x::capi::DataProvider*>(ptr));
+}
+
+
+#endif // icu4x_DataProvider_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/Date.d.hpp b/ffi/capi/bindings/cpp/icu4x/Date.d.hpp
new file mode 100644
index 00000000000..91421e7e283
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/Date.d.hpp
@@ -0,0 +1,89 @@
+#ifndef icu4x_Date_D_HPP
+#define icu4x_Date_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct Calendar; }
+class Calendar;
+namespace capi { struct Date; }
+class Date;
+namespace capi { struct IsoDate; }
+class IsoDate;
+namespace capi { struct WeekCalculator; }
+class WeekCalculator;
+struct WeekOf;
+class CalendarError;
+class CalendarParseError;
+class IsoWeekday;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct Date;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class Date {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::Date>, icu4x::CalendarError> from_iso_in_calendar(int32_t year, uint8_t month, uint8_t day, const icu4x::Calendar& calendar);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::Date>, icu4x::CalendarError> from_codes_in_calendar(std::string_view era_code, int32_t year, std::string_view month_code, uint8_t day, const icu4x::Calendar& calendar);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::Date>, icu4x::CalendarParseError> from_string(std::string_view v);
+
+  inline std::unique_ptr<icu4x::Date> to_calendar(const icu4x::Calendar& calendar) const;
+
+  inline std::unique_ptr<icu4x::IsoDate> to_iso() const;
+
+  inline uint16_t day_of_year() const;
+
+  inline uint32_t day_of_month() const;
+
+  inline icu4x::IsoWeekday day_of_week() const;
+
+  inline uint32_t week_of_month(icu4x::IsoWeekday first_weekday) const;
+
+  inline icu4x::WeekOf week_of_year(const icu4x::WeekCalculator& calculator) const;
+
+  inline uint32_t ordinal_month() const;
+
+  inline std::string month_code() const;
+
+  inline int32_t year_in_era() const;
+
+  inline std::string era() const;
+
+  inline uint8_t months_in_year() const;
+
+  inline uint8_t days_in_month() const;
+
+  inline uint16_t days_in_year() const;
+
+  inline std::unique_ptr<icu4x::Calendar> calendar() const;
+
+  inline const icu4x::capi::Date* AsFFI() const;
+  inline icu4x::capi::Date* AsFFI();
+  inline static const icu4x::Date* FromFFI(const icu4x::capi::Date* ptr);
+  inline static icu4x::Date* FromFFI(icu4x::capi::Date* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  Date() = delete;
+  Date(const icu4x::Date&) = delete;
+  Date(icu4x::Date&&) noexcept = delete;
+  Date operator=(const icu4x::Date&) = delete;
+  Date operator=(icu4x::Date&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_Date_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/Date.hpp b/ffi/capi/bindings/cpp/icu4x/Date.hpp
new file mode 100644
index 00000000000..c18b42685cf
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/Date.hpp
@@ -0,0 +1,202 @@
+#ifndef icu4x_Date_HPP
+#define icu4x_Date_HPP
+
+#include "Date.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "Calendar.hpp"
+#include "CalendarError.hpp"
+#include "CalendarParseError.hpp"
+#include "IsoDate.hpp"
+#include "IsoWeekday.hpp"
+#include "WeekCalculator.hpp"
+#include "WeekOf.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_Date_from_iso_in_calendar_mv1_result {union {icu4x::capi::Date* ok; icu4x::capi::CalendarError err;}; bool is_ok;} icu4x_Date_from_iso_in_calendar_mv1_result;
+    icu4x_Date_from_iso_in_calendar_mv1_result icu4x_Date_from_iso_in_calendar_mv1(int32_t year, uint8_t month, uint8_t day, const icu4x::capi::Calendar* calendar);
+    
+    typedef struct icu4x_Date_from_codes_in_calendar_mv1_result {union {icu4x::capi::Date* ok; icu4x::capi::CalendarError err;}; bool is_ok;} icu4x_Date_from_codes_in_calendar_mv1_result;
+    icu4x_Date_from_codes_in_calendar_mv1_result icu4x_Date_from_codes_in_calendar_mv1(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 icu4x::capi::Calendar* calendar);
+    
+    typedef struct icu4x_Date_from_string_mv1_result {union {icu4x::capi::Date* ok; icu4x::capi::CalendarParseError err;}; bool is_ok;} icu4x_Date_from_string_mv1_result;
+    icu4x_Date_from_string_mv1_result icu4x_Date_from_string_mv1(const char* v_data, size_t v_len);
+    
+    icu4x::capi::Date* icu4x_Date_to_calendar_mv1(const icu4x::capi::Date* self, const icu4x::capi::Calendar* calendar);
+    
+    icu4x::capi::IsoDate* icu4x_Date_to_iso_mv1(const icu4x::capi::Date* self);
+    
+    uint16_t icu4x_Date_day_of_year_mv1(const icu4x::capi::Date* self);
+    
+    uint32_t icu4x_Date_day_of_month_mv1(const icu4x::capi::Date* self);
+    
+    icu4x::capi::IsoWeekday icu4x_Date_day_of_week_mv1(const icu4x::capi::Date* self);
+    
+    uint32_t icu4x_Date_week_of_month_mv1(const icu4x::capi::Date* self, icu4x::capi::IsoWeekday first_weekday);
+    
+    icu4x::capi::WeekOf icu4x_Date_week_of_year_mv1(const icu4x::capi::Date* self, const icu4x::capi::WeekCalculator* calculator);
+    
+    uint32_t icu4x_Date_ordinal_month_mv1(const icu4x::capi::Date* self);
+    
+    void icu4x_Date_month_code_mv1(const icu4x::capi::Date* self, diplomat::capi::DiplomatWrite* write);
+    
+    int32_t icu4x_Date_year_in_era_mv1(const icu4x::capi::Date* self);
+    
+    void icu4x_Date_era_mv1(const icu4x::capi::Date* self, diplomat::capi::DiplomatWrite* write);
+    
+    uint8_t icu4x_Date_months_in_year_mv1(const icu4x::capi::Date* self);
+    
+    uint8_t icu4x_Date_days_in_month_mv1(const icu4x::capi::Date* self);
+    
+    uint16_t icu4x_Date_days_in_year_mv1(const icu4x::capi::Date* self);
+    
+    icu4x::capi::Calendar* icu4x_Date_calendar_mv1(const icu4x::capi::Date* self);
+    
+    
+    void icu4x_Date_destroy_mv1(Date* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::Date>, icu4x::CalendarError> icu4x::Date::from_iso_in_calendar(int32_t year, uint8_t month, uint8_t day, const icu4x::Calendar& calendar) {
+  auto result = icu4x::capi::icu4x_Date_from_iso_in_calendar_mv1(year,
+    month,
+    day,
+    calendar.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::Date>, icu4x::CalendarError>(diplomat::Ok<std::unique_ptr<icu4x::Date>>(std::unique_ptr<icu4x::Date>(icu4x::Date::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::Date>, icu4x::CalendarError>(diplomat::Err<icu4x::CalendarError>(icu4x::CalendarError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::Date>, icu4x::CalendarError> icu4x::Date::from_codes_in_calendar(std::string_view era_code, int32_t year, std::string_view month_code, uint8_t day, const icu4x::Calendar& calendar) {
+  auto result = icu4x::capi::icu4x_Date_from_codes_in_calendar_mv1(era_code.data(),
+    era_code.size(),
+    year,
+    month_code.data(),
+    month_code.size(),
+    day,
+    calendar.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::Date>, icu4x::CalendarError>(diplomat::Ok<std::unique_ptr<icu4x::Date>>(std::unique_ptr<icu4x::Date>(icu4x::Date::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::Date>, icu4x::CalendarError>(diplomat::Err<icu4x::CalendarError>(icu4x::CalendarError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::Date>, icu4x::CalendarParseError> icu4x::Date::from_string(std::string_view v) {
+  auto result = icu4x::capi::icu4x_Date_from_string_mv1(v.data(),
+    v.size());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::Date>, icu4x::CalendarParseError>(diplomat::Ok<std::unique_ptr<icu4x::Date>>(std::unique_ptr<icu4x::Date>(icu4x::Date::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::Date>, icu4x::CalendarParseError>(diplomat::Err<icu4x::CalendarParseError>(icu4x::CalendarParseError::FromFFI(result.err)));
+}
+
+inline std::unique_ptr<icu4x::Date> icu4x::Date::to_calendar(const icu4x::Calendar& calendar) const {
+  auto result = icu4x::capi::icu4x_Date_to_calendar_mv1(this->AsFFI(),
+    calendar.AsFFI());
+  return std::unique_ptr<icu4x::Date>(icu4x::Date::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::IsoDate> icu4x::Date::to_iso() const {
+  auto result = icu4x::capi::icu4x_Date_to_iso_mv1(this->AsFFI());
+  return std::unique_ptr<icu4x::IsoDate>(icu4x::IsoDate::FromFFI(result));
+}
+
+inline uint16_t icu4x::Date::day_of_year() const {
+  auto result = icu4x::capi::icu4x_Date_day_of_year_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint32_t icu4x::Date::day_of_month() const {
+  auto result = icu4x::capi::icu4x_Date_day_of_month_mv1(this->AsFFI());
+  return result;
+}
+
+inline icu4x::IsoWeekday icu4x::Date::day_of_week() const {
+  auto result = icu4x::capi::icu4x_Date_day_of_week_mv1(this->AsFFI());
+  return icu4x::IsoWeekday::FromFFI(result);
+}
+
+inline uint32_t icu4x::Date::week_of_month(icu4x::IsoWeekday first_weekday) const {
+  auto result = icu4x::capi::icu4x_Date_week_of_month_mv1(this->AsFFI(),
+    first_weekday.AsFFI());
+  return result;
+}
+
+inline icu4x::WeekOf icu4x::Date::week_of_year(const icu4x::WeekCalculator& calculator) const {
+  auto result = icu4x::capi::icu4x_Date_week_of_year_mv1(this->AsFFI(),
+    calculator.AsFFI());
+  return icu4x::WeekOf::FromFFI(result);
+}
+
+inline uint32_t icu4x::Date::ordinal_month() const {
+  auto result = icu4x::capi::icu4x_Date_ordinal_month_mv1(this->AsFFI());
+  return result;
+}
+
+inline std::string icu4x::Date::month_code() const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_Date_month_code_mv1(this->AsFFI(),
+    &write);
+  return output;
+}
+
+inline int32_t icu4x::Date::year_in_era() const {
+  auto result = icu4x::capi::icu4x_Date_year_in_era_mv1(this->AsFFI());
+  return result;
+}
+
+inline std::string icu4x::Date::era() const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_Date_era_mv1(this->AsFFI(),
+    &write);
+  return output;
+}
+
+inline uint8_t icu4x::Date::months_in_year() const {
+  auto result = icu4x::capi::icu4x_Date_months_in_year_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint8_t icu4x::Date::days_in_month() const {
+  auto result = icu4x::capi::icu4x_Date_days_in_month_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint16_t icu4x::Date::days_in_year() const {
+  auto result = icu4x::capi::icu4x_Date_days_in_year_mv1(this->AsFFI());
+  return result;
+}
+
+inline std::unique_ptr<icu4x::Calendar> icu4x::Date::calendar() const {
+  auto result = icu4x::capi::icu4x_Date_calendar_mv1(this->AsFFI());
+  return std::unique_ptr<icu4x::Calendar>(icu4x::Calendar::FromFFI(result));
+}
+
+inline const icu4x::capi::Date* icu4x::Date::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::Date*>(this);
+}
+
+inline icu4x::capi::Date* icu4x::Date::AsFFI() {
+  return reinterpret_cast<icu4x::capi::Date*>(this);
+}
+
+inline const icu4x::Date* icu4x::Date::FromFFI(const icu4x::capi::Date* ptr) {
+  return reinterpret_cast<const icu4x::Date*>(ptr);
+}
+
+inline icu4x::Date* icu4x::Date::FromFFI(icu4x::capi::Date* ptr) {
+  return reinterpret_cast<icu4x::Date*>(ptr);
+}
+
+inline void icu4x::Date::operator delete(void* ptr) {
+  icu4x::capi::icu4x_Date_destroy_mv1(reinterpret_cast<icu4x::capi::Date*>(ptr));
+}
+
+
+#endif // icu4x_Date_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/DateFormatter.d.hpp b/ffi/capi/bindings/cpp/icu4x/DateFormatter.d.hpp
new file mode 100644
index 00000000000..2c9200bd83f
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/DateFormatter.d.hpp
@@ -0,0 +1,67 @@
+#ifndef icu4x_DateFormatter_D_HPP
+#define icu4x_DateFormatter_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct Date; }
+class Date;
+namespace capi { struct DateFormatter; }
+class DateFormatter;
+namespace capi { struct DateTime; }
+class DateTime;
+namespace capi { struct IsoDate; }
+class IsoDate;
+namespace capi { struct IsoDateTime; }
+class IsoDateTime;
+namespace capi { struct Locale; }
+class Locale;
+class DateLength;
+class Error;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct DateFormatter;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class DateFormatter {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::DateFormatter>, icu4x::Error> create_with_length(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::DateLength date_length);
+
+  inline diplomat::result<std::string, icu4x::Error> format_date(const icu4x::Date& value) const;
+
+  inline diplomat::result<std::string, icu4x::Error> format_iso_date(const icu4x::IsoDate& value) const;
+
+  inline diplomat::result<std::string, icu4x::Error> format_datetime(const icu4x::DateTime& value) const;
+
+  inline diplomat::result<std::string, icu4x::Error> format_iso_datetime(const icu4x::IsoDateTime& value) const;
+
+  inline const icu4x::capi::DateFormatter* AsFFI() const;
+  inline icu4x::capi::DateFormatter* AsFFI();
+  inline static const icu4x::DateFormatter* FromFFI(const icu4x::capi::DateFormatter* ptr);
+  inline static icu4x::DateFormatter* FromFFI(icu4x::capi::DateFormatter* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  DateFormatter() = delete;
+  DateFormatter(const icu4x::DateFormatter&) = delete;
+  DateFormatter(icu4x::DateFormatter&&) noexcept = delete;
+  DateFormatter operator=(const icu4x::DateFormatter&) = delete;
+  DateFormatter operator=(icu4x::DateFormatter&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_DateFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/DateFormatter.hpp b/ffi/capi/bindings/cpp/icu4x/DateFormatter.hpp
new file mode 100644
index 00000000000..bc584805b7f
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/DateFormatter.hpp
@@ -0,0 +1,113 @@
+#ifndef icu4x_DateFormatter_HPP
+#define icu4x_DateFormatter_HPP
+
+#include "DateFormatter.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataProvider.hpp"
+#include "Date.hpp"
+#include "DateLength.hpp"
+#include "DateTime.hpp"
+#include "Error.hpp"
+#include "IsoDate.hpp"
+#include "IsoDateTime.hpp"
+#include "Locale.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_DateFormatter_create_with_length_mv1_result {union {icu4x::capi::DateFormatter* ok; icu4x::capi::Error err;}; bool is_ok;} icu4x_DateFormatter_create_with_length_mv1_result;
+    icu4x_DateFormatter_create_with_length_mv1_result icu4x_DateFormatter_create_with_length_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale, icu4x::capi::DateLength date_length);
+    
+    typedef struct icu4x_DateFormatter_format_date_mv1_result {union { icu4x::capi::Error err;}; bool is_ok;} icu4x_DateFormatter_format_date_mv1_result;
+    icu4x_DateFormatter_format_date_mv1_result icu4x_DateFormatter_format_date_mv1(const icu4x::capi::DateFormatter* self, const icu4x::capi::Date* value, diplomat::capi::DiplomatWrite* write);
+    
+    typedef struct icu4x_DateFormatter_format_iso_date_mv1_result {union { icu4x::capi::Error err;}; bool is_ok;} icu4x_DateFormatter_format_iso_date_mv1_result;
+    icu4x_DateFormatter_format_iso_date_mv1_result icu4x_DateFormatter_format_iso_date_mv1(const icu4x::capi::DateFormatter* self, const icu4x::capi::IsoDate* value, diplomat::capi::DiplomatWrite* write);
+    
+    typedef struct icu4x_DateFormatter_format_datetime_mv1_result {union { icu4x::capi::Error err;}; bool is_ok;} icu4x_DateFormatter_format_datetime_mv1_result;
+    icu4x_DateFormatter_format_datetime_mv1_result icu4x_DateFormatter_format_datetime_mv1(const icu4x::capi::DateFormatter* self, const icu4x::capi::DateTime* value, diplomat::capi::DiplomatWrite* write);
+    
+    typedef struct icu4x_DateFormatter_format_iso_datetime_mv1_result {union { icu4x::capi::Error err;}; bool is_ok;} icu4x_DateFormatter_format_iso_datetime_mv1_result;
+    icu4x_DateFormatter_format_iso_datetime_mv1_result icu4x_DateFormatter_format_iso_datetime_mv1(const icu4x::capi::DateFormatter* self, const icu4x::capi::IsoDateTime* value, diplomat::capi::DiplomatWrite* write);
+    
+    
+    void icu4x_DateFormatter_destroy_mv1(DateFormatter* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::DateFormatter>, icu4x::Error> icu4x::DateFormatter::create_with_length(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::DateLength date_length) {
+  auto result = icu4x::capi::icu4x_DateFormatter_create_with_length_mv1(provider.AsFFI(),
+    locale.AsFFI(),
+    date_length.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::DateFormatter>, icu4x::Error>(diplomat::Ok<std::unique_ptr<icu4x::DateFormatter>>(std::unique_ptr<icu4x::DateFormatter>(icu4x::DateFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::DateFormatter>, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::string, icu4x::Error> icu4x::DateFormatter::format_date(const icu4x::Date& value) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_DateFormatter_format_date_mv1(this->AsFFI(),
+    value.AsFFI(),
+    &write);
+  return result.is_ok ? diplomat::result<std::string, icu4x::Error>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::string, icu4x::Error> icu4x::DateFormatter::format_iso_date(const icu4x::IsoDate& value) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_DateFormatter_format_iso_date_mv1(this->AsFFI(),
+    value.AsFFI(),
+    &write);
+  return result.is_ok ? diplomat::result<std::string, icu4x::Error>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::string, icu4x::Error> icu4x::DateFormatter::format_datetime(const icu4x::DateTime& value) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_DateFormatter_format_datetime_mv1(this->AsFFI(),
+    value.AsFFI(),
+    &write);
+  return result.is_ok ? diplomat::result<std::string, icu4x::Error>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::string, icu4x::Error> icu4x::DateFormatter::format_iso_datetime(const icu4x::IsoDateTime& value) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_DateFormatter_format_iso_datetime_mv1(this->AsFFI(),
+    value.AsFFI(),
+    &write);
+  return result.is_ok ? diplomat::result<std::string, icu4x::Error>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline const icu4x::capi::DateFormatter* icu4x::DateFormatter::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::DateFormatter*>(this);
+}
+
+inline icu4x::capi::DateFormatter* icu4x::DateFormatter::AsFFI() {
+  return reinterpret_cast<icu4x::capi::DateFormatter*>(this);
+}
+
+inline const icu4x::DateFormatter* icu4x::DateFormatter::FromFFI(const icu4x::capi::DateFormatter* ptr) {
+  return reinterpret_cast<const icu4x::DateFormatter*>(ptr);
+}
+
+inline icu4x::DateFormatter* icu4x::DateFormatter::FromFFI(icu4x::capi::DateFormatter* ptr) {
+  return reinterpret_cast<icu4x::DateFormatter*>(ptr);
+}
+
+inline void icu4x::DateFormatter::operator delete(void* ptr) {
+  icu4x::capi::icu4x_DateFormatter_destroy_mv1(reinterpret_cast<icu4x::capi::DateFormatter*>(ptr));
+}
+
+
+#endif // icu4x_DateFormatter_HPP
diff --git a/ffi/capi/bindings/cpp/DateLength.d.hpp b/ffi/capi/bindings/cpp/icu4x/DateLength.d.hpp
similarity index 69%
rename from ffi/capi/bindings/cpp/DateLength.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/DateLength.d.hpp
index 73eed4ff111..cef2f476ec9 100644
--- a/ffi/capi/bindings/cpp/DateLength.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/DateLength.d.hpp
@@ -1,5 +1,5 @@
-#ifndef DateLength_D_HPP
-#define DateLength_D_HPP
+#ifndef icu4x_DateLength_D_HPP
+#define icu4x_DateLength_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum DateLength {
       DateLength_Full = 0,
@@ -21,6 +21,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class DateLength {
 public:
   enum Value {
@@ -37,11 +38,11 @@ class DateLength {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::DateLength AsFFI() const;
-  inline static DateLength FromFFI(diplomat::capi::DateLength c_enum);
+  inline icu4x::capi::DateLength AsFFI() const;
+  inline static icu4x::DateLength FromFFI(icu4x::capi::DateLength c_enum);
 private:
     Value value;
 };
 
-
-#endif // DateLength_D_HPP
+} // namespace
+#endif // icu4x_DateLength_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/DateLength.hpp b/ffi/capi/bindings/cpp/icu4x/DateLength.hpp
new file mode 100644
index 00000000000..8db8ddcf8bd
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/DateLength.hpp
@@ -0,0 +1,39 @@
+#ifndef icu4x_DateLength_HPP
+#define icu4x_DateLength_HPP
+
+#include "DateLength.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::DateLength icu4x::DateLength::AsFFI() const {
+  return static_cast<icu4x::capi::DateLength>(value);
+}
+
+inline icu4x::DateLength icu4x::DateLength::FromFFI(icu4x::capi::DateLength c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::DateLength_Full:
+    case icu4x::capi::DateLength_Long:
+    case icu4x::capi::DateLength_Medium:
+    case icu4x::capi::DateLength_Short:
+      return static_cast<icu4x::DateLength::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_DateLength_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/DateTime.d.hpp b/ffi/capi/bindings/cpp/icu4x/DateTime.d.hpp
new file mode 100644
index 00000000000..8abe49daefe
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/DateTime.d.hpp
@@ -0,0 +1,107 @@
+#ifndef icu4x_DateTime_D_HPP
+#define icu4x_DateTime_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct Calendar; }
+class Calendar;
+namespace capi { struct Date; }
+class Date;
+namespace capi { struct DateTime; }
+class DateTime;
+namespace capi { struct IsoDateTime; }
+class IsoDateTime;
+namespace capi { struct Time; }
+class Time;
+namespace capi { struct WeekCalculator; }
+class WeekCalculator;
+struct WeekOf;
+class CalendarError;
+class CalendarParseError;
+class IsoWeekday;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct DateTime;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class DateTime {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::DateTime>, icu4x::CalendarError> 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 icu4x::Calendar& calendar);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::DateTime>, icu4x::CalendarError> from_codes_in_calendar(std::string_view era_code, int32_t year, std::string_view month_code, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond, const icu4x::Calendar& calendar);
+
+  inline static std::unique_ptr<icu4x::DateTime> from_date_and_time(const icu4x::Date& date, const icu4x::Time& time);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::DateTime>, icu4x::CalendarParseError> from_string(std::string_view v);
+
+  inline std::unique_ptr<icu4x::Date> date() const;
+
+  inline std::unique_ptr<icu4x::Time> time() const;
+
+  inline std::unique_ptr<icu4x::IsoDateTime> to_iso() const;
+
+  inline std::unique_ptr<icu4x::DateTime> to_calendar(const icu4x::Calendar& calendar) const;
+
+  inline uint8_t hour() const;
+
+  inline uint8_t minute() const;
+
+  inline uint8_t second() const;
+
+  inline uint32_t nanosecond() const;
+
+  inline uint16_t day_of_year() const;
+
+  inline uint32_t day_of_month() const;
+
+  inline icu4x::IsoWeekday day_of_week() const;
+
+  inline uint32_t week_of_month(icu4x::IsoWeekday first_weekday) const;
+
+  inline icu4x::WeekOf week_of_year(const icu4x::WeekCalculator& calculator) const;
+
+  inline uint32_t ordinal_month() const;
+
+  inline std::string month_code() const;
+
+  inline int32_t year_in_era() const;
+
+  inline std::string era() const;
+
+  inline uint8_t months_in_year() const;
+
+  inline uint8_t days_in_month() const;
+
+  inline uint16_t days_in_year() const;
+
+  inline std::unique_ptr<icu4x::Calendar> calendar() const;
+
+  inline const icu4x::capi::DateTime* AsFFI() const;
+  inline icu4x::capi::DateTime* AsFFI();
+  inline static const icu4x::DateTime* FromFFI(const icu4x::capi::DateTime* ptr);
+  inline static icu4x::DateTime* FromFFI(icu4x::capi::DateTime* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  DateTime() = delete;
+  DateTime(const icu4x::DateTime&) = delete;
+  DateTime(icu4x::DateTime&&) noexcept = delete;
+  DateTime operator=(const icu4x::DateTime&) = delete;
+  DateTime operator=(icu4x::DateTime&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_DateTime_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/DateTime.hpp b/ffi/capi/bindings/cpp/icu4x/DateTime.hpp
new file mode 100644
index 00000000000..8fb4b618e07
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/DateTime.hpp
@@ -0,0 +1,262 @@
+#ifndef icu4x_DateTime_HPP
+#define icu4x_DateTime_HPP
+
+#include "DateTime.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "Calendar.hpp"
+#include "CalendarError.hpp"
+#include "CalendarParseError.hpp"
+#include "Date.hpp"
+#include "IsoDateTime.hpp"
+#include "IsoWeekday.hpp"
+#include "Time.hpp"
+#include "WeekCalculator.hpp"
+#include "WeekOf.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_DateTime_from_iso_in_calendar_mv1_result {union {icu4x::capi::DateTime* ok; icu4x::capi::CalendarError err;}; bool is_ok;} icu4x_DateTime_from_iso_in_calendar_mv1_result;
+    icu4x_DateTime_from_iso_in_calendar_mv1_result icu4x_DateTime_from_iso_in_calendar_mv1(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond, const icu4x::capi::Calendar* calendar);
+    
+    typedef struct icu4x_DateTime_from_codes_in_calendar_mv1_result {union {icu4x::capi::DateTime* ok; icu4x::capi::CalendarError err;}; bool is_ok;} icu4x_DateTime_from_codes_in_calendar_mv1_result;
+    icu4x_DateTime_from_codes_in_calendar_mv1_result icu4x_DateTime_from_codes_in_calendar_mv1(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 icu4x::capi::Calendar* calendar);
+    
+    icu4x::capi::DateTime* icu4x_DateTime_from_date_and_time_mv1(const icu4x::capi::Date* date, const icu4x::capi::Time* time);
+    
+    typedef struct icu4x_DateTime_from_string_mv1_result {union {icu4x::capi::DateTime* ok; icu4x::capi::CalendarParseError err;}; bool is_ok;} icu4x_DateTime_from_string_mv1_result;
+    icu4x_DateTime_from_string_mv1_result icu4x_DateTime_from_string_mv1(const char* v_data, size_t v_len);
+    
+    icu4x::capi::Date* icu4x_DateTime_date_mv1(const icu4x::capi::DateTime* self);
+    
+    icu4x::capi::Time* icu4x_DateTime_time_mv1(const icu4x::capi::DateTime* self);
+    
+    icu4x::capi::IsoDateTime* icu4x_DateTime_to_iso_mv1(const icu4x::capi::DateTime* self);
+    
+    icu4x::capi::DateTime* icu4x_DateTime_to_calendar_mv1(const icu4x::capi::DateTime* self, const icu4x::capi::Calendar* calendar);
+    
+    uint8_t icu4x_DateTime_hour_mv1(const icu4x::capi::DateTime* self);
+    
+    uint8_t icu4x_DateTime_minute_mv1(const icu4x::capi::DateTime* self);
+    
+    uint8_t icu4x_DateTime_second_mv1(const icu4x::capi::DateTime* self);
+    
+    uint32_t icu4x_DateTime_nanosecond_mv1(const icu4x::capi::DateTime* self);
+    
+    uint16_t icu4x_DateTime_day_of_year_mv1(const icu4x::capi::DateTime* self);
+    
+    uint32_t icu4x_DateTime_day_of_month_mv1(const icu4x::capi::DateTime* self);
+    
+    icu4x::capi::IsoWeekday icu4x_DateTime_day_of_week_mv1(const icu4x::capi::DateTime* self);
+    
+    uint32_t icu4x_DateTime_week_of_month_mv1(const icu4x::capi::DateTime* self, icu4x::capi::IsoWeekday first_weekday);
+    
+    icu4x::capi::WeekOf icu4x_DateTime_week_of_year_mv1(const icu4x::capi::DateTime* self, const icu4x::capi::WeekCalculator* calculator);
+    
+    uint32_t icu4x_DateTime_ordinal_month_mv1(const icu4x::capi::DateTime* self);
+    
+    void icu4x_DateTime_month_code_mv1(const icu4x::capi::DateTime* self, diplomat::capi::DiplomatWrite* write);
+    
+    int32_t icu4x_DateTime_year_in_era_mv1(const icu4x::capi::DateTime* self);
+    
+    void icu4x_DateTime_era_mv1(const icu4x::capi::DateTime* self, diplomat::capi::DiplomatWrite* write);
+    
+    uint8_t icu4x_DateTime_months_in_year_mv1(const icu4x::capi::DateTime* self);
+    
+    uint8_t icu4x_DateTime_days_in_month_mv1(const icu4x::capi::DateTime* self);
+    
+    uint16_t icu4x_DateTime_days_in_year_mv1(const icu4x::capi::DateTime* self);
+    
+    icu4x::capi::Calendar* icu4x_DateTime_calendar_mv1(const icu4x::capi::DateTime* self);
+    
+    
+    void icu4x_DateTime_destroy_mv1(DateTime* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::DateTime>, icu4x::CalendarError> icu4x::DateTime::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 icu4x::Calendar& calendar) {
+  auto result = icu4x::capi::icu4x_DateTime_from_iso_in_calendar_mv1(year,
+    month,
+    day,
+    hour,
+    minute,
+    second,
+    nanosecond,
+    calendar.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::DateTime>, icu4x::CalendarError>(diplomat::Ok<std::unique_ptr<icu4x::DateTime>>(std::unique_ptr<icu4x::DateTime>(icu4x::DateTime::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::DateTime>, icu4x::CalendarError>(diplomat::Err<icu4x::CalendarError>(icu4x::CalendarError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::DateTime>, icu4x::CalendarError> icu4x::DateTime::from_codes_in_calendar(std::string_view era_code, int32_t year, std::string_view month_code, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond, const icu4x::Calendar& calendar) {
+  auto result = icu4x::capi::icu4x_DateTime_from_codes_in_calendar_mv1(era_code.data(),
+    era_code.size(),
+    year,
+    month_code.data(),
+    month_code.size(),
+    day,
+    hour,
+    minute,
+    second,
+    nanosecond,
+    calendar.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::DateTime>, icu4x::CalendarError>(diplomat::Ok<std::unique_ptr<icu4x::DateTime>>(std::unique_ptr<icu4x::DateTime>(icu4x::DateTime::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::DateTime>, icu4x::CalendarError>(diplomat::Err<icu4x::CalendarError>(icu4x::CalendarError::FromFFI(result.err)));
+}
+
+inline std::unique_ptr<icu4x::DateTime> icu4x::DateTime::from_date_and_time(const icu4x::Date& date, const icu4x::Time& time) {
+  auto result = icu4x::capi::icu4x_DateTime_from_date_and_time_mv1(date.AsFFI(),
+    time.AsFFI());
+  return std::unique_ptr<icu4x::DateTime>(icu4x::DateTime::FromFFI(result));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::DateTime>, icu4x::CalendarParseError> icu4x::DateTime::from_string(std::string_view v) {
+  auto result = icu4x::capi::icu4x_DateTime_from_string_mv1(v.data(),
+    v.size());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::DateTime>, icu4x::CalendarParseError>(diplomat::Ok<std::unique_ptr<icu4x::DateTime>>(std::unique_ptr<icu4x::DateTime>(icu4x::DateTime::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::DateTime>, icu4x::CalendarParseError>(diplomat::Err<icu4x::CalendarParseError>(icu4x::CalendarParseError::FromFFI(result.err)));
+}
+
+inline std::unique_ptr<icu4x::Date> icu4x::DateTime::date() const {
+  auto result = icu4x::capi::icu4x_DateTime_date_mv1(this->AsFFI());
+  return std::unique_ptr<icu4x::Date>(icu4x::Date::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::Time> icu4x::DateTime::time() const {
+  auto result = icu4x::capi::icu4x_DateTime_time_mv1(this->AsFFI());
+  return std::unique_ptr<icu4x::Time>(icu4x::Time::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::IsoDateTime> icu4x::DateTime::to_iso() const {
+  auto result = icu4x::capi::icu4x_DateTime_to_iso_mv1(this->AsFFI());
+  return std::unique_ptr<icu4x::IsoDateTime>(icu4x::IsoDateTime::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::DateTime> icu4x::DateTime::to_calendar(const icu4x::Calendar& calendar) const {
+  auto result = icu4x::capi::icu4x_DateTime_to_calendar_mv1(this->AsFFI(),
+    calendar.AsFFI());
+  return std::unique_ptr<icu4x::DateTime>(icu4x::DateTime::FromFFI(result));
+}
+
+inline uint8_t icu4x::DateTime::hour() const {
+  auto result = icu4x::capi::icu4x_DateTime_hour_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint8_t icu4x::DateTime::minute() const {
+  auto result = icu4x::capi::icu4x_DateTime_minute_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint8_t icu4x::DateTime::second() const {
+  auto result = icu4x::capi::icu4x_DateTime_second_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint32_t icu4x::DateTime::nanosecond() const {
+  auto result = icu4x::capi::icu4x_DateTime_nanosecond_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint16_t icu4x::DateTime::day_of_year() const {
+  auto result = icu4x::capi::icu4x_DateTime_day_of_year_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint32_t icu4x::DateTime::day_of_month() const {
+  auto result = icu4x::capi::icu4x_DateTime_day_of_month_mv1(this->AsFFI());
+  return result;
+}
+
+inline icu4x::IsoWeekday icu4x::DateTime::day_of_week() const {
+  auto result = icu4x::capi::icu4x_DateTime_day_of_week_mv1(this->AsFFI());
+  return icu4x::IsoWeekday::FromFFI(result);
+}
+
+inline uint32_t icu4x::DateTime::week_of_month(icu4x::IsoWeekday first_weekday) const {
+  auto result = icu4x::capi::icu4x_DateTime_week_of_month_mv1(this->AsFFI(),
+    first_weekday.AsFFI());
+  return result;
+}
+
+inline icu4x::WeekOf icu4x::DateTime::week_of_year(const icu4x::WeekCalculator& calculator) const {
+  auto result = icu4x::capi::icu4x_DateTime_week_of_year_mv1(this->AsFFI(),
+    calculator.AsFFI());
+  return icu4x::WeekOf::FromFFI(result);
+}
+
+inline uint32_t icu4x::DateTime::ordinal_month() const {
+  auto result = icu4x::capi::icu4x_DateTime_ordinal_month_mv1(this->AsFFI());
+  return result;
+}
+
+inline std::string icu4x::DateTime::month_code() const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_DateTime_month_code_mv1(this->AsFFI(),
+    &write);
+  return output;
+}
+
+inline int32_t icu4x::DateTime::year_in_era() const {
+  auto result = icu4x::capi::icu4x_DateTime_year_in_era_mv1(this->AsFFI());
+  return result;
+}
+
+inline std::string icu4x::DateTime::era() const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_DateTime_era_mv1(this->AsFFI(),
+    &write);
+  return output;
+}
+
+inline uint8_t icu4x::DateTime::months_in_year() const {
+  auto result = icu4x::capi::icu4x_DateTime_months_in_year_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint8_t icu4x::DateTime::days_in_month() const {
+  auto result = icu4x::capi::icu4x_DateTime_days_in_month_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint16_t icu4x::DateTime::days_in_year() const {
+  auto result = icu4x::capi::icu4x_DateTime_days_in_year_mv1(this->AsFFI());
+  return result;
+}
+
+inline std::unique_ptr<icu4x::Calendar> icu4x::DateTime::calendar() const {
+  auto result = icu4x::capi::icu4x_DateTime_calendar_mv1(this->AsFFI());
+  return std::unique_ptr<icu4x::Calendar>(icu4x::Calendar::FromFFI(result));
+}
+
+inline const icu4x::capi::DateTime* icu4x::DateTime::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::DateTime*>(this);
+}
+
+inline icu4x::capi::DateTime* icu4x::DateTime::AsFFI() {
+  return reinterpret_cast<icu4x::capi::DateTime*>(this);
+}
+
+inline const icu4x::DateTime* icu4x::DateTime::FromFFI(const icu4x::capi::DateTime* ptr) {
+  return reinterpret_cast<const icu4x::DateTime*>(ptr);
+}
+
+inline icu4x::DateTime* icu4x::DateTime::FromFFI(icu4x::capi::DateTime* ptr) {
+  return reinterpret_cast<icu4x::DateTime*>(ptr);
+}
+
+inline void icu4x::DateTime::operator delete(void* ptr) {
+  icu4x::capi::icu4x_DateTime_destroy_mv1(reinterpret_cast<icu4x::capi::DateTime*>(ptr));
+}
+
+
+#endif // icu4x_DateTime_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/DateTimeFormatter.d.hpp b/ffi/capi/bindings/cpp/icu4x/DateTimeFormatter.d.hpp
new file mode 100644
index 00000000000..f9a3dcca72d
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/DateTimeFormatter.d.hpp
@@ -0,0 +1,60 @@
+#ifndef icu4x_DateTimeFormatter_D_HPP
+#define icu4x_DateTimeFormatter_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct DateTime; }
+class DateTime;
+namespace capi { struct DateTimeFormatter; }
+class DateTimeFormatter;
+namespace capi { struct IsoDateTime; }
+class IsoDateTime;
+namespace capi { struct Locale; }
+class Locale;
+class DateLength;
+class Error;
+class TimeLength;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct DateTimeFormatter;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class DateTimeFormatter {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::DateTimeFormatter>, icu4x::Error> create_with_lengths(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::DateLength date_length, icu4x::TimeLength time_length);
+
+  inline diplomat::result<std::string, icu4x::Error> format_datetime(const icu4x::DateTime& value) const;
+
+  inline diplomat::result<std::string, icu4x::Error> format_iso_datetime(const icu4x::IsoDateTime& value) const;
+
+  inline const icu4x::capi::DateTimeFormatter* AsFFI() const;
+  inline icu4x::capi::DateTimeFormatter* AsFFI();
+  inline static const icu4x::DateTimeFormatter* FromFFI(const icu4x::capi::DateTimeFormatter* ptr);
+  inline static icu4x::DateTimeFormatter* FromFFI(icu4x::capi::DateTimeFormatter* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  DateTimeFormatter() = delete;
+  DateTimeFormatter(const icu4x::DateTimeFormatter&) = delete;
+  DateTimeFormatter(icu4x::DateTimeFormatter&&) noexcept = delete;
+  DateTimeFormatter operator=(const icu4x::DateTimeFormatter&) = delete;
+  DateTimeFormatter operator=(icu4x::DateTimeFormatter&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_DateTimeFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/DateTimeFormatter.hpp b/ffi/capi/bindings/cpp/icu4x/DateTimeFormatter.hpp
new file mode 100644
index 00000000000..8e7a01ed567
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/DateTimeFormatter.hpp
@@ -0,0 +1,89 @@
+#ifndef icu4x_DateTimeFormatter_HPP
+#define icu4x_DateTimeFormatter_HPP
+
+#include "DateTimeFormatter.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataProvider.hpp"
+#include "DateLength.hpp"
+#include "DateTime.hpp"
+#include "Error.hpp"
+#include "IsoDateTime.hpp"
+#include "Locale.hpp"
+#include "TimeLength.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_DateTimeFormatter_create_with_lengths_mv1_result {union {icu4x::capi::DateTimeFormatter* ok; icu4x::capi::Error err;}; bool is_ok;} icu4x_DateTimeFormatter_create_with_lengths_mv1_result;
+    icu4x_DateTimeFormatter_create_with_lengths_mv1_result icu4x_DateTimeFormatter_create_with_lengths_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale, icu4x::capi::DateLength date_length, icu4x::capi::TimeLength time_length);
+    
+    typedef struct icu4x_DateTimeFormatter_format_datetime_mv1_result {union { icu4x::capi::Error err;}; bool is_ok;} icu4x_DateTimeFormatter_format_datetime_mv1_result;
+    icu4x_DateTimeFormatter_format_datetime_mv1_result icu4x_DateTimeFormatter_format_datetime_mv1(const icu4x::capi::DateTimeFormatter* self, const icu4x::capi::DateTime* value, diplomat::capi::DiplomatWrite* write);
+    
+    typedef struct icu4x_DateTimeFormatter_format_iso_datetime_mv1_result {union { icu4x::capi::Error err;}; bool is_ok;} icu4x_DateTimeFormatter_format_iso_datetime_mv1_result;
+    icu4x_DateTimeFormatter_format_iso_datetime_mv1_result icu4x_DateTimeFormatter_format_iso_datetime_mv1(const icu4x::capi::DateTimeFormatter* self, const icu4x::capi::IsoDateTime* value, diplomat::capi::DiplomatWrite* write);
+    
+    
+    void icu4x_DateTimeFormatter_destroy_mv1(DateTimeFormatter* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::DateTimeFormatter>, icu4x::Error> icu4x::DateTimeFormatter::create_with_lengths(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::DateLength date_length, icu4x::TimeLength time_length) {
+  auto result = icu4x::capi::icu4x_DateTimeFormatter_create_with_lengths_mv1(provider.AsFFI(),
+    locale.AsFFI(),
+    date_length.AsFFI(),
+    time_length.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::DateTimeFormatter>, icu4x::Error>(diplomat::Ok<std::unique_ptr<icu4x::DateTimeFormatter>>(std::unique_ptr<icu4x::DateTimeFormatter>(icu4x::DateTimeFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::DateTimeFormatter>, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::string, icu4x::Error> icu4x::DateTimeFormatter::format_datetime(const icu4x::DateTime& value) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_DateTimeFormatter_format_datetime_mv1(this->AsFFI(),
+    value.AsFFI(),
+    &write);
+  return result.is_ok ? diplomat::result<std::string, icu4x::Error>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::string, icu4x::Error> icu4x::DateTimeFormatter::format_iso_datetime(const icu4x::IsoDateTime& value) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_DateTimeFormatter_format_iso_datetime_mv1(this->AsFFI(),
+    value.AsFFI(),
+    &write);
+  return result.is_ok ? diplomat::result<std::string, icu4x::Error>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline const icu4x::capi::DateTimeFormatter* icu4x::DateTimeFormatter::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::DateTimeFormatter*>(this);
+}
+
+inline icu4x::capi::DateTimeFormatter* icu4x::DateTimeFormatter::AsFFI() {
+  return reinterpret_cast<icu4x::capi::DateTimeFormatter*>(this);
+}
+
+inline const icu4x::DateTimeFormatter* icu4x::DateTimeFormatter::FromFFI(const icu4x::capi::DateTimeFormatter* ptr) {
+  return reinterpret_cast<const icu4x::DateTimeFormatter*>(ptr);
+}
+
+inline icu4x::DateTimeFormatter* icu4x::DateTimeFormatter::FromFFI(icu4x::capi::DateTimeFormatter* ptr) {
+  return reinterpret_cast<icu4x::DateTimeFormatter*>(ptr);
+}
+
+inline void icu4x::DateTimeFormatter::operator delete(void* ptr) {
+  icu4x::capi::icu4x_DateTimeFormatter_destroy_mv1(reinterpret_cast<icu4x::capi::DateTimeFormatter*>(ptr));
+}
+
+
+#endif // icu4x_DateTimeFormatter_HPP
diff --git a/ffi/capi/bindings/cpp/Decomposed.d.hpp b/ffi/capi/bindings/cpp/icu4x/Decomposed.d.hpp
similarity index 50%
rename from ffi/capi/bindings/cpp/Decomposed.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/Decomposed.d.hpp
index 85bd335d8c3..f711ea145aa 100644
--- a/ffi/capi/bindings/cpp/Decomposed.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/Decomposed.d.hpp
@@ -1,5 +1,5 @@
-#ifndef Decomposed_D_HPP
-#define Decomposed_D_HPP
+#ifndef icu4x_Decomposed_D_HPP
+#define icu4x_Decomposed_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     struct Decomposed {
       char32_t first;
@@ -20,13 +20,14 @@ namespace capi {
 } // namespace
 
 
+namespace icu4x {
 struct Decomposed {
   char32_t first;
   char32_t second;
 
-  inline diplomat::capi::Decomposed AsFFI() const;
-  inline static Decomposed FromFFI(diplomat::capi::Decomposed c_struct);
+  inline icu4x::capi::Decomposed AsFFI() const;
+  inline static icu4x::Decomposed FromFFI(icu4x::capi::Decomposed c_struct);
 };
 
-
-#endif // Decomposed_D_HPP
+} // namespace
+#endif // icu4x_Decomposed_D_HPP
diff --git a/ffi/capi/bindings/cpp/Decomposed.hpp b/ffi/capi/bindings/cpp/icu4x/Decomposed.hpp
similarity index 52%
rename from ffi/capi/bindings/cpp/Decomposed.hpp
rename to ffi/capi/bindings/cpp/icu4x/Decomposed.hpp
index 3ea1fe951cc..d5096681c3b 100644
--- a/ffi/capi/bindings/cpp/Decomposed.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/Decomposed.hpp
@@ -1,5 +1,5 @@
-#ifndef Decomposed_HPP
-#define Decomposed_HPP
+#ifndef icu4x_Decomposed_HPP
+#define icu4x_Decomposed_HPP
 
 #include "Decomposed.d.hpp"
 
@@ -9,10 +9,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     extern "C" {
     
@@ -22,19 +22,19 @@ namespace capi {
 } // namespace
 
 
-inline diplomat::capi::Decomposed Decomposed::AsFFI() const {
-  return diplomat::capi::Decomposed {
+inline icu4x::capi::Decomposed icu4x::Decomposed::AsFFI() const {
+  return icu4x::capi::Decomposed {
     /* .first = */ first,
     /* .second = */ second,
   };
 }
 
-inline Decomposed Decomposed::FromFFI(diplomat::capi::Decomposed c_struct) {
-  return Decomposed {
+inline icu4x::Decomposed icu4x::Decomposed::FromFFI(icu4x::capi::Decomposed c_struct) {
+  return icu4x::Decomposed {
     /* .first = */ c_struct.first,
     /* .second = */ c_struct.second,
   };
 }
 
 
-#endif // Decomposed_HPP
+#endif // icu4x_Decomposed_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/DecomposingNormalizer.d.hpp b/ffi/capi/bindings/cpp/icu4x/DecomposingNormalizer.d.hpp
new file mode 100644
index 00000000000..99af6ccaa32
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/DecomposingNormalizer.d.hpp
@@ -0,0 +1,60 @@
+#ifndef icu4x_DecomposingNormalizer_D_HPP
+#define icu4x_DecomposingNormalizer_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct DecomposingNormalizer; }
+class DecomposingNormalizer;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct DecomposingNormalizer;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class DecomposingNormalizer {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::DecomposingNormalizer>, icu4x::DataError> create_nfd(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::DecomposingNormalizer>, icu4x::DataError> create_nfkd(const icu4x::DataProvider& provider);
+
+  inline std::string normalize(std::string_view s) const;
+
+  inline bool is_normalized(std::string_view s) const;
+
+  inline bool is_normalized_utf16(std::u16string_view s) const;
+
+  inline size_t is_normalized_up_to(std::string_view s) const;
+
+  inline size_t is_normalized_utf16_up_to(std::u16string_view s) const;
+
+  inline const icu4x::capi::DecomposingNormalizer* AsFFI() const;
+  inline icu4x::capi::DecomposingNormalizer* AsFFI();
+  inline static const icu4x::DecomposingNormalizer* FromFFI(const icu4x::capi::DecomposingNormalizer* ptr);
+  inline static icu4x::DecomposingNormalizer* FromFFI(icu4x::capi::DecomposingNormalizer* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  DecomposingNormalizer() = delete;
+  DecomposingNormalizer(const icu4x::DecomposingNormalizer&) = delete;
+  DecomposingNormalizer(icu4x::DecomposingNormalizer&&) noexcept = delete;
+  DecomposingNormalizer operator=(const icu4x::DecomposingNormalizer&) = delete;
+  DecomposingNormalizer operator=(icu4x::DecomposingNormalizer&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_DecomposingNormalizer_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/DecomposingNormalizer.hpp b/ffi/capi/bindings/cpp/icu4x/DecomposingNormalizer.hpp
new file mode 100644
index 00000000000..dc755a79694
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/DecomposingNormalizer.hpp
@@ -0,0 +1,113 @@
+#ifndef icu4x_DecomposingNormalizer_HPP
+#define icu4x_DecomposingNormalizer_HPP
+
+#include "DecomposingNormalizer.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_DecomposingNormalizer_create_nfd_mv1_result {union {icu4x::capi::DecomposingNormalizer* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_DecomposingNormalizer_create_nfd_mv1_result;
+    icu4x_DecomposingNormalizer_create_nfd_mv1_result icu4x_DecomposingNormalizer_create_nfd_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_DecomposingNormalizer_create_nfkd_mv1_result {union {icu4x::capi::DecomposingNormalizer* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_DecomposingNormalizer_create_nfkd_mv1_result;
+    icu4x_DecomposingNormalizer_create_nfkd_mv1_result icu4x_DecomposingNormalizer_create_nfkd_mv1(const icu4x::capi::DataProvider* provider);
+    
+    void icu4x_DecomposingNormalizer_normalize_mv1(const icu4x::capi::DecomposingNormalizer* self, const char* s_data, size_t s_len, diplomat::capi::DiplomatWrite* write);
+    
+    bool icu4x_DecomposingNormalizer_is_normalized_mv1(const icu4x::capi::DecomposingNormalizer* self, const char* s_data, size_t s_len);
+    
+    bool icu4x_DecomposingNormalizer_is_normalized_utf16_mv1(const icu4x::capi::DecomposingNormalizer* self, const char16_t* s_data, size_t s_len);
+    
+    size_t icu4x_DecomposingNormalizer_is_normalized_up_to_mv1(const icu4x::capi::DecomposingNormalizer* self, const char* s_data, size_t s_len);
+    
+    size_t icu4x_DecomposingNormalizer_is_normalized_utf16_up_to_mv1(const icu4x::capi::DecomposingNormalizer* self, const char16_t* s_data, size_t s_len);
+    
+    
+    void icu4x_DecomposingNormalizer_destroy_mv1(DecomposingNormalizer* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::DecomposingNormalizer>, icu4x::DataError> icu4x::DecomposingNormalizer::create_nfd(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_DecomposingNormalizer_create_nfd_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::DecomposingNormalizer>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::DecomposingNormalizer>>(std::unique_ptr<icu4x::DecomposingNormalizer>(icu4x::DecomposingNormalizer::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::DecomposingNormalizer>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::DecomposingNormalizer>, icu4x::DataError> icu4x::DecomposingNormalizer::create_nfkd(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_DecomposingNormalizer_create_nfkd_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::DecomposingNormalizer>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::DecomposingNormalizer>>(std::unique_ptr<icu4x::DecomposingNormalizer>(icu4x::DecomposingNormalizer::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::DecomposingNormalizer>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline std::string icu4x::DecomposingNormalizer::normalize(std::string_view s) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_DecomposingNormalizer_normalize_mv1(this->AsFFI(),
+    s.data(),
+    s.size(),
+    &write);
+  return output;
+}
+
+inline bool icu4x::DecomposingNormalizer::is_normalized(std::string_view s) const {
+  auto result = icu4x::capi::icu4x_DecomposingNormalizer_is_normalized_mv1(this->AsFFI(),
+    s.data(),
+    s.size());
+  return result;
+}
+
+inline bool icu4x::DecomposingNormalizer::is_normalized_utf16(std::u16string_view s) const {
+  auto result = icu4x::capi::icu4x_DecomposingNormalizer_is_normalized_utf16_mv1(this->AsFFI(),
+    s.data(),
+    s.size());
+  return result;
+}
+
+inline size_t icu4x::DecomposingNormalizer::is_normalized_up_to(std::string_view s) const {
+  auto result = icu4x::capi::icu4x_DecomposingNormalizer_is_normalized_up_to_mv1(this->AsFFI(),
+    s.data(),
+    s.size());
+  return result;
+}
+
+inline size_t icu4x::DecomposingNormalizer::is_normalized_utf16_up_to(std::u16string_view s) const {
+  auto result = icu4x::capi::icu4x_DecomposingNormalizer_is_normalized_utf16_up_to_mv1(this->AsFFI(),
+    s.data(),
+    s.size());
+  return result;
+}
+
+inline const icu4x::capi::DecomposingNormalizer* icu4x::DecomposingNormalizer::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::DecomposingNormalizer*>(this);
+}
+
+inline icu4x::capi::DecomposingNormalizer* icu4x::DecomposingNormalizer::AsFFI() {
+  return reinterpret_cast<icu4x::capi::DecomposingNormalizer*>(this);
+}
+
+inline const icu4x::DecomposingNormalizer* icu4x::DecomposingNormalizer::FromFFI(const icu4x::capi::DecomposingNormalizer* ptr) {
+  return reinterpret_cast<const icu4x::DecomposingNormalizer*>(ptr);
+}
+
+inline icu4x::DecomposingNormalizer* icu4x::DecomposingNormalizer::FromFFI(icu4x::capi::DecomposingNormalizer* ptr) {
+  return reinterpret_cast<icu4x::DecomposingNormalizer*>(ptr);
+}
+
+inline void icu4x::DecomposingNormalizer::operator delete(void* ptr) {
+  icu4x::capi::icu4x_DecomposingNormalizer_destroy_mv1(reinterpret_cast<icu4x::capi::DecomposingNormalizer*>(ptr));
+}
+
+
+#endif // icu4x_DecomposingNormalizer_HPP
diff --git a/ffi/capi/bindings/cpp/DisplayNamesFallback.d.hpp b/ffi/capi/bindings/cpp/icu4x/DisplayNamesFallback.d.hpp
similarity index 65%
rename from ffi/capi/bindings/cpp/DisplayNamesFallback.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/DisplayNamesFallback.d.hpp
index 0aaaec5bbcf..521b3b2611b 100644
--- a/ffi/capi/bindings/cpp/DisplayNamesFallback.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/DisplayNamesFallback.d.hpp
@@ -1,5 +1,5 @@
-#ifndef DisplayNamesFallback_D_HPP
-#define DisplayNamesFallback_D_HPP
+#ifndef icu4x_DisplayNamesFallback_D_HPP
+#define icu4x_DisplayNamesFallback_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum DisplayNamesFallback {
       DisplayNamesFallback_Code = 0,
@@ -19,6 +19,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class DisplayNamesFallback {
 public:
   enum Value {
@@ -33,11 +34,11 @@ class DisplayNamesFallback {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::DisplayNamesFallback AsFFI() const;
-  inline static DisplayNamesFallback FromFFI(diplomat::capi::DisplayNamesFallback c_enum);
+  inline icu4x::capi::DisplayNamesFallback AsFFI() const;
+  inline static icu4x::DisplayNamesFallback FromFFI(icu4x::capi::DisplayNamesFallback c_enum);
 private:
     Value value;
 };
 
-
-#endif // DisplayNamesFallback_D_HPP
+} // namespace
+#endif // icu4x_DisplayNamesFallback_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/DisplayNamesFallback.hpp b/ffi/capi/bindings/cpp/icu4x/DisplayNamesFallback.hpp
new file mode 100644
index 00000000000..ab47c3aaef2
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/DisplayNamesFallback.hpp
@@ -0,0 +1,37 @@
+#ifndef icu4x_DisplayNamesFallback_HPP
+#define icu4x_DisplayNamesFallback_HPP
+
+#include "DisplayNamesFallback.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::DisplayNamesFallback icu4x::DisplayNamesFallback::AsFFI() const {
+  return static_cast<icu4x::capi::DisplayNamesFallback>(value);
+}
+
+inline icu4x::DisplayNamesFallback icu4x::DisplayNamesFallback::FromFFI(icu4x::capi::DisplayNamesFallback c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::DisplayNamesFallback_Code:
+    case icu4x::capi::DisplayNamesFallback_None:
+      return static_cast<icu4x::DisplayNamesFallback::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_DisplayNamesFallback_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/DisplayNamesOptionsV1.d.hpp b/ffi/capi/bindings/cpp/icu4x/DisplayNamesOptionsV1.d.hpp
new file mode 100644
index 00000000000..43018f5365f
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/DisplayNamesOptionsV1.d.hpp
@@ -0,0 +1,44 @@
+#ifndef icu4x_DisplayNamesOptionsV1_D_HPP
+#define icu4x_DisplayNamesOptionsV1_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DisplayNamesFallback.d.hpp"
+#include "DisplayNamesStyle.d.hpp"
+#include "LanguageDisplay.d.hpp"
+
+namespace icu4x {
+class DisplayNamesFallback;
+class DisplayNamesStyle;
+class LanguageDisplay;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct DisplayNamesOptionsV1 {
+      icu4x::capi::DisplayNamesStyle style;
+      icu4x::capi::DisplayNamesFallback fallback;
+      icu4x::capi::LanguageDisplay language_display;
+    };
+} // namespace capi
+} // namespace
+
+
+namespace icu4x {
+struct DisplayNamesOptionsV1 {
+  icu4x::DisplayNamesStyle style;
+  icu4x::DisplayNamesFallback fallback;
+  icu4x::LanguageDisplay language_display;
+
+  inline icu4x::capi::DisplayNamesOptionsV1 AsFFI() const;
+  inline static icu4x::DisplayNamesOptionsV1 FromFFI(icu4x::capi::DisplayNamesOptionsV1 c_struct);
+};
+
+} // namespace
+#endif // icu4x_DisplayNamesOptionsV1_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/DisplayNamesOptionsV1.hpp b/ffi/capi/bindings/cpp/icu4x/DisplayNamesOptionsV1.hpp
new file mode 100644
index 00000000000..d331c639d32
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/DisplayNamesOptionsV1.hpp
@@ -0,0 +1,45 @@
+#ifndef icu4x_DisplayNamesOptionsV1_HPP
+#define icu4x_DisplayNamesOptionsV1_HPP
+
+#include "DisplayNamesOptionsV1.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DisplayNamesFallback.hpp"
+#include "DisplayNamesStyle.hpp"
+#include "LanguageDisplay.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+
+inline icu4x::capi::DisplayNamesOptionsV1 icu4x::DisplayNamesOptionsV1::AsFFI() const {
+  return icu4x::capi::DisplayNamesOptionsV1 {
+    /* .style = */ style.AsFFI(),
+    /* .fallback = */ fallback.AsFFI(),
+    /* .language_display = */ language_display.AsFFI(),
+  };
+}
+
+inline icu4x::DisplayNamesOptionsV1 icu4x::DisplayNamesOptionsV1::FromFFI(icu4x::capi::DisplayNamesOptionsV1 c_struct) {
+  return icu4x::DisplayNamesOptionsV1 {
+    /* .style = */ icu4x::DisplayNamesStyle::FromFFI(c_struct.style),
+    /* .fallback = */ icu4x::DisplayNamesFallback::FromFFI(c_struct.fallback),
+    /* .language_display = */ icu4x::LanguageDisplay::FromFFI(c_struct.language_display),
+  };
+}
+
+
+#endif // icu4x_DisplayNamesOptionsV1_HPP
diff --git a/ffi/capi/bindings/cpp/DisplayNamesStyle.d.hpp b/ffi/capi/bindings/cpp/icu4x/DisplayNamesStyle.d.hpp
similarity index 70%
rename from ffi/capi/bindings/cpp/DisplayNamesStyle.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/DisplayNamesStyle.d.hpp
index f514ed0e848..402a044b0b3 100644
--- a/ffi/capi/bindings/cpp/DisplayNamesStyle.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/DisplayNamesStyle.d.hpp
@@ -1,5 +1,5 @@
-#ifndef DisplayNamesStyle_D_HPP
-#define DisplayNamesStyle_D_HPP
+#ifndef icu4x_DisplayNamesStyle_D_HPP
+#define icu4x_DisplayNamesStyle_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum DisplayNamesStyle {
       DisplayNamesStyle_Auto = 0,
@@ -22,6 +22,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class DisplayNamesStyle {
 public:
   enum Value {
@@ -39,11 +40,11 @@ class DisplayNamesStyle {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::DisplayNamesStyle AsFFI() const;
-  inline static DisplayNamesStyle FromFFI(diplomat::capi::DisplayNamesStyle c_enum);
+  inline icu4x::capi::DisplayNamesStyle AsFFI() const;
+  inline static icu4x::DisplayNamesStyle FromFFI(icu4x::capi::DisplayNamesStyle c_enum);
 private:
     Value value;
 };
 
-
-#endif // DisplayNamesStyle_D_HPP
+} // namespace
+#endif // icu4x_DisplayNamesStyle_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/DisplayNamesStyle.hpp b/ffi/capi/bindings/cpp/icu4x/DisplayNamesStyle.hpp
new file mode 100644
index 00000000000..7cef65b1bf2
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/DisplayNamesStyle.hpp
@@ -0,0 +1,40 @@
+#ifndef icu4x_DisplayNamesStyle_HPP
+#define icu4x_DisplayNamesStyle_HPP
+
+#include "DisplayNamesStyle.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::DisplayNamesStyle icu4x::DisplayNamesStyle::AsFFI() const {
+  return static_cast<icu4x::capi::DisplayNamesStyle>(value);
+}
+
+inline icu4x::DisplayNamesStyle icu4x::DisplayNamesStyle::FromFFI(icu4x::capi::DisplayNamesStyle c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::DisplayNamesStyle_Auto:
+    case icu4x::capi::DisplayNamesStyle_Narrow:
+    case icu4x::capi::DisplayNamesStyle_Short:
+    case icu4x::capi::DisplayNamesStyle_Long:
+    case icu4x::capi::DisplayNamesStyle_Menu:
+      return static_cast<icu4x::DisplayNamesStyle::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_DisplayNamesStyle_HPP
diff --git a/ffi/capi/bindings/cpp/Error.d.hpp b/ffi/capi/bindings/cpp/icu4x/Error.d.hpp
similarity index 88%
rename from ffi/capi/bindings/cpp/Error.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/Error.d.hpp
index dcf00467500..9d743c84686 100644
--- a/ffi/capi/bindings/cpp/Error.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/Error.d.hpp
@@ -1,5 +1,5 @@
-#ifndef Error_D_HPP
-#define Error_D_HPP
+#ifndef icu4x_Error_D_HPP
+#define icu4x_Error_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum Error {
       Error_UnknownError = 0,
@@ -37,6 +37,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class Error {
 public:
   enum Value {
@@ -69,11 +70,11 @@ class Error {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::Error AsFFI() const;
-  inline static Error FromFFI(diplomat::capi::Error c_enum);
+  inline icu4x::capi::Error AsFFI() const;
+  inline static icu4x::Error FromFFI(icu4x::capi::Error c_enum);
 private:
     Value value;
 };
 
-
-#endif // Error_D_HPP
+} // namespace
+#endif // icu4x_Error_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/Error.hpp b/ffi/capi/bindings/cpp/icu4x/Error.hpp
new file mode 100644
index 00000000000..3e4eef5e3c4
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/Error.hpp
@@ -0,0 +1,55 @@
+#ifndef icu4x_Error_HPP
+#define icu4x_Error_HPP
+
+#include "Error.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::Error icu4x::Error::AsFFI() const {
+  return static_cast<icu4x::capi::Error>(value);
+}
+
+inline icu4x::Error icu4x::Error::FromFFI(icu4x::capi::Error c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::Error_UnknownError:
+    case icu4x::capi::Error_DataMissingDataMarkerError:
+    case icu4x::capi::Error_DataMissingLocaleError:
+    case icu4x::capi::Error_DataNeedsLocaleError:
+    case icu4x::capi::Error_DataExtraneousLocaleError:
+    case icu4x::capi::Error_DataFilteredResourceError:
+    case icu4x::capi::Error_DataMismatchedTypeError:
+    case icu4x::capi::Error_DataCustomError:
+    case icu4x::capi::Error_DataIoError:
+    case icu4x::capi::Error_DataUnavailableBufferFormatError:
+    case icu4x::capi::Error_PropertyUnexpectedPropertyNameError:
+    case icu4x::capi::Error_DateTimePatternError:
+    case icu4x::capi::Error_DateTimeMissingInputFieldError:
+    case icu4x::capi::Error_DateTimeSkeletonError:
+    case icu4x::capi::Error_DateTimeUnsupportedFieldError:
+    case icu4x::capi::Error_DateTimeUnsupportedOptionsError:
+    case icu4x::capi::Error_DateTimeMissingWeekdaySymbolError:
+    case icu4x::capi::Error_DateTimeMissingMonthSymbolError:
+    case icu4x::capi::Error_DateTimeFixedDecimalError:
+    case icu4x::capi::Error_DateTimeMismatchedCalendarError:
+      return static_cast<icu4x::Error::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_Error_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/FixedDecimal.d.hpp b/ffi/capi/bindings/cpp/icu4x/FixedDecimal.d.hpp
new file mode 100644
index 00000000000..af4ede36289
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/FixedDecimal.d.hpp
@@ -0,0 +1,115 @@
+#ifndef icu4x_FixedDecimal_D_HPP
+#define icu4x_FixedDecimal_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct FixedDecimal; }
+class FixedDecimal;
+struct FixedDecimalLimitError;
+class FixedDecimalParseError;
+class FixedDecimalRoundingIncrement;
+class FixedDecimalRoundingMode;
+class FixedDecimalSign;
+class FixedDecimalSignDisplay;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct FixedDecimal;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class FixedDecimal {
+public:
+
+  inline static std::unique_ptr<icu4x::FixedDecimal> from(int32_t v);
+
+  inline static std::unique_ptr<icu4x::FixedDecimal> from(uint32_t v);
+
+  inline static std::unique_ptr<icu4x::FixedDecimal> from(int64_t v);
+
+  inline static std::unique_ptr<icu4x::FixedDecimal> from(uint64_t v);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::FixedDecimal>, icu4x::FixedDecimalLimitError> from_double_with_integer_precision(double f);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::FixedDecimal>, icu4x::FixedDecimalLimitError> from_double_with_lower_magnitude(double f, int16_t magnitude);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::FixedDecimal>, icu4x::FixedDecimalLimitError> from_double_with_significant_digits(double f, uint8_t digits);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::FixedDecimal>, icu4x::FixedDecimalLimitError> from_double_with_floating_precision(double f);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::FixedDecimal>, icu4x::FixedDecimalParseError> from_string(std::string_view v);
+
+  inline uint8_t digit_at(int16_t magnitude) const;
+
+  inline int16_t magnitude_start() const;
+
+  inline int16_t magnitude_end() const;
+
+  inline int16_t nonzero_magnitude_start() const;
+
+  inline int16_t nonzero_magnitude_end() const;
+
+  inline bool is_zero() const;
+
+  inline void multiply_pow10(int16_t power);
+
+  inline icu4x::FixedDecimalSign sign() const;
+
+  inline void set_sign(icu4x::FixedDecimalSign sign);
+
+  inline void apply_sign_display(icu4x::FixedDecimalSignDisplay sign_display);
+
+  inline void trim_start();
+
+  inline void trim_end();
+
+  inline void pad_start(int16_t position);
+
+  inline void pad_end(int16_t position);
+
+  inline void set_max_position(int16_t position);
+
+  inline void round(int16_t position);
+
+  inline void ceil(int16_t position);
+
+  inline void expand(int16_t position);
+
+  inline void floor(int16_t position);
+
+  inline void trunc(int16_t position);
+
+  inline void round_with_mode(int16_t position, icu4x::FixedDecimalRoundingMode mode);
+
+  inline void round_with_mode_and_increment(int16_t position, icu4x::FixedDecimalRoundingMode mode, icu4x::FixedDecimalRoundingIncrement increment);
+
+  inline diplomat::result<std::monostate, std::monostate> concatenate_end(icu4x::FixedDecimal& other);
+
+  inline std::string to_string() const;
+
+  inline const icu4x::capi::FixedDecimal* AsFFI() const;
+  inline icu4x::capi::FixedDecimal* AsFFI();
+  inline static const icu4x::FixedDecimal* FromFFI(const icu4x::capi::FixedDecimal* ptr);
+  inline static icu4x::FixedDecimal* FromFFI(icu4x::capi::FixedDecimal* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  FixedDecimal() = delete;
+  FixedDecimal(const icu4x::FixedDecimal&) = delete;
+  FixedDecimal(icu4x::FixedDecimal&&) noexcept = delete;
+  FixedDecimal operator=(const icu4x::FixedDecimal&) = delete;
+  FixedDecimal operator=(icu4x::FixedDecimal&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_FixedDecimal_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/FixedDecimal.hpp b/ffi/capi/bindings/cpp/icu4x/FixedDecimal.hpp
new file mode 100644
index 00000000000..65db2646618
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/FixedDecimal.hpp
@@ -0,0 +1,299 @@
+#ifndef icu4x_FixedDecimal_HPP
+#define icu4x_FixedDecimal_HPP
+
+#include "FixedDecimal.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "FixedDecimalLimitError.hpp"
+#include "FixedDecimalParseError.hpp"
+#include "FixedDecimalRoundingIncrement.hpp"
+#include "FixedDecimalRoundingMode.hpp"
+#include "FixedDecimalSign.hpp"
+#include "FixedDecimalSignDisplay.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    icu4x::capi::FixedDecimal* icu4x_FixedDecimal_from_int32_mv1(int32_t v);
+    
+    icu4x::capi::FixedDecimal* icu4x_FixedDecimal_from_uint32_mv1(uint32_t v);
+    
+    icu4x::capi::FixedDecimal* icu4x_FixedDecimal_from_int64_mv1(int64_t v);
+    
+    icu4x::capi::FixedDecimal* icu4x_FixedDecimal_from_uint64_mv1(uint64_t v);
+    
+    typedef struct icu4x_FixedDecimal_from_double_with_integer_precision_mv1_result {union {icu4x::capi::FixedDecimal* ok; }; bool is_ok;} icu4x_FixedDecimal_from_double_with_integer_precision_mv1_result;
+    icu4x_FixedDecimal_from_double_with_integer_precision_mv1_result icu4x_FixedDecimal_from_double_with_integer_precision_mv1(double f);
+    
+    typedef struct icu4x_FixedDecimal_from_double_with_lower_magnitude_mv1_result {union {icu4x::capi::FixedDecimal* ok; }; bool is_ok;} icu4x_FixedDecimal_from_double_with_lower_magnitude_mv1_result;
+    icu4x_FixedDecimal_from_double_with_lower_magnitude_mv1_result icu4x_FixedDecimal_from_double_with_lower_magnitude_mv1(double f, int16_t magnitude);
+    
+    typedef struct icu4x_FixedDecimal_from_double_with_significant_digits_mv1_result {union {icu4x::capi::FixedDecimal* ok; }; bool is_ok;} icu4x_FixedDecimal_from_double_with_significant_digits_mv1_result;
+    icu4x_FixedDecimal_from_double_with_significant_digits_mv1_result icu4x_FixedDecimal_from_double_with_significant_digits_mv1(double f, uint8_t digits);
+    
+    typedef struct icu4x_FixedDecimal_from_double_with_floating_precision_mv1_result {union {icu4x::capi::FixedDecimal* ok; }; bool is_ok;} icu4x_FixedDecimal_from_double_with_floating_precision_mv1_result;
+    icu4x_FixedDecimal_from_double_with_floating_precision_mv1_result icu4x_FixedDecimal_from_double_with_floating_precision_mv1(double f);
+    
+    typedef struct icu4x_FixedDecimal_from_string_mv1_result {union {icu4x::capi::FixedDecimal* ok; icu4x::capi::FixedDecimalParseError err;}; bool is_ok;} icu4x_FixedDecimal_from_string_mv1_result;
+    icu4x_FixedDecimal_from_string_mv1_result icu4x_FixedDecimal_from_string_mv1(const char* v_data, size_t v_len);
+    
+    uint8_t icu4x_FixedDecimal_digit_at_mv1(const icu4x::capi::FixedDecimal* self, int16_t magnitude);
+    
+    int16_t icu4x_FixedDecimal_magnitude_start_mv1(const icu4x::capi::FixedDecimal* self);
+    
+    int16_t icu4x_FixedDecimal_magnitude_end_mv1(const icu4x::capi::FixedDecimal* self);
+    
+    int16_t icu4x_FixedDecimal_nonzero_magnitude_start_mv1(const icu4x::capi::FixedDecimal* self);
+    
+    int16_t icu4x_FixedDecimal_nonzero_magnitude_end_mv1(const icu4x::capi::FixedDecimal* self);
+    
+    bool icu4x_FixedDecimal_is_zero_mv1(const icu4x::capi::FixedDecimal* self);
+    
+    void icu4x_FixedDecimal_multiply_pow10_mv1(icu4x::capi::FixedDecimal* self, int16_t power);
+    
+    icu4x::capi::FixedDecimalSign icu4x_FixedDecimal_sign_mv1(const icu4x::capi::FixedDecimal* self);
+    
+    void icu4x_FixedDecimal_set_sign_mv1(icu4x::capi::FixedDecimal* self, icu4x::capi::FixedDecimalSign sign);
+    
+    void icu4x_FixedDecimal_apply_sign_display_mv1(icu4x::capi::FixedDecimal* self, icu4x::capi::FixedDecimalSignDisplay sign_display);
+    
+    void icu4x_FixedDecimal_trim_start_mv1(icu4x::capi::FixedDecimal* self);
+    
+    void icu4x_FixedDecimal_trim_end_mv1(icu4x::capi::FixedDecimal* self);
+    
+    void icu4x_FixedDecimal_pad_start_mv1(icu4x::capi::FixedDecimal* self, int16_t position);
+    
+    void icu4x_FixedDecimal_pad_end_mv1(icu4x::capi::FixedDecimal* self, int16_t position);
+    
+    void icu4x_FixedDecimal_set_max_position_mv1(icu4x::capi::FixedDecimal* self, int16_t position);
+    
+    void icu4x_FixedDecimal_round_mv1(icu4x::capi::FixedDecimal* self, int16_t position);
+    
+    void icu4x_FixedDecimal_ceil_mv1(icu4x::capi::FixedDecimal* self, int16_t position);
+    
+    void icu4x_FixedDecimal_expand_mv1(icu4x::capi::FixedDecimal* self, int16_t position);
+    
+    void icu4x_FixedDecimal_floor_mv1(icu4x::capi::FixedDecimal* self, int16_t position);
+    
+    void icu4x_FixedDecimal_trunc_mv1(icu4x::capi::FixedDecimal* self, int16_t position);
+    
+    void icu4x_FixedDecimal_round_with_mode_mv1(icu4x::capi::FixedDecimal* self, int16_t position, icu4x::capi::FixedDecimalRoundingMode mode);
+    
+    void icu4x_FixedDecimal_round_with_mode_and_increment_mv1(icu4x::capi::FixedDecimal* self, int16_t position, icu4x::capi::FixedDecimalRoundingMode mode, icu4x::capi::FixedDecimalRoundingIncrement increment);
+    
+    typedef struct icu4x_FixedDecimal_concatenate_end_mv1_result { bool is_ok;} icu4x_FixedDecimal_concatenate_end_mv1_result;
+    icu4x_FixedDecimal_concatenate_end_mv1_result icu4x_FixedDecimal_concatenate_end_mv1(icu4x::capi::FixedDecimal* self, icu4x::capi::FixedDecimal* other);
+    
+    void icu4x_FixedDecimal_to_string_mv1(const icu4x::capi::FixedDecimal* self, diplomat::capi::DiplomatWrite* write);
+    
+    
+    void icu4x_FixedDecimal_destroy_mv1(FixedDecimal* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline std::unique_ptr<icu4x::FixedDecimal> icu4x::FixedDecimal::from(int32_t v) {
+  auto result = icu4x::capi::icu4x_FixedDecimal_from_int32_mv1(v);
+  return std::unique_ptr<icu4x::FixedDecimal>(icu4x::FixedDecimal::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::FixedDecimal> icu4x::FixedDecimal::from(uint32_t v) {
+  auto result = icu4x::capi::icu4x_FixedDecimal_from_uint32_mv1(v);
+  return std::unique_ptr<icu4x::FixedDecimal>(icu4x::FixedDecimal::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::FixedDecimal> icu4x::FixedDecimal::from(int64_t v) {
+  auto result = icu4x::capi::icu4x_FixedDecimal_from_int64_mv1(v);
+  return std::unique_ptr<icu4x::FixedDecimal>(icu4x::FixedDecimal::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::FixedDecimal> icu4x::FixedDecimal::from(uint64_t v) {
+  auto result = icu4x::capi::icu4x_FixedDecimal_from_uint64_mv1(v);
+  return std::unique_ptr<icu4x::FixedDecimal>(icu4x::FixedDecimal::FromFFI(result));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::FixedDecimal>, icu4x::FixedDecimalLimitError> icu4x::FixedDecimal::from_double_with_integer_precision(double f) {
+  auto result = icu4x::capi::icu4x_FixedDecimal_from_double_with_integer_precision_mv1(f);
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::FixedDecimal>, icu4x::FixedDecimalLimitError>(diplomat::Ok<std::unique_ptr<icu4x::FixedDecimal>>(std::unique_ptr<icu4x::FixedDecimal>(icu4x::FixedDecimal::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::FixedDecimal>, icu4x::FixedDecimalLimitError>(diplomat::Err<icu4x::FixedDecimalLimitError>(icu4x::FixedDecimalLimitError {}));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::FixedDecimal>, icu4x::FixedDecimalLimitError> icu4x::FixedDecimal::from_double_with_lower_magnitude(double f, int16_t magnitude) {
+  auto result = icu4x::capi::icu4x_FixedDecimal_from_double_with_lower_magnitude_mv1(f,
+    magnitude);
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::FixedDecimal>, icu4x::FixedDecimalLimitError>(diplomat::Ok<std::unique_ptr<icu4x::FixedDecimal>>(std::unique_ptr<icu4x::FixedDecimal>(icu4x::FixedDecimal::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::FixedDecimal>, icu4x::FixedDecimalLimitError>(diplomat::Err<icu4x::FixedDecimalLimitError>(icu4x::FixedDecimalLimitError {}));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::FixedDecimal>, icu4x::FixedDecimalLimitError> icu4x::FixedDecimal::from_double_with_significant_digits(double f, uint8_t digits) {
+  auto result = icu4x::capi::icu4x_FixedDecimal_from_double_with_significant_digits_mv1(f,
+    digits);
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::FixedDecimal>, icu4x::FixedDecimalLimitError>(diplomat::Ok<std::unique_ptr<icu4x::FixedDecimal>>(std::unique_ptr<icu4x::FixedDecimal>(icu4x::FixedDecimal::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::FixedDecimal>, icu4x::FixedDecimalLimitError>(diplomat::Err<icu4x::FixedDecimalLimitError>(icu4x::FixedDecimalLimitError {}));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::FixedDecimal>, icu4x::FixedDecimalLimitError> icu4x::FixedDecimal::from_double_with_floating_precision(double f) {
+  auto result = icu4x::capi::icu4x_FixedDecimal_from_double_with_floating_precision_mv1(f);
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::FixedDecimal>, icu4x::FixedDecimalLimitError>(diplomat::Ok<std::unique_ptr<icu4x::FixedDecimal>>(std::unique_ptr<icu4x::FixedDecimal>(icu4x::FixedDecimal::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::FixedDecimal>, icu4x::FixedDecimalLimitError>(diplomat::Err<icu4x::FixedDecimalLimitError>(icu4x::FixedDecimalLimitError {}));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::FixedDecimal>, icu4x::FixedDecimalParseError> icu4x::FixedDecimal::from_string(std::string_view v) {
+  auto result = icu4x::capi::icu4x_FixedDecimal_from_string_mv1(v.data(),
+    v.size());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::FixedDecimal>, icu4x::FixedDecimalParseError>(diplomat::Ok<std::unique_ptr<icu4x::FixedDecimal>>(std::unique_ptr<icu4x::FixedDecimal>(icu4x::FixedDecimal::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::FixedDecimal>, icu4x::FixedDecimalParseError>(diplomat::Err<icu4x::FixedDecimalParseError>(icu4x::FixedDecimalParseError::FromFFI(result.err)));
+}
+
+inline uint8_t icu4x::FixedDecimal::digit_at(int16_t magnitude) const {
+  auto result = icu4x::capi::icu4x_FixedDecimal_digit_at_mv1(this->AsFFI(),
+    magnitude);
+  return result;
+}
+
+inline int16_t icu4x::FixedDecimal::magnitude_start() const {
+  auto result = icu4x::capi::icu4x_FixedDecimal_magnitude_start_mv1(this->AsFFI());
+  return result;
+}
+
+inline int16_t icu4x::FixedDecimal::magnitude_end() const {
+  auto result = icu4x::capi::icu4x_FixedDecimal_magnitude_end_mv1(this->AsFFI());
+  return result;
+}
+
+inline int16_t icu4x::FixedDecimal::nonzero_magnitude_start() const {
+  auto result = icu4x::capi::icu4x_FixedDecimal_nonzero_magnitude_start_mv1(this->AsFFI());
+  return result;
+}
+
+inline int16_t icu4x::FixedDecimal::nonzero_magnitude_end() const {
+  auto result = icu4x::capi::icu4x_FixedDecimal_nonzero_magnitude_end_mv1(this->AsFFI());
+  return result;
+}
+
+inline bool icu4x::FixedDecimal::is_zero() const {
+  auto result = icu4x::capi::icu4x_FixedDecimal_is_zero_mv1(this->AsFFI());
+  return result;
+}
+
+inline void icu4x::FixedDecimal::multiply_pow10(int16_t power) {
+  icu4x::capi::icu4x_FixedDecimal_multiply_pow10_mv1(this->AsFFI(),
+    power);
+}
+
+inline icu4x::FixedDecimalSign icu4x::FixedDecimal::sign() const {
+  auto result = icu4x::capi::icu4x_FixedDecimal_sign_mv1(this->AsFFI());
+  return icu4x::FixedDecimalSign::FromFFI(result);
+}
+
+inline void icu4x::FixedDecimal::set_sign(icu4x::FixedDecimalSign sign) {
+  icu4x::capi::icu4x_FixedDecimal_set_sign_mv1(this->AsFFI(),
+    sign.AsFFI());
+}
+
+inline void icu4x::FixedDecimal::apply_sign_display(icu4x::FixedDecimalSignDisplay sign_display) {
+  icu4x::capi::icu4x_FixedDecimal_apply_sign_display_mv1(this->AsFFI(),
+    sign_display.AsFFI());
+}
+
+inline void icu4x::FixedDecimal::trim_start() {
+  icu4x::capi::icu4x_FixedDecimal_trim_start_mv1(this->AsFFI());
+}
+
+inline void icu4x::FixedDecimal::trim_end() {
+  icu4x::capi::icu4x_FixedDecimal_trim_end_mv1(this->AsFFI());
+}
+
+inline void icu4x::FixedDecimal::pad_start(int16_t position) {
+  icu4x::capi::icu4x_FixedDecimal_pad_start_mv1(this->AsFFI(),
+    position);
+}
+
+inline void icu4x::FixedDecimal::pad_end(int16_t position) {
+  icu4x::capi::icu4x_FixedDecimal_pad_end_mv1(this->AsFFI(),
+    position);
+}
+
+inline void icu4x::FixedDecimal::set_max_position(int16_t position) {
+  icu4x::capi::icu4x_FixedDecimal_set_max_position_mv1(this->AsFFI(),
+    position);
+}
+
+inline void icu4x::FixedDecimal::round(int16_t position) {
+  icu4x::capi::icu4x_FixedDecimal_round_mv1(this->AsFFI(),
+    position);
+}
+
+inline void icu4x::FixedDecimal::ceil(int16_t position) {
+  icu4x::capi::icu4x_FixedDecimal_ceil_mv1(this->AsFFI(),
+    position);
+}
+
+inline void icu4x::FixedDecimal::expand(int16_t position) {
+  icu4x::capi::icu4x_FixedDecimal_expand_mv1(this->AsFFI(),
+    position);
+}
+
+inline void icu4x::FixedDecimal::floor(int16_t position) {
+  icu4x::capi::icu4x_FixedDecimal_floor_mv1(this->AsFFI(),
+    position);
+}
+
+inline void icu4x::FixedDecimal::trunc(int16_t position) {
+  icu4x::capi::icu4x_FixedDecimal_trunc_mv1(this->AsFFI(),
+    position);
+}
+
+inline void icu4x::FixedDecimal::round_with_mode(int16_t position, icu4x::FixedDecimalRoundingMode mode) {
+  icu4x::capi::icu4x_FixedDecimal_round_with_mode_mv1(this->AsFFI(),
+    position,
+    mode.AsFFI());
+}
+
+inline void icu4x::FixedDecimal::round_with_mode_and_increment(int16_t position, icu4x::FixedDecimalRoundingMode mode, icu4x::FixedDecimalRoundingIncrement increment) {
+  icu4x::capi::icu4x_FixedDecimal_round_with_mode_and_increment_mv1(this->AsFFI(),
+    position,
+    mode.AsFFI(),
+    increment.AsFFI());
+}
+
+inline diplomat::result<std::monostate, std::monostate> icu4x::FixedDecimal::concatenate_end(icu4x::FixedDecimal& other) {
+  auto result = icu4x::capi::icu4x_FixedDecimal_concatenate_end_mv1(this->AsFFI(),
+    other.AsFFI());
+  return result.is_ok ? diplomat::result<std::monostate, std::monostate>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, std::monostate>(diplomat::Err<std::monostate>());
+}
+
+inline std::string icu4x::FixedDecimal::to_string() const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_FixedDecimal_to_string_mv1(this->AsFFI(),
+    &write);
+  return output;
+}
+
+inline const icu4x::capi::FixedDecimal* icu4x::FixedDecimal::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::FixedDecimal*>(this);
+}
+
+inline icu4x::capi::FixedDecimal* icu4x::FixedDecimal::AsFFI() {
+  return reinterpret_cast<icu4x::capi::FixedDecimal*>(this);
+}
+
+inline const icu4x::FixedDecimal* icu4x::FixedDecimal::FromFFI(const icu4x::capi::FixedDecimal* ptr) {
+  return reinterpret_cast<const icu4x::FixedDecimal*>(ptr);
+}
+
+inline icu4x::FixedDecimal* icu4x::FixedDecimal::FromFFI(icu4x::capi::FixedDecimal* ptr) {
+  return reinterpret_cast<icu4x::FixedDecimal*>(ptr);
+}
+
+inline void icu4x::FixedDecimal::operator delete(void* ptr) {
+  icu4x::capi::icu4x_FixedDecimal_destroy_mv1(reinterpret_cast<icu4x::capi::FixedDecimal*>(ptr));
+}
+
+
+#endif // icu4x_FixedDecimal_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/FixedDecimalFormatter.d.hpp b/ffi/capi/bindings/cpp/icu4x/FixedDecimalFormatter.d.hpp
new file mode 100644
index 00000000000..7ec058176f9
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/FixedDecimalFormatter.d.hpp
@@ -0,0 +1,57 @@
+#ifndef icu4x_FixedDecimalFormatter_D_HPP
+#define icu4x_FixedDecimalFormatter_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct FixedDecimal; }
+class FixedDecimal;
+namespace capi { struct FixedDecimalFormatter; }
+class FixedDecimalFormatter;
+namespace capi { struct Locale; }
+class Locale;
+class DataError;
+class FixedDecimalGroupingStrategy;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct FixedDecimalFormatter;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class FixedDecimalFormatter {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::FixedDecimalFormatter>, icu4x::DataError> create_with_grouping_strategy(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::FixedDecimalGroupingStrategy grouping_strategy);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::FixedDecimalFormatter>, icu4x::DataError> create_with_manual_data(std::string_view plus_sign_prefix, std::string_view plus_sign_suffix, std::string_view minus_sign_prefix, std::string_view minus_sign_suffix, std::string_view decimal_separator, std::string_view grouping_separator, uint8_t primary_group_size, uint8_t secondary_group_size, uint8_t min_group_size, diplomat::span<const char32_t> digits, icu4x::FixedDecimalGroupingStrategy grouping_strategy);
+
+  inline std::string format(const icu4x::FixedDecimal& value) const;
+
+  inline const icu4x::capi::FixedDecimalFormatter* AsFFI() const;
+  inline icu4x::capi::FixedDecimalFormatter* AsFFI();
+  inline static const icu4x::FixedDecimalFormatter* FromFFI(const icu4x::capi::FixedDecimalFormatter* ptr);
+  inline static icu4x::FixedDecimalFormatter* FromFFI(icu4x::capi::FixedDecimalFormatter* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  FixedDecimalFormatter() = delete;
+  FixedDecimalFormatter(const icu4x::FixedDecimalFormatter&) = delete;
+  FixedDecimalFormatter(icu4x::FixedDecimalFormatter&&) noexcept = delete;
+  FixedDecimalFormatter operator=(const icu4x::FixedDecimalFormatter&) = delete;
+  FixedDecimalFormatter operator=(icu4x::FixedDecimalFormatter&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_FixedDecimalFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/FixedDecimalFormatter.hpp b/ffi/capi/bindings/cpp/icu4x/FixedDecimalFormatter.hpp
new file mode 100644
index 00000000000..f897c44f682
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/FixedDecimalFormatter.hpp
@@ -0,0 +1,98 @@
+#ifndef icu4x_FixedDecimalFormatter_HPP
+#define icu4x_FixedDecimalFormatter_HPP
+
+#include "FixedDecimalFormatter.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "FixedDecimal.hpp"
+#include "FixedDecimalGroupingStrategy.hpp"
+#include "Locale.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_FixedDecimalFormatter_create_with_grouping_strategy_mv1_result {union {icu4x::capi::FixedDecimalFormatter* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_FixedDecimalFormatter_create_with_grouping_strategy_mv1_result;
+    icu4x_FixedDecimalFormatter_create_with_grouping_strategy_mv1_result icu4x_FixedDecimalFormatter_create_with_grouping_strategy_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale, icu4x::capi::FixedDecimalGroupingStrategy grouping_strategy);
+    
+    typedef struct icu4x_FixedDecimalFormatter_create_with_manual_data_mv1_result {union {icu4x::capi::FixedDecimalFormatter* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_FixedDecimalFormatter_create_with_manual_data_mv1_result;
+    icu4x_FixedDecimalFormatter_create_with_manual_data_mv1_result icu4x_FixedDecimalFormatter_create_with_manual_data_mv1(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, icu4x::capi::FixedDecimalGroupingStrategy grouping_strategy);
+    
+    void icu4x_FixedDecimalFormatter_format_mv1(const icu4x::capi::FixedDecimalFormatter* self, const icu4x::capi::FixedDecimal* value, diplomat::capi::DiplomatWrite* write);
+    
+    
+    void icu4x_FixedDecimalFormatter_destroy_mv1(FixedDecimalFormatter* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::FixedDecimalFormatter>, icu4x::DataError> icu4x::FixedDecimalFormatter::create_with_grouping_strategy(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::FixedDecimalGroupingStrategy grouping_strategy) {
+  auto result = icu4x::capi::icu4x_FixedDecimalFormatter_create_with_grouping_strategy_mv1(provider.AsFFI(),
+    locale.AsFFI(),
+    grouping_strategy.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::FixedDecimalFormatter>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::FixedDecimalFormatter>>(std::unique_ptr<icu4x::FixedDecimalFormatter>(icu4x::FixedDecimalFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::FixedDecimalFormatter>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::FixedDecimalFormatter>, icu4x::DataError> icu4x::FixedDecimalFormatter::create_with_manual_data(std::string_view plus_sign_prefix, std::string_view plus_sign_suffix, std::string_view minus_sign_prefix, std::string_view minus_sign_suffix, std::string_view decimal_separator, std::string_view grouping_separator, uint8_t primary_group_size, uint8_t secondary_group_size, uint8_t min_group_size, diplomat::span<const char32_t> digits, icu4x::FixedDecimalGroupingStrategy grouping_strategy) {
+  auto result = icu4x::capi::icu4x_FixedDecimalFormatter_create_with_manual_data_mv1(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(),
+    grouping_strategy.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::FixedDecimalFormatter>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::FixedDecimalFormatter>>(std::unique_ptr<icu4x::FixedDecimalFormatter>(icu4x::FixedDecimalFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::FixedDecimalFormatter>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline std::string icu4x::FixedDecimalFormatter::format(const icu4x::FixedDecimal& value) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_FixedDecimalFormatter_format_mv1(this->AsFFI(),
+    value.AsFFI(),
+    &write);
+  return output;
+}
+
+inline const icu4x::capi::FixedDecimalFormatter* icu4x::FixedDecimalFormatter::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::FixedDecimalFormatter*>(this);
+}
+
+inline icu4x::capi::FixedDecimalFormatter* icu4x::FixedDecimalFormatter::AsFFI() {
+  return reinterpret_cast<icu4x::capi::FixedDecimalFormatter*>(this);
+}
+
+inline const icu4x::FixedDecimalFormatter* icu4x::FixedDecimalFormatter::FromFFI(const icu4x::capi::FixedDecimalFormatter* ptr) {
+  return reinterpret_cast<const icu4x::FixedDecimalFormatter*>(ptr);
+}
+
+inline icu4x::FixedDecimalFormatter* icu4x::FixedDecimalFormatter::FromFFI(icu4x::capi::FixedDecimalFormatter* ptr) {
+  return reinterpret_cast<icu4x::FixedDecimalFormatter*>(ptr);
+}
+
+inline void icu4x::FixedDecimalFormatter::operator delete(void* ptr) {
+  icu4x::capi::icu4x_FixedDecimalFormatter_destroy_mv1(reinterpret_cast<icu4x::capi::FixedDecimalFormatter*>(ptr));
+}
+
+
+#endif // icu4x_FixedDecimalFormatter_HPP
diff --git a/ffi/capi/bindings/cpp/FixedDecimalGroupingStrategy.d.hpp b/ffi/capi/bindings/cpp/icu4x/FixedDecimalGroupingStrategy.d.hpp
similarity index 67%
rename from ffi/capi/bindings/cpp/FixedDecimalGroupingStrategy.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/FixedDecimalGroupingStrategy.d.hpp
index 23922c8ab53..20f2d6760b7 100644
--- a/ffi/capi/bindings/cpp/FixedDecimalGroupingStrategy.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/FixedDecimalGroupingStrategy.d.hpp
@@ -1,5 +1,5 @@
-#ifndef FixedDecimalGroupingStrategy_D_HPP
-#define FixedDecimalGroupingStrategy_D_HPP
+#ifndef icu4x_FixedDecimalGroupingStrategy_D_HPP
+#define icu4x_FixedDecimalGroupingStrategy_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum FixedDecimalGroupingStrategy {
       FixedDecimalGroupingStrategy_Auto = 0,
@@ -21,6 +21,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class FixedDecimalGroupingStrategy {
 public:
   enum Value {
@@ -37,11 +38,11 @@ class FixedDecimalGroupingStrategy {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::FixedDecimalGroupingStrategy AsFFI() const;
-  inline static FixedDecimalGroupingStrategy FromFFI(diplomat::capi::FixedDecimalGroupingStrategy c_enum);
+  inline icu4x::capi::FixedDecimalGroupingStrategy AsFFI() const;
+  inline static icu4x::FixedDecimalGroupingStrategy FromFFI(icu4x::capi::FixedDecimalGroupingStrategy c_enum);
 private:
     Value value;
 };
 
-
-#endif // FixedDecimalGroupingStrategy_D_HPP
+} // namespace
+#endif // icu4x_FixedDecimalGroupingStrategy_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/FixedDecimalGroupingStrategy.hpp b/ffi/capi/bindings/cpp/icu4x/FixedDecimalGroupingStrategy.hpp
new file mode 100644
index 00000000000..065005c9f15
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/FixedDecimalGroupingStrategy.hpp
@@ -0,0 +1,39 @@
+#ifndef icu4x_FixedDecimalGroupingStrategy_HPP
+#define icu4x_FixedDecimalGroupingStrategy_HPP
+
+#include "FixedDecimalGroupingStrategy.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::FixedDecimalGroupingStrategy icu4x::FixedDecimalGroupingStrategy::AsFFI() const {
+  return static_cast<icu4x::capi::FixedDecimalGroupingStrategy>(value);
+}
+
+inline icu4x::FixedDecimalGroupingStrategy icu4x::FixedDecimalGroupingStrategy::FromFFI(icu4x::capi::FixedDecimalGroupingStrategy c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::FixedDecimalGroupingStrategy_Auto:
+    case icu4x::capi::FixedDecimalGroupingStrategy_Never:
+    case icu4x::capi::FixedDecimalGroupingStrategy_Always:
+    case icu4x::capi::FixedDecimalGroupingStrategy_Min2:
+      return static_cast<icu4x::FixedDecimalGroupingStrategy::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_FixedDecimalGroupingStrategy_HPP
diff --git a/ffi/capi/bindings/cpp/FixedDecimalLimitError.d.hpp b/ffi/capi/bindings/cpp/icu4x/FixedDecimalLimitError.d.hpp
similarity index 50%
rename from ffi/capi/bindings/cpp/FixedDecimalLimitError.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/FixedDecimalLimitError.d.hpp
index 7dbf757d3b0..a5a188df4b4 100644
--- a/ffi/capi/bindings/cpp/FixedDecimalLimitError.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/FixedDecimalLimitError.d.hpp
@@ -1,5 +1,5 @@
-#ifndef FixedDecimalLimitError_D_HPP
-#define FixedDecimalLimitError_D_HPP
+#ifndef icu4x_FixedDecimalLimitError_D_HPP
+#define icu4x_FixedDecimalLimitError_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,19 +7,20 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     
 } // namespace capi
 } // namespace
 
 
+namespace icu4x {
 struct FixedDecimalLimitError {
 
 };
 
-
-#endif // FixedDecimalLimitError_D_HPP
+} // namespace
+#endif // icu4x_FixedDecimalLimitError_D_HPP
diff --git a/ffi/capi/bindings/cpp/FixedDecimalLimitError.hpp b/ffi/capi/bindings/cpp/icu4x/FixedDecimalLimitError.hpp
similarity index 59%
rename from ffi/capi/bindings/cpp/FixedDecimalLimitError.hpp
rename to ffi/capi/bindings/cpp/icu4x/FixedDecimalLimitError.hpp
index 84e02b94f75..dbebdb86ab9 100644
--- a/ffi/capi/bindings/cpp/FixedDecimalLimitError.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/FixedDecimalLimitError.hpp
@@ -1,5 +1,5 @@
-#ifndef FixedDecimalLimitError_HPP
-#define FixedDecimalLimitError_HPP
+#ifndef icu4x_FixedDecimalLimitError_HPP
+#define icu4x_FixedDecimalLimitError_HPP
 
 #include "FixedDecimalLimitError.d.hpp"
 
@@ -9,10 +9,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     extern "C" {
     
@@ -24,4 +24,4 @@ namespace capi {
 
 
 
-#endif // FixedDecimalLimitError_HPP
+#endif // icu4x_FixedDecimalLimitError_HPP
diff --git a/ffi/capi/bindings/cpp/FixedDecimalParseError.d.hpp b/ffi/capi/bindings/cpp/icu4x/FixedDecimalParseError.d.hpp
similarity index 66%
rename from ffi/capi/bindings/cpp/FixedDecimalParseError.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/FixedDecimalParseError.d.hpp
index d795d4dced8..4f6eaf6b3f7 100644
--- a/ffi/capi/bindings/cpp/FixedDecimalParseError.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/FixedDecimalParseError.d.hpp
@@ -1,5 +1,5 @@
-#ifndef FixedDecimalParseError_D_HPP
-#define FixedDecimalParseError_D_HPP
+#ifndef icu4x_FixedDecimalParseError_D_HPP
+#define icu4x_FixedDecimalParseError_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum FixedDecimalParseError {
       FixedDecimalParseError_Unknown = 0,
@@ -20,6 +20,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class FixedDecimalParseError {
 public:
   enum Value {
@@ -35,11 +36,11 @@ class FixedDecimalParseError {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::FixedDecimalParseError AsFFI() const;
-  inline static FixedDecimalParseError FromFFI(diplomat::capi::FixedDecimalParseError c_enum);
+  inline icu4x::capi::FixedDecimalParseError AsFFI() const;
+  inline static icu4x::FixedDecimalParseError FromFFI(icu4x::capi::FixedDecimalParseError c_enum);
 private:
     Value value;
 };
 
-
-#endif // FixedDecimalParseError_D_HPP
+} // namespace
+#endif // icu4x_FixedDecimalParseError_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/FixedDecimalParseError.hpp b/ffi/capi/bindings/cpp/icu4x/FixedDecimalParseError.hpp
new file mode 100644
index 00000000000..aa26ac00e63
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/FixedDecimalParseError.hpp
@@ -0,0 +1,38 @@
+#ifndef icu4x_FixedDecimalParseError_HPP
+#define icu4x_FixedDecimalParseError_HPP
+
+#include "FixedDecimalParseError.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::FixedDecimalParseError icu4x::FixedDecimalParseError::AsFFI() const {
+  return static_cast<icu4x::capi::FixedDecimalParseError>(value);
+}
+
+inline icu4x::FixedDecimalParseError icu4x::FixedDecimalParseError::FromFFI(icu4x::capi::FixedDecimalParseError c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::FixedDecimalParseError_Unknown:
+    case icu4x::capi::FixedDecimalParseError_Limit:
+    case icu4x::capi::FixedDecimalParseError_Syntax:
+      return static_cast<icu4x::FixedDecimalParseError::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_FixedDecimalParseError_HPP
diff --git a/ffi/capi/bindings/cpp/FixedDecimalRoundingIncrement.d.hpp b/ffi/capi/bindings/cpp/icu4x/FixedDecimalRoundingIncrement.d.hpp
similarity index 68%
rename from ffi/capi/bindings/cpp/FixedDecimalRoundingIncrement.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/FixedDecimalRoundingIncrement.d.hpp
index 073d2013ccf..da49a4e9b0f 100644
--- a/ffi/capi/bindings/cpp/FixedDecimalRoundingIncrement.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/FixedDecimalRoundingIncrement.d.hpp
@@ -1,5 +1,5 @@
-#ifndef FixedDecimalRoundingIncrement_D_HPP
-#define FixedDecimalRoundingIncrement_D_HPP
+#ifndef icu4x_FixedDecimalRoundingIncrement_D_HPP
+#define icu4x_FixedDecimalRoundingIncrement_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum FixedDecimalRoundingIncrement {
       FixedDecimalRoundingIncrement_MultiplesOf1 = 0,
@@ -21,6 +21,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class FixedDecimalRoundingIncrement {
 public:
   enum Value {
@@ -37,11 +38,11 @@ class FixedDecimalRoundingIncrement {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::FixedDecimalRoundingIncrement AsFFI() const;
-  inline static FixedDecimalRoundingIncrement FromFFI(diplomat::capi::FixedDecimalRoundingIncrement c_enum);
+  inline icu4x::capi::FixedDecimalRoundingIncrement AsFFI() const;
+  inline static icu4x::FixedDecimalRoundingIncrement FromFFI(icu4x::capi::FixedDecimalRoundingIncrement c_enum);
 private:
     Value value;
 };
 
-
-#endif // FixedDecimalRoundingIncrement_D_HPP
+} // namespace
+#endif // icu4x_FixedDecimalRoundingIncrement_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/FixedDecimalRoundingIncrement.hpp b/ffi/capi/bindings/cpp/icu4x/FixedDecimalRoundingIncrement.hpp
new file mode 100644
index 00000000000..6fdabd4a6fe
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/FixedDecimalRoundingIncrement.hpp
@@ -0,0 +1,39 @@
+#ifndef icu4x_FixedDecimalRoundingIncrement_HPP
+#define icu4x_FixedDecimalRoundingIncrement_HPP
+
+#include "FixedDecimalRoundingIncrement.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::FixedDecimalRoundingIncrement icu4x::FixedDecimalRoundingIncrement::AsFFI() const {
+  return static_cast<icu4x::capi::FixedDecimalRoundingIncrement>(value);
+}
+
+inline icu4x::FixedDecimalRoundingIncrement icu4x::FixedDecimalRoundingIncrement::FromFFI(icu4x::capi::FixedDecimalRoundingIncrement c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::FixedDecimalRoundingIncrement_MultiplesOf1:
+    case icu4x::capi::FixedDecimalRoundingIncrement_MultiplesOf2:
+    case icu4x::capi::FixedDecimalRoundingIncrement_MultiplesOf5:
+    case icu4x::capi::FixedDecimalRoundingIncrement_MultiplesOf25:
+      return static_cast<icu4x::FixedDecimalRoundingIncrement::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_FixedDecimalRoundingIncrement_HPP
diff --git a/ffi/capi/bindings/cpp/FixedDecimalRoundingMode.d.hpp b/ffi/capi/bindings/cpp/icu4x/FixedDecimalRoundingMode.d.hpp
similarity index 74%
rename from ffi/capi/bindings/cpp/FixedDecimalRoundingMode.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/FixedDecimalRoundingMode.d.hpp
index 0ab50fd8f59..50141604e11 100644
--- a/ffi/capi/bindings/cpp/FixedDecimalRoundingMode.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/FixedDecimalRoundingMode.d.hpp
@@ -1,5 +1,5 @@
-#ifndef FixedDecimalRoundingMode_D_HPP
-#define FixedDecimalRoundingMode_D_HPP
+#ifndef icu4x_FixedDecimalRoundingMode_D_HPP
+#define icu4x_FixedDecimalRoundingMode_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum FixedDecimalRoundingMode {
       FixedDecimalRoundingMode_Ceil = 0,
@@ -26,6 +26,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class FixedDecimalRoundingMode {
 public:
   enum Value {
@@ -47,11 +48,11 @@ class FixedDecimalRoundingMode {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::FixedDecimalRoundingMode AsFFI() const;
-  inline static FixedDecimalRoundingMode FromFFI(diplomat::capi::FixedDecimalRoundingMode c_enum);
+  inline icu4x::capi::FixedDecimalRoundingMode AsFFI() const;
+  inline static icu4x::FixedDecimalRoundingMode FromFFI(icu4x::capi::FixedDecimalRoundingMode c_enum);
 private:
     Value value;
 };
 
-
-#endif // FixedDecimalRoundingMode_D_HPP
+} // namespace
+#endif // icu4x_FixedDecimalRoundingMode_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/FixedDecimalRoundingMode.hpp b/ffi/capi/bindings/cpp/icu4x/FixedDecimalRoundingMode.hpp
new file mode 100644
index 00000000000..962bafc3048
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/FixedDecimalRoundingMode.hpp
@@ -0,0 +1,44 @@
+#ifndef icu4x_FixedDecimalRoundingMode_HPP
+#define icu4x_FixedDecimalRoundingMode_HPP
+
+#include "FixedDecimalRoundingMode.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::FixedDecimalRoundingMode icu4x::FixedDecimalRoundingMode::AsFFI() const {
+  return static_cast<icu4x::capi::FixedDecimalRoundingMode>(value);
+}
+
+inline icu4x::FixedDecimalRoundingMode icu4x::FixedDecimalRoundingMode::FromFFI(icu4x::capi::FixedDecimalRoundingMode c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::FixedDecimalRoundingMode_Ceil:
+    case icu4x::capi::FixedDecimalRoundingMode_Expand:
+    case icu4x::capi::FixedDecimalRoundingMode_Floor:
+    case icu4x::capi::FixedDecimalRoundingMode_Trunc:
+    case icu4x::capi::FixedDecimalRoundingMode_HalfCeil:
+    case icu4x::capi::FixedDecimalRoundingMode_HalfExpand:
+    case icu4x::capi::FixedDecimalRoundingMode_HalfFloor:
+    case icu4x::capi::FixedDecimalRoundingMode_HalfTrunc:
+    case icu4x::capi::FixedDecimalRoundingMode_HalfEven:
+      return static_cast<icu4x::FixedDecimalRoundingMode::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_FixedDecimalRoundingMode_HPP
diff --git a/ffi/capi/bindings/cpp/FixedDecimalSign.d.hpp b/ffi/capi/bindings/cpp/icu4x/FixedDecimalSign.d.hpp
similarity index 67%
rename from ffi/capi/bindings/cpp/FixedDecimalSign.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/FixedDecimalSign.d.hpp
index dccf27e4ff7..a0e39c81ae9 100644
--- a/ffi/capi/bindings/cpp/FixedDecimalSign.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/FixedDecimalSign.d.hpp
@@ -1,5 +1,5 @@
-#ifndef FixedDecimalSign_D_HPP
-#define FixedDecimalSign_D_HPP
+#ifndef icu4x_FixedDecimalSign_D_HPP
+#define icu4x_FixedDecimalSign_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum FixedDecimalSign {
       FixedDecimalSign_None = 0,
@@ -20,6 +20,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class FixedDecimalSign {
 public:
   enum Value {
@@ -35,11 +36,11 @@ class FixedDecimalSign {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::FixedDecimalSign AsFFI() const;
-  inline static FixedDecimalSign FromFFI(diplomat::capi::FixedDecimalSign c_enum);
+  inline icu4x::capi::FixedDecimalSign AsFFI() const;
+  inline static icu4x::FixedDecimalSign FromFFI(icu4x::capi::FixedDecimalSign c_enum);
 private:
     Value value;
 };
 
-
-#endif // FixedDecimalSign_D_HPP
+} // namespace
+#endif // icu4x_FixedDecimalSign_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/FixedDecimalSign.hpp b/ffi/capi/bindings/cpp/icu4x/FixedDecimalSign.hpp
new file mode 100644
index 00000000000..b06e1682c1d
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/FixedDecimalSign.hpp
@@ -0,0 +1,38 @@
+#ifndef icu4x_FixedDecimalSign_HPP
+#define icu4x_FixedDecimalSign_HPP
+
+#include "FixedDecimalSign.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::FixedDecimalSign icu4x::FixedDecimalSign::AsFFI() const {
+  return static_cast<icu4x::capi::FixedDecimalSign>(value);
+}
+
+inline icu4x::FixedDecimalSign icu4x::FixedDecimalSign::FromFFI(icu4x::capi::FixedDecimalSign c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::FixedDecimalSign_None:
+    case icu4x::capi::FixedDecimalSign_Negative:
+    case icu4x::capi::FixedDecimalSign_Positive:
+      return static_cast<icu4x::FixedDecimalSign::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_FixedDecimalSign_HPP
diff --git a/ffi/capi/bindings/cpp/FixedDecimalSignDisplay.d.hpp b/ffi/capi/bindings/cpp/icu4x/FixedDecimalSignDisplay.d.hpp
similarity index 69%
rename from ffi/capi/bindings/cpp/FixedDecimalSignDisplay.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/FixedDecimalSignDisplay.d.hpp
index c63f0c4dc77..d45f15355ed 100644
--- a/ffi/capi/bindings/cpp/FixedDecimalSignDisplay.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/FixedDecimalSignDisplay.d.hpp
@@ -1,5 +1,5 @@
-#ifndef FixedDecimalSignDisplay_D_HPP
-#define FixedDecimalSignDisplay_D_HPP
+#ifndef icu4x_FixedDecimalSignDisplay_D_HPP
+#define icu4x_FixedDecimalSignDisplay_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum FixedDecimalSignDisplay {
       FixedDecimalSignDisplay_Auto = 0,
@@ -22,6 +22,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class FixedDecimalSignDisplay {
 public:
   enum Value {
@@ -39,11 +40,11 @@ class FixedDecimalSignDisplay {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::FixedDecimalSignDisplay AsFFI() const;
-  inline static FixedDecimalSignDisplay FromFFI(diplomat::capi::FixedDecimalSignDisplay c_enum);
+  inline icu4x::capi::FixedDecimalSignDisplay AsFFI() const;
+  inline static icu4x::FixedDecimalSignDisplay FromFFI(icu4x::capi::FixedDecimalSignDisplay c_enum);
 private:
     Value value;
 };
 
-
-#endif // FixedDecimalSignDisplay_D_HPP
+} // namespace
+#endif // icu4x_FixedDecimalSignDisplay_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/FixedDecimalSignDisplay.hpp b/ffi/capi/bindings/cpp/icu4x/FixedDecimalSignDisplay.hpp
new file mode 100644
index 00000000000..c066ef1f4ac
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/FixedDecimalSignDisplay.hpp
@@ -0,0 +1,40 @@
+#ifndef icu4x_FixedDecimalSignDisplay_HPP
+#define icu4x_FixedDecimalSignDisplay_HPP
+
+#include "FixedDecimalSignDisplay.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::FixedDecimalSignDisplay icu4x::FixedDecimalSignDisplay::AsFFI() const {
+  return static_cast<icu4x::capi::FixedDecimalSignDisplay>(value);
+}
+
+inline icu4x::FixedDecimalSignDisplay icu4x::FixedDecimalSignDisplay::FromFFI(icu4x::capi::FixedDecimalSignDisplay c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::FixedDecimalSignDisplay_Auto:
+    case icu4x::capi::FixedDecimalSignDisplay_Never:
+    case icu4x::capi::FixedDecimalSignDisplay_Always:
+    case icu4x::capi::FixedDecimalSignDisplay_ExceptZero:
+    case icu4x::capi::FixedDecimalSignDisplay_Negative:
+      return static_cast<icu4x::FixedDecimalSignDisplay::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_FixedDecimalSignDisplay_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/GeneralCategoryNameToMaskMapper.d.hpp b/ffi/capi/bindings/cpp/icu4x/GeneralCategoryNameToMaskMapper.d.hpp
new file mode 100644
index 00000000000..c378524258e
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/GeneralCategoryNameToMaskMapper.d.hpp
@@ -0,0 +1,52 @@
+#ifndef icu4x_GeneralCategoryNameToMaskMapper_D_HPP
+#define icu4x_GeneralCategoryNameToMaskMapper_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct GeneralCategoryNameToMaskMapper; }
+class GeneralCategoryNameToMaskMapper;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct GeneralCategoryNameToMaskMapper;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class GeneralCategoryNameToMaskMapper {
+public:
+
+  inline uint32_t get_strict(std::string_view name) const;
+
+  inline uint32_t get_loose(std::string_view name) const;
+
+  inline static diplomat::result<std::unique_ptr<icu4x::GeneralCategoryNameToMaskMapper>, icu4x::DataError> load(const icu4x::DataProvider& provider);
+
+  inline const icu4x::capi::GeneralCategoryNameToMaskMapper* AsFFI() const;
+  inline icu4x::capi::GeneralCategoryNameToMaskMapper* AsFFI();
+  inline static const icu4x::GeneralCategoryNameToMaskMapper* FromFFI(const icu4x::capi::GeneralCategoryNameToMaskMapper* ptr);
+  inline static icu4x::GeneralCategoryNameToMaskMapper* FromFFI(icu4x::capi::GeneralCategoryNameToMaskMapper* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  GeneralCategoryNameToMaskMapper() = delete;
+  GeneralCategoryNameToMaskMapper(const icu4x::GeneralCategoryNameToMaskMapper&) = delete;
+  GeneralCategoryNameToMaskMapper(icu4x::GeneralCategoryNameToMaskMapper&&) noexcept = delete;
+  GeneralCategoryNameToMaskMapper operator=(const icu4x::GeneralCategoryNameToMaskMapper&) = delete;
+  GeneralCategoryNameToMaskMapper operator=(icu4x::GeneralCategoryNameToMaskMapper&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_GeneralCategoryNameToMaskMapper_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/GeneralCategoryNameToMaskMapper.hpp b/ffi/capi/bindings/cpp/icu4x/GeneralCategoryNameToMaskMapper.hpp
new file mode 100644
index 00000000000..fa83f034d34
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/GeneralCategoryNameToMaskMapper.hpp
@@ -0,0 +1,75 @@
+#ifndef icu4x_GeneralCategoryNameToMaskMapper_HPP
+#define icu4x_GeneralCategoryNameToMaskMapper_HPP
+
+#include "GeneralCategoryNameToMaskMapper.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    uint32_t icu4x_GeneralCategoryNameToMaskMapper_get_strict_mv1(const icu4x::capi::GeneralCategoryNameToMaskMapper* self, const char* name_data, size_t name_len);
+    
+    uint32_t icu4x_GeneralCategoryNameToMaskMapper_get_loose_mv1(const icu4x::capi::GeneralCategoryNameToMaskMapper* self, const char* name_data, size_t name_len);
+    
+    typedef struct icu4x_GeneralCategoryNameToMaskMapper_load_mv1_result {union {icu4x::capi::GeneralCategoryNameToMaskMapper* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_GeneralCategoryNameToMaskMapper_load_mv1_result;
+    icu4x_GeneralCategoryNameToMaskMapper_load_mv1_result icu4x_GeneralCategoryNameToMaskMapper_load_mv1(const icu4x::capi::DataProvider* provider);
+    
+    
+    void icu4x_GeneralCategoryNameToMaskMapper_destroy_mv1(GeneralCategoryNameToMaskMapper* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline uint32_t icu4x::GeneralCategoryNameToMaskMapper::get_strict(std::string_view name) const {
+  auto result = icu4x::capi::icu4x_GeneralCategoryNameToMaskMapper_get_strict_mv1(this->AsFFI(),
+    name.data(),
+    name.size());
+  return result;
+}
+
+inline uint32_t icu4x::GeneralCategoryNameToMaskMapper::get_loose(std::string_view name) const {
+  auto result = icu4x::capi::icu4x_GeneralCategoryNameToMaskMapper_get_loose_mv1(this->AsFFI(),
+    name.data(),
+    name.size());
+  return result;
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::GeneralCategoryNameToMaskMapper>, icu4x::DataError> icu4x::GeneralCategoryNameToMaskMapper::load(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_GeneralCategoryNameToMaskMapper_load_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::GeneralCategoryNameToMaskMapper>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::GeneralCategoryNameToMaskMapper>>(std::unique_ptr<icu4x::GeneralCategoryNameToMaskMapper>(icu4x::GeneralCategoryNameToMaskMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::GeneralCategoryNameToMaskMapper>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline const icu4x::capi::GeneralCategoryNameToMaskMapper* icu4x::GeneralCategoryNameToMaskMapper::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::GeneralCategoryNameToMaskMapper*>(this);
+}
+
+inline icu4x::capi::GeneralCategoryNameToMaskMapper* icu4x::GeneralCategoryNameToMaskMapper::AsFFI() {
+  return reinterpret_cast<icu4x::capi::GeneralCategoryNameToMaskMapper*>(this);
+}
+
+inline const icu4x::GeneralCategoryNameToMaskMapper* icu4x::GeneralCategoryNameToMaskMapper::FromFFI(const icu4x::capi::GeneralCategoryNameToMaskMapper* ptr) {
+  return reinterpret_cast<const icu4x::GeneralCategoryNameToMaskMapper*>(ptr);
+}
+
+inline icu4x::GeneralCategoryNameToMaskMapper* icu4x::GeneralCategoryNameToMaskMapper::FromFFI(icu4x::capi::GeneralCategoryNameToMaskMapper* ptr) {
+  return reinterpret_cast<icu4x::GeneralCategoryNameToMaskMapper*>(ptr);
+}
+
+inline void icu4x::GeneralCategoryNameToMaskMapper::operator delete(void* ptr) {
+  icu4x::capi::icu4x_GeneralCategoryNameToMaskMapper_destroy_mv1(reinterpret_cast<icu4x::capi::GeneralCategoryNameToMaskMapper*>(ptr));
+}
+
+
+#endif // icu4x_GeneralCategoryNameToMaskMapper_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorLatin1.d.hpp b/ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorLatin1.d.hpp
new file mode 100644
index 00000000000..7d3285a7e69
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorLatin1.d.hpp
@@ -0,0 +1,40 @@
+#ifndef icu4x_GraphemeClusterBreakIteratorLatin1_D_HPP
+#define icu4x_GraphemeClusterBreakIteratorLatin1_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    struct GraphemeClusterBreakIteratorLatin1;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class GraphemeClusterBreakIteratorLatin1 {
+public:
+
+  inline int32_t next();
+
+  inline const icu4x::capi::GraphemeClusterBreakIteratorLatin1* AsFFI() const;
+  inline icu4x::capi::GraphemeClusterBreakIteratorLatin1* AsFFI();
+  inline static const icu4x::GraphemeClusterBreakIteratorLatin1* FromFFI(const icu4x::capi::GraphemeClusterBreakIteratorLatin1* ptr);
+  inline static icu4x::GraphemeClusterBreakIteratorLatin1* FromFFI(icu4x::capi::GraphemeClusterBreakIteratorLatin1* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  GraphemeClusterBreakIteratorLatin1() = delete;
+  GraphemeClusterBreakIteratorLatin1(const icu4x::GraphemeClusterBreakIteratorLatin1&) = delete;
+  GraphemeClusterBreakIteratorLatin1(icu4x::GraphemeClusterBreakIteratorLatin1&&) noexcept = delete;
+  GraphemeClusterBreakIteratorLatin1 operator=(const icu4x::GraphemeClusterBreakIteratorLatin1&) = delete;
+  GraphemeClusterBreakIteratorLatin1 operator=(icu4x::GraphemeClusterBreakIteratorLatin1&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_GraphemeClusterBreakIteratorLatin1_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorLatin1.hpp b/ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorLatin1.hpp
new file mode 100644
index 00000000000..a857ff3864b
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorLatin1.hpp
@@ -0,0 +1,54 @@
+#ifndef icu4x_GraphemeClusterBreakIteratorLatin1_HPP
+#define icu4x_GraphemeClusterBreakIteratorLatin1_HPP
+
+#include "GraphemeClusterBreakIteratorLatin1.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    int32_t icu4x_GraphemeClusterBreakIteratorLatin1_next_mv1(icu4x::capi::GraphemeClusterBreakIteratorLatin1* self);
+    
+    
+    void icu4x_GraphemeClusterBreakIteratorLatin1_destroy_mv1(GraphemeClusterBreakIteratorLatin1* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline int32_t icu4x::GraphemeClusterBreakIteratorLatin1::next() {
+  auto result = icu4x::capi::icu4x_GraphemeClusterBreakIteratorLatin1_next_mv1(this->AsFFI());
+  return result;
+}
+
+inline const icu4x::capi::GraphemeClusterBreakIteratorLatin1* icu4x::GraphemeClusterBreakIteratorLatin1::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::GraphemeClusterBreakIteratorLatin1*>(this);
+}
+
+inline icu4x::capi::GraphemeClusterBreakIteratorLatin1* icu4x::GraphemeClusterBreakIteratorLatin1::AsFFI() {
+  return reinterpret_cast<icu4x::capi::GraphemeClusterBreakIteratorLatin1*>(this);
+}
+
+inline const icu4x::GraphemeClusterBreakIteratorLatin1* icu4x::GraphemeClusterBreakIteratorLatin1::FromFFI(const icu4x::capi::GraphemeClusterBreakIteratorLatin1* ptr) {
+  return reinterpret_cast<const icu4x::GraphemeClusterBreakIteratorLatin1*>(ptr);
+}
+
+inline icu4x::GraphemeClusterBreakIteratorLatin1* icu4x::GraphemeClusterBreakIteratorLatin1::FromFFI(icu4x::capi::GraphemeClusterBreakIteratorLatin1* ptr) {
+  return reinterpret_cast<icu4x::GraphemeClusterBreakIteratorLatin1*>(ptr);
+}
+
+inline void icu4x::GraphemeClusterBreakIteratorLatin1::operator delete(void* ptr) {
+  icu4x::capi::icu4x_GraphemeClusterBreakIteratorLatin1_destroy_mv1(reinterpret_cast<icu4x::capi::GraphemeClusterBreakIteratorLatin1*>(ptr));
+}
+
+
+#endif // icu4x_GraphemeClusterBreakIteratorLatin1_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorUtf16.d.hpp b/ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorUtf16.d.hpp
new file mode 100644
index 00000000000..81fa6d1b3dc
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorUtf16.d.hpp
@@ -0,0 +1,40 @@
+#ifndef icu4x_GraphemeClusterBreakIteratorUtf16_D_HPP
+#define icu4x_GraphemeClusterBreakIteratorUtf16_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    struct GraphemeClusterBreakIteratorUtf16;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class GraphemeClusterBreakIteratorUtf16 {
+public:
+
+  inline int32_t next();
+
+  inline const icu4x::capi::GraphemeClusterBreakIteratorUtf16* AsFFI() const;
+  inline icu4x::capi::GraphemeClusterBreakIteratorUtf16* AsFFI();
+  inline static const icu4x::GraphemeClusterBreakIteratorUtf16* FromFFI(const icu4x::capi::GraphemeClusterBreakIteratorUtf16* ptr);
+  inline static icu4x::GraphemeClusterBreakIteratorUtf16* FromFFI(icu4x::capi::GraphemeClusterBreakIteratorUtf16* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  GraphemeClusterBreakIteratorUtf16() = delete;
+  GraphemeClusterBreakIteratorUtf16(const icu4x::GraphemeClusterBreakIteratorUtf16&) = delete;
+  GraphemeClusterBreakIteratorUtf16(icu4x::GraphemeClusterBreakIteratorUtf16&&) noexcept = delete;
+  GraphemeClusterBreakIteratorUtf16 operator=(const icu4x::GraphemeClusterBreakIteratorUtf16&) = delete;
+  GraphemeClusterBreakIteratorUtf16 operator=(icu4x::GraphemeClusterBreakIteratorUtf16&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_GraphemeClusterBreakIteratorUtf16_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorUtf16.hpp b/ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorUtf16.hpp
new file mode 100644
index 00000000000..f331c485ffa
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorUtf16.hpp
@@ -0,0 +1,54 @@
+#ifndef icu4x_GraphemeClusterBreakIteratorUtf16_HPP
+#define icu4x_GraphemeClusterBreakIteratorUtf16_HPP
+
+#include "GraphemeClusterBreakIteratorUtf16.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    int32_t icu4x_GraphemeClusterBreakIteratorUtf16_next_mv1(icu4x::capi::GraphemeClusterBreakIteratorUtf16* self);
+    
+    
+    void icu4x_GraphemeClusterBreakIteratorUtf16_destroy_mv1(GraphemeClusterBreakIteratorUtf16* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline int32_t icu4x::GraphemeClusterBreakIteratorUtf16::next() {
+  auto result = icu4x::capi::icu4x_GraphemeClusterBreakIteratorUtf16_next_mv1(this->AsFFI());
+  return result;
+}
+
+inline const icu4x::capi::GraphemeClusterBreakIteratorUtf16* icu4x::GraphemeClusterBreakIteratorUtf16::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::GraphemeClusterBreakIteratorUtf16*>(this);
+}
+
+inline icu4x::capi::GraphemeClusterBreakIteratorUtf16* icu4x::GraphemeClusterBreakIteratorUtf16::AsFFI() {
+  return reinterpret_cast<icu4x::capi::GraphemeClusterBreakIteratorUtf16*>(this);
+}
+
+inline const icu4x::GraphemeClusterBreakIteratorUtf16* icu4x::GraphemeClusterBreakIteratorUtf16::FromFFI(const icu4x::capi::GraphemeClusterBreakIteratorUtf16* ptr) {
+  return reinterpret_cast<const icu4x::GraphemeClusterBreakIteratorUtf16*>(ptr);
+}
+
+inline icu4x::GraphemeClusterBreakIteratorUtf16* icu4x::GraphemeClusterBreakIteratorUtf16::FromFFI(icu4x::capi::GraphemeClusterBreakIteratorUtf16* ptr) {
+  return reinterpret_cast<icu4x::GraphemeClusterBreakIteratorUtf16*>(ptr);
+}
+
+inline void icu4x::GraphemeClusterBreakIteratorUtf16::operator delete(void* ptr) {
+  icu4x::capi::icu4x_GraphemeClusterBreakIteratorUtf16_destroy_mv1(reinterpret_cast<icu4x::capi::GraphemeClusterBreakIteratorUtf16*>(ptr));
+}
+
+
+#endif // icu4x_GraphemeClusterBreakIteratorUtf16_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorUtf8.d.hpp b/ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorUtf8.d.hpp
new file mode 100644
index 00000000000..fa88c07a5a4
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorUtf8.d.hpp
@@ -0,0 +1,40 @@
+#ifndef icu4x_GraphemeClusterBreakIteratorUtf8_D_HPP
+#define icu4x_GraphemeClusterBreakIteratorUtf8_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    struct GraphemeClusterBreakIteratorUtf8;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class GraphemeClusterBreakIteratorUtf8 {
+public:
+
+  inline int32_t next();
+
+  inline const icu4x::capi::GraphemeClusterBreakIteratorUtf8* AsFFI() const;
+  inline icu4x::capi::GraphemeClusterBreakIteratorUtf8* AsFFI();
+  inline static const icu4x::GraphemeClusterBreakIteratorUtf8* FromFFI(const icu4x::capi::GraphemeClusterBreakIteratorUtf8* ptr);
+  inline static icu4x::GraphemeClusterBreakIteratorUtf8* FromFFI(icu4x::capi::GraphemeClusterBreakIteratorUtf8* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  GraphemeClusterBreakIteratorUtf8() = delete;
+  GraphemeClusterBreakIteratorUtf8(const icu4x::GraphemeClusterBreakIteratorUtf8&) = delete;
+  GraphemeClusterBreakIteratorUtf8(icu4x::GraphemeClusterBreakIteratorUtf8&&) noexcept = delete;
+  GraphemeClusterBreakIteratorUtf8 operator=(const icu4x::GraphemeClusterBreakIteratorUtf8&) = delete;
+  GraphemeClusterBreakIteratorUtf8 operator=(icu4x::GraphemeClusterBreakIteratorUtf8&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_GraphemeClusterBreakIteratorUtf8_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorUtf8.hpp b/ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorUtf8.hpp
new file mode 100644
index 00000000000..869209e8d72
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/GraphemeClusterBreakIteratorUtf8.hpp
@@ -0,0 +1,54 @@
+#ifndef icu4x_GraphemeClusterBreakIteratorUtf8_HPP
+#define icu4x_GraphemeClusterBreakIteratorUtf8_HPP
+
+#include "GraphemeClusterBreakIteratorUtf8.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    int32_t icu4x_GraphemeClusterBreakIteratorUtf8_next_mv1(icu4x::capi::GraphemeClusterBreakIteratorUtf8* self);
+    
+    
+    void icu4x_GraphemeClusterBreakIteratorUtf8_destroy_mv1(GraphemeClusterBreakIteratorUtf8* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline int32_t icu4x::GraphemeClusterBreakIteratorUtf8::next() {
+  auto result = icu4x::capi::icu4x_GraphemeClusterBreakIteratorUtf8_next_mv1(this->AsFFI());
+  return result;
+}
+
+inline const icu4x::capi::GraphemeClusterBreakIteratorUtf8* icu4x::GraphemeClusterBreakIteratorUtf8::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::GraphemeClusterBreakIteratorUtf8*>(this);
+}
+
+inline icu4x::capi::GraphemeClusterBreakIteratorUtf8* icu4x::GraphemeClusterBreakIteratorUtf8::AsFFI() {
+  return reinterpret_cast<icu4x::capi::GraphemeClusterBreakIteratorUtf8*>(this);
+}
+
+inline const icu4x::GraphemeClusterBreakIteratorUtf8* icu4x::GraphemeClusterBreakIteratorUtf8::FromFFI(const icu4x::capi::GraphemeClusterBreakIteratorUtf8* ptr) {
+  return reinterpret_cast<const icu4x::GraphemeClusterBreakIteratorUtf8*>(ptr);
+}
+
+inline icu4x::GraphemeClusterBreakIteratorUtf8* icu4x::GraphemeClusterBreakIteratorUtf8::FromFFI(icu4x::capi::GraphemeClusterBreakIteratorUtf8* ptr) {
+  return reinterpret_cast<icu4x::GraphemeClusterBreakIteratorUtf8*>(ptr);
+}
+
+inline void icu4x::GraphemeClusterBreakIteratorUtf8::operator delete(void* ptr) {
+  icu4x::capi::icu4x_GraphemeClusterBreakIteratorUtf8_destroy_mv1(reinterpret_cast<icu4x::capi::GraphemeClusterBreakIteratorUtf8*>(ptr));
+}
+
+
+#endif // icu4x_GraphemeClusterBreakIteratorUtf8_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/GraphemeClusterSegmenter.d.hpp b/ffi/capi/bindings/cpp/icu4x/GraphemeClusterSegmenter.d.hpp
new file mode 100644
index 00000000000..da0bcdf8ff9
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/GraphemeClusterSegmenter.d.hpp
@@ -0,0 +1,60 @@
+#ifndef icu4x_GraphemeClusterSegmenter_D_HPP
+#define icu4x_GraphemeClusterSegmenter_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct GraphemeClusterBreakIteratorLatin1; }
+class GraphemeClusterBreakIteratorLatin1;
+namespace capi { struct GraphemeClusterBreakIteratorUtf16; }
+class GraphemeClusterBreakIteratorUtf16;
+namespace capi { struct GraphemeClusterBreakIteratorUtf8; }
+class GraphemeClusterBreakIteratorUtf8;
+namespace capi { struct GraphemeClusterSegmenter; }
+class GraphemeClusterSegmenter;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct GraphemeClusterSegmenter;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class GraphemeClusterSegmenter {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::GraphemeClusterSegmenter>, icu4x::DataError> create(const icu4x::DataProvider& provider);
+
+  inline std::unique_ptr<icu4x::GraphemeClusterBreakIteratorUtf8> segment(std::string_view input) const;
+
+  inline std::unique_ptr<icu4x::GraphemeClusterBreakIteratorUtf16> segment16(std::u16string_view input) const;
+
+  inline std::unique_ptr<icu4x::GraphemeClusterBreakIteratorLatin1> segment_latin1(diplomat::span<const uint8_t> input) const;
+
+  inline const icu4x::capi::GraphemeClusterSegmenter* AsFFI() const;
+  inline icu4x::capi::GraphemeClusterSegmenter* AsFFI();
+  inline static const icu4x::GraphemeClusterSegmenter* FromFFI(const icu4x::capi::GraphemeClusterSegmenter* ptr);
+  inline static icu4x::GraphemeClusterSegmenter* FromFFI(icu4x::capi::GraphemeClusterSegmenter* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  GraphemeClusterSegmenter() = delete;
+  GraphemeClusterSegmenter(const icu4x::GraphemeClusterSegmenter&) = delete;
+  GraphemeClusterSegmenter(icu4x::GraphemeClusterSegmenter&&) noexcept = delete;
+  GraphemeClusterSegmenter operator=(const icu4x::GraphemeClusterSegmenter&) = delete;
+  GraphemeClusterSegmenter operator=(icu4x::GraphemeClusterSegmenter&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_GraphemeClusterSegmenter_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/GraphemeClusterSegmenter.hpp b/ffi/capi/bindings/cpp/icu4x/GraphemeClusterSegmenter.hpp
new file mode 100644
index 00000000000..241b41d3d23
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/GraphemeClusterSegmenter.hpp
@@ -0,0 +1,87 @@
+#ifndef icu4x_GraphemeClusterSegmenter_HPP
+#define icu4x_GraphemeClusterSegmenter_HPP
+
+#include "GraphemeClusterSegmenter.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "GraphemeClusterBreakIteratorLatin1.hpp"
+#include "GraphemeClusterBreakIteratorUtf16.hpp"
+#include "GraphemeClusterBreakIteratorUtf8.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_GraphemeClusterSegmenter_create_mv1_result {union {icu4x::capi::GraphemeClusterSegmenter* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_GraphemeClusterSegmenter_create_mv1_result;
+    icu4x_GraphemeClusterSegmenter_create_mv1_result icu4x_GraphemeClusterSegmenter_create_mv1(const icu4x::capi::DataProvider* provider);
+    
+    icu4x::capi::GraphemeClusterBreakIteratorUtf8* icu4x_GraphemeClusterSegmenter_segment_utf8_mv1(const icu4x::capi::GraphemeClusterSegmenter* self, const char* input_data, size_t input_len);
+    
+    icu4x::capi::GraphemeClusterBreakIteratorUtf16* icu4x_GraphemeClusterSegmenter_segment_utf16_mv1(const icu4x::capi::GraphemeClusterSegmenter* self, const char16_t* input_data, size_t input_len);
+    
+    icu4x::capi::GraphemeClusterBreakIteratorLatin1* icu4x_GraphemeClusterSegmenter_segment_latin1_mv1(const icu4x::capi::GraphemeClusterSegmenter* self, const uint8_t* input_data, size_t input_len);
+    
+    
+    void icu4x_GraphemeClusterSegmenter_destroy_mv1(GraphemeClusterSegmenter* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::GraphemeClusterSegmenter>, icu4x::DataError> icu4x::GraphemeClusterSegmenter::create(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_GraphemeClusterSegmenter_create_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::GraphemeClusterSegmenter>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::GraphemeClusterSegmenter>>(std::unique_ptr<icu4x::GraphemeClusterSegmenter>(icu4x::GraphemeClusterSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::GraphemeClusterSegmenter>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline std::unique_ptr<icu4x::GraphemeClusterBreakIteratorUtf8> icu4x::GraphemeClusterSegmenter::segment(std::string_view input) const {
+  auto result = icu4x::capi::icu4x_GraphemeClusterSegmenter_segment_utf8_mv1(this->AsFFI(),
+    input.data(),
+    input.size());
+  return std::unique_ptr<icu4x::GraphemeClusterBreakIteratorUtf8>(icu4x::GraphemeClusterBreakIteratorUtf8::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::GraphemeClusterBreakIteratorUtf16> icu4x::GraphemeClusterSegmenter::segment16(std::u16string_view input) const {
+  auto result = icu4x::capi::icu4x_GraphemeClusterSegmenter_segment_utf16_mv1(this->AsFFI(),
+    input.data(),
+    input.size());
+  return std::unique_ptr<icu4x::GraphemeClusterBreakIteratorUtf16>(icu4x::GraphemeClusterBreakIteratorUtf16::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::GraphemeClusterBreakIteratorLatin1> icu4x::GraphemeClusterSegmenter::segment_latin1(diplomat::span<const uint8_t> input) const {
+  auto result = icu4x::capi::icu4x_GraphemeClusterSegmenter_segment_latin1_mv1(this->AsFFI(),
+    input.data(),
+    input.size());
+  return std::unique_ptr<icu4x::GraphemeClusterBreakIteratorLatin1>(icu4x::GraphemeClusterBreakIteratorLatin1::FromFFI(result));
+}
+
+inline const icu4x::capi::GraphemeClusterSegmenter* icu4x::GraphemeClusterSegmenter::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::GraphemeClusterSegmenter*>(this);
+}
+
+inline icu4x::capi::GraphemeClusterSegmenter* icu4x::GraphemeClusterSegmenter::AsFFI() {
+  return reinterpret_cast<icu4x::capi::GraphemeClusterSegmenter*>(this);
+}
+
+inline const icu4x::GraphemeClusterSegmenter* icu4x::GraphemeClusterSegmenter::FromFFI(const icu4x::capi::GraphemeClusterSegmenter* ptr) {
+  return reinterpret_cast<const icu4x::GraphemeClusterSegmenter*>(ptr);
+}
+
+inline icu4x::GraphemeClusterSegmenter* icu4x::GraphemeClusterSegmenter::FromFFI(icu4x::capi::GraphemeClusterSegmenter* ptr) {
+  return reinterpret_cast<icu4x::GraphemeClusterSegmenter*>(ptr);
+}
+
+inline void icu4x::GraphemeClusterSegmenter::operator delete(void* ptr) {
+  icu4x::capi::icu4x_GraphemeClusterSegmenter_destroy_mv1(reinterpret_cast<icu4x::capi::GraphemeClusterSegmenter*>(ptr));
+}
+
+
+#endif // icu4x_GraphemeClusterSegmenter_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/GregorianDateFormatter.d.hpp b/ffi/capi/bindings/cpp/icu4x/GregorianDateFormatter.d.hpp
new file mode 100644
index 00000000000..85bef736dd0
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/GregorianDateFormatter.d.hpp
@@ -0,0 +1,59 @@
+#ifndef icu4x_GregorianDateFormatter_D_HPP
+#define icu4x_GregorianDateFormatter_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct GregorianDateFormatter; }
+class GregorianDateFormatter;
+namespace capi { struct IsoDate; }
+class IsoDate;
+namespace capi { struct IsoDateTime; }
+class IsoDateTime;
+namespace capi { struct Locale; }
+class Locale;
+class DateLength;
+class Error;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct GregorianDateFormatter;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class GregorianDateFormatter {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::GregorianDateFormatter>, icu4x::Error> create_with_length(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::DateLength length);
+
+  inline std::string format_iso_date(const icu4x::IsoDate& value) const;
+
+  inline std::string format_iso_datetime(const icu4x::IsoDateTime& value) const;
+
+  inline const icu4x::capi::GregorianDateFormatter* AsFFI() const;
+  inline icu4x::capi::GregorianDateFormatter* AsFFI();
+  inline static const icu4x::GregorianDateFormatter* FromFFI(const icu4x::capi::GregorianDateFormatter* ptr);
+  inline static icu4x::GregorianDateFormatter* FromFFI(icu4x::capi::GregorianDateFormatter* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  GregorianDateFormatter() = delete;
+  GregorianDateFormatter(const icu4x::GregorianDateFormatter&) = delete;
+  GregorianDateFormatter(icu4x::GregorianDateFormatter&&) noexcept = delete;
+  GregorianDateFormatter operator=(const icu4x::GregorianDateFormatter&) = delete;
+  GregorianDateFormatter operator=(icu4x::GregorianDateFormatter&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_GregorianDateFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/GregorianDateFormatter.hpp b/ffi/capi/bindings/cpp/icu4x/GregorianDateFormatter.hpp
new file mode 100644
index 00000000000..6bf881d4b6d
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/GregorianDateFormatter.hpp
@@ -0,0 +1,85 @@
+#ifndef icu4x_GregorianDateFormatter_HPP
+#define icu4x_GregorianDateFormatter_HPP
+
+#include "GregorianDateFormatter.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataProvider.hpp"
+#include "DateLength.hpp"
+#include "Error.hpp"
+#include "IsoDate.hpp"
+#include "IsoDateTime.hpp"
+#include "Locale.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_GregorianDateFormatter_create_with_length_mv1_result {union {icu4x::capi::GregorianDateFormatter* ok; icu4x::capi::Error err;}; bool is_ok;} icu4x_GregorianDateFormatter_create_with_length_mv1_result;
+    icu4x_GregorianDateFormatter_create_with_length_mv1_result icu4x_GregorianDateFormatter_create_with_length_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale, icu4x::capi::DateLength length);
+    
+    void icu4x_GregorianDateFormatter_format_iso_date_mv1(const icu4x::capi::GregorianDateFormatter* self, const icu4x::capi::IsoDate* value, diplomat::capi::DiplomatWrite* write);
+    
+    void icu4x_GregorianDateFormatter_format_iso_datetime_mv1(const icu4x::capi::GregorianDateFormatter* self, const icu4x::capi::IsoDateTime* value, diplomat::capi::DiplomatWrite* write);
+    
+    
+    void icu4x_GregorianDateFormatter_destroy_mv1(GregorianDateFormatter* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::GregorianDateFormatter>, icu4x::Error> icu4x::GregorianDateFormatter::create_with_length(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::DateLength length) {
+  auto result = icu4x::capi::icu4x_GregorianDateFormatter_create_with_length_mv1(provider.AsFFI(),
+    locale.AsFFI(),
+    length.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::GregorianDateFormatter>, icu4x::Error>(diplomat::Ok<std::unique_ptr<icu4x::GregorianDateFormatter>>(std::unique_ptr<icu4x::GregorianDateFormatter>(icu4x::GregorianDateFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::GregorianDateFormatter>, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline std::string icu4x::GregorianDateFormatter::format_iso_date(const icu4x::IsoDate& value) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_GregorianDateFormatter_format_iso_date_mv1(this->AsFFI(),
+    value.AsFFI(),
+    &write);
+  return output;
+}
+
+inline std::string icu4x::GregorianDateFormatter::format_iso_datetime(const icu4x::IsoDateTime& value) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_GregorianDateFormatter_format_iso_datetime_mv1(this->AsFFI(),
+    value.AsFFI(),
+    &write);
+  return output;
+}
+
+inline const icu4x::capi::GregorianDateFormatter* icu4x::GregorianDateFormatter::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::GregorianDateFormatter*>(this);
+}
+
+inline icu4x::capi::GregorianDateFormatter* icu4x::GregorianDateFormatter::AsFFI() {
+  return reinterpret_cast<icu4x::capi::GregorianDateFormatter*>(this);
+}
+
+inline const icu4x::GregorianDateFormatter* icu4x::GregorianDateFormatter::FromFFI(const icu4x::capi::GregorianDateFormatter* ptr) {
+  return reinterpret_cast<const icu4x::GregorianDateFormatter*>(ptr);
+}
+
+inline icu4x::GregorianDateFormatter* icu4x::GregorianDateFormatter::FromFFI(icu4x::capi::GregorianDateFormatter* ptr) {
+  return reinterpret_cast<icu4x::GregorianDateFormatter*>(ptr);
+}
+
+inline void icu4x::GregorianDateFormatter::operator delete(void* ptr) {
+  icu4x::capi::icu4x_GregorianDateFormatter_destroy_mv1(reinterpret_cast<icu4x::capi::GregorianDateFormatter*>(ptr));
+}
+
+
+#endif // icu4x_GregorianDateFormatter_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/GregorianDateTimeFormatter.d.hpp b/ffi/capi/bindings/cpp/icu4x/GregorianDateTimeFormatter.d.hpp
new file mode 100644
index 00000000000..f5714cfe525
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/GregorianDateTimeFormatter.d.hpp
@@ -0,0 +1,56 @@
+#ifndef icu4x_GregorianDateTimeFormatter_D_HPP
+#define icu4x_GregorianDateTimeFormatter_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct GregorianDateTimeFormatter; }
+class GregorianDateTimeFormatter;
+namespace capi { struct IsoDateTime; }
+class IsoDateTime;
+namespace capi { struct Locale; }
+class Locale;
+class DateLength;
+class Error;
+class TimeLength;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct GregorianDateTimeFormatter;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class GregorianDateTimeFormatter {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::GregorianDateTimeFormatter>, icu4x::Error> create_with_lengths(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::DateLength date_length, icu4x::TimeLength time_length);
+
+  inline std::string format_iso_datetime(const icu4x::IsoDateTime& value) const;
+
+  inline const icu4x::capi::GregorianDateTimeFormatter* AsFFI() const;
+  inline icu4x::capi::GregorianDateTimeFormatter* AsFFI();
+  inline static const icu4x::GregorianDateTimeFormatter* FromFFI(const icu4x::capi::GregorianDateTimeFormatter* ptr);
+  inline static icu4x::GregorianDateTimeFormatter* FromFFI(icu4x::capi::GregorianDateTimeFormatter* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  GregorianDateTimeFormatter() = delete;
+  GregorianDateTimeFormatter(const icu4x::GregorianDateTimeFormatter&) = delete;
+  GregorianDateTimeFormatter(icu4x::GregorianDateTimeFormatter&&) noexcept = delete;
+  GregorianDateTimeFormatter operator=(const icu4x::GregorianDateTimeFormatter&) = delete;
+  GregorianDateTimeFormatter operator=(icu4x::GregorianDateTimeFormatter&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_GregorianDateTimeFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/GregorianDateTimeFormatter.hpp b/ffi/capi/bindings/cpp/icu4x/GregorianDateTimeFormatter.hpp
new file mode 100644
index 00000000000..9b210e044ff
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/GregorianDateTimeFormatter.hpp
@@ -0,0 +1,75 @@
+#ifndef icu4x_GregorianDateTimeFormatter_HPP
+#define icu4x_GregorianDateTimeFormatter_HPP
+
+#include "GregorianDateTimeFormatter.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataProvider.hpp"
+#include "DateLength.hpp"
+#include "Error.hpp"
+#include "IsoDateTime.hpp"
+#include "Locale.hpp"
+#include "TimeLength.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_GregorianDateTimeFormatter_create_with_lengths_mv1_result {union {icu4x::capi::GregorianDateTimeFormatter* ok; icu4x::capi::Error err;}; bool is_ok;} icu4x_GregorianDateTimeFormatter_create_with_lengths_mv1_result;
+    icu4x_GregorianDateTimeFormatter_create_with_lengths_mv1_result icu4x_GregorianDateTimeFormatter_create_with_lengths_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale, icu4x::capi::DateLength date_length, icu4x::capi::TimeLength time_length);
+    
+    void icu4x_GregorianDateTimeFormatter_format_iso_datetime_mv1(const icu4x::capi::GregorianDateTimeFormatter* self, const icu4x::capi::IsoDateTime* value, diplomat::capi::DiplomatWrite* write);
+    
+    
+    void icu4x_GregorianDateTimeFormatter_destroy_mv1(GregorianDateTimeFormatter* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::GregorianDateTimeFormatter>, icu4x::Error> icu4x::GregorianDateTimeFormatter::create_with_lengths(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::DateLength date_length, icu4x::TimeLength time_length) {
+  auto result = icu4x::capi::icu4x_GregorianDateTimeFormatter_create_with_lengths_mv1(provider.AsFFI(),
+    locale.AsFFI(),
+    date_length.AsFFI(),
+    time_length.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::GregorianDateTimeFormatter>, icu4x::Error>(diplomat::Ok<std::unique_ptr<icu4x::GregorianDateTimeFormatter>>(std::unique_ptr<icu4x::GregorianDateTimeFormatter>(icu4x::GregorianDateTimeFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::GregorianDateTimeFormatter>, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline std::string icu4x::GregorianDateTimeFormatter::format_iso_datetime(const icu4x::IsoDateTime& value) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_GregorianDateTimeFormatter_format_iso_datetime_mv1(this->AsFFI(),
+    value.AsFFI(),
+    &write);
+  return output;
+}
+
+inline const icu4x::capi::GregorianDateTimeFormatter* icu4x::GregorianDateTimeFormatter::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::GregorianDateTimeFormatter*>(this);
+}
+
+inline icu4x::capi::GregorianDateTimeFormatter* icu4x::GregorianDateTimeFormatter::AsFFI() {
+  return reinterpret_cast<icu4x::capi::GregorianDateTimeFormatter*>(this);
+}
+
+inline const icu4x::GregorianDateTimeFormatter* icu4x::GregorianDateTimeFormatter::FromFFI(const icu4x::capi::GregorianDateTimeFormatter* ptr) {
+  return reinterpret_cast<const icu4x::GregorianDateTimeFormatter*>(ptr);
+}
+
+inline icu4x::GregorianDateTimeFormatter* icu4x::GregorianDateTimeFormatter::FromFFI(icu4x::capi::GregorianDateTimeFormatter* ptr) {
+  return reinterpret_cast<icu4x::GregorianDateTimeFormatter*>(ptr);
+}
+
+inline void icu4x::GregorianDateTimeFormatter::operator delete(void* ptr) {
+  icu4x::capi::icu4x_GregorianDateTimeFormatter_destroy_mv1(reinterpret_cast<icu4x::capi::GregorianDateTimeFormatter*>(ptr));
+}
+
+
+#endif // icu4x_GregorianDateTimeFormatter_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/GregorianZonedDateTimeFormatter.d.hpp b/ffi/capi/bindings/cpp/icu4x/GregorianZonedDateTimeFormatter.d.hpp
new file mode 100644
index 00000000000..910aedef05b
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/GregorianZonedDateTimeFormatter.d.hpp
@@ -0,0 +1,61 @@
+#ifndef icu4x_GregorianZonedDateTimeFormatter_D_HPP
+#define icu4x_GregorianZonedDateTimeFormatter_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct CustomTimeZone; }
+class CustomTimeZone;
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct GregorianZonedDateTimeFormatter; }
+class GregorianZonedDateTimeFormatter;
+namespace capi { struct IsoDateTime; }
+class IsoDateTime;
+namespace capi { struct Locale; }
+class Locale;
+struct IsoTimeZoneOptions;
+class DateLength;
+class Error;
+class TimeLength;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct GregorianZonedDateTimeFormatter;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class GregorianZonedDateTimeFormatter {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::GregorianZonedDateTimeFormatter>, icu4x::Error> create_with_lengths(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::DateLength date_length, icu4x::TimeLength time_length);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::GregorianZonedDateTimeFormatter>, icu4x::Error> create_with_lengths_and_iso_8601_time_zone_fallback(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::DateLength date_length, icu4x::TimeLength time_length, icu4x::IsoTimeZoneOptions zone_options);
+
+  inline std::string format_iso_datetime_with_custom_time_zone(const icu4x::IsoDateTime& datetime, const icu4x::CustomTimeZone& time_zone) const;
+
+  inline const icu4x::capi::GregorianZonedDateTimeFormatter* AsFFI() const;
+  inline icu4x::capi::GregorianZonedDateTimeFormatter* AsFFI();
+  inline static const icu4x::GregorianZonedDateTimeFormatter* FromFFI(const icu4x::capi::GregorianZonedDateTimeFormatter* ptr);
+  inline static icu4x::GregorianZonedDateTimeFormatter* FromFFI(icu4x::capi::GregorianZonedDateTimeFormatter* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  GregorianZonedDateTimeFormatter() = delete;
+  GregorianZonedDateTimeFormatter(const icu4x::GregorianZonedDateTimeFormatter&) = delete;
+  GregorianZonedDateTimeFormatter(icu4x::GregorianZonedDateTimeFormatter&&) noexcept = delete;
+  GregorianZonedDateTimeFormatter operator=(const icu4x::GregorianZonedDateTimeFormatter&) = delete;
+  GregorianZonedDateTimeFormatter operator=(icu4x::GregorianZonedDateTimeFormatter&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_GregorianZonedDateTimeFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/GregorianZonedDateTimeFormatter.hpp b/ffi/capi/bindings/cpp/icu4x/GregorianZonedDateTimeFormatter.hpp
new file mode 100644
index 00000000000..a465d7ad885
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/GregorianZonedDateTimeFormatter.hpp
@@ -0,0 +1,90 @@
+#ifndef icu4x_GregorianZonedDateTimeFormatter_HPP
+#define icu4x_GregorianZonedDateTimeFormatter_HPP
+
+#include "GregorianZonedDateTimeFormatter.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "CustomTimeZone.hpp"
+#include "DataProvider.hpp"
+#include "DateLength.hpp"
+#include "Error.hpp"
+#include "IsoDateTime.hpp"
+#include "IsoTimeZoneOptions.hpp"
+#include "Locale.hpp"
+#include "TimeLength.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_GregorianZonedDateTimeFormatter_create_with_lengths_mv1_result {union {icu4x::capi::GregorianZonedDateTimeFormatter* ok; icu4x::capi::Error err;}; bool is_ok;} icu4x_GregorianZonedDateTimeFormatter_create_with_lengths_mv1_result;
+    icu4x_GregorianZonedDateTimeFormatter_create_with_lengths_mv1_result icu4x_GregorianZonedDateTimeFormatter_create_with_lengths_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale, icu4x::capi::DateLength date_length, icu4x::capi::TimeLength time_length);
+    
+    typedef struct icu4x_GregorianZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback_mv1_result {union {icu4x::capi::GregorianZonedDateTimeFormatter* ok; icu4x::capi::Error err;}; bool is_ok;} icu4x_GregorianZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback_mv1_result;
+    icu4x_GregorianZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback_mv1_result icu4x_GregorianZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale, icu4x::capi::DateLength date_length, icu4x::capi::TimeLength time_length, icu4x::capi::IsoTimeZoneOptions zone_options);
+    
+    void icu4x_GregorianZonedDateTimeFormatter_format_iso_datetime_with_custom_time_zone_mv1(const icu4x::capi::GregorianZonedDateTimeFormatter* self, const icu4x::capi::IsoDateTime* datetime, const icu4x::capi::CustomTimeZone* time_zone, diplomat::capi::DiplomatWrite* write);
+    
+    
+    void icu4x_GregorianZonedDateTimeFormatter_destroy_mv1(GregorianZonedDateTimeFormatter* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::GregorianZonedDateTimeFormatter>, icu4x::Error> icu4x::GregorianZonedDateTimeFormatter::create_with_lengths(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::DateLength date_length, icu4x::TimeLength time_length) {
+  auto result = icu4x::capi::icu4x_GregorianZonedDateTimeFormatter_create_with_lengths_mv1(provider.AsFFI(),
+    locale.AsFFI(),
+    date_length.AsFFI(),
+    time_length.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::GregorianZonedDateTimeFormatter>, icu4x::Error>(diplomat::Ok<std::unique_ptr<icu4x::GregorianZonedDateTimeFormatter>>(std::unique_ptr<icu4x::GregorianZonedDateTimeFormatter>(icu4x::GregorianZonedDateTimeFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::GregorianZonedDateTimeFormatter>, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::GregorianZonedDateTimeFormatter>, icu4x::Error> icu4x::GregorianZonedDateTimeFormatter::create_with_lengths_and_iso_8601_time_zone_fallback(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::DateLength date_length, icu4x::TimeLength time_length, icu4x::IsoTimeZoneOptions zone_options) {
+  auto result = icu4x::capi::icu4x_GregorianZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback_mv1(provider.AsFFI(),
+    locale.AsFFI(),
+    date_length.AsFFI(),
+    time_length.AsFFI(),
+    zone_options.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::GregorianZonedDateTimeFormatter>, icu4x::Error>(diplomat::Ok<std::unique_ptr<icu4x::GregorianZonedDateTimeFormatter>>(std::unique_ptr<icu4x::GregorianZonedDateTimeFormatter>(icu4x::GregorianZonedDateTimeFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::GregorianZonedDateTimeFormatter>, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline std::string icu4x::GregorianZonedDateTimeFormatter::format_iso_datetime_with_custom_time_zone(const icu4x::IsoDateTime& datetime, const icu4x::CustomTimeZone& time_zone) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_GregorianZonedDateTimeFormatter_format_iso_datetime_with_custom_time_zone_mv1(this->AsFFI(),
+    datetime.AsFFI(),
+    time_zone.AsFFI(),
+    &write);
+  return output;
+}
+
+inline const icu4x::capi::GregorianZonedDateTimeFormatter* icu4x::GregorianZonedDateTimeFormatter::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::GregorianZonedDateTimeFormatter*>(this);
+}
+
+inline icu4x::capi::GregorianZonedDateTimeFormatter* icu4x::GregorianZonedDateTimeFormatter::AsFFI() {
+  return reinterpret_cast<icu4x::capi::GregorianZonedDateTimeFormatter*>(this);
+}
+
+inline const icu4x::GregorianZonedDateTimeFormatter* icu4x::GregorianZonedDateTimeFormatter::FromFFI(const icu4x::capi::GregorianZonedDateTimeFormatter* ptr) {
+  return reinterpret_cast<const icu4x::GregorianZonedDateTimeFormatter*>(ptr);
+}
+
+inline icu4x::GregorianZonedDateTimeFormatter* icu4x::GregorianZonedDateTimeFormatter::FromFFI(icu4x::capi::GregorianZonedDateTimeFormatter* ptr) {
+  return reinterpret_cast<icu4x::GregorianZonedDateTimeFormatter*>(ptr);
+}
+
+inline void icu4x::GregorianZonedDateTimeFormatter::operator delete(void* ptr) {
+  icu4x::capi::icu4x_GregorianZonedDateTimeFormatter_destroy_mv1(reinterpret_cast<icu4x::capi::GregorianZonedDateTimeFormatter*>(ptr));
+}
+
+
+#endif // icu4x_GregorianZonedDateTimeFormatter_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/IsoDate.d.hpp b/ffi/capi/bindings/cpp/icu4x/IsoDate.d.hpp
new file mode 100644
index 00000000000..37c7e578e36
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/IsoDate.d.hpp
@@ -0,0 +1,85 @@
+#ifndef icu4x_IsoDate_D_HPP
+#define icu4x_IsoDate_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct Calendar; }
+class Calendar;
+namespace capi { struct Date; }
+class Date;
+namespace capi { struct IsoDate; }
+class IsoDate;
+namespace capi { struct WeekCalculator; }
+class WeekCalculator;
+struct WeekOf;
+class CalendarError;
+class CalendarParseError;
+class IsoWeekday;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct IsoDate;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class IsoDate {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::IsoDate>, icu4x::CalendarError> create(int32_t year, uint8_t month, uint8_t day);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::IsoDate>, icu4x::CalendarParseError> from_string(std::string_view v);
+
+  inline static std::unique_ptr<icu4x::IsoDate> unix_epoch();
+
+  inline std::unique_ptr<icu4x::Date> to_calendar(const icu4x::Calendar& calendar) const;
+
+  inline std::unique_ptr<icu4x::Date> to_any() const;
+
+  inline uint16_t day_of_year() const;
+
+  inline uint32_t day_of_month() const;
+
+  inline icu4x::IsoWeekday day_of_week() const;
+
+  inline uint32_t week_of_month(icu4x::IsoWeekday first_weekday) const;
+
+  inline icu4x::WeekOf week_of_year(const icu4x::WeekCalculator& calculator) const;
+
+  inline uint32_t month() const;
+
+  inline int32_t year() const;
+
+  inline bool is_in_leap_year() const;
+
+  inline uint8_t months_in_year() const;
+
+  inline uint8_t days_in_month() const;
+
+  inline uint16_t days_in_year() const;
+
+  inline const icu4x::capi::IsoDate* AsFFI() const;
+  inline icu4x::capi::IsoDate* AsFFI();
+  inline static const icu4x::IsoDate* FromFFI(const icu4x::capi::IsoDate* ptr);
+  inline static icu4x::IsoDate* FromFFI(icu4x::capi::IsoDate* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  IsoDate() = delete;
+  IsoDate(const icu4x::IsoDate&) = delete;
+  IsoDate(icu4x::IsoDate&&) noexcept = delete;
+  IsoDate operator=(const icu4x::IsoDate&) = delete;
+  IsoDate operator=(icu4x::IsoDate&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_IsoDate_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/IsoDate.hpp b/ffi/capi/bindings/cpp/icu4x/IsoDate.hpp
new file mode 100644
index 00000000000..afd58617200
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/IsoDate.hpp
@@ -0,0 +1,174 @@
+#ifndef icu4x_IsoDate_HPP
+#define icu4x_IsoDate_HPP
+
+#include "IsoDate.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "Calendar.hpp"
+#include "CalendarError.hpp"
+#include "CalendarParseError.hpp"
+#include "Date.hpp"
+#include "IsoWeekday.hpp"
+#include "WeekCalculator.hpp"
+#include "WeekOf.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_IsoDate_create_mv1_result {union {icu4x::capi::IsoDate* ok; icu4x::capi::CalendarError err;}; bool is_ok;} icu4x_IsoDate_create_mv1_result;
+    icu4x_IsoDate_create_mv1_result icu4x_IsoDate_create_mv1(int32_t year, uint8_t month, uint8_t day);
+    
+    typedef struct icu4x_IsoDate_from_string_mv1_result {union {icu4x::capi::IsoDate* ok; icu4x::capi::CalendarParseError err;}; bool is_ok;} icu4x_IsoDate_from_string_mv1_result;
+    icu4x_IsoDate_from_string_mv1_result icu4x_IsoDate_from_string_mv1(const char* v_data, size_t v_len);
+    
+    icu4x::capi::IsoDate* icu4x_IsoDate_unix_epoch_mv1(void);
+    
+    icu4x::capi::Date* icu4x_IsoDate_to_calendar_mv1(const icu4x::capi::IsoDate* self, const icu4x::capi::Calendar* calendar);
+    
+    icu4x::capi::Date* icu4x_IsoDate_to_any_mv1(const icu4x::capi::IsoDate* self);
+    
+    uint16_t icu4x_IsoDate_day_of_year_mv1(const icu4x::capi::IsoDate* self);
+    
+    uint32_t icu4x_IsoDate_day_of_month_mv1(const icu4x::capi::IsoDate* self);
+    
+    icu4x::capi::IsoWeekday icu4x_IsoDate_day_of_week_mv1(const icu4x::capi::IsoDate* self);
+    
+    uint32_t icu4x_IsoDate_week_of_month_mv1(const icu4x::capi::IsoDate* self, icu4x::capi::IsoWeekday first_weekday);
+    
+    icu4x::capi::WeekOf icu4x_IsoDate_week_of_year_mv1(const icu4x::capi::IsoDate* self, const icu4x::capi::WeekCalculator* calculator);
+    
+    uint32_t icu4x_IsoDate_month_mv1(const icu4x::capi::IsoDate* self);
+    
+    int32_t icu4x_IsoDate_year_mv1(const icu4x::capi::IsoDate* self);
+    
+    bool icu4x_IsoDate_is_in_leap_year_mv1(const icu4x::capi::IsoDate* self);
+    
+    uint8_t icu4x_IsoDate_months_in_year_mv1(const icu4x::capi::IsoDate* self);
+    
+    uint8_t icu4x_IsoDate_days_in_month_mv1(const icu4x::capi::IsoDate* self);
+    
+    uint16_t icu4x_IsoDate_days_in_year_mv1(const icu4x::capi::IsoDate* self);
+    
+    
+    void icu4x_IsoDate_destroy_mv1(IsoDate* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::IsoDate>, icu4x::CalendarError> icu4x::IsoDate::create(int32_t year, uint8_t month, uint8_t day) {
+  auto result = icu4x::capi::icu4x_IsoDate_create_mv1(year,
+    month,
+    day);
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::IsoDate>, icu4x::CalendarError>(diplomat::Ok<std::unique_ptr<icu4x::IsoDate>>(std::unique_ptr<icu4x::IsoDate>(icu4x::IsoDate::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::IsoDate>, icu4x::CalendarError>(diplomat::Err<icu4x::CalendarError>(icu4x::CalendarError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::IsoDate>, icu4x::CalendarParseError> icu4x::IsoDate::from_string(std::string_view v) {
+  auto result = icu4x::capi::icu4x_IsoDate_from_string_mv1(v.data(),
+    v.size());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::IsoDate>, icu4x::CalendarParseError>(diplomat::Ok<std::unique_ptr<icu4x::IsoDate>>(std::unique_ptr<icu4x::IsoDate>(icu4x::IsoDate::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::IsoDate>, icu4x::CalendarParseError>(diplomat::Err<icu4x::CalendarParseError>(icu4x::CalendarParseError::FromFFI(result.err)));
+}
+
+inline std::unique_ptr<icu4x::IsoDate> icu4x::IsoDate::unix_epoch() {
+  auto result = icu4x::capi::icu4x_IsoDate_unix_epoch_mv1();
+  return std::unique_ptr<icu4x::IsoDate>(icu4x::IsoDate::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::Date> icu4x::IsoDate::to_calendar(const icu4x::Calendar& calendar) const {
+  auto result = icu4x::capi::icu4x_IsoDate_to_calendar_mv1(this->AsFFI(),
+    calendar.AsFFI());
+  return std::unique_ptr<icu4x::Date>(icu4x::Date::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::Date> icu4x::IsoDate::to_any() const {
+  auto result = icu4x::capi::icu4x_IsoDate_to_any_mv1(this->AsFFI());
+  return std::unique_ptr<icu4x::Date>(icu4x::Date::FromFFI(result));
+}
+
+inline uint16_t icu4x::IsoDate::day_of_year() const {
+  auto result = icu4x::capi::icu4x_IsoDate_day_of_year_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint32_t icu4x::IsoDate::day_of_month() const {
+  auto result = icu4x::capi::icu4x_IsoDate_day_of_month_mv1(this->AsFFI());
+  return result;
+}
+
+inline icu4x::IsoWeekday icu4x::IsoDate::day_of_week() const {
+  auto result = icu4x::capi::icu4x_IsoDate_day_of_week_mv1(this->AsFFI());
+  return icu4x::IsoWeekday::FromFFI(result);
+}
+
+inline uint32_t icu4x::IsoDate::week_of_month(icu4x::IsoWeekday first_weekday) const {
+  auto result = icu4x::capi::icu4x_IsoDate_week_of_month_mv1(this->AsFFI(),
+    first_weekday.AsFFI());
+  return result;
+}
+
+inline icu4x::WeekOf icu4x::IsoDate::week_of_year(const icu4x::WeekCalculator& calculator) const {
+  auto result = icu4x::capi::icu4x_IsoDate_week_of_year_mv1(this->AsFFI(),
+    calculator.AsFFI());
+  return icu4x::WeekOf::FromFFI(result);
+}
+
+inline uint32_t icu4x::IsoDate::month() const {
+  auto result = icu4x::capi::icu4x_IsoDate_month_mv1(this->AsFFI());
+  return result;
+}
+
+inline int32_t icu4x::IsoDate::year() const {
+  auto result = icu4x::capi::icu4x_IsoDate_year_mv1(this->AsFFI());
+  return result;
+}
+
+inline bool icu4x::IsoDate::is_in_leap_year() const {
+  auto result = icu4x::capi::icu4x_IsoDate_is_in_leap_year_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint8_t icu4x::IsoDate::months_in_year() const {
+  auto result = icu4x::capi::icu4x_IsoDate_months_in_year_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint8_t icu4x::IsoDate::days_in_month() const {
+  auto result = icu4x::capi::icu4x_IsoDate_days_in_month_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint16_t icu4x::IsoDate::days_in_year() const {
+  auto result = icu4x::capi::icu4x_IsoDate_days_in_year_mv1(this->AsFFI());
+  return result;
+}
+
+inline const icu4x::capi::IsoDate* icu4x::IsoDate::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::IsoDate*>(this);
+}
+
+inline icu4x::capi::IsoDate* icu4x::IsoDate::AsFFI() {
+  return reinterpret_cast<icu4x::capi::IsoDate*>(this);
+}
+
+inline const icu4x::IsoDate* icu4x::IsoDate::FromFFI(const icu4x::capi::IsoDate* ptr) {
+  return reinterpret_cast<const icu4x::IsoDate*>(ptr);
+}
+
+inline icu4x::IsoDate* icu4x::IsoDate::FromFFI(icu4x::capi::IsoDate* ptr) {
+  return reinterpret_cast<icu4x::IsoDate*>(ptr);
+}
+
+inline void icu4x::IsoDate::operator delete(void* ptr) {
+  icu4x::capi::icu4x_IsoDate_destroy_mv1(reinterpret_cast<icu4x::capi::IsoDate*>(ptr));
+}
+
+
+#endif // icu4x_IsoDate_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/IsoDateTime.d.hpp b/ffi/capi/bindings/cpp/icu4x/IsoDateTime.d.hpp
new file mode 100644
index 00000000000..754ff9bdf22
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/IsoDateTime.d.hpp
@@ -0,0 +1,107 @@
+#ifndef icu4x_IsoDateTime_D_HPP
+#define icu4x_IsoDateTime_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct Calendar; }
+class Calendar;
+namespace capi { struct DateTime; }
+class DateTime;
+namespace capi { struct IsoDate; }
+class IsoDate;
+namespace capi { struct IsoDateTime; }
+class IsoDateTime;
+namespace capi { struct Time; }
+class Time;
+namespace capi { struct WeekCalculator; }
+class WeekCalculator;
+struct WeekOf;
+class CalendarError;
+class CalendarParseError;
+class IsoWeekday;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct IsoDateTime;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class IsoDateTime {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::IsoDateTime>, icu4x::CalendarError> create(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond);
+
+  inline static std::unique_ptr<icu4x::IsoDateTime> from_date_and_time(const icu4x::IsoDate& date, const icu4x::Time& time);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::IsoDateTime>, icu4x::CalendarParseError> from_string(std::string_view v);
+
+  inline static std::unique_ptr<icu4x::IsoDateTime> local_unix_epoch();
+
+  inline static std::unique_ptr<icu4x::IsoDateTime> from_minutes_since_local_unix_epoch(int32_t minutes);
+
+  inline std::unique_ptr<icu4x::IsoDate> date() const;
+
+  inline std::unique_ptr<icu4x::Time> time() const;
+
+  inline std::unique_ptr<icu4x::DateTime> to_any() const;
+
+  inline int32_t minutes_since_local_unix_epoch() const;
+
+  inline std::unique_ptr<icu4x::DateTime> to_calendar(const icu4x::Calendar& calendar) const;
+
+  inline uint8_t hour() const;
+
+  inline uint8_t minute() const;
+
+  inline uint8_t second() const;
+
+  inline uint32_t nanosecond() const;
+
+  inline uint16_t day_of_year() const;
+
+  inline uint32_t day_of_month() const;
+
+  inline icu4x::IsoWeekday day_of_week() const;
+
+  inline uint32_t week_of_month(icu4x::IsoWeekday first_weekday) const;
+
+  inline icu4x::WeekOf week_of_year(const icu4x::WeekCalculator& calculator) const;
+
+  inline uint32_t month() const;
+
+  inline int32_t year() const;
+
+  inline bool is_in_leap_year() const;
+
+  inline uint8_t months_in_year() const;
+
+  inline uint8_t days_in_month() const;
+
+  inline uint16_t days_in_year() const;
+
+  inline const icu4x::capi::IsoDateTime* AsFFI() const;
+  inline icu4x::capi::IsoDateTime* AsFFI();
+  inline static const icu4x::IsoDateTime* FromFFI(const icu4x::capi::IsoDateTime* ptr);
+  inline static icu4x::IsoDateTime* FromFFI(icu4x::capi::IsoDateTime* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  IsoDateTime() = delete;
+  IsoDateTime(const icu4x::IsoDateTime&) = delete;
+  IsoDateTime(icu4x::IsoDateTime&&) noexcept = delete;
+  IsoDateTime operator=(const icu4x::IsoDateTime&) = delete;
+  IsoDateTime operator=(icu4x::IsoDateTime&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_IsoDateTime_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/IsoDateTime.hpp b/ffi/capi/bindings/cpp/icu4x/IsoDateTime.hpp
new file mode 100644
index 00000000000..8d6361f913d
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/IsoDateTime.hpp
@@ -0,0 +1,244 @@
+#ifndef icu4x_IsoDateTime_HPP
+#define icu4x_IsoDateTime_HPP
+
+#include "IsoDateTime.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "Calendar.hpp"
+#include "CalendarError.hpp"
+#include "CalendarParseError.hpp"
+#include "DateTime.hpp"
+#include "IsoDate.hpp"
+#include "IsoWeekday.hpp"
+#include "Time.hpp"
+#include "WeekCalculator.hpp"
+#include "WeekOf.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_IsoDateTime_create_mv1_result {union {icu4x::capi::IsoDateTime* ok; icu4x::capi::CalendarError err;}; bool is_ok;} icu4x_IsoDateTime_create_mv1_result;
+    icu4x_IsoDateTime_create_mv1_result icu4x_IsoDateTime_create_mv1(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond);
+    
+    icu4x::capi::IsoDateTime* icu4x_IsoDateTime_from_date_and_time_mv1(const icu4x::capi::IsoDate* date, const icu4x::capi::Time* time);
+    
+    typedef struct icu4x_IsoDateTime_from_string_mv1_result {union {icu4x::capi::IsoDateTime* ok; icu4x::capi::CalendarParseError err;}; bool is_ok;} icu4x_IsoDateTime_from_string_mv1_result;
+    icu4x_IsoDateTime_from_string_mv1_result icu4x_IsoDateTime_from_string_mv1(const char* v_data, size_t v_len);
+    
+    icu4x::capi::IsoDateTime* icu4x_IsoDateTime_local_unix_epoch_mv1(void);
+    
+    icu4x::capi::IsoDateTime* icu4x_IsoDateTime_from_minutes_since_local_unix_epoch_mv1(int32_t minutes);
+    
+    icu4x::capi::IsoDate* icu4x_IsoDateTime_date_mv1(const icu4x::capi::IsoDateTime* self);
+    
+    icu4x::capi::Time* icu4x_IsoDateTime_time_mv1(const icu4x::capi::IsoDateTime* self);
+    
+    icu4x::capi::DateTime* icu4x_IsoDateTime_to_any_mv1(const icu4x::capi::IsoDateTime* self);
+    
+    int32_t icu4x_IsoDateTime_minutes_since_local_unix_epoch_mv1(const icu4x::capi::IsoDateTime* self);
+    
+    icu4x::capi::DateTime* icu4x_IsoDateTime_to_calendar_mv1(const icu4x::capi::IsoDateTime* self, const icu4x::capi::Calendar* calendar);
+    
+    uint8_t icu4x_IsoDateTime_hour_mv1(const icu4x::capi::IsoDateTime* self);
+    
+    uint8_t icu4x_IsoDateTime_minute_mv1(const icu4x::capi::IsoDateTime* self);
+    
+    uint8_t icu4x_IsoDateTime_second_mv1(const icu4x::capi::IsoDateTime* self);
+    
+    uint32_t icu4x_IsoDateTime_nanosecond_mv1(const icu4x::capi::IsoDateTime* self);
+    
+    uint16_t icu4x_IsoDateTime_day_of_year_mv1(const icu4x::capi::IsoDateTime* self);
+    
+    uint32_t icu4x_IsoDateTime_day_of_month_mv1(const icu4x::capi::IsoDateTime* self);
+    
+    icu4x::capi::IsoWeekday icu4x_IsoDateTime_day_of_week_mv1(const icu4x::capi::IsoDateTime* self);
+    
+    uint32_t icu4x_IsoDateTime_week_of_month_mv1(const icu4x::capi::IsoDateTime* self, icu4x::capi::IsoWeekday first_weekday);
+    
+    icu4x::capi::WeekOf icu4x_IsoDateTime_week_of_year_mv1(const icu4x::capi::IsoDateTime* self, const icu4x::capi::WeekCalculator* calculator);
+    
+    uint32_t icu4x_IsoDateTime_month_mv1(const icu4x::capi::IsoDateTime* self);
+    
+    int32_t icu4x_IsoDateTime_year_mv1(const icu4x::capi::IsoDateTime* self);
+    
+    bool icu4x_IsoDateTime_is_in_leap_year_mv1(const icu4x::capi::IsoDateTime* self);
+    
+    uint8_t icu4x_IsoDateTime_months_in_year_mv1(const icu4x::capi::IsoDateTime* self);
+    
+    uint8_t icu4x_IsoDateTime_days_in_month_mv1(const icu4x::capi::IsoDateTime* self);
+    
+    uint16_t icu4x_IsoDateTime_days_in_year_mv1(const icu4x::capi::IsoDateTime* self);
+    
+    
+    void icu4x_IsoDateTime_destroy_mv1(IsoDateTime* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::IsoDateTime>, icu4x::CalendarError> icu4x::IsoDateTime::create(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond) {
+  auto result = icu4x::capi::icu4x_IsoDateTime_create_mv1(year,
+    month,
+    day,
+    hour,
+    minute,
+    second,
+    nanosecond);
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::IsoDateTime>, icu4x::CalendarError>(diplomat::Ok<std::unique_ptr<icu4x::IsoDateTime>>(std::unique_ptr<icu4x::IsoDateTime>(icu4x::IsoDateTime::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::IsoDateTime>, icu4x::CalendarError>(diplomat::Err<icu4x::CalendarError>(icu4x::CalendarError::FromFFI(result.err)));
+}
+
+inline std::unique_ptr<icu4x::IsoDateTime> icu4x::IsoDateTime::from_date_and_time(const icu4x::IsoDate& date, const icu4x::Time& time) {
+  auto result = icu4x::capi::icu4x_IsoDateTime_from_date_and_time_mv1(date.AsFFI(),
+    time.AsFFI());
+  return std::unique_ptr<icu4x::IsoDateTime>(icu4x::IsoDateTime::FromFFI(result));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::IsoDateTime>, icu4x::CalendarParseError> icu4x::IsoDateTime::from_string(std::string_view v) {
+  auto result = icu4x::capi::icu4x_IsoDateTime_from_string_mv1(v.data(),
+    v.size());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::IsoDateTime>, icu4x::CalendarParseError>(diplomat::Ok<std::unique_ptr<icu4x::IsoDateTime>>(std::unique_ptr<icu4x::IsoDateTime>(icu4x::IsoDateTime::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::IsoDateTime>, icu4x::CalendarParseError>(diplomat::Err<icu4x::CalendarParseError>(icu4x::CalendarParseError::FromFFI(result.err)));
+}
+
+inline std::unique_ptr<icu4x::IsoDateTime> icu4x::IsoDateTime::local_unix_epoch() {
+  auto result = icu4x::capi::icu4x_IsoDateTime_local_unix_epoch_mv1();
+  return std::unique_ptr<icu4x::IsoDateTime>(icu4x::IsoDateTime::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::IsoDateTime> icu4x::IsoDateTime::from_minutes_since_local_unix_epoch(int32_t minutes) {
+  auto result = icu4x::capi::icu4x_IsoDateTime_from_minutes_since_local_unix_epoch_mv1(minutes);
+  return std::unique_ptr<icu4x::IsoDateTime>(icu4x::IsoDateTime::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::IsoDate> icu4x::IsoDateTime::date() const {
+  auto result = icu4x::capi::icu4x_IsoDateTime_date_mv1(this->AsFFI());
+  return std::unique_ptr<icu4x::IsoDate>(icu4x::IsoDate::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::Time> icu4x::IsoDateTime::time() const {
+  auto result = icu4x::capi::icu4x_IsoDateTime_time_mv1(this->AsFFI());
+  return std::unique_ptr<icu4x::Time>(icu4x::Time::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::DateTime> icu4x::IsoDateTime::to_any() const {
+  auto result = icu4x::capi::icu4x_IsoDateTime_to_any_mv1(this->AsFFI());
+  return std::unique_ptr<icu4x::DateTime>(icu4x::DateTime::FromFFI(result));
+}
+
+inline int32_t icu4x::IsoDateTime::minutes_since_local_unix_epoch() const {
+  auto result = icu4x::capi::icu4x_IsoDateTime_minutes_since_local_unix_epoch_mv1(this->AsFFI());
+  return result;
+}
+
+inline std::unique_ptr<icu4x::DateTime> icu4x::IsoDateTime::to_calendar(const icu4x::Calendar& calendar) const {
+  auto result = icu4x::capi::icu4x_IsoDateTime_to_calendar_mv1(this->AsFFI(),
+    calendar.AsFFI());
+  return std::unique_ptr<icu4x::DateTime>(icu4x::DateTime::FromFFI(result));
+}
+
+inline uint8_t icu4x::IsoDateTime::hour() const {
+  auto result = icu4x::capi::icu4x_IsoDateTime_hour_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint8_t icu4x::IsoDateTime::minute() const {
+  auto result = icu4x::capi::icu4x_IsoDateTime_minute_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint8_t icu4x::IsoDateTime::second() const {
+  auto result = icu4x::capi::icu4x_IsoDateTime_second_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint32_t icu4x::IsoDateTime::nanosecond() const {
+  auto result = icu4x::capi::icu4x_IsoDateTime_nanosecond_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint16_t icu4x::IsoDateTime::day_of_year() const {
+  auto result = icu4x::capi::icu4x_IsoDateTime_day_of_year_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint32_t icu4x::IsoDateTime::day_of_month() const {
+  auto result = icu4x::capi::icu4x_IsoDateTime_day_of_month_mv1(this->AsFFI());
+  return result;
+}
+
+inline icu4x::IsoWeekday icu4x::IsoDateTime::day_of_week() const {
+  auto result = icu4x::capi::icu4x_IsoDateTime_day_of_week_mv1(this->AsFFI());
+  return icu4x::IsoWeekday::FromFFI(result);
+}
+
+inline uint32_t icu4x::IsoDateTime::week_of_month(icu4x::IsoWeekday first_weekday) const {
+  auto result = icu4x::capi::icu4x_IsoDateTime_week_of_month_mv1(this->AsFFI(),
+    first_weekday.AsFFI());
+  return result;
+}
+
+inline icu4x::WeekOf icu4x::IsoDateTime::week_of_year(const icu4x::WeekCalculator& calculator) const {
+  auto result = icu4x::capi::icu4x_IsoDateTime_week_of_year_mv1(this->AsFFI(),
+    calculator.AsFFI());
+  return icu4x::WeekOf::FromFFI(result);
+}
+
+inline uint32_t icu4x::IsoDateTime::month() const {
+  auto result = icu4x::capi::icu4x_IsoDateTime_month_mv1(this->AsFFI());
+  return result;
+}
+
+inline int32_t icu4x::IsoDateTime::year() const {
+  auto result = icu4x::capi::icu4x_IsoDateTime_year_mv1(this->AsFFI());
+  return result;
+}
+
+inline bool icu4x::IsoDateTime::is_in_leap_year() const {
+  auto result = icu4x::capi::icu4x_IsoDateTime_is_in_leap_year_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint8_t icu4x::IsoDateTime::months_in_year() const {
+  auto result = icu4x::capi::icu4x_IsoDateTime_months_in_year_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint8_t icu4x::IsoDateTime::days_in_month() const {
+  auto result = icu4x::capi::icu4x_IsoDateTime_days_in_month_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint16_t icu4x::IsoDateTime::days_in_year() const {
+  auto result = icu4x::capi::icu4x_IsoDateTime_days_in_year_mv1(this->AsFFI());
+  return result;
+}
+
+inline const icu4x::capi::IsoDateTime* icu4x::IsoDateTime::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::IsoDateTime*>(this);
+}
+
+inline icu4x::capi::IsoDateTime* icu4x::IsoDateTime::AsFFI() {
+  return reinterpret_cast<icu4x::capi::IsoDateTime*>(this);
+}
+
+inline const icu4x::IsoDateTime* icu4x::IsoDateTime::FromFFI(const icu4x::capi::IsoDateTime* ptr) {
+  return reinterpret_cast<const icu4x::IsoDateTime*>(ptr);
+}
+
+inline icu4x::IsoDateTime* icu4x::IsoDateTime::FromFFI(icu4x::capi::IsoDateTime* ptr) {
+  return reinterpret_cast<icu4x::IsoDateTime*>(ptr);
+}
+
+inline void icu4x::IsoDateTime::operator delete(void* ptr) {
+  icu4x::capi::icu4x_IsoDateTime_destroy_mv1(reinterpret_cast<icu4x::capi::IsoDateTime*>(ptr));
+}
+
+
+#endif // icu4x_IsoDateTime_HPP
diff --git a/ffi/capi/bindings/cpp/IsoTimeZoneFormat.d.hpp b/ffi/capi/bindings/cpp/icu4x/IsoTimeZoneFormat.d.hpp
similarity index 69%
rename from ffi/capi/bindings/cpp/IsoTimeZoneFormat.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/IsoTimeZoneFormat.d.hpp
index ecafc701404..3d119b33cd9 100644
--- a/ffi/capi/bindings/cpp/IsoTimeZoneFormat.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/IsoTimeZoneFormat.d.hpp
@@ -1,5 +1,5 @@
-#ifndef IsoTimeZoneFormat_D_HPP
-#define IsoTimeZoneFormat_D_HPP
+#ifndef icu4x_IsoTimeZoneFormat_D_HPP
+#define icu4x_IsoTimeZoneFormat_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum IsoTimeZoneFormat {
       IsoTimeZoneFormat_Basic = 0,
@@ -21,6 +21,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class IsoTimeZoneFormat {
 public:
   enum Value {
@@ -37,11 +38,11 @@ class IsoTimeZoneFormat {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::IsoTimeZoneFormat AsFFI() const;
-  inline static IsoTimeZoneFormat FromFFI(diplomat::capi::IsoTimeZoneFormat c_enum);
+  inline icu4x::capi::IsoTimeZoneFormat AsFFI() const;
+  inline static icu4x::IsoTimeZoneFormat FromFFI(icu4x::capi::IsoTimeZoneFormat c_enum);
 private:
     Value value;
 };
 
-
-#endif // IsoTimeZoneFormat_D_HPP
+} // namespace
+#endif // icu4x_IsoTimeZoneFormat_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/IsoTimeZoneFormat.hpp b/ffi/capi/bindings/cpp/icu4x/IsoTimeZoneFormat.hpp
new file mode 100644
index 00000000000..9111574060d
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/IsoTimeZoneFormat.hpp
@@ -0,0 +1,39 @@
+#ifndef icu4x_IsoTimeZoneFormat_HPP
+#define icu4x_IsoTimeZoneFormat_HPP
+
+#include "IsoTimeZoneFormat.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::IsoTimeZoneFormat icu4x::IsoTimeZoneFormat::AsFFI() const {
+  return static_cast<icu4x::capi::IsoTimeZoneFormat>(value);
+}
+
+inline icu4x::IsoTimeZoneFormat icu4x::IsoTimeZoneFormat::FromFFI(icu4x::capi::IsoTimeZoneFormat c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::IsoTimeZoneFormat_Basic:
+    case icu4x::capi::IsoTimeZoneFormat_Extended:
+    case icu4x::capi::IsoTimeZoneFormat_UtcBasic:
+    case icu4x::capi::IsoTimeZoneFormat_UtcExtended:
+      return static_cast<icu4x::IsoTimeZoneFormat::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_IsoTimeZoneFormat_HPP
diff --git a/ffi/capi/bindings/cpp/IsoTimeZoneMinuteDisplay.d.hpp b/ffi/capi/bindings/cpp/icu4x/IsoTimeZoneMinuteDisplay.d.hpp
similarity index 64%
rename from ffi/capi/bindings/cpp/IsoTimeZoneMinuteDisplay.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/IsoTimeZoneMinuteDisplay.d.hpp
index e5d0392cada..c309b1bcd39 100644
--- a/ffi/capi/bindings/cpp/IsoTimeZoneMinuteDisplay.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/IsoTimeZoneMinuteDisplay.d.hpp
@@ -1,5 +1,5 @@
-#ifndef IsoTimeZoneMinuteDisplay_D_HPP
-#define IsoTimeZoneMinuteDisplay_D_HPP
+#ifndef icu4x_IsoTimeZoneMinuteDisplay_D_HPP
+#define icu4x_IsoTimeZoneMinuteDisplay_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum IsoTimeZoneMinuteDisplay {
       IsoTimeZoneMinuteDisplay_Required = 0,
@@ -19,6 +19,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class IsoTimeZoneMinuteDisplay {
 public:
   enum Value {
@@ -33,11 +34,11 @@ class IsoTimeZoneMinuteDisplay {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::IsoTimeZoneMinuteDisplay AsFFI() const;
-  inline static IsoTimeZoneMinuteDisplay FromFFI(diplomat::capi::IsoTimeZoneMinuteDisplay c_enum);
+  inline icu4x::capi::IsoTimeZoneMinuteDisplay AsFFI() const;
+  inline static icu4x::IsoTimeZoneMinuteDisplay FromFFI(icu4x::capi::IsoTimeZoneMinuteDisplay c_enum);
 private:
     Value value;
 };
 
-
-#endif // IsoTimeZoneMinuteDisplay_D_HPP
+} // namespace
+#endif // icu4x_IsoTimeZoneMinuteDisplay_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/IsoTimeZoneMinuteDisplay.hpp b/ffi/capi/bindings/cpp/icu4x/IsoTimeZoneMinuteDisplay.hpp
new file mode 100644
index 00000000000..35a4dceda30
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/IsoTimeZoneMinuteDisplay.hpp
@@ -0,0 +1,37 @@
+#ifndef icu4x_IsoTimeZoneMinuteDisplay_HPP
+#define icu4x_IsoTimeZoneMinuteDisplay_HPP
+
+#include "IsoTimeZoneMinuteDisplay.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::IsoTimeZoneMinuteDisplay icu4x::IsoTimeZoneMinuteDisplay::AsFFI() const {
+  return static_cast<icu4x::capi::IsoTimeZoneMinuteDisplay>(value);
+}
+
+inline icu4x::IsoTimeZoneMinuteDisplay icu4x::IsoTimeZoneMinuteDisplay::FromFFI(icu4x::capi::IsoTimeZoneMinuteDisplay c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::IsoTimeZoneMinuteDisplay_Required:
+    case icu4x::capi::IsoTimeZoneMinuteDisplay_Optional:
+      return static_cast<icu4x::IsoTimeZoneMinuteDisplay::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_IsoTimeZoneMinuteDisplay_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/IsoTimeZoneOptions.d.hpp b/ffi/capi/bindings/cpp/icu4x/IsoTimeZoneOptions.d.hpp
new file mode 100644
index 00000000000..e5b102a12d3
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/IsoTimeZoneOptions.d.hpp
@@ -0,0 +1,44 @@
+#ifndef icu4x_IsoTimeZoneOptions_D_HPP
+#define icu4x_IsoTimeZoneOptions_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "IsoTimeZoneFormat.d.hpp"
+#include "IsoTimeZoneMinuteDisplay.d.hpp"
+#include "IsoTimeZoneSecondDisplay.d.hpp"
+
+namespace icu4x {
+class IsoTimeZoneFormat;
+class IsoTimeZoneMinuteDisplay;
+class IsoTimeZoneSecondDisplay;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct IsoTimeZoneOptions {
+      icu4x::capi::IsoTimeZoneFormat format;
+      icu4x::capi::IsoTimeZoneMinuteDisplay minutes;
+      icu4x::capi::IsoTimeZoneSecondDisplay seconds;
+    };
+} // namespace capi
+} // namespace
+
+
+namespace icu4x {
+struct IsoTimeZoneOptions {
+  icu4x::IsoTimeZoneFormat format;
+  icu4x::IsoTimeZoneMinuteDisplay minutes;
+  icu4x::IsoTimeZoneSecondDisplay seconds;
+
+  inline icu4x::capi::IsoTimeZoneOptions AsFFI() const;
+  inline static icu4x::IsoTimeZoneOptions FromFFI(icu4x::capi::IsoTimeZoneOptions c_struct);
+};
+
+} // namespace
+#endif // icu4x_IsoTimeZoneOptions_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/IsoTimeZoneOptions.hpp b/ffi/capi/bindings/cpp/icu4x/IsoTimeZoneOptions.hpp
new file mode 100644
index 00000000000..7aee14ff275
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/IsoTimeZoneOptions.hpp
@@ -0,0 +1,45 @@
+#ifndef icu4x_IsoTimeZoneOptions_HPP
+#define icu4x_IsoTimeZoneOptions_HPP
+
+#include "IsoTimeZoneOptions.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "IsoTimeZoneFormat.hpp"
+#include "IsoTimeZoneMinuteDisplay.hpp"
+#include "IsoTimeZoneSecondDisplay.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+
+inline icu4x::capi::IsoTimeZoneOptions icu4x::IsoTimeZoneOptions::AsFFI() const {
+  return icu4x::capi::IsoTimeZoneOptions {
+    /* .format = */ format.AsFFI(),
+    /* .minutes = */ minutes.AsFFI(),
+    /* .seconds = */ seconds.AsFFI(),
+  };
+}
+
+inline icu4x::IsoTimeZoneOptions icu4x::IsoTimeZoneOptions::FromFFI(icu4x::capi::IsoTimeZoneOptions c_struct) {
+  return icu4x::IsoTimeZoneOptions {
+    /* .format = */ icu4x::IsoTimeZoneFormat::FromFFI(c_struct.format),
+    /* .minutes = */ icu4x::IsoTimeZoneMinuteDisplay::FromFFI(c_struct.minutes),
+    /* .seconds = */ icu4x::IsoTimeZoneSecondDisplay::FromFFI(c_struct.seconds),
+  };
+}
+
+
+#endif // icu4x_IsoTimeZoneOptions_HPP
diff --git a/ffi/capi/bindings/cpp/IsoTimeZoneSecondDisplay.d.hpp b/ffi/capi/bindings/cpp/icu4x/IsoTimeZoneSecondDisplay.d.hpp
similarity index 64%
rename from ffi/capi/bindings/cpp/IsoTimeZoneSecondDisplay.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/IsoTimeZoneSecondDisplay.d.hpp
index cfb7fbc29ad..683414c6028 100644
--- a/ffi/capi/bindings/cpp/IsoTimeZoneSecondDisplay.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/IsoTimeZoneSecondDisplay.d.hpp
@@ -1,5 +1,5 @@
-#ifndef IsoTimeZoneSecondDisplay_D_HPP
-#define IsoTimeZoneSecondDisplay_D_HPP
+#ifndef icu4x_IsoTimeZoneSecondDisplay_D_HPP
+#define icu4x_IsoTimeZoneSecondDisplay_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum IsoTimeZoneSecondDisplay {
       IsoTimeZoneSecondDisplay_Optional = 0,
@@ -19,6 +19,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class IsoTimeZoneSecondDisplay {
 public:
   enum Value {
@@ -33,11 +34,11 @@ class IsoTimeZoneSecondDisplay {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::IsoTimeZoneSecondDisplay AsFFI() const;
-  inline static IsoTimeZoneSecondDisplay FromFFI(diplomat::capi::IsoTimeZoneSecondDisplay c_enum);
+  inline icu4x::capi::IsoTimeZoneSecondDisplay AsFFI() const;
+  inline static icu4x::IsoTimeZoneSecondDisplay FromFFI(icu4x::capi::IsoTimeZoneSecondDisplay c_enum);
 private:
     Value value;
 };
 
-
-#endif // IsoTimeZoneSecondDisplay_D_HPP
+} // namespace
+#endif // icu4x_IsoTimeZoneSecondDisplay_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/IsoTimeZoneSecondDisplay.hpp b/ffi/capi/bindings/cpp/icu4x/IsoTimeZoneSecondDisplay.hpp
new file mode 100644
index 00000000000..470291d5fa8
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/IsoTimeZoneSecondDisplay.hpp
@@ -0,0 +1,37 @@
+#ifndef icu4x_IsoTimeZoneSecondDisplay_HPP
+#define icu4x_IsoTimeZoneSecondDisplay_HPP
+
+#include "IsoTimeZoneSecondDisplay.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::IsoTimeZoneSecondDisplay icu4x::IsoTimeZoneSecondDisplay::AsFFI() const {
+  return static_cast<icu4x::capi::IsoTimeZoneSecondDisplay>(value);
+}
+
+inline icu4x::IsoTimeZoneSecondDisplay icu4x::IsoTimeZoneSecondDisplay::FromFFI(icu4x::capi::IsoTimeZoneSecondDisplay c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::IsoTimeZoneSecondDisplay_Optional:
+    case icu4x::capi::IsoTimeZoneSecondDisplay_Never:
+      return static_cast<icu4x::IsoTimeZoneSecondDisplay::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_IsoTimeZoneSecondDisplay_HPP
diff --git a/ffi/capi/bindings/cpp/IsoWeekday.d.hpp b/ffi/capi/bindings/cpp/icu4x/IsoWeekday.d.hpp
similarity index 74%
rename from ffi/capi/bindings/cpp/IsoWeekday.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/IsoWeekday.d.hpp
index 32ad5fd77dc..280cf605b26 100644
--- a/ffi/capi/bindings/cpp/IsoWeekday.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/IsoWeekday.d.hpp
@@ -1,5 +1,5 @@
-#ifndef IsoWeekday_D_HPP
-#define IsoWeekday_D_HPP
+#ifndef icu4x_IsoWeekday_D_HPP
+#define icu4x_IsoWeekday_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum IsoWeekday {
       IsoWeekday_Monday = 1,
@@ -24,6 +24,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class IsoWeekday {
 public:
   enum Value {
@@ -43,11 +44,11 @@ class IsoWeekday {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::IsoWeekday AsFFI() const;
-  inline static IsoWeekday FromFFI(diplomat::capi::IsoWeekday c_enum);
+  inline icu4x::capi::IsoWeekday AsFFI() const;
+  inline static icu4x::IsoWeekday FromFFI(icu4x::capi::IsoWeekday c_enum);
 private:
     Value value;
 };
 
-
-#endif // IsoWeekday_D_HPP
+} // namespace
+#endif // icu4x_IsoWeekday_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/IsoWeekday.hpp b/ffi/capi/bindings/cpp/icu4x/IsoWeekday.hpp
new file mode 100644
index 00000000000..8ff27b8ea2a
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/IsoWeekday.hpp
@@ -0,0 +1,42 @@
+#ifndef icu4x_IsoWeekday_HPP
+#define icu4x_IsoWeekday_HPP
+
+#include "IsoWeekday.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::IsoWeekday icu4x::IsoWeekday::AsFFI() const {
+  return static_cast<icu4x::capi::IsoWeekday>(value);
+}
+
+inline icu4x::IsoWeekday icu4x::IsoWeekday::FromFFI(icu4x::capi::IsoWeekday c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::IsoWeekday_Monday:
+    case icu4x::capi::IsoWeekday_Tuesday:
+    case icu4x::capi::IsoWeekday_Wednesday:
+    case icu4x::capi::IsoWeekday_Thursday:
+    case icu4x::capi::IsoWeekday_Friday:
+    case icu4x::capi::IsoWeekday_Saturday:
+    case icu4x::capi::IsoWeekday_Sunday:
+      return static_cast<icu4x::IsoWeekday::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_IsoWeekday_HPP
diff --git a/ffi/capi/bindings/cpp/LanguageDisplay.d.hpp b/ffi/capi/bindings/cpp/icu4x/LanguageDisplay.d.hpp
similarity index 66%
rename from ffi/capi/bindings/cpp/LanguageDisplay.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/LanguageDisplay.d.hpp
index 196a775f954..d5c8f057308 100644
--- a/ffi/capi/bindings/cpp/LanguageDisplay.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/LanguageDisplay.d.hpp
@@ -1,5 +1,5 @@
-#ifndef LanguageDisplay_D_HPP
-#define LanguageDisplay_D_HPP
+#ifndef icu4x_LanguageDisplay_D_HPP
+#define icu4x_LanguageDisplay_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum LanguageDisplay {
       LanguageDisplay_Dialect = 0,
@@ -19,6 +19,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class LanguageDisplay {
 public:
   enum Value {
@@ -33,11 +34,11 @@ class LanguageDisplay {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::LanguageDisplay AsFFI() const;
-  inline static LanguageDisplay FromFFI(diplomat::capi::LanguageDisplay c_enum);
+  inline icu4x::capi::LanguageDisplay AsFFI() const;
+  inline static icu4x::LanguageDisplay FromFFI(icu4x::capi::LanguageDisplay c_enum);
 private:
     Value value;
 };
 
-
-#endif // LanguageDisplay_D_HPP
+} // namespace
+#endif // icu4x_LanguageDisplay_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LanguageDisplay.hpp b/ffi/capi/bindings/cpp/icu4x/LanguageDisplay.hpp
new file mode 100644
index 00000000000..0d3b3ac2449
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LanguageDisplay.hpp
@@ -0,0 +1,37 @@
+#ifndef icu4x_LanguageDisplay_HPP
+#define icu4x_LanguageDisplay_HPP
+
+#include "LanguageDisplay.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::LanguageDisplay icu4x::LanguageDisplay::AsFFI() const {
+  return static_cast<icu4x::capi::LanguageDisplay>(value);
+}
+
+inline icu4x::LanguageDisplay icu4x::LanguageDisplay::FromFFI(icu4x::capi::LanguageDisplay c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::LanguageDisplay_Dialect:
+    case icu4x::capi::LanguageDisplay_Standard:
+      return static_cast<icu4x::LanguageDisplay::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_LanguageDisplay_HPP
diff --git a/ffi/capi/bindings/cpp/LeadingAdjustment.d.hpp b/ffi/capi/bindings/cpp/icu4x/LeadingAdjustment.d.hpp
similarity index 67%
rename from ffi/capi/bindings/cpp/LeadingAdjustment.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/LeadingAdjustment.d.hpp
index 767519ecd23..2da9d1fdab2 100644
--- a/ffi/capi/bindings/cpp/LeadingAdjustment.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/LeadingAdjustment.d.hpp
@@ -1,5 +1,5 @@
-#ifndef LeadingAdjustment_D_HPP
-#define LeadingAdjustment_D_HPP
+#ifndef icu4x_LeadingAdjustment_D_HPP
+#define icu4x_LeadingAdjustment_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum LeadingAdjustment {
       LeadingAdjustment_Auto = 0,
@@ -20,6 +20,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class LeadingAdjustment {
 public:
   enum Value {
@@ -35,11 +36,11 @@ class LeadingAdjustment {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::LeadingAdjustment AsFFI() const;
-  inline static LeadingAdjustment FromFFI(diplomat::capi::LeadingAdjustment c_enum);
+  inline icu4x::capi::LeadingAdjustment AsFFI() const;
+  inline static icu4x::LeadingAdjustment FromFFI(icu4x::capi::LeadingAdjustment c_enum);
 private:
     Value value;
 };
 
-
-#endif // LeadingAdjustment_D_HPP
+} // namespace
+#endif // icu4x_LeadingAdjustment_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LeadingAdjustment.hpp b/ffi/capi/bindings/cpp/icu4x/LeadingAdjustment.hpp
new file mode 100644
index 00000000000..6ee8793fa47
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LeadingAdjustment.hpp
@@ -0,0 +1,38 @@
+#ifndef icu4x_LeadingAdjustment_HPP
+#define icu4x_LeadingAdjustment_HPP
+
+#include "LeadingAdjustment.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::LeadingAdjustment icu4x::LeadingAdjustment::AsFFI() const {
+  return static_cast<icu4x::capi::LeadingAdjustment>(value);
+}
+
+inline icu4x::LeadingAdjustment icu4x::LeadingAdjustment::FromFFI(icu4x::capi::LeadingAdjustment c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::LeadingAdjustment_Auto:
+    case icu4x::capi::LeadingAdjustment_None:
+    case icu4x::capi::LeadingAdjustment_ToCased:
+      return static_cast<icu4x::LeadingAdjustment::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_LeadingAdjustment_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LineBreakIteratorLatin1.d.hpp b/ffi/capi/bindings/cpp/icu4x/LineBreakIteratorLatin1.d.hpp
new file mode 100644
index 00000000000..085f687f226
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LineBreakIteratorLatin1.d.hpp
@@ -0,0 +1,40 @@
+#ifndef icu4x_LineBreakIteratorLatin1_D_HPP
+#define icu4x_LineBreakIteratorLatin1_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    struct LineBreakIteratorLatin1;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class LineBreakIteratorLatin1 {
+public:
+
+  inline int32_t next();
+
+  inline const icu4x::capi::LineBreakIteratorLatin1* AsFFI() const;
+  inline icu4x::capi::LineBreakIteratorLatin1* AsFFI();
+  inline static const icu4x::LineBreakIteratorLatin1* FromFFI(const icu4x::capi::LineBreakIteratorLatin1* ptr);
+  inline static icu4x::LineBreakIteratorLatin1* FromFFI(icu4x::capi::LineBreakIteratorLatin1* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  LineBreakIteratorLatin1() = delete;
+  LineBreakIteratorLatin1(const icu4x::LineBreakIteratorLatin1&) = delete;
+  LineBreakIteratorLatin1(icu4x::LineBreakIteratorLatin1&&) noexcept = delete;
+  LineBreakIteratorLatin1 operator=(const icu4x::LineBreakIteratorLatin1&) = delete;
+  LineBreakIteratorLatin1 operator=(icu4x::LineBreakIteratorLatin1&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_LineBreakIteratorLatin1_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LineBreakIteratorLatin1.hpp b/ffi/capi/bindings/cpp/icu4x/LineBreakIteratorLatin1.hpp
new file mode 100644
index 00000000000..1648b11cc5d
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LineBreakIteratorLatin1.hpp
@@ -0,0 +1,54 @@
+#ifndef icu4x_LineBreakIteratorLatin1_HPP
+#define icu4x_LineBreakIteratorLatin1_HPP
+
+#include "LineBreakIteratorLatin1.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    int32_t icu4x_LineBreakIteratorLatin1_next_mv1(icu4x::capi::LineBreakIteratorLatin1* self);
+    
+    
+    void icu4x_LineBreakIteratorLatin1_destroy_mv1(LineBreakIteratorLatin1* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline int32_t icu4x::LineBreakIteratorLatin1::next() {
+  auto result = icu4x::capi::icu4x_LineBreakIteratorLatin1_next_mv1(this->AsFFI());
+  return result;
+}
+
+inline const icu4x::capi::LineBreakIteratorLatin1* icu4x::LineBreakIteratorLatin1::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::LineBreakIteratorLatin1*>(this);
+}
+
+inline icu4x::capi::LineBreakIteratorLatin1* icu4x::LineBreakIteratorLatin1::AsFFI() {
+  return reinterpret_cast<icu4x::capi::LineBreakIteratorLatin1*>(this);
+}
+
+inline const icu4x::LineBreakIteratorLatin1* icu4x::LineBreakIteratorLatin1::FromFFI(const icu4x::capi::LineBreakIteratorLatin1* ptr) {
+  return reinterpret_cast<const icu4x::LineBreakIteratorLatin1*>(ptr);
+}
+
+inline icu4x::LineBreakIteratorLatin1* icu4x::LineBreakIteratorLatin1::FromFFI(icu4x::capi::LineBreakIteratorLatin1* ptr) {
+  return reinterpret_cast<icu4x::LineBreakIteratorLatin1*>(ptr);
+}
+
+inline void icu4x::LineBreakIteratorLatin1::operator delete(void* ptr) {
+  icu4x::capi::icu4x_LineBreakIteratorLatin1_destroy_mv1(reinterpret_cast<icu4x::capi::LineBreakIteratorLatin1*>(ptr));
+}
+
+
+#endif // icu4x_LineBreakIteratorLatin1_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LineBreakIteratorUtf16.d.hpp b/ffi/capi/bindings/cpp/icu4x/LineBreakIteratorUtf16.d.hpp
new file mode 100644
index 00000000000..198408e23db
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LineBreakIteratorUtf16.d.hpp
@@ -0,0 +1,40 @@
+#ifndef icu4x_LineBreakIteratorUtf16_D_HPP
+#define icu4x_LineBreakIteratorUtf16_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    struct LineBreakIteratorUtf16;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class LineBreakIteratorUtf16 {
+public:
+
+  inline int32_t next();
+
+  inline const icu4x::capi::LineBreakIteratorUtf16* AsFFI() const;
+  inline icu4x::capi::LineBreakIteratorUtf16* AsFFI();
+  inline static const icu4x::LineBreakIteratorUtf16* FromFFI(const icu4x::capi::LineBreakIteratorUtf16* ptr);
+  inline static icu4x::LineBreakIteratorUtf16* FromFFI(icu4x::capi::LineBreakIteratorUtf16* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  LineBreakIteratorUtf16() = delete;
+  LineBreakIteratorUtf16(const icu4x::LineBreakIteratorUtf16&) = delete;
+  LineBreakIteratorUtf16(icu4x::LineBreakIteratorUtf16&&) noexcept = delete;
+  LineBreakIteratorUtf16 operator=(const icu4x::LineBreakIteratorUtf16&) = delete;
+  LineBreakIteratorUtf16 operator=(icu4x::LineBreakIteratorUtf16&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_LineBreakIteratorUtf16_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LineBreakIteratorUtf16.hpp b/ffi/capi/bindings/cpp/icu4x/LineBreakIteratorUtf16.hpp
new file mode 100644
index 00000000000..8e071ca5f2f
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LineBreakIteratorUtf16.hpp
@@ -0,0 +1,54 @@
+#ifndef icu4x_LineBreakIteratorUtf16_HPP
+#define icu4x_LineBreakIteratorUtf16_HPP
+
+#include "LineBreakIteratorUtf16.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    int32_t icu4x_LineBreakIteratorUtf16_next_mv1(icu4x::capi::LineBreakIteratorUtf16* self);
+    
+    
+    void icu4x_LineBreakIteratorUtf16_destroy_mv1(LineBreakIteratorUtf16* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline int32_t icu4x::LineBreakIteratorUtf16::next() {
+  auto result = icu4x::capi::icu4x_LineBreakIteratorUtf16_next_mv1(this->AsFFI());
+  return result;
+}
+
+inline const icu4x::capi::LineBreakIteratorUtf16* icu4x::LineBreakIteratorUtf16::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::LineBreakIteratorUtf16*>(this);
+}
+
+inline icu4x::capi::LineBreakIteratorUtf16* icu4x::LineBreakIteratorUtf16::AsFFI() {
+  return reinterpret_cast<icu4x::capi::LineBreakIteratorUtf16*>(this);
+}
+
+inline const icu4x::LineBreakIteratorUtf16* icu4x::LineBreakIteratorUtf16::FromFFI(const icu4x::capi::LineBreakIteratorUtf16* ptr) {
+  return reinterpret_cast<const icu4x::LineBreakIteratorUtf16*>(ptr);
+}
+
+inline icu4x::LineBreakIteratorUtf16* icu4x::LineBreakIteratorUtf16::FromFFI(icu4x::capi::LineBreakIteratorUtf16* ptr) {
+  return reinterpret_cast<icu4x::LineBreakIteratorUtf16*>(ptr);
+}
+
+inline void icu4x::LineBreakIteratorUtf16::operator delete(void* ptr) {
+  icu4x::capi::icu4x_LineBreakIteratorUtf16_destroy_mv1(reinterpret_cast<icu4x::capi::LineBreakIteratorUtf16*>(ptr));
+}
+
+
+#endif // icu4x_LineBreakIteratorUtf16_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LineBreakIteratorUtf8.d.hpp b/ffi/capi/bindings/cpp/icu4x/LineBreakIteratorUtf8.d.hpp
new file mode 100644
index 00000000000..8a1e5fae86c
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LineBreakIteratorUtf8.d.hpp
@@ -0,0 +1,40 @@
+#ifndef icu4x_LineBreakIteratorUtf8_D_HPP
+#define icu4x_LineBreakIteratorUtf8_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    struct LineBreakIteratorUtf8;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class LineBreakIteratorUtf8 {
+public:
+
+  inline int32_t next();
+
+  inline const icu4x::capi::LineBreakIteratorUtf8* AsFFI() const;
+  inline icu4x::capi::LineBreakIteratorUtf8* AsFFI();
+  inline static const icu4x::LineBreakIteratorUtf8* FromFFI(const icu4x::capi::LineBreakIteratorUtf8* ptr);
+  inline static icu4x::LineBreakIteratorUtf8* FromFFI(icu4x::capi::LineBreakIteratorUtf8* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  LineBreakIteratorUtf8() = delete;
+  LineBreakIteratorUtf8(const icu4x::LineBreakIteratorUtf8&) = delete;
+  LineBreakIteratorUtf8(icu4x::LineBreakIteratorUtf8&&) noexcept = delete;
+  LineBreakIteratorUtf8 operator=(const icu4x::LineBreakIteratorUtf8&) = delete;
+  LineBreakIteratorUtf8 operator=(icu4x::LineBreakIteratorUtf8&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_LineBreakIteratorUtf8_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LineBreakIteratorUtf8.hpp b/ffi/capi/bindings/cpp/icu4x/LineBreakIteratorUtf8.hpp
new file mode 100644
index 00000000000..0d9ae0c3df3
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LineBreakIteratorUtf8.hpp
@@ -0,0 +1,54 @@
+#ifndef icu4x_LineBreakIteratorUtf8_HPP
+#define icu4x_LineBreakIteratorUtf8_HPP
+
+#include "LineBreakIteratorUtf8.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    int32_t icu4x_LineBreakIteratorUtf8_next_mv1(icu4x::capi::LineBreakIteratorUtf8* self);
+    
+    
+    void icu4x_LineBreakIteratorUtf8_destroy_mv1(LineBreakIteratorUtf8* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline int32_t icu4x::LineBreakIteratorUtf8::next() {
+  auto result = icu4x::capi::icu4x_LineBreakIteratorUtf8_next_mv1(this->AsFFI());
+  return result;
+}
+
+inline const icu4x::capi::LineBreakIteratorUtf8* icu4x::LineBreakIteratorUtf8::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::LineBreakIteratorUtf8*>(this);
+}
+
+inline icu4x::capi::LineBreakIteratorUtf8* icu4x::LineBreakIteratorUtf8::AsFFI() {
+  return reinterpret_cast<icu4x::capi::LineBreakIteratorUtf8*>(this);
+}
+
+inline const icu4x::LineBreakIteratorUtf8* icu4x::LineBreakIteratorUtf8::FromFFI(const icu4x::capi::LineBreakIteratorUtf8* ptr) {
+  return reinterpret_cast<const icu4x::LineBreakIteratorUtf8*>(ptr);
+}
+
+inline icu4x::LineBreakIteratorUtf8* icu4x::LineBreakIteratorUtf8::FromFFI(icu4x::capi::LineBreakIteratorUtf8* ptr) {
+  return reinterpret_cast<icu4x::LineBreakIteratorUtf8*>(ptr);
+}
+
+inline void icu4x::LineBreakIteratorUtf8::operator delete(void* ptr) {
+  icu4x::capi::icu4x_LineBreakIteratorUtf8_destroy_mv1(reinterpret_cast<icu4x::capi::LineBreakIteratorUtf8*>(ptr));
+}
+
+
+#endif // icu4x_LineBreakIteratorUtf8_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LineBreakOptionsV1.d.hpp b/ffi/capi/bindings/cpp/icu4x/LineBreakOptionsV1.d.hpp
new file mode 100644
index 00000000000..d787fe7a427
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LineBreakOptionsV1.d.hpp
@@ -0,0 +1,42 @@
+#ifndef icu4x_LineBreakOptionsV1_D_HPP
+#define icu4x_LineBreakOptionsV1_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "LineBreakStrictness.d.hpp"
+#include "LineBreakWordOption.d.hpp"
+
+namespace icu4x {
+class LineBreakStrictness;
+class LineBreakWordOption;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct LineBreakOptionsV1 {
+      icu4x::capi::LineBreakStrictness strictness;
+      icu4x::capi::LineBreakWordOption word_option;
+      bool ja_zh;
+    };
+} // namespace capi
+} // namespace
+
+
+namespace icu4x {
+struct LineBreakOptionsV1 {
+  icu4x::LineBreakStrictness strictness;
+  icu4x::LineBreakWordOption word_option;
+  bool ja_zh;
+
+  inline icu4x::capi::LineBreakOptionsV1 AsFFI() const;
+  inline static icu4x::LineBreakOptionsV1 FromFFI(icu4x::capi::LineBreakOptionsV1 c_struct);
+};
+
+} // namespace
+#endif // icu4x_LineBreakOptionsV1_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LineBreakOptionsV1.hpp b/ffi/capi/bindings/cpp/icu4x/LineBreakOptionsV1.hpp
new file mode 100644
index 00000000000..e1763d160dc
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LineBreakOptionsV1.hpp
@@ -0,0 +1,44 @@
+#ifndef icu4x_LineBreakOptionsV1_HPP
+#define icu4x_LineBreakOptionsV1_HPP
+
+#include "LineBreakOptionsV1.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "LineBreakStrictness.hpp"
+#include "LineBreakWordOption.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+
+inline icu4x::capi::LineBreakOptionsV1 icu4x::LineBreakOptionsV1::AsFFI() const {
+  return icu4x::capi::LineBreakOptionsV1 {
+    /* .strictness = */ strictness.AsFFI(),
+    /* .word_option = */ word_option.AsFFI(),
+    /* .ja_zh = */ ja_zh,
+  };
+}
+
+inline icu4x::LineBreakOptionsV1 icu4x::LineBreakOptionsV1::FromFFI(icu4x::capi::LineBreakOptionsV1 c_struct) {
+  return icu4x::LineBreakOptionsV1 {
+    /* .strictness = */ icu4x::LineBreakStrictness::FromFFI(c_struct.strictness),
+    /* .word_option = */ icu4x::LineBreakWordOption::FromFFI(c_struct.word_option),
+    /* .ja_zh = */ c_struct.ja_zh,
+  };
+}
+
+
+#endif // icu4x_LineBreakOptionsV1_HPP
diff --git a/ffi/capi/bindings/cpp/LineBreakStrictness.d.hpp b/ffi/capi/bindings/cpp/icu4x/LineBreakStrictness.d.hpp
similarity index 68%
rename from ffi/capi/bindings/cpp/LineBreakStrictness.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/LineBreakStrictness.d.hpp
index c3b3f2ad1ea..2b7059c589d 100644
--- a/ffi/capi/bindings/cpp/LineBreakStrictness.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/LineBreakStrictness.d.hpp
@@ -1,5 +1,5 @@
-#ifndef LineBreakStrictness_D_HPP
-#define LineBreakStrictness_D_HPP
+#ifndef icu4x_LineBreakStrictness_D_HPP
+#define icu4x_LineBreakStrictness_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum LineBreakStrictness {
       LineBreakStrictness_Loose = 0,
@@ -21,6 +21,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class LineBreakStrictness {
 public:
   enum Value {
@@ -37,11 +38,11 @@ class LineBreakStrictness {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::LineBreakStrictness AsFFI() const;
-  inline static LineBreakStrictness FromFFI(diplomat::capi::LineBreakStrictness c_enum);
+  inline icu4x::capi::LineBreakStrictness AsFFI() const;
+  inline static icu4x::LineBreakStrictness FromFFI(icu4x::capi::LineBreakStrictness c_enum);
 private:
     Value value;
 };
 
-
-#endif // LineBreakStrictness_D_HPP
+} // namespace
+#endif // icu4x_LineBreakStrictness_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LineBreakStrictness.hpp b/ffi/capi/bindings/cpp/icu4x/LineBreakStrictness.hpp
new file mode 100644
index 00000000000..2148cd8a3ad
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LineBreakStrictness.hpp
@@ -0,0 +1,39 @@
+#ifndef icu4x_LineBreakStrictness_HPP
+#define icu4x_LineBreakStrictness_HPP
+
+#include "LineBreakStrictness.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::LineBreakStrictness icu4x::LineBreakStrictness::AsFFI() const {
+  return static_cast<icu4x::capi::LineBreakStrictness>(value);
+}
+
+inline icu4x::LineBreakStrictness icu4x::LineBreakStrictness::FromFFI(icu4x::capi::LineBreakStrictness c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::LineBreakStrictness_Loose:
+    case icu4x::capi::LineBreakStrictness_Normal:
+    case icu4x::capi::LineBreakStrictness_Strict:
+    case icu4x::capi::LineBreakStrictness_Anywhere:
+      return static_cast<icu4x::LineBreakStrictness::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_LineBreakStrictness_HPP
diff --git a/ffi/capi/bindings/cpp/LineBreakWordOption.d.hpp b/ffi/capi/bindings/cpp/icu4x/LineBreakWordOption.d.hpp
similarity index 67%
rename from ffi/capi/bindings/cpp/LineBreakWordOption.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/LineBreakWordOption.d.hpp
index 3c666538f8b..6c8ed1cae44 100644
--- a/ffi/capi/bindings/cpp/LineBreakWordOption.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/LineBreakWordOption.d.hpp
@@ -1,5 +1,5 @@
-#ifndef LineBreakWordOption_D_HPP
-#define LineBreakWordOption_D_HPP
+#ifndef icu4x_LineBreakWordOption_D_HPP
+#define icu4x_LineBreakWordOption_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum LineBreakWordOption {
       LineBreakWordOption_Normal = 0,
@@ -20,6 +20,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class LineBreakWordOption {
 public:
   enum Value {
@@ -35,11 +36,11 @@ class LineBreakWordOption {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::LineBreakWordOption AsFFI() const;
-  inline static LineBreakWordOption FromFFI(diplomat::capi::LineBreakWordOption c_enum);
+  inline icu4x::capi::LineBreakWordOption AsFFI() const;
+  inline static icu4x::LineBreakWordOption FromFFI(icu4x::capi::LineBreakWordOption c_enum);
 private:
     Value value;
 };
 
-
-#endif // LineBreakWordOption_D_HPP
+} // namespace
+#endif // icu4x_LineBreakWordOption_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LineBreakWordOption.hpp b/ffi/capi/bindings/cpp/icu4x/LineBreakWordOption.hpp
new file mode 100644
index 00000000000..f217a3ed3aa
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LineBreakWordOption.hpp
@@ -0,0 +1,38 @@
+#ifndef icu4x_LineBreakWordOption_HPP
+#define icu4x_LineBreakWordOption_HPP
+
+#include "LineBreakWordOption.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::LineBreakWordOption icu4x::LineBreakWordOption::AsFFI() const {
+  return static_cast<icu4x::capi::LineBreakWordOption>(value);
+}
+
+inline icu4x::LineBreakWordOption icu4x::LineBreakWordOption::FromFFI(icu4x::capi::LineBreakWordOption c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::LineBreakWordOption_Normal:
+    case icu4x::capi::LineBreakWordOption_BreakAll:
+    case icu4x::capi::LineBreakWordOption_KeepAll:
+      return static_cast<icu4x::LineBreakWordOption::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_LineBreakWordOption_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LineSegmenter.d.hpp b/ffi/capi/bindings/cpp/icu4x/LineSegmenter.d.hpp
new file mode 100644
index 00000000000..f4d8abe9b4c
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LineSegmenter.d.hpp
@@ -0,0 +1,71 @@
+#ifndef icu4x_LineSegmenter_D_HPP
+#define icu4x_LineSegmenter_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct LineBreakIteratorLatin1; }
+class LineBreakIteratorLatin1;
+namespace capi { struct LineBreakIteratorUtf16; }
+class LineBreakIteratorUtf16;
+namespace capi { struct LineBreakIteratorUtf8; }
+class LineBreakIteratorUtf8;
+namespace capi { struct LineSegmenter; }
+class LineSegmenter;
+struct LineBreakOptionsV1;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct LineSegmenter;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class LineSegmenter {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError> create_auto(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError> create_lstm(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError> create_dictionary(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError> create_auto_with_options_v1(const icu4x::DataProvider& provider, icu4x::LineBreakOptionsV1 options);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError> create_lstm_with_options_v1(const icu4x::DataProvider& provider, icu4x::LineBreakOptionsV1 options);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError> create_dictionary_with_options_v1(const icu4x::DataProvider& provider, icu4x::LineBreakOptionsV1 options);
+
+  inline std::unique_ptr<icu4x::LineBreakIteratorUtf8> segment(std::string_view input) const;
+
+  inline std::unique_ptr<icu4x::LineBreakIteratorUtf16> segment16(std::u16string_view input) const;
+
+  inline std::unique_ptr<icu4x::LineBreakIteratorLatin1> segment_latin1(diplomat::span<const uint8_t> input) const;
+
+  inline const icu4x::capi::LineSegmenter* AsFFI() const;
+  inline icu4x::capi::LineSegmenter* AsFFI();
+  inline static const icu4x::LineSegmenter* FromFFI(const icu4x::capi::LineSegmenter* ptr);
+  inline static icu4x::LineSegmenter* FromFFI(icu4x::capi::LineSegmenter* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  LineSegmenter() = delete;
+  LineSegmenter(const icu4x::LineSegmenter&) = delete;
+  LineSegmenter(icu4x::LineSegmenter&&) noexcept = delete;
+  LineSegmenter operator=(const icu4x::LineSegmenter&) = delete;
+  LineSegmenter operator=(icu4x::LineSegmenter&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_LineSegmenter_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LineSegmenter.hpp b/ffi/capi/bindings/cpp/icu4x/LineSegmenter.hpp
new file mode 100644
index 00000000000..88debb59431
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LineSegmenter.hpp
@@ -0,0 +1,131 @@
+#ifndef icu4x_LineSegmenter_HPP
+#define icu4x_LineSegmenter_HPP
+
+#include "LineSegmenter.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "LineBreakIteratorLatin1.hpp"
+#include "LineBreakIteratorUtf16.hpp"
+#include "LineBreakIteratorUtf8.hpp"
+#include "LineBreakOptionsV1.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_LineSegmenter_create_auto_mv1_result {union {icu4x::capi::LineSegmenter* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_LineSegmenter_create_auto_mv1_result;
+    icu4x_LineSegmenter_create_auto_mv1_result icu4x_LineSegmenter_create_auto_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_LineSegmenter_create_lstm_mv1_result {union {icu4x::capi::LineSegmenter* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_LineSegmenter_create_lstm_mv1_result;
+    icu4x_LineSegmenter_create_lstm_mv1_result icu4x_LineSegmenter_create_lstm_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_LineSegmenter_create_dictionary_mv1_result {union {icu4x::capi::LineSegmenter* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_LineSegmenter_create_dictionary_mv1_result;
+    icu4x_LineSegmenter_create_dictionary_mv1_result icu4x_LineSegmenter_create_dictionary_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_LineSegmenter_create_auto_with_options_v1_mv1_result {union {icu4x::capi::LineSegmenter* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_LineSegmenter_create_auto_with_options_v1_mv1_result;
+    icu4x_LineSegmenter_create_auto_with_options_v1_mv1_result icu4x_LineSegmenter_create_auto_with_options_v1_mv1(const icu4x::capi::DataProvider* provider, icu4x::capi::LineBreakOptionsV1 options);
+    
+    typedef struct icu4x_LineSegmenter_create_lstm_with_options_v1_mv1_result {union {icu4x::capi::LineSegmenter* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_LineSegmenter_create_lstm_with_options_v1_mv1_result;
+    icu4x_LineSegmenter_create_lstm_with_options_v1_mv1_result icu4x_LineSegmenter_create_lstm_with_options_v1_mv1(const icu4x::capi::DataProvider* provider, icu4x::capi::LineBreakOptionsV1 options);
+    
+    typedef struct icu4x_LineSegmenter_create_dictionary_with_options_v1_mv1_result {union {icu4x::capi::LineSegmenter* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_LineSegmenter_create_dictionary_with_options_v1_mv1_result;
+    icu4x_LineSegmenter_create_dictionary_with_options_v1_mv1_result icu4x_LineSegmenter_create_dictionary_with_options_v1_mv1(const icu4x::capi::DataProvider* provider, icu4x::capi::LineBreakOptionsV1 options);
+    
+    icu4x::capi::LineBreakIteratorUtf8* icu4x_LineSegmenter_segment_utf8_mv1(const icu4x::capi::LineSegmenter* self, const char* input_data, size_t input_len);
+    
+    icu4x::capi::LineBreakIteratorUtf16* icu4x_LineSegmenter_segment_utf16_mv1(const icu4x::capi::LineSegmenter* self, const char16_t* input_data, size_t input_len);
+    
+    icu4x::capi::LineBreakIteratorLatin1* icu4x_LineSegmenter_segment_latin1_mv1(const icu4x::capi::LineSegmenter* self, const uint8_t* input_data, size_t input_len);
+    
+    
+    void icu4x_LineSegmenter_destroy_mv1(LineSegmenter* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError> icu4x::LineSegmenter::create_auto(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_LineSegmenter_create_auto_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::LineSegmenter>>(std::unique_ptr<icu4x::LineSegmenter>(icu4x::LineSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError> icu4x::LineSegmenter::create_lstm(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_LineSegmenter_create_lstm_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::LineSegmenter>>(std::unique_ptr<icu4x::LineSegmenter>(icu4x::LineSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError> icu4x::LineSegmenter::create_dictionary(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_LineSegmenter_create_dictionary_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::LineSegmenter>>(std::unique_ptr<icu4x::LineSegmenter>(icu4x::LineSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError> icu4x::LineSegmenter::create_auto_with_options_v1(const icu4x::DataProvider& provider, icu4x::LineBreakOptionsV1 options) {
+  auto result = icu4x::capi::icu4x_LineSegmenter_create_auto_with_options_v1_mv1(provider.AsFFI(),
+    options.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::LineSegmenter>>(std::unique_ptr<icu4x::LineSegmenter>(icu4x::LineSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError> icu4x::LineSegmenter::create_lstm_with_options_v1(const icu4x::DataProvider& provider, icu4x::LineBreakOptionsV1 options) {
+  auto result = icu4x::capi::icu4x_LineSegmenter_create_lstm_with_options_v1_mv1(provider.AsFFI(),
+    options.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::LineSegmenter>>(std::unique_ptr<icu4x::LineSegmenter>(icu4x::LineSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError> icu4x::LineSegmenter::create_dictionary_with_options_v1(const icu4x::DataProvider& provider, icu4x::LineBreakOptionsV1 options) {
+  auto result = icu4x::capi::icu4x_LineSegmenter_create_dictionary_with_options_v1_mv1(provider.AsFFI(),
+    options.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::LineSegmenter>>(std::unique_ptr<icu4x::LineSegmenter>(icu4x::LineSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::LineSegmenter>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline std::unique_ptr<icu4x::LineBreakIteratorUtf8> icu4x::LineSegmenter::segment(std::string_view input) const {
+  auto result = icu4x::capi::icu4x_LineSegmenter_segment_utf8_mv1(this->AsFFI(),
+    input.data(),
+    input.size());
+  return std::unique_ptr<icu4x::LineBreakIteratorUtf8>(icu4x::LineBreakIteratorUtf8::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::LineBreakIteratorUtf16> icu4x::LineSegmenter::segment16(std::u16string_view input) const {
+  auto result = icu4x::capi::icu4x_LineSegmenter_segment_utf16_mv1(this->AsFFI(),
+    input.data(),
+    input.size());
+  return std::unique_ptr<icu4x::LineBreakIteratorUtf16>(icu4x::LineBreakIteratorUtf16::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::LineBreakIteratorLatin1> icu4x::LineSegmenter::segment_latin1(diplomat::span<const uint8_t> input) const {
+  auto result = icu4x::capi::icu4x_LineSegmenter_segment_latin1_mv1(this->AsFFI(),
+    input.data(),
+    input.size());
+  return std::unique_ptr<icu4x::LineBreakIteratorLatin1>(icu4x::LineBreakIteratorLatin1::FromFFI(result));
+}
+
+inline const icu4x::capi::LineSegmenter* icu4x::LineSegmenter::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::LineSegmenter*>(this);
+}
+
+inline icu4x::capi::LineSegmenter* icu4x::LineSegmenter::AsFFI() {
+  return reinterpret_cast<icu4x::capi::LineSegmenter*>(this);
+}
+
+inline const icu4x::LineSegmenter* icu4x::LineSegmenter::FromFFI(const icu4x::capi::LineSegmenter* ptr) {
+  return reinterpret_cast<const icu4x::LineSegmenter*>(ptr);
+}
+
+inline icu4x::LineSegmenter* icu4x::LineSegmenter::FromFFI(icu4x::capi::LineSegmenter* ptr) {
+  return reinterpret_cast<icu4x::LineSegmenter*>(ptr);
+}
+
+inline void icu4x::LineSegmenter::operator delete(void* ptr) {
+  icu4x::capi::icu4x_LineSegmenter_destroy_mv1(reinterpret_cast<icu4x::capi::LineSegmenter*>(ptr));
+}
+
+
+#endif // icu4x_LineSegmenter_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/ListFormatter.d.hpp b/ffi/capi/bindings/cpp/icu4x/ListFormatter.d.hpp
new file mode 100644
index 00000000000..117a9217f89
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/ListFormatter.d.hpp
@@ -0,0 +1,59 @@
+#ifndef icu4x_ListFormatter_D_HPP
+#define icu4x_ListFormatter_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct ListFormatter; }
+class ListFormatter;
+namespace capi { struct Locale; }
+class Locale;
+class DataError;
+class ListLength;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct ListFormatter;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class ListFormatter {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::ListFormatter>, icu4x::DataError> create_and_with_length(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::ListLength length);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::ListFormatter>, icu4x::DataError> create_or_with_length(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::ListLength length);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::ListFormatter>, icu4x::DataError> create_unit_with_length(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::ListLength length);
+
+  inline std::string format(diplomat::span<const std::string_view> list) const;
+
+  inline std::string format16(diplomat::span<const std::u16string_view> list) const;
+
+  inline const icu4x::capi::ListFormatter* AsFFI() const;
+  inline icu4x::capi::ListFormatter* AsFFI();
+  inline static const icu4x::ListFormatter* FromFFI(const icu4x::capi::ListFormatter* ptr);
+  inline static icu4x::ListFormatter* FromFFI(icu4x::capi::ListFormatter* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  ListFormatter() = delete;
+  ListFormatter(const icu4x::ListFormatter&) = delete;
+  ListFormatter(icu4x::ListFormatter&&) noexcept = delete;
+  ListFormatter operator=(const icu4x::ListFormatter&) = delete;
+  ListFormatter operator=(icu4x::ListFormatter&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_ListFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/ListFormatter.hpp b/ffi/capi/bindings/cpp/icu4x/ListFormatter.hpp
new file mode 100644
index 00000000000..36b61a5f7ce
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/ListFormatter.hpp
@@ -0,0 +1,105 @@
+#ifndef icu4x_ListFormatter_HPP
+#define icu4x_ListFormatter_HPP
+
+#include "ListFormatter.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "ListLength.hpp"
+#include "Locale.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_ListFormatter_create_and_with_length_mv1_result {union {icu4x::capi::ListFormatter* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_ListFormatter_create_and_with_length_mv1_result;
+    icu4x_ListFormatter_create_and_with_length_mv1_result icu4x_ListFormatter_create_and_with_length_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale, icu4x::capi::ListLength length);
+    
+    typedef struct icu4x_ListFormatter_create_or_with_length_mv1_result {union {icu4x::capi::ListFormatter* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_ListFormatter_create_or_with_length_mv1_result;
+    icu4x_ListFormatter_create_or_with_length_mv1_result icu4x_ListFormatter_create_or_with_length_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale, icu4x::capi::ListLength length);
+    
+    typedef struct icu4x_ListFormatter_create_unit_with_length_mv1_result {union {icu4x::capi::ListFormatter* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_ListFormatter_create_unit_with_length_mv1_result;
+    icu4x_ListFormatter_create_unit_with_length_mv1_result icu4x_ListFormatter_create_unit_with_length_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale, icu4x::capi::ListLength length);
+    
+    void icu4x_ListFormatter_format_utf8_mv1(const icu4x::capi::ListFormatter* self, diplomat::capi::DiplomatStringsView* list_data, size_t list_len, diplomat::capi::DiplomatWrite* write);
+    
+    void icu4x_ListFormatter_format_utf16_mv1(const icu4x::capi::ListFormatter* self, diplomat::capi::DiplomatStrings16View* list_data, size_t list_len, diplomat::capi::DiplomatWrite* write);
+    
+    
+    void icu4x_ListFormatter_destroy_mv1(ListFormatter* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::ListFormatter>, icu4x::DataError> icu4x::ListFormatter::create_and_with_length(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::ListLength length) {
+  auto result = icu4x::capi::icu4x_ListFormatter_create_and_with_length_mv1(provider.AsFFI(),
+    locale.AsFFI(),
+    length.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::ListFormatter>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::ListFormatter>>(std::unique_ptr<icu4x::ListFormatter>(icu4x::ListFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::ListFormatter>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::ListFormatter>, icu4x::DataError> icu4x::ListFormatter::create_or_with_length(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::ListLength length) {
+  auto result = icu4x::capi::icu4x_ListFormatter_create_or_with_length_mv1(provider.AsFFI(),
+    locale.AsFFI(),
+    length.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::ListFormatter>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::ListFormatter>>(std::unique_ptr<icu4x::ListFormatter>(icu4x::ListFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::ListFormatter>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::ListFormatter>, icu4x::DataError> icu4x::ListFormatter::create_unit_with_length(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::ListLength length) {
+  auto result = icu4x::capi::icu4x_ListFormatter_create_unit_with_length_mv1(provider.AsFFI(),
+    locale.AsFFI(),
+    length.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::ListFormatter>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::ListFormatter>>(std::unique_ptr<icu4x::ListFormatter>(icu4x::ListFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::ListFormatter>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline std::string icu4x::ListFormatter::format(diplomat::span<const std::string_view> list) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_ListFormatter_format_utf8_mv1(this->AsFFI(),
+    list.data(),
+    list.size(),
+    &write);
+  return output;
+}
+
+inline std::string icu4x::ListFormatter::format16(diplomat::span<const std::u16string_view> list) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_ListFormatter_format_utf16_mv1(this->AsFFI(),
+    list.data(),
+    list.size(),
+    &write);
+  return output;
+}
+
+inline const icu4x::capi::ListFormatter* icu4x::ListFormatter::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::ListFormatter*>(this);
+}
+
+inline icu4x::capi::ListFormatter* icu4x::ListFormatter::AsFFI() {
+  return reinterpret_cast<icu4x::capi::ListFormatter*>(this);
+}
+
+inline const icu4x::ListFormatter* icu4x::ListFormatter::FromFFI(const icu4x::capi::ListFormatter* ptr) {
+  return reinterpret_cast<const icu4x::ListFormatter*>(ptr);
+}
+
+inline icu4x::ListFormatter* icu4x::ListFormatter::FromFFI(icu4x::capi::ListFormatter* ptr) {
+  return reinterpret_cast<icu4x::ListFormatter*>(ptr);
+}
+
+inline void icu4x::ListFormatter::operator delete(void* ptr) {
+  icu4x::capi::icu4x_ListFormatter_destroy_mv1(reinterpret_cast<icu4x::capi::ListFormatter*>(ptr));
+}
+
+
+#endif // icu4x_ListFormatter_HPP
diff --git a/ffi/capi/bindings/cpp/ListLength.d.hpp b/ffi/capi/bindings/cpp/icu4x/ListLength.d.hpp
similarity index 68%
rename from ffi/capi/bindings/cpp/ListLength.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/ListLength.d.hpp
index 214dbd1422f..489cd7d4150 100644
--- a/ffi/capi/bindings/cpp/ListLength.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/ListLength.d.hpp
@@ -1,5 +1,5 @@
-#ifndef ListLength_D_HPP
-#define ListLength_D_HPP
+#ifndef icu4x_ListLength_D_HPP
+#define icu4x_ListLength_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum ListLength {
       ListLength_Wide = 0,
@@ -20,6 +20,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class ListLength {
 public:
   enum Value {
@@ -35,11 +36,11 @@ class ListLength {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::ListLength AsFFI() const;
-  inline static ListLength FromFFI(diplomat::capi::ListLength c_enum);
+  inline icu4x::capi::ListLength AsFFI() const;
+  inline static icu4x::ListLength FromFFI(icu4x::capi::ListLength c_enum);
 private:
     Value value;
 };
 
-
-#endif // ListLength_D_HPP
+} // namespace
+#endif // icu4x_ListLength_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/ListLength.hpp b/ffi/capi/bindings/cpp/icu4x/ListLength.hpp
new file mode 100644
index 00000000000..25ba9427037
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/ListLength.hpp
@@ -0,0 +1,38 @@
+#ifndef icu4x_ListLength_HPP
+#define icu4x_ListLength_HPP
+
+#include "ListLength.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::ListLength icu4x::ListLength::AsFFI() const {
+  return static_cast<icu4x::capi::ListLength>(value);
+}
+
+inline icu4x::ListLength icu4x::ListLength::FromFFI(icu4x::capi::ListLength c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::ListLength_Wide:
+    case icu4x::capi::ListLength_Short:
+    case icu4x::capi::ListLength_Narrow:
+      return static_cast<icu4x::ListLength::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_ListLength_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/Locale.d.hpp b/ffi/capi/bindings/cpp/icu4x/Locale.d.hpp
new file mode 100644
index 00000000000..f2b67ac0c09
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/Locale.d.hpp
@@ -0,0 +1,76 @@
+#ifndef icu4x_Locale_D_HPP
+#define icu4x_Locale_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct Locale; }
+class Locale;
+class LocaleParseError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct Locale;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class Locale {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::Locale>, icu4x::LocaleParseError> from_string(std::string_view name);
+
+  inline static std::unique_ptr<icu4x::Locale> und();
+
+  inline std::unique_ptr<icu4x::Locale> clone() const;
+
+  inline std::string basename() const;
+
+  inline std::optional<std::string> get_unicode_extension(std::string_view s) const;
+
+  inline std::string language() const;
+
+  inline diplomat::result<std::monostate, icu4x::LocaleParseError> set_language(std::string_view s);
+
+  inline std::optional<std::string> region() const;
+
+  inline diplomat::result<std::monostate, icu4x::LocaleParseError> set_region(std::string_view s);
+
+  inline std::optional<std::string> script() const;
+
+  inline diplomat::result<std::monostate, icu4x::LocaleParseError> set_script(std::string_view s);
+
+  inline static diplomat::result<std::string, icu4x::LocaleParseError> canonicalize(std::string_view s);
+
+  inline std::string to_string() const;
+
+  inline bool normalizing_eq(std::string_view other) const;
+
+  inline int8_t compare_to_string(std::string_view other) const;
+
+  inline int8_t compare_to(const icu4x::Locale& other) const;
+
+  inline const icu4x::capi::Locale* AsFFI() const;
+  inline icu4x::capi::Locale* AsFFI();
+  inline static const icu4x::Locale* FromFFI(const icu4x::capi::Locale* ptr);
+  inline static icu4x::Locale* FromFFI(icu4x::capi::Locale* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  Locale() = delete;
+  Locale(const icu4x::Locale&) = delete;
+  Locale(icu4x::Locale&&) noexcept = delete;
+  Locale operator=(const icu4x::Locale&) = delete;
+  Locale operator=(icu4x::Locale&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_Locale_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/Locale.hpp b/ffi/capi/bindings/cpp/icu4x/Locale.hpp
new file mode 100644
index 00000000000..7638410bf20
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/Locale.hpp
@@ -0,0 +1,204 @@
+#ifndef icu4x_Locale_HPP
+#define icu4x_Locale_HPP
+
+#include "Locale.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "LocaleParseError.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_Locale_from_string_mv1_result {union {icu4x::capi::Locale* ok; icu4x::capi::LocaleParseError err;}; bool is_ok;} icu4x_Locale_from_string_mv1_result;
+    icu4x_Locale_from_string_mv1_result icu4x_Locale_from_string_mv1(const char* name_data, size_t name_len);
+    
+    icu4x::capi::Locale* icu4x_Locale_und_mv1(void);
+    
+    icu4x::capi::Locale* icu4x_Locale_clone_mv1(const icu4x::capi::Locale* self);
+    
+    void icu4x_Locale_basename_mv1(const icu4x::capi::Locale* self, diplomat::capi::DiplomatWrite* write);
+    
+    typedef struct icu4x_Locale_get_unicode_extension_mv1_result { bool is_ok;} icu4x_Locale_get_unicode_extension_mv1_result;
+    icu4x_Locale_get_unicode_extension_mv1_result icu4x_Locale_get_unicode_extension_mv1(const icu4x::capi::Locale* self, const char* s_data, size_t s_len, diplomat::capi::DiplomatWrite* write);
+    
+    void icu4x_Locale_language_mv1(const icu4x::capi::Locale* self, diplomat::capi::DiplomatWrite* write);
+    
+    typedef struct icu4x_Locale_set_language_mv1_result {union { icu4x::capi::LocaleParseError err;}; bool is_ok;} icu4x_Locale_set_language_mv1_result;
+    icu4x_Locale_set_language_mv1_result icu4x_Locale_set_language_mv1(icu4x::capi::Locale* self, const char* s_data, size_t s_len);
+    
+    typedef struct icu4x_Locale_region_mv1_result { bool is_ok;} icu4x_Locale_region_mv1_result;
+    icu4x_Locale_region_mv1_result icu4x_Locale_region_mv1(const icu4x::capi::Locale* self, diplomat::capi::DiplomatWrite* write);
+    
+    typedef struct icu4x_Locale_set_region_mv1_result {union { icu4x::capi::LocaleParseError err;}; bool is_ok;} icu4x_Locale_set_region_mv1_result;
+    icu4x_Locale_set_region_mv1_result icu4x_Locale_set_region_mv1(icu4x::capi::Locale* self, const char* s_data, size_t s_len);
+    
+    typedef struct icu4x_Locale_script_mv1_result { bool is_ok;} icu4x_Locale_script_mv1_result;
+    icu4x_Locale_script_mv1_result icu4x_Locale_script_mv1(const icu4x::capi::Locale* self, diplomat::capi::DiplomatWrite* write);
+    
+    typedef struct icu4x_Locale_set_script_mv1_result {union { icu4x::capi::LocaleParseError err;}; bool is_ok;} icu4x_Locale_set_script_mv1_result;
+    icu4x_Locale_set_script_mv1_result icu4x_Locale_set_script_mv1(icu4x::capi::Locale* self, const char* s_data, size_t s_len);
+    
+    typedef struct icu4x_Locale_canonicalize_mv1_result {union { icu4x::capi::LocaleParseError err;}; bool is_ok;} icu4x_Locale_canonicalize_mv1_result;
+    icu4x_Locale_canonicalize_mv1_result icu4x_Locale_canonicalize_mv1(const char* s_data, size_t s_len, diplomat::capi::DiplomatWrite* write);
+    
+    void icu4x_Locale_to_string_mv1(const icu4x::capi::Locale* self, diplomat::capi::DiplomatWrite* write);
+    
+    bool icu4x_Locale_normalizing_eq_mv1(const icu4x::capi::Locale* self, const char* other_data, size_t other_len);
+    
+    int8_t icu4x_Locale_compare_to_string_mv1(const icu4x::capi::Locale* self, const char* other_data, size_t other_len);
+    
+    int8_t icu4x_Locale_compare_to_mv1(const icu4x::capi::Locale* self, const icu4x::capi::Locale* other);
+    
+    
+    void icu4x_Locale_destroy_mv1(Locale* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::Locale>, icu4x::LocaleParseError> icu4x::Locale::from_string(std::string_view name) {
+  auto result = icu4x::capi::icu4x_Locale_from_string_mv1(name.data(),
+    name.size());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::Locale>, icu4x::LocaleParseError>(diplomat::Ok<std::unique_ptr<icu4x::Locale>>(std::unique_ptr<icu4x::Locale>(icu4x::Locale::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::Locale>, icu4x::LocaleParseError>(diplomat::Err<icu4x::LocaleParseError>(icu4x::LocaleParseError::FromFFI(result.err)));
+}
+
+inline std::unique_ptr<icu4x::Locale> icu4x::Locale::und() {
+  auto result = icu4x::capi::icu4x_Locale_und_mv1();
+  return std::unique_ptr<icu4x::Locale>(icu4x::Locale::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::Locale> icu4x::Locale::clone() const {
+  auto result = icu4x::capi::icu4x_Locale_clone_mv1(this->AsFFI());
+  return std::unique_ptr<icu4x::Locale>(icu4x::Locale::FromFFI(result));
+}
+
+inline std::string icu4x::Locale::basename() const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_Locale_basename_mv1(this->AsFFI(),
+    &write);
+  return output;
+}
+
+inline std::optional<std::string> icu4x::Locale::get_unicode_extension(std::string_view s) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_Locale_get_unicode_extension_mv1(this->AsFFI(),
+    s.data(),
+    s.size(),
+    &write);
+  return result.is_ok ? std::optional<std::string>(std::move(output)) : std::nullopt;
+}
+
+inline std::string icu4x::Locale::language() const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_Locale_language_mv1(this->AsFFI(),
+    &write);
+  return output;
+}
+
+inline diplomat::result<std::monostate, icu4x::LocaleParseError> icu4x::Locale::set_language(std::string_view s) {
+  auto result = icu4x::capi::icu4x_Locale_set_language_mv1(this->AsFFI(),
+    s.data(),
+    s.size());
+  return result.is_ok ? diplomat::result<std::monostate, icu4x::LocaleParseError>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, icu4x::LocaleParseError>(diplomat::Err<icu4x::LocaleParseError>(icu4x::LocaleParseError::FromFFI(result.err)));
+}
+
+inline std::optional<std::string> icu4x::Locale::region() const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_Locale_region_mv1(this->AsFFI(),
+    &write);
+  return result.is_ok ? std::optional<std::string>(std::move(output)) : std::nullopt;
+}
+
+inline diplomat::result<std::monostate, icu4x::LocaleParseError> icu4x::Locale::set_region(std::string_view s) {
+  auto result = icu4x::capi::icu4x_Locale_set_region_mv1(this->AsFFI(),
+    s.data(),
+    s.size());
+  return result.is_ok ? diplomat::result<std::monostate, icu4x::LocaleParseError>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, icu4x::LocaleParseError>(diplomat::Err<icu4x::LocaleParseError>(icu4x::LocaleParseError::FromFFI(result.err)));
+}
+
+inline std::optional<std::string> icu4x::Locale::script() const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_Locale_script_mv1(this->AsFFI(),
+    &write);
+  return result.is_ok ? std::optional<std::string>(std::move(output)) : std::nullopt;
+}
+
+inline diplomat::result<std::monostate, icu4x::LocaleParseError> icu4x::Locale::set_script(std::string_view s) {
+  auto result = icu4x::capi::icu4x_Locale_set_script_mv1(this->AsFFI(),
+    s.data(),
+    s.size());
+  return result.is_ok ? diplomat::result<std::monostate, icu4x::LocaleParseError>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, icu4x::LocaleParseError>(diplomat::Err<icu4x::LocaleParseError>(icu4x::LocaleParseError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::string, icu4x::LocaleParseError> icu4x::Locale::canonicalize(std::string_view s) {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_Locale_canonicalize_mv1(s.data(),
+    s.size(),
+    &write);
+  return result.is_ok ? diplomat::result<std::string, icu4x::LocaleParseError>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, icu4x::LocaleParseError>(diplomat::Err<icu4x::LocaleParseError>(icu4x::LocaleParseError::FromFFI(result.err)));
+}
+
+inline std::string icu4x::Locale::to_string() const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_Locale_to_string_mv1(this->AsFFI(),
+    &write);
+  return output;
+}
+
+inline bool icu4x::Locale::normalizing_eq(std::string_view other) const {
+  auto result = icu4x::capi::icu4x_Locale_normalizing_eq_mv1(this->AsFFI(),
+    other.data(),
+    other.size());
+  return result;
+}
+
+inline int8_t icu4x::Locale::compare_to_string(std::string_view other) const {
+  auto result = icu4x::capi::icu4x_Locale_compare_to_string_mv1(this->AsFFI(),
+    other.data(),
+    other.size());
+  return result;
+}
+
+inline int8_t icu4x::Locale::compare_to(const icu4x::Locale& other) const {
+  auto result = icu4x::capi::icu4x_Locale_compare_to_mv1(this->AsFFI(),
+    other.AsFFI());
+  return result;
+}
+
+inline const icu4x::capi::Locale* icu4x::Locale::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::Locale*>(this);
+}
+
+inline icu4x::capi::Locale* icu4x::Locale::AsFFI() {
+  return reinterpret_cast<icu4x::capi::Locale*>(this);
+}
+
+inline const icu4x::Locale* icu4x::Locale::FromFFI(const icu4x::capi::Locale* ptr) {
+  return reinterpret_cast<const icu4x::Locale*>(ptr);
+}
+
+inline icu4x::Locale* icu4x::Locale::FromFFI(icu4x::capi::Locale* ptr) {
+  return reinterpret_cast<icu4x::Locale*>(ptr);
+}
+
+inline void icu4x::Locale::operator delete(void* ptr) {
+  icu4x::capi::icu4x_Locale_destroy_mv1(reinterpret_cast<icu4x::capi::Locale*>(ptr));
+}
+
+
+#endif // icu4x_Locale_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LocaleCanonicalizer.d.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleCanonicalizer.d.hpp
new file mode 100644
index 00000000000..771f016af1a
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleCanonicalizer.d.hpp
@@ -0,0 +1,55 @@
+#ifndef icu4x_LocaleCanonicalizer_D_HPP
+#define icu4x_LocaleCanonicalizer_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct Locale; }
+class Locale;
+namespace capi { struct LocaleCanonicalizer; }
+class LocaleCanonicalizer;
+class Error;
+class TransformResult;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct LocaleCanonicalizer;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class LocaleCanonicalizer {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::LocaleCanonicalizer>, icu4x::Error> create(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::LocaleCanonicalizer>, icu4x::Error> create_extended(const icu4x::DataProvider& provider);
+
+  inline icu4x::TransformResult canonicalize(icu4x::Locale& locale) const;
+
+  inline const icu4x::capi::LocaleCanonicalizer* AsFFI() const;
+  inline icu4x::capi::LocaleCanonicalizer* AsFFI();
+  inline static const icu4x::LocaleCanonicalizer* FromFFI(const icu4x::capi::LocaleCanonicalizer* ptr);
+  inline static icu4x::LocaleCanonicalizer* FromFFI(icu4x::capi::LocaleCanonicalizer* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  LocaleCanonicalizer() = delete;
+  LocaleCanonicalizer(const icu4x::LocaleCanonicalizer&) = delete;
+  LocaleCanonicalizer(icu4x::LocaleCanonicalizer&&) noexcept = delete;
+  LocaleCanonicalizer operator=(const icu4x::LocaleCanonicalizer&) = delete;
+  LocaleCanonicalizer operator=(icu4x::LocaleCanonicalizer&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_LocaleCanonicalizer_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LocaleCanonicalizer.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleCanonicalizer.hpp
new file mode 100644
index 00000000000..b1d73b59d05
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleCanonicalizer.hpp
@@ -0,0 +1,75 @@
+#ifndef icu4x_LocaleCanonicalizer_HPP
+#define icu4x_LocaleCanonicalizer_HPP
+
+#include "LocaleCanonicalizer.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataProvider.hpp"
+#include "Error.hpp"
+#include "Locale.hpp"
+#include "TransformResult.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_LocaleCanonicalizer_create_mv1_result {union {icu4x::capi::LocaleCanonicalizer* ok; icu4x::capi::Error err;}; bool is_ok;} icu4x_LocaleCanonicalizer_create_mv1_result;
+    icu4x_LocaleCanonicalizer_create_mv1_result icu4x_LocaleCanonicalizer_create_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_LocaleCanonicalizer_create_extended_mv1_result {union {icu4x::capi::LocaleCanonicalizer* ok; icu4x::capi::Error err;}; bool is_ok;} icu4x_LocaleCanonicalizer_create_extended_mv1_result;
+    icu4x_LocaleCanonicalizer_create_extended_mv1_result icu4x_LocaleCanonicalizer_create_extended_mv1(const icu4x::capi::DataProvider* provider);
+    
+    icu4x::capi::TransformResult icu4x_LocaleCanonicalizer_canonicalize_mv1(const icu4x::capi::LocaleCanonicalizer* self, icu4x::capi::Locale* locale);
+    
+    
+    void icu4x_LocaleCanonicalizer_destroy_mv1(LocaleCanonicalizer* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::LocaleCanonicalizer>, icu4x::Error> icu4x::LocaleCanonicalizer::create(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_LocaleCanonicalizer_create_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::LocaleCanonicalizer>, icu4x::Error>(diplomat::Ok<std::unique_ptr<icu4x::LocaleCanonicalizer>>(std::unique_ptr<icu4x::LocaleCanonicalizer>(icu4x::LocaleCanonicalizer::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::LocaleCanonicalizer>, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::LocaleCanonicalizer>, icu4x::Error> icu4x::LocaleCanonicalizer::create_extended(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_LocaleCanonicalizer_create_extended_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::LocaleCanonicalizer>, icu4x::Error>(diplomat::Ok<std::unique_ptr<icu4x::LocaleCanonicalizer>>(std::unique_ptr<icu4x::LocaleCanonicalizer>(icu4x::LocaleCanonicalizer::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::LocaleCanonicalizer>, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline icu4x::TransformResult icu4x::LocaleCanonicalizer::canonicalize(icu4x::Locale& locale) const {
+  auto result = icu4x::capi::icu4x_LocaleCanonicalizer_canonicalize_mv1(this->AsFFI(),
+    locale.AsFFI());
+  return icu4x::TransformResult::FromFFI(result);
+}
+
+inline const icu4x::capi::LocaleCanonicalizer* icu4x::LocaleCanonicalizer::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::LocaleCanonicalizer*>(this);
+}
+
+inline icu4x::capi::LocaleCanonicalizer* icu4x::LocaleCanonicalizer::AsFFI() {
+  return reinterpret_cast<icu4x::capi::LocaleCanonicalizer*>(this);
+}
+
+inline const icu4x::LocaleCanonicalizer* icu4x::LocaleCanonicalizer::FromFFI(const icu4x::capi::LocaleCanonicalizer* ptr) {
+  return reinterpret_cast<const icu4x::LocaleCanonicalizer*>(ptr);
+}
+
+inline icu4x::LocaleCanonicalizer* icu4x::LocaleCanonicalizer::FromFFI(icu4x::capi::LocaleCanonicalizer* ptr) {
+  return reinterpret_cast<icu4x::LocaleCanonicalizer*>(ptr);
+}
+
+inline void icu4x::LocaleCanonicalizer::operator delete(void* ptr) {
+  icu4x::capi::icu4x_LocaleCanonicalizer_destroy_mv1(reinterpret_cast<icu4x::capi::LocaleCanonicalizer*>(ptr));
+}
+
+
+#endif // icu4x_LocaleCanonicalizer_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleDirection.d.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleDirection.d.hpp
similarity index 68%
rename from ffi/capi/bindings/cpp/LocaleDirection.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/LocaleDirection.d.hpp
index a1f85400c81..807effa8760 100644
--- a/ffi/capi/bindings/cpp/LocaleDirection.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleDirection.d.hpp
@@ -1,5 +1,5 @@
-#ifndef LocaleDirection_D_HPP
-#define LocaleDirection_D_HPP
+#ifndef icu4x_LocaleDirection_D_HPP
+#define icu4x_LocaleDirection_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum LocaleDirection {
       LocaleDirection_LeftToRight = 0,
@@ -20,6 +20,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class LocaleDirection {
 public:
   enum Value {
@@ -35,11 +36,11 @@ class LocaleDirection {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::LocaleDirection AsFFI() const;
-  inline static LocaleDirection FromFFI(diplomat::capi::LocaleDirection c_enum);
+  inline icu4x::capi::LocaleDirection AsFFI() const;
+  inline static icu4x::LocaleDirection FromFFI(icu4x::capi::LocaleDirection c_enum);
 private:
     Value value;
 };
 
-
-#endif // LocaleDirection_D_HPP
+} // namespace
+#endif // icu4x_LocaleDirection_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LocaleDirection.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleDirection.hpp
new file mode 100644
index 00000000000..73ed1c480a4
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleDirection.hpp
@@ -0,0 +1,38 @@
+#ifndef icu4x_LocaleDirection_HPP
+#define icu4x_LocaleDirection_HPP
+
+#include "LocaleDirection.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::LocaleDirection icu4x::LocaleDirection::AsFFI() const {
+  return static_cast<icu4x::capi::LocaleDirection>(value);
+}
+
+inline icu4x::LocaleDirection icu4x::LocaleDirection::FromFFI(icu4x::capi::LocaleDirection c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::LocaleDirection_LeftToRight:
+    case icu4x::capi::LocaleDirection_RightToLeft:
+    case icu4x::capi::LocaleDirection_Unknown:
+      return static_cast<icu4x::LocaleDirection::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_LocaleDirection_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LocaleDirectionality.d.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleDirectionality.d.hpp
new file mode 100644
index 00000000000..53293a01931
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleDirectionality.d.hpp
@@ -0,0 +1,61 @@
+#ifndef icu4x_LocaleDirectionality_D_HPP
+#define icu4x_LocaleDirectionality_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct Locale; }
+class Locale;
+namespace capi { struct LocaleDirectionality; }
+class LocaleDirectionality;
+namespace capi { struct LocaleExpander; }
+class LocaleExpander;
+class DataError;
+class LocaleDirection;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct LocaleDirectionality;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class LocaleDirectionality {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::LocaleDirectionality>, icu4x::DataError> create(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::LocaleDirectionality>, icu4x::DataError> create_with_expander(const icu4x::DataProvider& provider, const icu4x::LocaleExpander& expander);
+
+  inline icu4x::LocaleDirection get(const icu4x::Locale& locale) const;
+
+  inline bool is_left_to_right(const icu4x::Locale& locale) const;
+
+  inline bool is_right_to_left(const icu4x::Locale& locale) const;
+
+  inline const icu4x::capi::LocaleDirectionality* AsFFI() const;
+  inline icu4x::capi::LocaleDirectionality* AsFFI();
+  inline static const icu4x::LocaleDirectionality* FromFFI(const icu4x::capi::LocaleDirectionality* ptr);
+  inline static icu4x::LocaleDirectionality* FromFFI(icu4x::capi::LocaleDirectionality* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  LocaleDirectionality() = delete;
+  LocaleDirectionality(const icu4x::LocaleDirectionality&) = delete;
+  LocaleDirectionality(icu4x::LocaleDirectionality&&) noexcept = delete;
+  LocaleDirectionality operator=(const icu4x::LocaleDirectionality&) = delete;
+  LocaleDirectionality operator=(icu4x::LocaleDirectionality&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_LocaleDirectionality_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LocaleDirectionality.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleDirectionality.hpp
new file mode 100644
index 00000000000..49849a2f879
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleDirectionality.hpp
@@ -0,0 +1,93 @@
+#ifndef icu4x_LocaleDirectionality_HPP
+#define icu4x_LocaleDirectionality_HPP
+
+#include "LocaleDirectionality.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "Locale.hpp"
+#include "LocaleDirection.hpp"
+#include "LocaleExpander.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_LocaleDirectionality_create_mv1_result {union {icu4x::capi::LocaleDirectionality* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_LocaleDirectionality_create_mv1_result;
+    icu4x_LocaleDirectionality_create_mv1_result icu4x_LocaleDirectionality_create_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_LocaleDirectionality_create_with_expander_mv1_result {union {icu4x::capi::LocaleDirectionality* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_LocaleDirectionality_create_with_expander_mv1_result;
+    icu4x_LocaleDirectionality_create_with_expander_mv1_result icu4x_LocaleDirectionality_create_with_expander_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::LocaleExpander* expander);
+    
+    icu4x::capi::LocaleDirection icu4x_LocaleDirectionality_get_mv1(const icu4x::capi::LocaleDirectionality* self, const icu4x::capi::Locale* locale);
+    
+    bool icu4x_LocaleDirectionality_is_left_to_right_mv1(const icu4x::capi::LocaleDirectionality* self, const icu4x::capi::Locale* locale);
+    
+    bool icu4x_LocaleDirectionality_is_right_to_left_mv1(const icu4x::capi::LocaleDirectionality* self, const icu4x::capi::Locale* locale);
+    
+    
+    void icu4x_LocaleDirectionality_destroy_mv1(LocaleDirectionality* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::LocaleDirectionality>, icu4x::DataError> icu4x::LocaleDirectionality::create(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_LocaleDirectionality_create_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::LocaleDirectionality>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::LocaleDirectionality>>(std::unique_ptr<icu4x::LocaleDirectionality>(icu4x::LocaleDirectionality::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::LocaleDirectionality>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::LocaleDirectionality>, icu4x::DataError> icu4x::LocaleDirectionality::create_with_expander(const icu4x::DataProvider& provider, const icu4x::LocaleExpander& expander) {
+  auto result = icu4x::capi::icu4x_LocaleDirectionality_create_with_expander_mv1(provider.AsFFI(),
+    expander.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::LocaleDirectionality>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::LocaleDirectionality>>(std::unique_ptr<icu4x::LocaleDirectionality>(icu4x::LocaleDirectionality::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::LocaleDirectionality>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline icu4x::LocaleDirection icu4x::LocaleDirectionality::get(const icu4x::Locale& locale) const {
+  auto result = icu4x::capi::icu4x_LocaleDirectionality_get_mv1(this->AsFFI(),
+    locale.AsFFI());
+  return icu4x::LocaleDirection::FromFFI(result);
+}
+
+inline bool icu4x::LocaleDirectionality::is_left_to_right(const icu4x::Locale& locale) const {
+  auto result = icu4x::capi::icu4x_LocaleDirectionality_is_left_to_right_mv1(this->AsFFI(),
+    locale.AsFFI());
+  return result;
+}
+
+inline bool icu4x::LocaleDirectionality::is_right_to_left(const icu4x::Locale& locale) const {
+  auto result = icu4x::capi::icu4x_LocaleDirectionality_is_right_to_left_mv1(this->AsFFI(),
+    locale.AsFFI());
+  return result;
+}
+
+inline const icu4x::capi::LocaleDirectionality* icu4x::LocaleDirectionality::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::LocaleDirectionality*>(this);
+}
+
+inline icu4x::capi::LocaleDirectionality* icu4x::LocaleDirectionality::AsFFI() {
+  return reinterpret_cast<icu4x::capi::LocaleDirectionality*>(this);
+}
+
+inline const icu4x::LocaleDirectionality* icu4x::LocaleDirectionality::FromFFI(const icu4x::capi::LocaleDirectionality* ptr) {
+  return reinterpret_cast<const icu4x::LocaleDirectionality*>(ptr);
+}
+
+inline icu4x::LocaleDirectionality* icu4x::LocaleDirectionality::FromFFI(icu4x::capi::LocaleDirectionality* ptr) {
+  return reinterpret_cast<icu4x::LocaleDirectionality*>(ptr);
+}
+
+inline void icu4x::LocaleDirectionality::operator delete(void* ptr) {
+  icu4x::capi::icu4x_LocaleDirectionality_destroy_mv1(reinterpret_cast<icu4x::capi::LocaleDirectionality*>(ptr));
+}
+
+
+#endif // icu4x_LocaleDirectionality_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LocaleDisplayNamesFormatter.d.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleDisplayNamesFormatter.d.hpp
new file mode 100644
index 00000000000..fe8175a81f2
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleDisplayNamesFormatter.d.hpp
@@ -0,0 +1,53 @@
+#ifndef icu4x_LocaleDisplayNamesFormatter_D_HPP
+#define icu4x_LocaleDisplayNamesFormatter_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct Locale; }
+class Locale;
+namespace capi { struct LocaleDisplayNamesFormatter; }
+class LocaleDisplayNamesFormatter;
+struct DisplayNamesOptionsV1;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct LocaleDisplayNamesFormatter;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class LocaleDisplayNamesFormatter {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::LocaleDisplayNamesFormatter>, icu4x::DataError> create_v1(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::DisplayNamesOptionsV1 options);
+
+  inline std::string of(const icu4x::Locale& locale) const;
+
+  inline const icu4x::capi::LocaleDisplayNamesFormatter* AsFFI() const;
+  inline icu4x::capi::LocaleDisplayNamesFormatter* AsFFI();
+  inline static const icu4x::LocaleDisplayNamesFormatter* FromFFI(const icu4x::capi::LocaleDisplayNamesFormatter* ptr);
+  inline static icu4x::LocaleDisplayNamesFormatter* FromFFI(icu4x::capi::LocaleDisplayNamesFormatter* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  LocaleDisplayNamesFormatter() = delete;
+  LocaleDisplayNamesFormatter(const icu4x::LocaleDisplayNamesFormatter&) = delete;
+  LocaleDisplayNamesFormatter(icu4x::LocaleDisplayNamesFormatter&&) noexcept = delete;
+  LocaleDisplayNamesFormatter operator=(const icu4x::LocaleDisplayNamesFormatter&) = delete;
+  LocaleDisplayNamesFormatter operator=(icu4x::LocaleDisplayNamesFormatter&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_LocaleDisplayNamesFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LocaleDisplayNamesFormatter.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleDisplayNamesFormatter.hpp
new file mode 100644
index 00000000000..ef5ae99c225
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleDisplayNamesFormatter.hpp
@@ -0,0 +1,72 @@
+#ifndef icu4x_LocaleDisplayNamesFormatter_HPP
+#define icu4x_LocaleDisplayNamesFormatter_HPP
+
+#include "LocaleDisplayNamesFormatter.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "DisplayNamesOptionsV1.hpp"
+#include "Locale.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_LocaleDisplayNamesFormatter_create_v1_mv1_result {union {icu4x::capi::LocaleDisplayNamesFormatter* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_LocaleDisplayNamesFormatter_create_v1_mv1_result;
+    icu4x_LocaleDisplayNamesFormatter_create_v1_mv1_result icu4x_LocaleDisplayNamesFormatter_create_v1_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale, icu4x::capi::DisplayNamesOptionsV1 options);
+    
+    void icu4x_LocaleDisplayNamesFormatter_of_mv1(const icu4x::capi::LocaleDisplayNamesFormatter* self, const icu4x::capi::Locale* locale, diplomat::capi::DiplomatWrite* write);
+    
+    
+    void icu4x_LocaleDisplayNamesFormatter_destroy_mv1(LocaleDisplayNamesFormatter* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::LocaleDisplayNamesFormatter>, icu4x::DataError> icu4x::LocaleDisplayNamesFormatter::create_v1(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::DisplayNamesOptionsV1 options) {
+  auto result = icu4x::capi::icu4x_LocaleDisplayNamesFormatter_create_v1_mv1(provider.AsFFI(),
+    locale.AsFFI(),
+    options.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::LocaleDisplayNamesFormatter>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::LocaleDisplayNamesFormatter>>(std::unique_ptr<icu4x::LocaleDisplayNamesFormatter>(icu4x::LocaleDisplayNamesFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::LocaleDisplayNamesFormatter>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline std::string icu4x::LocaleDisplayNamesFormatter::of(const icu4x::Locale& locale) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_LocaleDisplayNamesFormatter_of_mv1(this->AsFFI(),
+    locale.AsFFI(),
+    &write);
+  return output;
+}
+
+inline const icu4x::capi::LocaleDisplayNamesFormatter* icu4x::LocaleDisplayNamesFormatter::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::LocaleDisplayNamesFormatter*>(this);
+}
+
+inline icu4x::capi::LocaleDisplayNamesFormatter* icu4x::LocaleDisplayNamesFormatter::AsFFI() {
+  return reinterpret_cast<icu4x::capi::LocaleDisplayNamesFormatter*>(this);
+}
+
+inline const icu4x::LocaleDisplayNamesFormatter* icu4x::LocaleDisplayNamesFormatter::FromFFI(const icu4x::capi::LocaleDisplayNamesFormatter* ptr) {
+  return reinterpret_cast<const icu4x::LocaleDisplayNamesFormatter*>(ptr);
+}
+
+inline icu4x::LocaleDisplayNamesFormatter* icu4x::LocaleDisplayNamesFormatter::FromFFI(icu4x::capi::LocaleDisplayNamesFormatter* ptr) {
+  return reinterpret_cast<icu4x::LocaleDisplayNamesFormatter*>(ptr);
+}
+
+inline void icu4x::LocaleDisplayNamesFormatter::operator delete(void* ptr) {
+  icu4x::capi::icu4x_LocaleDisplayNamesFormatter_destroy_mv1(reinterpret_cast<icu4x::capi::LocaleDisplayNamesFormatter*>(ptr));
+}
+
+
+#endif // icu4x_LocaleDisplayNamesFormatter_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LocaleExpander.d.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleExpander.d.hpp
new file mode 100644
index 00000000000..11934c115b9
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleExpander.d.hpp
@@ -0,0 +1,59 @@
+#ifndef icu4x_LocaleExpander_D_HPP
+#define icu4x_LocaleExpander_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct Locale; }
+class Locale;
+namespace capi { struct LocaleExpander; }
+class LocaleExpander;
+class Error;
+class TransformResult;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct LocaleExpander;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class LocaleExpander {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::LocaleExpander>, icu4x::Error> create(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::LocaleExpander>, icu4x::Error> create_extended(const icu4x::DataProvider& provider);
+
+  inline icu4x::TransformResult maximize(icu4x::Locale& locale) const;
+
+  inline icu4x::TransformResult minimize(icu4x::Locale& locale) const;
+
+  inline icu4x::TransformResult minimize_favor_script(icu4x::Locale& locale) const;
+
+  inline const icu4x::capi::LocaleExpander* AsFFI() const;
+  inline icu4x::capi::LocaleExpander* AsFFI();
+  inline static const icu4x::LocaleExpander* FromFFI(const icu4x::capi::LocaleExpander* ptr);
+  inline static icu4x::LocaleExpander* FromFFI(icu4x::capi::LocaleExpander* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  LocaleExpander() = delete;
+  LocaleExpander(const icu4x::LocaleExpander&) = delete;
+  LocaleExpander(icu4x::LocaleExpander&&) noexcept = delete;
+  LocaleExpander operator=(const icu4x::LocaleExpander&) = delete;
+  LocaleExpander operator=(icu4x::LocaleExpander&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_LocaleExpander_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LocaleExpander.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleExpander.hpp
new file mode 100644
index 00000000000..4bdcb01ece9
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleExpander.hpp
@@ -0,0 +1,91 @@
+#ifndef icu4x_LocaleExpander_HPP
+#define icu4x_LocaleExpander_HPP
+
+#include "LocaleExpander.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataProvider.hpp"
+#include "Error.hpp"
+#include "Locale.hpp"
+#include "TransformResult.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_LocaleExpander_create_mv1_result {union {icu4x::capi::LocaleExpander* ok; icu4x::capi::Error err;}; bool is_ok;} icu4x_LocaleExpander_create_mv1_result;
+    icu4x_LocaleExpander_create_mv1_result icu4x_LocaleExpander_create_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_LocaleExpander_create_extended_mv1_result {union {icu4x::capi::LocaleExpander* ok; icu4x::capi::Error err;}; bool is_ok;} icu4x_LocaleExpander_create_extended_mv1_result;
+    icu4x_LocaleExpander_create_extended_mv1_result icu4x_LocaleExpander_create_extended_mv1(const icu4x::capi::DataProvider* provider);
+    
+    icu4x::capi::TransformResult icu4x_LocaleExpander_maximize_mv1(const icu4x::capi::LocaleExpander* self, icu4x::capi::Locale* locale);
+    
+    icu4x::capi::TransformResult icu4x_LocaleExpander_minimize_mv1(const icu4x::capi::LocaleExpander* self, icu4x::capi::Locale* locale);
+    
+    icu4x::capi::TransformResult icu4x_LocaleExpander_minimize_favor_script_mv1(const icu4x::capi::LocaleExpander* self, icu4x::capi::Locale* locale);
+    
+    
+    void icu4x_LocaleExpander_destroy_mv1(LocaleExpander* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::LocaleExpander>, icu4x::Error> icu4x::LocaleExpander::create(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_LocaleExpander_create_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::LocaleExpander>, icu4x::Error>(diplomat::Ok<std::unique_ptr<icu4x::LocaleExpander>>(std::unique_ptr<icu4x::LocaleExpander>(icu4x::LocaleExpander::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::LocaleExpander>, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::LocaleExpander>, icu4x::Error> icu4x::LocaleExpander::create_extended(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_LocaleExpander_create_extended_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::LocaleExpander>, icu4x::Error>(diplomat::Ok<std::unique_ptr<icu4x::LocaleExpander>>(std::unique_ptr<icu4x::LocaleExpander>(icu4x::LocaleExpander::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::LocaleExpander>, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline icu4x::TransformResult icu4x::LocaleExpander::maximize(icu4x::Locale& locale) const {
+  auto result = icu4x::capi::icu4x_LocaleExpander_maximize_mv1(this->AsFFI(),
+    locale.AsFFI());
+  return icu4x::TransformResult::FromFFI(result);
+}
+
+inline icu4x::TransformResult icu4x::LocaleExpander::minimize(icu4x::Locale& locale) const {
+  auto result = icu4x::capi::icu4x_LocaleExpander_minimize_mv1(this->AsFFI(),
+    locale.AsFFI());
+  return icu4x::TransformResult::FromFFI(result);
+}
+
+inline icu4x::TransformResult icu4x::LocaleExpander::minimize_favor_script(icu4x::Locale& locale) const {
+  auto result = icu4x::capi::icu4x_LocaleExpander_minimize_favor_script_mv1(this->AsFFI(),
+    locale.AsFFI());
+  return icu4x::TransformResult::FromFFI(result);
+}
+
+inline const icu4x::capi::LocaleExpander* icu4x::LocaleExpander::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::LocaleExpander*>(this);
+}
+
+inline icu4x::capi::LocaleExpander* icu4x::LocaleExpander::AsFFI() {
+  return reinterpret_cast<icu4x::capi::LocaleExpander*>(this);
+}
+
+inline const icu4x::LocaleExpander* icu4x::LocaleExpander::FromFFI(const icu4x::capi::LocaleExpander* ptr) {
+  return reinterpret_cast<const icu4x::LocaleExpander*>(ptr);
+}
+
+inline icu4x::LocaleExpander* icu4x::LocaleExpander::FromFFI(icu4x::capi::LocaleExpander* ptr) {
+  return reinterpret_cast<icu4x::LocaleExpander*>(ptr);
+}
+
+inline void icu4x::LocaleExpander::operator delete(void* ptr) {
+  icu4x::capi::icu4x_LocaleExpander_destroy_mv1(reinterpret_cast<icu4x::capi::LocaleExpander*>(ptr));
+}
+
+
+#endif // icu4x_LocaleExpander_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LocaleFallbackConfig.d.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleFallbackConfig.d.hpp
new file mode 100644
index 00000000000..0c79dfcd6bf
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleFallbackConfig.d.hpp
@@ -0,0 +1,42 @@
+#ifndef icu4x_LocaleFallbackConfig_D_HPP
+#define icu4x_LocaleFallbackConfig_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "LocaleFallbackPriority.d.hpp"
+#include "LocaleFallbackSupplement.d.hpp"
+
+namespace icu4x {
+class LocaleFallbackPriority;
+class LocaleFallbackSupplement;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct LocaleFallbackConfig {
+      icu4x::capi::LocaleFallbackPriority priority;
+      diplomat::capi::DiplomatStringView extension_key;
+      icu4x::capi::LocaleFallbackSupplement fallback_supplement;
+    };
+} // namespace capi
+} // namespace
+
+
+namespace icu4x {
+struct LocaleFallbackConfig {
+  icu4x::LocaleFallbackPriority priority;
+  std::string_view extension_key;
+  icu4x::LocaleFallbackSupplement fallback_supplement;
+
+  inline icu4x::capi::LocaleFallbackConfig AsFFI() const;
+  inline static icu4x::LocaleFallbackConfig FromFFI(icu4x::capi::LocaleFallbackConfig c_struct);
+};
+
+} // namespace
+#endif // icu4x_LocaleFallbackConfig_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LocaleFallbackConfig.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleFallbackConfig.hpp
new file mode 100644
index 00000000000..102981eed34
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleFallbackConfig.hpp
@@ -0,0 +1,44 @@
+#ifndef icu4x_LocaleFallbackConfig_HPP
+#define icu4x_LocaleFallbackConfig_HPP
+
+#include "LocaleFallbackConfig.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "LocaleFallbackPriority.hpp"
+#include "LocaleFallbackSupplement.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+
+inline icu4x::capi::LocaleFallbackConfig icu4x::LocaleFallbackConfig::AsFFI() const {
+  return icu4x::capi::LocaleFallbackConfig {
+    /* .priority = */ priority.AsFFI(),
+    /* .extension_key = */ {extension_key.data(), extension_key.size()},
+    /* .fallback_supplement = */ fallback_supplement.AsFFI(),
+  };
+}
+
+inline icu4x::LocaleFallbackConfig icu4x::LocaleFallbackConfig::FromFFI(icu4x::capi::LocaleFallbackConfig c_struct) {
+  return icu4x::LocaleFallbackConfig {
+    /* .priority = */ icu4x::LocaleFallbackPriority::FromFFI(c_struct.priority),
+    /* .extension_key = */ std::string_view(c_struct.extension_key.data, c_struct.extension_key.len),
+    /* .fallback_supplement = */ icu4x::LocaleFallbackSupplement::FromFFI(c_struct.fallback_supplement),
+  };
+}
+
+
+#endif // icu4x_LocaleFallbackConfig_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LocaleFallbackIterator.d.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleFallbackIterator.d.hpp
new file mode 100644
index 00000000000..a0a75377536
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleFallbackIterator.d.hpp
@@ -0,0 +1,45 @@
+#ifndef icu4x_LocaleFallbackIterator_D_HPP
+#define icu4x_LocaleFallbackIterator_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct Locale; }
+class Locale;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct LocaleFallbackIterator;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class LocaleFallbackIterator {
+public:
+
+  inline std::unique_ptr<icu4x::Locale> next();
+
+  inline const icu4x::capi::LocaleFallbackIterator* AsFFI() const;
+  inline icu4x::capi::LocaleFallbackIterator* AsFFI();
+  inline static const icu4x::LocaleFallbackIterator* FromFFI(const icu4x::capi::LocaleFallbackIterator* ptr);
+  inline static icu4x::LocaleFallbackIterator* FromFFI(icu4x::capi::LocaleFallbackIterator* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  LocaleFallbackIterator() = delete;
+  LocaleFallbackIterator(const icu4x::LocaleFallbackIterator&) = delete;
+  LocaleFallbackIterator(icu4x::LocaleFallbackIterator&&) noexcept = delete;
+  LocaleFallbackIterator operator=(const icu4x::LocaleFallbackIterator&) = delete;
+  LocaleFallbackIterator operator=(icu4x::LocaleFallbackIterator&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_LocaleFallbackIterator_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LocaleFallbackIterator.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleFallbackIterator.hpp
new file mode 100644
index 00000000000..9f16eb5a71c
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleFallbackIterator.hpp
@@ -0,0 +1,55 @@
+#ifndef icu4x_LocaleFallbackIterator_HPP
+#define icu4x_LocaleFallbackIterator_HPP
+
+#include "LocaleFallbackIterator.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "Locale.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    icu4x::capi::Locale* icu4x_LocaleFallbackIterator_next_mv1(icu4x::capi::LocaleFallbackIterator* self);
+    
+    
+    void icu4x_LocaleFallbackIterator_destroy_mv1(LocaleFallbackIterator* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline std::unique_ptr<icu4x::Locale> icu4x::LocaleFallbackIterator::next() {
+  auto result = icu4x::capi::icu4x_LocaleFallbackIterator_next_mv1(this->AsFFI());
+  return std::unique_ptr<icu4x::Locale>(icu4x::Locale::FromFFI(result));
+}
+
+inline const icu4x::capi::LocaleFallbackIterator* icu4x::LocaleFallbackIterator::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::LocaleFallbackIterator*>(this);
+}
+
+inline icu4x::capi::LocaleFallbackIterator* icu4x::LocaleFallbackIterator::AsFFI() {
+  return reinterpret_cast<icu4x::capi::LocaleFallbackIterator*>(this);
+}
+
+inline const icu4x::LocaleFallbackIterator* icu4x::LocaleFallbackIterator::FromFFI(const icu4x::capi::LocaleFallbackIterator* ptr) {
+  return reinterpret_cast<const icu4x::LocaleFallbackIterator*>(ptr);
+}
+
+inline icu4x::LocaleFallbackIterator* icu4x::LocaleFallbackIterator::FromFFI(icu4x::capi::LocaleFallbackIterator* ptr) {
+  return reinterpret_cast<icu4x::LocaleFallbackIterator*>(ptr);
+}
+
+inline void icu4x::LocaleFallbackIterator::operator delete(void* ptr) {
+  icu4x::capi::icu4x_LocaleFallbackIterator_destroy_mv1(reinterpret_cast<icu4x::capi::LocaleFallbackIterator*>(ptr));
+}
+
+
+#endif // icu4x_LocaleFallbackIterator_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleFallbackPriority.d.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleFallbackPriority.d.hpp
similarity index 67%
rename from ffi/capi/bindings/cpp/LocaleFallbackPriority.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/LocaleFallbackPriority.d.hpp
index 56a765b236a..5b137ffa74d 100644
--- a/ffi/capi/bindings/cpp/LocaleFallbackPriority.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleFallbackPriority.d.hpp
@@ -1,5 +1,5 @@
-#ifndef LocaleFallbackPriority_D_HPP
-#define LocaleFallbackPriority_D_HPP
+#ifndef icu4x_LocaleFallbackPriority_D_HPP
+#define icu4x_LocaleFallbackPriority_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum LocaleFallbackPriority {
       LocaleFallbackPriority_Language = 0,
@@ -20,6 +20,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class LocaleFallbackPriority {
 public:
   enum Value {
@@ -35,11 +36,11 @@ class LocaleFallbackPriority {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::LocaleFallbackPriority AsFFI() const;
-  inline static LocaleFallbackPriority FromFFI(diplomat::capi::LocaleFallbackPriority c_enum);
+  inline icu4x::capi::LocaleFallbackPriority AsFFI() const;
+  inline static icu4x::LocaleFallbackPriority FromFFI(icu4x::capi::LocaleFallbackPriority c_enum);
 private:
     Value value;
 };
 
-
-#endif // LocaleFallbackPriority_D_HPP
+} // namespace
+#endif // icu4x_LocaleFallbackPriority_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LocaleFallbackPriority.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleFallbackPriority.hpp
new file mode 100644
index 00000000000..6b9a5608154
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleFallbackPriority.hpp
@@ -0,0 +1,38 @@
+#ifndef icu4x_LocaleFallbackPriority_HPP
+#define icu4x_LocaleFallbackPriority_HPP
+
+#include "LocaleFallbackPriority.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::LocaleFallbackPriority icu4x::LocaleFallbackPriority::AsFFI() const {
+  return static_cast<icu4x::capi::LocaleFallbackPriority>(value);
+}
+
+inline icu4x::LocaleFallbackPriority icu4x::LocaleFallbackPriority::FromFFI(icu4x::capi::LocaleFallbackPriority c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::LocaleFallbackPriority_Language:
+    case icu4x::capi::LocaleFallbackPriority_Region:
+    case icu4x::capi::LocaleFallbackPriority_Collation:
+      return static_cast<icu4x::LocaleFallbackPriority::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_LocaleFallbackPriority_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleFallbackSupplement.d.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleFallbackSupplement.d.hpp
similarity index 64%
rename from ffi/capi/bindings/cpp/LocaleFallbackSupplement.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/LocaleFallbackSupplement.d.hpp
index 11356caa8b7..51245b1316d 100644
--- a/ffi/capi/bindings/cpp/LocaleFallbackSupplement.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleFallbackSupplement.d.hpp
@@ -1,5 +1,5 @@
-#ifndef LocaleFallbackSupplement_D_HPP
-#define LocaleFallbackSupplement_D_HPP
+#ifndef icu4x_LocaleFallbackSupplement_D_HPP
+#define icu4x_LocaleFallbackSupplement_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum LocaleFallbackSupplement {
       LocaleFallbackSupplement_None = 0,
@@ -19,6 +19,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class LocaleFallbackSupplement {
 public:
   enum Value {
@@ -33,11 +34,11 @@ class LocaleFallbackSupplement {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::LocaleFallbackSupplement AsFFI() const;
-  inline static LocaleFallbackSupplement FromFFI(diplomat::capi::LocaleFallbackSupplement c_enum);
+  inline icu4x::capi::LocaleFallbackSupplement AsFFI() const;
+  inline static icu4x::LocaleFallbackSupplement FromFFI(icu4x::capi::LocaleFallbackSupplement c_enum);
 private:
     Value value;
 };
 
-
-#endif // LocaleFallbackSupplement_D_HPP
+} // namespace
+#endif // icu4x_LocaleFallbackSupplement_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LocaleFallbackSupplement.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleFallbackSupplement.hpp
new file mode 100644
index 00000000000..356da64a8be
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleFallbackSupplement.hpp
@@ -0,0 +1,37 @@
+#ifndef icu4x_LocaleFallbackSupplement_HPP
+#define icu4x_LocaleFallbackSupplement_HPP
+
+#include "LocaleFallbackSupplement.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::LocaleFallbackSupplement icu4x::LocaleFallbackSupplement::AsFFI() const {
+  return static_cast<icu4x::capi::LocaleFallbackSupplement>(value);
+}
+
+inline icu4x::LocaleFallbackSupplement icu4x::LocaleFallbackSupplement::FromFFI(icu4x::capi::LocaleFallbackSupplement c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::LocaleFallbackSupplement_None:
+    case icu4x::capi::LocaleFallbackSupplement_Collation:
+      return static_cast<icu4x::LocaleFallbackSupplement::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_LocaleFallbackSupplement_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LocaleFallbacker.d.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleFallbacker.d.hpp
new file mode 100644
index 00000000000..42928fafff7
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleFallbacker.d.hpp
@@ -0,0 +1,56 @@
+#ifndef icu4x_LocaleFallbacker_D_HPP
+#define icu4x_LocaleFallbacker_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct LocaleFallbacker; }
+class LocaleFallbacker;
+namespace capi { struct LocaleFallbackerWithConfig; }
+class LocaleFallbackerWithConfig;
+struct LocaleFallbackConfig;
+class DataError;
+class LocaleParseError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct LocaleFallbacker;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class LocaleFallbacker {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::LocaleFallbacker>, icu4x::DataError> create(const icu4x::DataProvider& provider);
+
+  inline static std::unique_ptr<icu4x::LocaleFallbacker> without_data();
+
+  inline diplomat::result<std::unique_ptr<icu4x::LocaleFallbackerWithConfig>, icu4x::LocaleParseError> for_config(icu4x::LocaleFallbackConfig config) const;
+
+  inline const icu4x::capi::LocaleFallbacker* AsFFI() const;
+  inline icu4x::capi::LocaleFallbacker* AsFFI();
+  inline static const icu4x::LocaleFallbacker* FromFFI(const icu4x::capi::LocaleFallbacker* ptr);
+  inline static icu4x::LocaleFallbacker* FromFFI(icu4x::capi::LocaleFallbacker* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  LocaleFallbacker() = delete;
+  LocaleFallbacker(const icu4x::LocaleFallbacker&) = delete;
+  LocaleFallbacker(icu4x::LocaleFallbacker&&) noexcept = delete;
+  LocaleFallbacker operator=(const icu4x::LocaleFallbacker&) = delete;
+  LocaleFallbacker operator=(icu4x::LocaleFallbacker&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_LocaleFallbacker_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LocaleFallbacker.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleFallbacker.hpp
new file mode 100644
index 00000000000..287c1697e43
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleFallbacker.hpp
@@ -0,0 +1,76 @@
+#ifndef icu4x_LocaleFallbacker_HPP
+#define icu4x_LocaleFallbacker_HPP
+
+#include "LocaleFallbacker.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "LocaleFallbackConfig.hpp"
+#include "LocaleFallbackerWithConfig.hpp"
+#include "LocaleParseError.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_LocaleFallbacker_create_mv1_result {union {icu4x::capi::LocaleFallbacker* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_LocaleFallbacker_create_mv1_result;
+    icu4x_LocaleFallbacker_create_mv1_result icu4x_LocaleFallbacker_create_mv1(const icu4x::capi::DataProvider* provider);
+    
+    icu4x::capi::LocaleFallbacker* icu4x_LocaleFallbacker_without_data_mv1(void);
+    
+    typedef struct icu4x_LocaleFallbacker_for_config_mv1_result {union {icu4x::capi::LocaleFallbackerWithConfig* ok; icu4x::capi::LocaleParseError err;}; bool is_ok;} icu4x_LocaleFallbacker_for_config_mv1_result;
+    icu4x_LocaleFallbacker_for_config_mv1_result icu4x_LocaleFallbacker_for_config_mv1(const icu4x::capi::LocaleFallbacker* self, icu4x::capi::LocaleFallbackConfig config);
+    
+    
+    void icu4x_LocaleFallbacker_destroy_mv1(LocaleFallbacker* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::LocaleFallbacker>, icu4x::DataError> icu4x::LocaleFallbacker::create(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_LocaleFallbacker_create_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::LocaleFallbacker>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::LocaleFallbacker>>(std::unique_ptr<icu4x::LocaleFallbacker>(icu4x::LocaleFallbacker::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::LocaleFallbacker>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline std::unique_ptr<icu4x::LocaleFallbacker> icu4x::LocaleFallbacker::without_data() {
+  auto result = icu4x::capi::icu4x_LocaleFallbacker_without_data_mv1();
+  return std::unique_ptr<icu4x::LocaleFallbacker>(icu4x::LocaleFallbacker::FromFFI(result));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::LocaleFallbackerWithConfig>, icu4x::LocaleParseError> icu4x::LocaleFallbacker::for_config(icu4x::LocaleFallbackConfig config) const {
+  auto result = icu4x::capi::icu4x_LocaleFallbacker_for_config_mv1(this->AsFFI(),
+    config.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::LocaleFallbackerWithConfig>, icu4x::LocaleParseError>(diplomat::Ok<std::unique_ptr<icu4x::LocaleFallbackerWithConfig>>(std::unique_ptr<icu4x::LocaleFallbackerWithConfig>(icu4x::LocaleFallbackerWithConfig::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::LocaleFallbackerWithConfig>, icu4x::LocaleParseError>(diplomat::Err<icu4x::LocaleParseError>(icu4x::LocaleParseError::FromFFI(result.err)));
+}
+
+inline const icu4x::capi::LocaleFallbacker* icu4x::LocaleFallbacker::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::LocaleFallbacker*>(this);
+}
+
+inline icu4x::capi::LocaleFallbacker* icu4x::LocaleFallbacker::AsFFI() {
+  return reinterpret_cast<icu4x::capi::LocaleFallbacker*>(this);
+}
+
+inline const icu4x::LocaleFallbacker* icu4x::LocaleFallbacker::FromFFI(const icu4x::capi::LocaleFallbacker* ptr) {
+  return reinterpret_cast<const icu4x::LocaleFallbacker*>(ptr);
+}
+
+inline icu4x::LocaleFallbacker* icu4x::LocaleFallbacker::FromFFI(icu4x::capi::LocaleFallbacker* ptr) {
+  return reinterpret_cast<icu4x::LocaleFallbacker*>(ptr);
+}
+
+inline void icu4x::LocaleFallbacker::operator delete(void* ptr) {
+  icu4x::capi::icu4x_LocaleFallbacker_destroy_mv1(reinterpret_cast<icu4x::capi::LocaleFallbacker*>(ptr));
+}
+
+
+#endif // icu4x_LocaleFallbacker_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LocaleFallbackerWithConfig.d.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleFallbackerWithConfig.d.hpp
new file mode 100644
index 00000000000..f932ca4451a
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleFallbackerWithConfig.d.hpp
@@ -0,0 +1,47 @@
+#ifndef icu4x_LocaleFallbackerWithConfig_D_HPP
+#define icu4x_LocaleFallbackerWithConfig_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct Locale; }
+class Locale;
+namespace capi { struct LocaleFallbackIterator; }
+class LocaleFallbackIterator;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct LocaleFallbackerWithConfig;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class LocaleFallbackerWithConfig {
+public:
+
+  inline std::unique_ptr<icu4x::LocaleFallbackIterator> fallback_for_locale(const icu4x::Locale& locale) const;
+
+  inline const icu4x::capi::LocaleFallbackerWithConfig* AsFFI() const;
+  inline icu4x::capi::LocaleFallbackerWithConfig* AsFFI();
+  inline static const icu4x::LocaleFallbackerWithConfig* FromFFI(const icu4x::capi::LocaleFallbackerWithConfig* ptr);
+  inline static icu4x::LocaleFallbackerWithConfig* FromFFI(icu4x::capi::LocaleFallbackerWithConfig* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  LocaleFallbackerWithConfig() = delete;
+  LocaleFallbackerWithConfig(const icu4x::LocaleFallbackerWithConfig&) = delete;
+  LocaleFallbackerWithConfig(icu4x::LocaleFallbackerWithConfig&&) noexcept = delete;
+  LocaleFallbackerWithConfig operator=(const icu4x::LocaleFallbackerWithConfig&) = delete;
+  LocaleFallbackerWithConfig operator=(icu4x::LocaleFallbackerWithConfig&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_LocaleFallbackerWithConfig_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LocaleFallbackerWithConfig.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleFallbackerWithConfig.hpp
new file mode 100644
index 00000000000..769769a7300
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleFallbackerWithConfig.hpp
@@ -0,0 +1,57 @@
+#ifndef icu4x_LocaleFallbackerWithConfig_HPP
+#define icu4x_LocaleFallbackerWithConfig_HPP
+
+#include "LocaleFallbackerWithConfig.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "Locale.hpp"
+#include "LocaleFallbackIterator.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    icu4x::capi::LocaleFallbackIterator* icu4x_LocaleFallbackerWithConfig_fallback_for_locale_mv1(const icu4x::capi::LocaleFallbackerWithConfig* self, const icu4x::capi::Locale* locale);
+    
+    
+    void icu4x_LocaleFallbackerWithConfig_destroy_mv1(LocaleFallbackerWithConfig* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline std::unique_ptr<icu4x::LocaleFallbackIterator> icu4x::LocaleFallbackerWithConfig::fallback_for_locale(const icu4x::Locale& locale) const {
+  auto result = icu4x::capi::icu4x_LocaleFallbackerWithConfig_fallback_for_locale_mv1(this->AsFFI(),
+    locale.AsFFI());
+  return std::unique_ptr<icu4x::LocaleFallbackIterator>(icu4x::LocaleFallbackIterator::FromFFI(result));
+}
+
+inline const icu4x::capi::LocaleFallbackerWithConfig* icu4x::LocaleFallbackerWithConfig::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::LocaleFallbackerWithConfig*>(this);
+}
+
+inline icu4x::capi::LocaleFallbackerWithConfig* icu4x::LocaleFallbackerWithConfig::AsFFI() {
+  return reinterpret_cast<icu4x::capi::LocaleFallbackerWithConfig*>(this);
+}
+
+inline const icu4x::LocaleFallbackerWithConfig* icu4x::LocaleFallbackerWithConfig::FromFFI(const icu4x::capi::LocaleFallbackerWithConfig* ptr) {
+  return reinterpret_cast<const icu4x::LocaleFallbackerWithConfig*>(ptr);
+}
+
+inline icu4x::LocaleFallbackerWithConfig* icu4x::LocaleFallbackerWithConfig::FromFFI(icu4x::capi::LocaleFallbackerWithConfig* ptr) {
+  return reinterpret_cast<icu4x::LocaleFallbackerWithConfig*>(ptr);
+}
+
+inline void icu4x::LocaleFallbackerWithConfig::operator delete(void* ptr) {
+  icu4x::capi::icu4x_LocaleFallbackerWithConfig_destroy_mv1(reinterpret_cast<icu4x::capi::LocaleFallbackerWithConfig*>(ptr));
+}
+
+
+#endif // icu4x_LocaleFallbackerWithConfig_HPP
diff --git a/ffi/capi/bindings/cpp/LocaleParseError.d.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleParseError.d.hpp
similarity index 69%
rename from ffi/capi/bindings/cpp/LocaleParseError.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/LocaleParseError.d.hpp
index 18ac451d133..d6db2420b87 100644
--- a/ffi/capi/bindings/cpp/LocaleParseError.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleParseError.d.hpp
@@ -1,5 +1,5 @@
-#ifndef LocaleParseError_D_HPP
-#define LocaleParseError_D_HPP
+#ifndef icu4x_LocaleParseError_D_HPP
+#define icu4x_LocaleParseError_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum LocaleParseError {
       LocaleParseError_Unknown = 0,
@@ -21,6 +21,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class LocaleParseError {
 public:
   enum Value {
@@ -37,11 +38,11 @@ class LocaleParseError {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::LocaleParseError AsFFI() const;
-  inline static LocaleParseError FromFFI(diplomat::capi::LocaleParseError c_enum);
+  inline icu4x::capi::LocaleParseError AsFFI() const;
+  inline static icu4x::LocaleParseError FromFFI(icu4x::capi::LocaleParseError c_enum);
 private:
     Value value;
 };
 
-
-#endif // LocaleParseError_D_HPP
+} // namespace
+#endif // icu4x_LocaleParseError_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/LocaleParseError.hpp b/ffi/capi/bindings/cpp/icu4x/LocaleParseError.hpp
new file mode 100644
index 00000000000..a5a5326daef
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/LocaleParseError.hpp
@@ -0,0 +1,39 @@
+#ifndef icu4x_LocaleParseError_HPP
+#define icu4x_LocaleParseError_HPP
+
+#include "LocaleParseError.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::LocaleParseError icu4x::LocaleParseError::AsFFI() const {
+  return static_cast<icu4x::capi::LocaleParseError>(value);
+}
+
+inline icu4x::LocaleParseError icu4x::LocaleParseError::FromFFI(icu4x::capi::LocaleParseError c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::LocaleParseError_Unknown:
+    case icu4x::capi::LocaleParseError_Language:
+    case icu4x::capi::LocaleParseError_Subtag:
+    case icu4x::capi::LocaleParseError_Extension:
+      return static_cast<icu4x::LocaleParseError::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_LocaleParseError_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/Logger.d.hpp b/ffi/capi/bindings/cpp/icu4x/Logger.d.hpp
new file mode 100644
index 00000000000..7fb47dbc193
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/Logger.d.hpp
@@ -0,0 +1,40 @@
+#ifndef icu4x_Logger_D_HPP
+#define icu4x_Logger_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    struct Logger;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class Logger {
+public:
+
+  inline static bool init_simple_logger();
+
+  inline const icu4x::capi::Logger* AsFFI() const;
+  inline icu4x::capi::Logger* AsFFI();
+  inline static const icu4x::Logger* FromFFI(const icu4x::capi::Logger* ptr);
+  inline static icu4x::Logger* FromFFI(icu4x::capi::Logger* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  Logger() = delete;
+  Logger(const icu4x::Logger&) = delete;
+  Logger(icu4x::Logger&&) noexcept = delete;
+  Logger operator=(const icu4x::Logger&) = delete;
+  Logger operator=(icu4x::Logger&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_Logger_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/Logger.hpp b/ffi/capi/bindings/cpp/icu4x/Logger.hpp
new file mode 100644
index 00000000000..fe60472853c
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/Logger.hpp
@@ -0,0 +1,54 @@
+#ifndef icu4x_Logger_HPP
+#define icu4x_Logger_HPP
+
+#include "Logger.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    bool icu4x_Logger_init_simple_logger_mv1(void);
+    
+    
+    void icu4x_Logger_destroy_mv1(Logger* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline bool icu4x::Logger::init_simple_logger() {
+  auto result = icu4x::capi::icu4x_Logger_init_simple_logger_mv1();
+  return result;
+}
+
+inline const icu4x::capi::Logger* icu4x::Logger::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::Logger*>(this);
+}
+
+inline icu4x::capi::Logger* icu4x::Logger::AsFFI() {
+  return reinterpret_cast<icu4x::capi::Logger*>(this);
+}
+
+inline const icu4x::Logger* icu4x::Logger::FromFFI(const icu4x::capi::Logger* ptr) {
+  return reinterpret_cast<const icu4x::Logger*>(ptr);
+}
+
+inline icu4x::Logger* icu4x::Logger::FromFFI(icu4x::capi::Logger* ptr) {
+  return reinterpret_cast<icu4x::Logger*>(ptr);
+}
+
+inline void icu4x::Logger::operator delete(void* ptr) {
+  icu4x::capi::icu4x_Logger_destroy_mv1(reinterpret_cast<icu4x::capi::Logger*>(ptr));
+}
+
+
+#endif // icu4x_Logger_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/MeasureUnit.d.hpp b/ffi/capi/bindings/cpp/icu4x/MeasureUnit.d.hpp
new file mode 100644
index 00000000000..19918adc239
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/MeasureUnit.d.hpp
@@ -0,0 +1,38 @@
+#ifndef icu4x_MeasureUnit_D_HPP
+#define icu4x_MeasureUnit_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    struct MeasureUnit;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class MeasureUnit {
+public:
+
+  inline const icu4x::capi::MeasureUnit* AsFFI() const;
+  inline icu4x::capi::MeasureUnit* AsFFI();
+  inline static const icu4x::MeasureUnit* FromFFI(const icu4x::capi::MeasureUnit* ptr);
+  inline static icu4x::MeasureUnit* FromFFI(icu4x::capi::MeasureUnit* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  MeasureUnit() = delete;
+  MeasureUnit(const icu4x::MeasureUnit&) = delete;
+  MeasureUnit(icu4x::MeasureUnit&&) noexcept = delete;
+  MeasureUnit operator=(const icu4x::MeasureUnit&) = delete;
+  MeasureUnit operator=(icu4x::MeasureUnit&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_MeasureUnit_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/MeasureUnit.hpp b/ffi/capi/bindings/cpp/icu4x/MeasureUnit.hpp
new file mode 100644
index 00000000000..4219105acc1
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/MeasureUnit.hpp
@@ -0,0 +1,47 @@
+#ifndef icu4x_MeasureUnit_HPP
+#define icu4x_MeasureUnit_HPP
+
+#include "MeasureUnit.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    void icu4x_MeasureUnit_destroy_mv1(MeasureUnit* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline const icu4x::capi::MeasureUnit* icu4x::MeasureUnit::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::MeasureUnit*>(this);
+}
+
+inline icu4x::capi::MeasureUnit* icu4x::MeasureUnit::AsFFI() {
+  return reinterpret_cast<icu4x::capi::MeasureUnit*>(this);
+}
+
+inline const icu4x::MeasureUnit* icu4x::MeasureUnit::FromFFI(const icu4x::capi::MeasureUnit* ptr) {
+  return reinterpret_cast<const icu4x::MeasureUnit*>(ptr);
+}
+
+inline icu4x::MeasureUnit* icu4x::MeasureUnit::FromFFI(icu4x::capi::MeasureUnit* ptr) {
+  return reinterpret_cast<icu4x::MeasureUnit*>(ptr);
+}
+
+inline void icu4x::MeasureUnit::operator delete(void* ptr) {
+  icu4x::capi::icu4x_MeasureUnit_destroy_mv1(reinterpret_cast<icu4x::capi::MeasureUnit*>(ptr));
+}
+
+
+#endif // icu4x_MeasureUnit_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/MeasureUnitParser.d.hpp b/ffi/capi/bindings/cpp/icu4x/MeasureUnitParser.d.hpp
new file mode 100644
index 00000000000..b7e7762c285
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/MeasureUnitParser.d.hpp
@@ -0,0 +1,45 @@
+#ifndef icu4x_MeasureUnitParser_D_HPP
+#define icu4x_MeasureUnitParser_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct MeasureUnit; }
+class MeasureUnit;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct MeasureUnitParser;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class MeasureUnitParser {
+public:
+
+  inline std::unique_ptr<icu4x::MeasureUnit> parse(std::string_view unit_id) const;
+
+  inline const icu4x::capi::MeasureUnitParser* AsFFI() const;
+  inline icu4x::capi::MeasureUnitParser* AsFFI();
+  inline static const icu4x::MeasureUnitParser* FromFFI(const icu4x::capi::MeasureUnitParser* ptr);
+  inline static icu4x::MeasureUnitParser* FromFFI(icu4x::capi::MeasureUnitParser* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  MeasureUnitParser() = delete;
+  MeasureUnitParser(const icu4x::MeasureUnitParser&) = delete;
+  MeasureUnitParser(icu4x::MeasureUnitParser&&) noexcept = delete;
+  MeasureUnitParser operator=(const icu4x::MeasureUnitParser&) = delete;
+  MeasureUnitParser operator=(icu4x::MeasureUnitParser&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_MeasureUnitParser_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/MeasureUnitParser.hpp b/ffi/capi/bindings/cpp/icu4x/MeasureUnitParser.hpp
new file mode 100644
index 00000000000..9a3703ea43e
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/MeasureUnitParser.hpp
@@ -0,0 +1,57 @@
+#ifndef icu4x_MeasureUnitParser_HPP
+#define icu4x_MeasureUnitParser_HPP
+
+#include "MeasureUnitParser.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "MeasureUnit.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    icu4x::capi::MeasureUnit* icu4x_MeasureUnitParser_parse_mv1(const icu4x::capi::MeasureUnitParser* self, const char* unit_id_data, size_t unit_id_len);
+    
+    
+    void icu4x_MeasureUnitParser_destroy_mv1(MeasureUnitParser* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline std::unique_ptr<icu4x::MeasureUnit> icu4x::MeasureUnitParser::parse(std::string_view unit_id) const {
+  auto result = icu4x::capi::icu4x_MeasureUnitParser_parse_mv1(this->AsFFI(),
+    unit_id.data(),
+    unit_id.size());
+  return std::unique_ptr<icu4x::MeasureUnit>(icu4x::MeasureUnit::FromFFI(result));
+}
+
+inline const icu4x::capi::MeasureUnitParser* icu4x::MeasureUnitParser::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::MeasureUnitParser*>(this);
+}
+
+inline icu4x::capi::MeasureUnitParser* icu4x::MeasureUnitParser::AsFFI() {
+  return reinterpret_cast<icu4x::capi::MeasureUnitParser*>(this);
+}
+
+inline const icu4x::MeasureUnitParser* icu4x::MeasureUnitParser::FromFFI(const icu4x::capi::MeasureUnitParser* ptr) {
+  return reinterpret_cast<const icu4x::MeasureUnitParser*>(ptr);
+}
+
+inline icu4x::MeasureUnitParser* icu4x::MeasureUnitParser::FromFFI(icu4x::capi::MeasureUnitParser* ptr) {
+  return reinterpret_cast<icu4x::MeasureUnitParser*>(ptr);
+}
+
+inline void icu4x::MeasureUnitParser::operator delete(void* ptr) {
+  icu4x::capi::icu4x_MeasureUnitParser_destroy_mv1(reinterpret_cast<icu4x::capi::MeasureUnitParser*>(ptr));
+}
+
+
+#endif // icu4x_MeasureUnitParser_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/MetazoneCalculator.d.hpp b/ffi/capi/bindings/cpp/icu4x/MetazoneCalculator.d.hpp
new file mode 100644
index 00000000000..a60308a2493
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/MetazoneCalculator.d.hpp
@@ -0,0 +1,48 @@
+#ifndef icu4x_MetazoneCalculator_D_HPP
+#define icu4x_MetazoneCalculator_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct MetazoneCalculator; }
+class MetazoneCalculator;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct MetazoneCalculator;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class MetazoneCalculator {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::MetazoneCalculator>, icu4x::DataError> create(const icu4x::DataProvider& provider);
+
+  inline const icu4x::capi::MetazoneCalculator* AsFFI() const;
+  inline icu4x::capi::MetazoneCalculator* AsFFI();
+  inline static const icu4x::MetazoneCalculator* FromFFI(const icu4x::capi::MetazoneCalculator* ptr);
+  inline static icu4x::MetazoneCalculator* FromFFI(icu4x::capi::MetazoneCalculator* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  MetazoneCalculator() = delete;
+  MetazoneCalculator(const icu4x::MetazoneCalculator&) = delete;
+  MetazoneCalculator(icu4x::MetazoneCalculator&&) noexcept = delete;
+  MetazoneCalculator operator=(const icu4x::MetazoneCalculator&) = delete;
+  MetazoneCalculator operator=(icu4x::MetazoneCalculator&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_MetazoneCalculator_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/MetazoneCalculator.hpp b/ffi/capi/bindings/cpp/icu4x/MetazoneCalculator.hpp
new file mode 100644
index 00000000000..6274dd544f1
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/MetazoneCalculator.hpp
@@ -0,0 +1,57 @@
+#ifndef icu4x_MetazoneCalculator_HPP
+#define icu4x_MetazoneCalculator_HPP
+
+#include "MetazoneCalculator.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_MetazoneCalculator_create_mv1_result {union {icu4x::capi::MetazoneCalculator* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_MetazoneCalculator_create_mv1_result;
+    icu4x_MetazoneCalculator_create_mv1_result icu4x_MetazoneCalculator_create_mv1(const icu4x::capi::DataProvider* provider);
+    
+    
+    void icu4x_MetazoneCalculator_destroy_mv1(MetazoneCalculator* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::MetazoneCalculator>, icu4x::DataError> icu4x::MetazoneCalculator::create(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_MetazoneCalculator_create_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::MetazoneCalculator>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::MetazoneCalculator>>(std::unique_ptr<icu4x::MetazoneCalculator>(icu4x::MetazoneCalculator::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::MetazoneCalculator>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline const icu4x::capi::MetazoneCalculator* icu4x::MetazoneCalculator::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::MetazoneCalculator*>(this);
+}
+
+inline icu4x::capi::MetazoneCalculator* icu4x::MetazoneCalculator::AsFFI() {
+  return reinterpret_cast<icu4x::capi::MetazoneCalculator*>(this);
+}
+
+inline const icu4x::MetazoneCalculator* icu4x::MetazoneCalculator::FromFFI(const icu4x::capi::MetazoneCalculator* ptr) {
+  return reinterpret_cast<const icu4x::MetazoneCalculator*>(ptr);
+}
+
+inline icu4x::MetazoneCalculator* icu4x::MetazoneCalculator::FromFFI(icu4x::capi::MetazoneCalculator* ptr) {
+  return reinterpret_cast<icu4x::MetazoneCalculator*>(ptr);
+}
+
+inline void icu4x::MetazoneCalculator::operator delete(void* ptr) {
+  icu4x::capi::icu4x_MetazoneCalculator_destroy_mv1(reinterpret_cast<icu4x::capi::MetazoneCalculator*>(ptr));
+}
+
+
+#endif // icu4x_MetazoneCalculator_HPP
diff --git a/ffi/capi/bindings/cpp/PluralCategories.d.hpp b/ffi/capi/bindings/cpp/icu4x/PluralCategories.d.hpp
similarity index 55%
rename from ffi/capi/bindings/cpp/PluralCategories.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/PluralCategories.d.hpp
index d4418f7c18a..82cdc22c22e 100644
--- a/ffi/capi/bindings/cpp/PluralCategories.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/PluralCategories.d.hpp
@@ -1,5 +1,5 @@
-#ifndef PluralCategories_D_HPP
-#define PluralCategories_D_HPP
+#ifndef icu4x_PluralCategories_D_HPP
+#define icu4x_PluralCategories_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     struct PluralCategories {
       bool zero;
@@ -24,6 +24,7 @@ namespace capi {
 } // namespace
 
 
+namespace icu4x {
 struct PluralCategories {
   bool zero;
   bool one;
@@ -32,9 +33,9 @@ struct PluralCategories {
   bool many;
   bool other;
 
-  inline diplomat::capi::PluralCategories AsFFI() const;
-  inline static PluralCategories FromFFI(diplomat::capi::PluralCategories c_struct);
+  inline icu4x::capi::PluralCategories AsFFI() const;
+  inline static icu4x::PluralCategories FromFFI(icu4x::capi::PluralCategories c_struct);
 };
 
-
-#endif // PluralCategories_D_HPP
+} // namespace
+#endif // icu4x_PluralCategories_D_HPP
diff --git a/ffi/capi/bindings/cpp/PluralCategories.hpp b/ffi/capi/bindings/cpp/icu4x/PluralCategories.hpp
similarity index 59%
rename from ffi/capi/bindings/cpp/PluralCategories.hpp
rename to ffi/capi/bindings/cpp/icu4x/PluralCategories.hpp
index f70c1705f03..9203ab21872 100644
--- a/ffi/capi/bindings/cpp/PluralCategories.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/PluralCategories.hpp
@@ -1,5 +1,5 @@
-#ifndef PluralCategories_HPP
-#define PluralCategories_HPP
+#ifndef icu4x_PluralCategories_HPP
+#define icu4x_PluralCategories_HPP
 
 #include "PluralCategories.d.hpp"
 
@@ -9,10 +9,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     extern "C" {
     
@@ -22,8 +22,8 @@ namespace capi {
 } // namespace
 
 
-inline diplomat::capi::PluralCategories PluralCategories::AsFFI() const {
-  return diplomat::capi::PluralCategories {
+inline icu4x::capi::PluralCategories icu4x::PluralCategories::AsFFI() const {
+  return icu4x::capi::PluralCategories {
     /* .zero = */ zero,
     /* .one = */ one,
     /* .two = */ two,
@@ -33,8 +33,8 @@ inline diplomat::capi::PluralCategories PluralCategories::AsFFI() const {
   };
 }
 
-inline PluralCategories PluralCategories::FromFFI(diplomat::capi::PluralCategories c_struct) {
-  return PluralCategories {
+inline icu4x::PluralCategories icu4x::PluralCategories::FromFFI(icu4x::capi::PluralCategories c_struct) {
+  return icu4x::PluralCategories {
     /* .zero = */ c_struct.zero,
     /* .one = */ c_struct.one,
     /* .two = */ c_struct.two,
@@ -45,4 +45,4 @@ inline PluralCategories PluralCategories::FromFFI(diplomat::capi::PluralCategori
 }
 
 
-#endif // PluralCategories_HPP
+#endif // icu4x_PluralCategories_HPP
diff --git a/ffi/capi/bindings/cpp/PluralCategory.d.hpp b/ffi/capi/bindings/cpp/icu4x/PluralCategory.d.hpp
similarity index 63%
rename from ffi/capi/bindings/cpp/PluralCategory.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/PluralCategory.d.hpp
index effb520b733..8fcd6591348 100644
--- a/ffi/capi/bindings/cpp/PluralCategory.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/PluralCategory.d.hpp
@@ -1,5 +1,5 @@
-#ifndef PluralCategory_D_HPP
-#define PluralCategory_D_HPP
+#ifndef icu4x_PluralCategory_D_HPP
+#define icu4x_PluralCategory_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,14 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
+namespace icu4x {
+class PluralCategory;
+}
 
-namespace diplomat {
+
+namespace icu4x {
 namespace capi {
     enum PluralCategory {
       PluralCategory_Zero = 0,
@@ -23,6 +27,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class PluralCategory {
 public:
   enum Value {
@@ -41,13 +46,13 @@ class PluralCategory {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline static std::optional<PluralCategory> get_for_cldr_string(std::string_view s);
+  inline static std::optional<icu4x::PluralCategory> get_for_cldr_string(std::string_view s);
 
-  inline diplomat::capi::PluralCategory AsFFI() const;
-  inline static PluralCategory FromFFI(diplomat::capi::PluralCategory c_enum);
+  inline icu4x::capi::PluralCategory AsFFI() const;
+  inline static icu4x::PluralCategory FromFFI(icu4x::capi::PluralCategory c_enum);
 private:
     Value value;
 };
 
-
-#endif // PluralCategory_D_HPP
+} // namespace
+#endif // icu4x_PluralCategory_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/PluralCategory.hpp b/ffi/capi/bindings/cpp/icu4x/PluralCategory.hpp
new file mode 100644
index 00000000000..5fd2c85a639
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/PluralCategory.hpp
@@ -0,0 +1,50 @@
+#ifndef icu4x_PluralCategory_HPP
+#define icu4x_PluralCategory_HPP
+
+#include "PluralCategory.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_PluralCategory_get_for_cldr_string_mv1_result {union {icu4x::capi::PluralCategory ok; }; bool is_ok;} icu4x_PluralCategory_get_for_cldr_string_mv1_result;
+    icu4x_PluralCategory_get_for_cldr_string_mv1_result icu4x_PluralCategory_get_for_cldr_string_mv1(const char* s_data, size_t s_len);
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::PluralCategory icu4x::PluralCategory::AsFFI() const {
+  return static_cast<icu4x::capi::PluralCategory>(value);
+}
+
+inline icu4x::PluralCategory icu4x::PluralCategory::FromFFI(icu4x::capi::PluralCategory c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::PluralCategory_Zero:
+    case icu4x::capi::PluralCategory_One:
+    case icu4x::capi::PluralCategory_Two:
+    case icu4x::capi::PluralCategory_Few:
+    case icu4x::capi::PluralCategory_Many:
+    case icu4x::capi::PluralCategory_Other:
+      return static_cast<icu4x::PluralCategory::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+
+inline std::optional<icu4x::PluralCategory> icu4x::PluralCategory::get_for_cldr_string(std::string_view s) {
+  auto result = icu4x::capi::icu4x_PluralCategory_get_for_cldr_string_mv1(s.data(),
+    s.size());
+  return result.is_ok ? std::optional<icu4x::PluralCategory>(icu4x::PluralCategory::FromFFI(result.ok)) : std::nullopt;
+}
+#endif // icu4x_PluralCategory_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/PluralOperands.d.hpp b/ffi/capi/bindings/cpp/icu4x/PluralOperands.d.hpp
new file mode 100644
index 00000000000..27ec9275592
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/PluralOperands.d.hpp
@@ -0,0 +1,50 @@
+#ifndef icu4x_PluralOperands_D_HPP
+#define icu4x_PluralOperands_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct FixedDecimal; }
+class FixedDecimal;
+namespace capi { struct PluralOperands; }
+class PluralOperands;
+class FixedDecimalParseError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct PluralOperands;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class PluralOperands {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::PluralOperands>, icu4x::FixedDecimalParseError> from_string(std::string_view s);
+
+  inline static std::unique_ptr<icu4x::PluralOperands> from_fixed_decimal(const icu4x::FixedDecimal& x);
+
+  inline const icu4x::capi::PluralOperands* AsFFI() const;
+  inline icu4x::capi::PluralOperands* AsFFI();
+  inline static const icu4x::PluralOperands* FromFFI(const icu4x::capi::PluralOperands* ptr);
+  inline static icu4x::PluralOperands* FromFFI(icu4x::capi::PluralOperands* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  PluralOperands() = delete;
+  PluralOperands(const icu4x::PluralOperands&) = delete;
+  PluralOperands(icu4x::PluralOperands&&) noexcept = delete;
+  PluralOperands operator=(const icu4x::PluralOperands&) = delete;
+  PluralOperands operator=(icu4x::PluralOperands&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_PluralOperands_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/PluralOperands.hpp b/ffi/capi/bindings/cpp/icu4x/PluralOperands.hpp
new file mode 100644
index 00000000000..f657c8b6660
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/PluralOperands.hpp
@@ -0,0 +1,65 @@
+#ifndef icu4x_PluralOperands_HPP
+#define icu4x_PluralOperands_HPP
+
+#include "PluralOperands.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "FixedDecimal.hpp"
+#include "FixedDecimalParseError.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_PluralOperands_from_string_mv1_result {union {icu4x::capi::PluralOperands* ok; icu4x::capi::FixedDecimalParseError err;}; bool is_ok;} icu4x_PluralOperands_from_string_mv1_result;
+    icu4x_PluralOperands_from_string_mv1_result icu4x_PluralOperands_from_string_mv1(const char* s_data, size_t s_len);
+    
+    icu4x::capi::PluralOperands* icu4x_PluralOperands_from_fixed_decimal_mv1(const icu4x::capi::FixedDecimal* x);
+    
+    
+    void icu4x_PluralOperands_destroy_mv1(PluralOperands* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::PluralOperands>, icu4x::FixedDecimalParseError> icu4x::PluralOperands::from_string(std::string_view s) {
+  auto result = icu4x::capi::icu4x_PluralOperands_from_string_mv1(s.data(),
+    s.size());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::PluralOperands>, icu4x::FixedDecimalParseError>(diplomat::Ok<std::unique_ptr<icu4x::PluralOperands>>(std::unique_ptr<icu4x::PluralOperands>(icu4x::PluralOperands::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::PluralOperands>, icu4x::FixedDecimalParseError>(diplomat::Err<icu4x::FixedDecimalParseError>(icu4x::FixedDecimalParseError::FromFFI(result.err)));
+}
+
+inline std::unique_ptr<icu4x::PluralOperands> icu4x::PluralOperands::from_fixed_decimal(const icu4x::FixedDecimal& x) {
+  auto result = icu4x::capi::icu4x_PluralOperands_from_fixed_decimal_mv1(x.AsFFI());
+  return std::unique_ptr<icu4x::PluralOperands>(icu4x::PluralOperands::FromFFI(result));
+}
+
+inline const icu4x::capi::PluralOperands* icu4x::PluralOperands::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::PluralOperands*>(this);
+}
+
+inline icu4x::capi::PluralOperands* icu4x::PluralOperands::AsFFI() {
+  return reinterpret_cast<icu4x::capi::PluralOperands*>(this);
+}
+
+inline const icu4x::PluralOperands* icu4x::PluralOperands::FromFFI(const icu4x::capi::PluralOperands* ptr) {
+  return reinterpret_cast<const icu4x::PluralOperands*>(ptr);
+}
+
+inline icu4x::PluralOperands* icu4x::PluralOperands::FromFFI(icu4x::capi::PluralOperands* ptr) {
+  return reinterpret_cast<icu4x::PluralOperands*>(ptr);
+}
+
+inline void icu4x::PluralOperands::operator delete(void* ptr) {
+  icu4x::capi::icu4x_PluralOperands_destroy_mv1(reinterpret_cast<icu4x::capi::PluralOperands*>(ptr));
+}
+
+
+#endif // icu4x_PluralOperands_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/PluralRules.d.hpp b/ffi/capi/bindings/cpp/icu4x/PluralRules.d.hpp
new file mode 100644
index 00000000000..e490d2f6c14
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/PluralRules.d.hpp
@@ -0,0 +1,60 @@
+#ifndef icu4x_PluralRules_D_HPP
+#define icu4x_PluralRules_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct Locale; }
+class Locale;
+namespace capi { struct PluralOperands; }
+class PluralOperands;
+namespace capi { struct PluralRules; }
+class PluralRules;
+struct PluralCategories;
+class DataError;
+class PluralCategory;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct PluralRules;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class PluralRules {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::PluralRules>, icu4x::DataError> create_cardinal(const icu4x::DataProvider& provider, const icu4x::Locale& locale);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::PluralRules>, icu4x::DataError> create_ordinal(const icu4x::DataProvider& provider, const icu4x::Locale& locale);
+
+  inline icu4x::PluralCategory category_for(const icu4x::PluralOperands& op) const;
+
+  inline icu4x::PluralCategories categories() const;
+
+  inline const icu4x::capi::PluralRules* AsFFI() const;
+  inline icu4x::capi::PluralRules* AsFFI();
+  inline static const icu4x::PluralRules* FromFFI(const icu4x::capi::PluralRules* ptr);
+  inline static icu4x::PluralRules* FromFFI(icu4x::capi::PluralRules* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  PluralRules() = delete;
+  PluralRules(const icu4x::PluralRules&) = delete;
+  PluralRules(icu4x::PluralRules&&) noexcept = delete;
+  PluralRules operator=(const icu4x::PluralRules&) = delete;
+  PluralRules operator=(icu4x::PluralRules&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_PluralRules_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/PluralRules.hpp b/ffi/capi/bindings/cpp/icu4x/PluralRules.hpp
new file mode 100644
index 00000000000..7a53c9bb2d9
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/PluralRules.hpp
@@ -0,0 +1,86 @@
+#ifndef icu4x_PluralRules_HPP
+#define icu4x_PluralRules_HPP
+
+#include "PluralRules.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "Locale.hpp"
+#include "PluralCategories.hpp"
+#include "PluralCategory.hpp"
+#include "PluralOperands.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_PluralRules_create_cardinal_mv1_result {union {icu4x::capi::PluralRules* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_PluralRules_create_cardinal_mv1_result;
+    icu4x_PluralRules_create_cardinal_mv1_result icu4x_PluralRules_create_cardinal_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale);
+    
+    typedef struct icu4x_PluralRules_create_ordinal_mv1_result {union {icu4x::capi::PluralRules* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_PluralRules_create_ordinal_mv1_result;
+    icu4x_PluralRules_create_ordinal_mv1_result icu4x_PluralRules_create_ordinal_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale);
+    
+    icu4x::capi::PluralCategory icu4x_PluralRules_category_for_mv1(const icu4x::capi::PluralRules* self, const icu4x::capi::PluralOperands* op);
+    
+    icu4x::capi::PluralCategories icu4x_PluralRules_categories_mv1(const icu4x::capi::PluralRules* self);
+    
+    
+    void icu4x_PluralRules_destroy_mv1(PluralRules* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::PluralRules>, icu4x::DataError> icu4x::PluralRules::create_cardinal(const icu4x::DataProvider& provider, const icu4x::Locale& locale) {
+  auto result = icu4x::capi::icu4x_PluralRules_create_cardinal_mv1(provider.AsFFI(),
+    locale.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::PluralRules>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::PluralRules>>(std::unique_ptr<icu4x::PluralRules>(icu4x::PluralRules::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::PluralRules>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::PluralRules>, icu4x::DataError> icu4x::PluralRules::create_ordinal(const icu4x::DataProvider& provider, const icu4x::Locale& locale) {
+  auto result = icu4x::capi::icu4x_PluralRules_create_ordinal_mv1(provider.AsFFI(),
+    locale.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::PluralRules>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::PluralRules>>(std::unique_ptr<icu4x::PluralRules>(icu4x::PluralRules::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::PluralRules>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline icu4x::PluralCategory icu4x::PluralRules::category_for(const icu4x::PluralOperands& op) const {
+  auto result = icu4x::capi::icu4x_PluralRules_category_for_mv1(this->AsFFI(),
+    op.AsFFI());
+  return icu4x::PluralCategory::FromFFI(result);
+}
+
+inline icu4x::PluralCategories icu4x::PluralRules::categories() const {
+  auto result = icu4x::capi::icu4x_PluralRules_categories_mv1(this->AsFFI());
+  return icu4x::PluralCategories::FromFFI(result);
+}
+
+inline const icu4x::capi::PluralRules* icu4x::PluralRules::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::PluralRules*>(this);
+}
+
+inline icu4x::capi::PluralRules* icu4x::PluralRules::AsFFI() {
+  return reinterpret_cast<icu4x::capi::PluralRules*>(this);
+}
+
+inline const icu4x::PluralRules* icu4x::PluralRules::FromFFI(const icu4x::capi::PluralRules* ptr) {
+  return reinterpret_cast<const icu4x::PluralRules*>(ptr);
+}
+
+inline icu4x::PluralRules* icu4x::PluralRules::FromFFI(icu4x::capi::PluralRules* ptr) {
+  return reinterpret_cast<icu4x::PluralRules*>(ptr);
+}
+
+inline void icu4x::PluralRules::operator delete(void* ptr) {
+  icu4x::capi::icu4x_PluralRules_destroy_mv1(reinterpret_cast<icu4x::capi::PluralRules*>(ptr));
+}
+
+
+#endif // icu4x_PluralRules_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/PropertyValueNameToEnumMapper.d.hpp b/ffi/capi/bindings/cpp/icu4x/PropertyValueNameToEnumMapper.d.hpp
new file mode 100644
index 00000000000..30c1e2d1e62
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/PropertyValueNameToEnumMapper.d.hpp
@@ -0,0 +1,70 @@
+#ifndef icu4x_PropertyValueNameToEnumMapper_D_HPP
+#define icu4x_PropertyValueNameToEnumMapper_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct PropertyValueNameToEnumMapper; }
+class PropertyValueNameToEnumMapper;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct PropertyValueNameToEnumMapper;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class PropertyValueNameToEnumMapper {
+public:
+
+  inline int16_t get_strict(std::string_view name) const;
+
+  inline int16_t get_loose(std::string_view name) const;
+
+  inline static diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError> load_general_category(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError> load_hangul_syllable_type(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError> load_east_asian_width(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError> load_bidi_class(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError> load_indic_syllabic_category(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError> load_line_break(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError> load_grapheme_cluster_break(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError> load_word_break(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError> load_sentence_break(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError> load_script(const icu4x::DataProvider& provider);
+
+  inline const icu4x::capi::PropertyValueNameToEnumMapper* AsFFI() const;
+  inline icu4x::capi::PropertyValueNameToEnumMapper* AsFFI();
+  inline static const icu4x::PropertyValueNameToEnumMapper* FromFFI(const icu4x::capi::PropertyValueNameToEnumMapper* ptr);
+  inline static icu4x::PropertyValueNameToEnumMapper* FromFFI(icu4x::capi::PropertyValueNameToEnumMapper* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  PropertyValueNameToEnumMapper() = delete;
+  PropertyValueNameToEnumMapper(const icu4x::PropertyValueNameToEnumMapper&) = delete;
+  PropertyValueNameToEnumMapper(icu4x::PropertyValueNameToEnumMapper&&) noexcept = delete;
+  PropertyValueNameToEnumMapper operator=(const icu4x::PropertyValueNameToEnumMapper&) = delete;
+  PropertyValueNameToEnumMapper operator=(icu4x::PropertyValueNameToEnumMapper&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_PropertyValueNameToEnumMapper_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/PropertyValueNameToEnumMapper.hpp b/ffi/capi/bindings/cpp/icu4x/PropertyValueNameToEnumMapper.hpp
new file mode 100644
index 00000000000..72fedbc3a84
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/PropertyValueNameToEnumMapper.hpp
@@ -0,0 +1,147 @@
+#ifndef icu4x_PropertyValueNameToEnumMapper_HPP
+#define icu4x_PropertyValueNameToEnumMapper_HPP
+
+#include "PropertyValueNameToEnumMapper.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    int16_t icu4x_PropertyValueNameToEnumMapper_get_strict_mv1(const icu4x::capi::PropertyValueNameToEnumMapper* self, const char* name_data, size_t name_len);
+    
+    int16_t icu4x_PropertyValueNameToEnumMapper_get_loose_mv1(const icu4x::capi::PropertyValueNameToEnumMapper* self, const char* name_data, size_t name_len);
+    
+    typedef struct icu4x_PropertyValueNameToEnumMapper_load_general_category_mv1_result {union {icu4x::capi::PropertyValueNameToEnumMapper* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_PropertyValueNameToEnumMapper_load_general_category_mv1_result;
+    icu4x_PropertyValueNameToEnumMapper_load_general_category_mv1_result icu4x_PropertyValueNameToEnumMapper_load_general_category_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_PropertyValueNameToEnumMapper_load_hangul_syllable_type_mv1_result {union {icu4x::capi::PropertyValueNameToEnumMapper* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_PropertyValueNameToEnumMapper_load_hangul_syllable_type_mv1_result;
+    icu4x_PropertyValueNameToEnumMapper_load_hangul_syllable_type_mv1_result icu4x_PropertyValueNameToEnumMapper_load_hangul_syllable_type_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_PropertyValueNameToEnumMapper_load_east_asian_width_mv1_result {union {icu4x::capi::PropertyValueNameToEnumMapper* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_PropertyValueNameToEnumMapper_load_east_asian_width_mv1_result;
+    icu4x_PropertyValueNameToEnumMapper_load_east_asian_width_mv1_result icu4x_PropertyValueNameToEnumMapper_load_east_asian_width_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_PropertyValueNameToEnumMapper_load_bidi_class_mv1_result {union {icu4x::capi::PropertyValueNameToEnumMapper* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_PropertyValueNameToEnumMapper_load_bidi_class_mv1_result;
+    icu4x_PropertyValueNameToEnumMapper_load_bidi_class_mv1_result icu4x_PropertyValueNameToEnumMapper_load_bidi_class_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_PropertyValueNameToEnumMapper_load_indic_syllabic_category_mv1_result {union {icu4x::capi::PropertyValueNameToEnumMapper* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_PropertyValueNameToEnumMapper_load_indic_syllabic_category_mv1_result;
+    icu4x_PropertyValueNameToEnumMapper_load_indic_syllabic_category_mv1_result icu4x_PropertyValueNameToEnumMapper_load_indic_syllabic_category_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_PropertyValueNameToEnumMapper_load_line_break_mv1_result {union {icu4x::capi::PropertyValueNameToEnumMapper* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_PropertyValueNameToEnumMapper_load_line_break_mv1_result;
+    icu4x_PropertyValueNameToEnumMapper_load_line_break_mv1_result icu4x_PropertyValueNameToEnumMapper_load_line_break_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_PropertyValueNameToEnumMapper_load_grapheme_cluster_break_mv1_result {union {icu4x::capi::PropertyValueNameToEnumMapper* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_PropertyValueNameToEnumMapper_load_grapheme_cluster_break_mv1_result;
+    icu4x_PropertyValueNameToEnumMapper_load_grapheme_cluster_break_mv1_result icu4x_PropertyValueNameToEnumMapper_load_grapheme_cluster_break_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_PropertyValueNameToEnumMapper_load_word_break_mv1_result {union {icu4x::capi::PropertyValueNameToEnumMapper* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_PropertyValueNameToEnumMapper_load_word_break_mv1_result;
+    icu4x_PropertyValueNameToEnumMapper_load_word_break_mv1_result icu4x_PropertyValueNameToEnumMapper_load_word_break_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_PropertyValueNameToEnumMapper_load_sentence_break_mv1_result {union {icu4x::capi::PropertyValueNameToEnumMapper* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_PropertyValueNameToEnumMapper_load_sentence_break_mv1_result;
+    icu4x_PropertyValueNameToEnumMapper_load_sentence_break_mv1_result icu4x_PropertyValueNameToEnumMapper_load_sentence_break_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_PropertyValueNameToEnumMapper_load_script_mv1_result {union {icu4x::capi::PropertyValueNameToEnumMapper* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_PropertyValueNameToEnumMapper_load_script_mv1_result;
+    icu4x_PropertyValueNameToEnumMapper_load_script_mv1_result icu4x_PropertyValueNameToEnumMapper_load_script_mv1(const icu4x::capi::DataProvider* provider);
+    
+    
+    void icu4x_PropertyValueNameToEnumMapper_destroy_mv1(PropertyValueNameToEnumMapper* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline int16_t icu4x::PropertyValueNameToEnumMapper::get_strict(std::string_view name) const {
+  auto result = icu4x::capi::icu4x_PropertyValueNameToEnumMapper_get_strict_mv1(this->AsFFI(),
+    name.data(),
+    name.size());
+  return result;
+}
+
+inline int16_t icu4x::PropertyValueNameToEnumMapper::get_loose(std::string_view name) const {
+  auto result = icu4x::capi::icu4x_PropertyValueNameToEnumMapper_get_loose_mv1(this->AsFFI(),
+    name.data(),
+    name.size());
+  return result;
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError> icu4x::PropertyValueNameToEnumMapper::load_general_category(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_PropertyValueNameToEnumMapper_load_general_category_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>>(std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>(icu4x::PropertyValueNameToEnumMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError> icu4x::PropertyValueNameToEnumMapper::load_hangul_syllable_type(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_PropertyValueNameToEnumMapper_load_hangul_syllable_type_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>>(std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>(icu4x::PropertyValueNameToEnumMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError> icu4x::PropertyValueNameToEnumMapper::load_east_asian_width(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_PropertyValueNameToEnumMapper_load_east_asian_width_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>>(std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>(icu4x::PropertyValueNameToEnumMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError> icu4x::PropertyValueNameToEnumMapper::load_bidi_class(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_PropertyValueNameToEnumMapper_load_bidi_class_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>>(std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>(icu4x::PropertyValueNameToEnumMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError> icu4x::PropertyValueNameToEnumMapper::load_indic_syllabic_category(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_PropertyValueNameToEnumMapper_load_indic_syllabic_category_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>>(std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>(icu4x::PropertyValueNameToEnumMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError> icu4x::PropertyValueNameToEnumMapper::load_line_break(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_PropertyValueNameToEnumMapper_load_line_break_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>>(std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>(icu4x::PropertyValueNameToEnumMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError> icu4x::PropertyValueNameToEnumMapper::load_grapheme_cluster_break(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_PropertyValueNameToEnumMapper_load_grapheme_cluster_break_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>>(std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>(icu4x::PropertyValueNameToEnumMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError> icu4x::PropertyValueNameToEnumMapper::load_word_break(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_PropertyValueNameToEnumMapper_load_word_break_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>>(std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>(icu4x::PropertyValueNameToEnumMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError> icu4x::PropertyValueNameToEnumMapper::load_sentence_break(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_PropertyValueNameToEnumMapper_load_sentence_break_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>>(std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>(icu4x::PropertyValueNameToEnumMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError> icu4x::PropertyValueNameToEnumMapper::load_script(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_PropertyValueNameToEnumMapper_load_script_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>>(std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>(icu4x::PropertyValueNameToEnumMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::PropertyValueNameToEnumMapper>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline const icu4x::capi::PropertyValueNameToEnumMapper* icu4x::PropertyValueNameToEnumMapper::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::PropertyValueNameToEnumMapper*>(this);
+}
+
+inline icu4x::capi::PropertyValueNameToEnumMapper* icu4x::PropertyValueNameToEnumMapper::AsFFI() {
+  return reinterpret_cast<icu4x::capi::PropertyValueNameToEnumMapper*>(this);
+}
+
+inline const icu4x::PropertyValueNameToEnumMapper* icu4x::PropertyValueNameToEnumMapper::FromFFI(const icu4x::capi::PropertyValueNameToEnumMapper* ptr) {
+  return reinterpret_cast<const icu4x::PropertyValueNameToEnumMapper*>(ptr);
+}
+
+inline icu4x::PropertyValueNameToEnumMapper* icu4x::PropertyValueNameToEnumMapper::FromFFI(icu4x::capi::PropertyValueNameToEnumMapper* ptr) {
+  return reinterpret_cast<icu4x::PropertyValueNameToEnumMapper*>(ptr);
+}
+
+inline void icu4x::PropertyValueNameToEnumMapper::operator delete(void* ptr) {
+  icu4x::capi::icu4x_PropertyValueNameToEnumMapper_destroy_mv1(reinterpret_cast<icu4x::capi::PropertyValueNameToEnumMapper*>(ptr));
+}
+
+
+#endif // icu4x_PropertyValueNameToEnumMapper_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/RegionDisplayNames.d.hpp b/ffi/capi/bindings/cpp/icu4x/RegionDisplayNames.d.hpp
new file mode 100644
index 00000000000..f102af2ff89
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/RegionDisplayNames.d.hpp
@@ -0,0 +1,53 @@
+#ifndef icu4x_RegionDisplayNames_D_HPP
+#define icu4x_RegionDisplayNames_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct Locale; }
+class Locale;
+namespace capi { struct RegionDisplayNames; }
+class RegionDisplayNames;
+class DataError;
+class LocaleParseError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct RegionDisplayNames;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class RegionDisplayNames {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::RegionDisplayNames>, icu4x::DataError> create(const icu4x::DataProvider& provider, const icu4x::Locale& locale);
+
+  inline diplomat::result<std::string, icu4x::LocaleParseError> of(std::string_view region) const;
+
+  inline const icu4x::capi::RegionDisplayNames* AsFFI() const;
+  inline icu4x::capi::RegionDisplayNames* AsFFI();
+  inline static const icu4x::RegionDisplayNames* FromFFI(const icu4x::capi::RegionDisplayNames* ptr);
+  inline static icu4x::RegionDisplayNames* FromFFI(icu4x::capi::RegionDisplayNames* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  RegionDisplayNames() = delete;
+  RegionDisplayNames(const icu4x::RegionDisplayNames&) = delete;
+  RegionDisplayNames(icu4x::RegionDisplayNames&&) noexcept = delete;
+  RegionDisplayNames operator=(const icu4x::RegionDisplayNames&) = delete;
+  RegionDisplayNames operator=(icu4x::RegionDisplayNames&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_RegionDisplayNames_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/RegionDisplayNames.hpp b/ffi/capi/bindings/cpp/icu4x/RegionDisplayNames.hpp
new file mode 100644
index 00000000000..968c961f972
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/RegionDisplayNames.hpp
@@ -0,0 +1,73 @@
+#ifndef icu4x_RegionDisplayNames_HPP
+#define icu4x_RegionDisplayNames_HPP
+
+#include "RegionDisplayNames.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "Locale.hpp"
+#include "LocaleParseError.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_RegionDisplayNames_create_mv1_result {union {icu4x::capi::RegionDisplayNames* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_RegionDisplayNames_create_mv1_result;
+    icu4x_RegionDisplayNames_create_mv1_result icu4x_RegionDisplayNames_create_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale);
+    
+    typedef struct icu4x_RegionDisplayNames_of_mv1_result {union { icu4x::capi::LocaleParseError err;}; bool is_ok;} icu4x_RegionDisplayNames_of_mv1_result;
+    icu4x_RegionDisplayNames_of_mv1_result icu4x_RegionDisplayNames_of_mv1(const icu4x::capi::RegionDisplayNames* self, const char* region_data, size_t region_len, diplomat::capi::DiplomatWrite* write);
+    
+    
+    void icu4x_RegionDisplayNames_destroy_mv1(RegionDisplayNames* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::RegionDisplayNames>, icu4x::DataError> icu4x::RegionDisplayNames::create(const icu4x::DataProvider& provider, const icu4x::Locale& locale) {
+  auto result = icu4x::capi::icu4x_RegionDisplayNames_create_mv1(provider.AsFFI(),
+    locale.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::RegionDisplayNames>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::RegionDisplayNames>>(std::unique_ptr<icu4x::RegionDisplayNames>(icu4x::RegionDisplayNames::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::RegionDisplayNames>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::string, icu4x::LocaleParseError> icu4x::RegionDisplayNames::of(std::string_view region) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_RegionDisplayNames_of_mv1(this->AsFFI(),
+    region.data(),
+    region.size(),
+    &write);
+  return result.is_ok ? diplomat::result<std::string, icu4x::LocaleParseError>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, icu4x::LocaleParseError>(diplomat::Err<icu4x::LocaleParseError>(icu4x::LocaleParseError::FromFFI(result.err)));
+}
+
+inline const icu4x::capi::RegionDisplayNames* icu4x::RegionDisplayNames::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::RegionDisplayNames*>(this);
+}
+
+inline icu4x::capi::RegionDisplayNames* icu4x::RegionDisplayNames::AsFFI() {
+  return reinterpret_cast<icu4x::capi::RegionDisplayNames*>(this);
+}
+
+inline const icu4x::RegionDisplayNames* icu4x::RegionDisplayNames::FromFFI(const icu4x::capi::RegionDisplayNames* ptr) {
+  return reinterpret_cast<const icu4x::RegionDisplayNames*>(ptr);
+}
+
+inline icu4x::RegionDisplayNames* icu4x::RegionDisplayNames::FromFFI(icu4x::capi::RegionDisplayNames* ptr) {
+  return reinterpret_cast<icu4x::RegionDisplayNames*>(ptr);
+}
+
+inline void icu4x::RegionDisplayNames::operator delete(void* ptr) {
+  icu4x::capi::icu4x_RegionDisplayNames_destroy_mv1(reinterpret_cast<icu4x::capi::RegionDisplayNames*>(ptr));
+}
+
+
+#endif // icu4x_RegionDisplayNames_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/ReorderedIndexMap.d.hpp b/ffi/capi/bindings/cpp/icu4x/ReorderedIndexMap.d.hpp
new file mode 100644
index 00000000000..f3e2ba2ee25
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/ReorderedIndexMap.d.hpp
@@ -0,0 +1,46 @@
+#ifndef icu4x_ReorderedIndexMap_D_HPP
+#define icu4x_ReorderedIndexMap_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    struct ReorderedIndexMap;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class ReorderedIndexMap {
+public:
+
+  inline diplomat::span<const size_t> as_slice() const;
+
+  inline size_t len() const;
+
+  inline bool is_empty() const;
+
+  inline size_t get(size_t index) const;
+
+  inline const icu4x::capi::ReorderedIndexMap* AsFFI() const;
+  inline icu4x::capi::ReorderedIndexMap* AsFFI();
+  inline static const icu4x::ReorderedIndexMap* FromFFI(const icu4x::capi::ReorderedIndexMap* ptr);
+  inline static icu4x::ReorderedIndexMap* FromFFI(icu4x::capi::ReorderedIndexMap* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  ReorderedIndexMap() = delete;
+  ReorderedIndexMap(const icu4x::ReorderedIndexMap&) = delete;
+  ReorderedIndexMap(icu4x::ReorderedIndexMap&&) noexcept = delete;
+  ReorderedIndexMap operator=(const icu4x::ReorderedIndexMap&) = delete;
+  ReorderedIndexMap operator=(icu4x::ReorderedIndexMap&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_ReorderedIndexMap_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/ReorderedIndexMap.hpp b/ffi/capi/bindings/cpp/icu4x/ReorderedIndexMap.hpp
new file mode 100644
index 00000000000..204659ea380
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/ReorderedIndexMap.hpp
@@ -0,0 +1,76 @@
+#ifndef icu4x_ReorderedIndexMap_HPP
+#define icu4x_ReorderedIndexMap_HPP
+
+#include "ReorderedIndexMap.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    diplomat::capi::DiplomatUsizeView icu4x_ReorderedIndexMap_as_slice_mv1(const icu4x::capi::ReorderedIndexMap* self);
+    
+    size_t icu4x_ReorderedIndexMap_len_mv1(const icu4x::capi::ReorderedIndexMap* self);
+    
+    bool icu4x_ReorderedIndexMap_is_empty_mv1(const icu4x::capi::ReorderedIndexMap* self);
+    
+    size_t icu4x_ReorderedIndexMap_get_mv1(const icu4x::capi::ReorderedIndexMap* self, size_t index);
+    
+    
+    void icu4x_ReorderedIndexMap_destroy_mv1(ReorderedIndexMap* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::span<const size_t> icu4x::ReorderedIndexMap::as_slice() const {
+  auto result = icu4x::capi::icu4x_ReorderedIndexMap_as_slice_mv1(this->AsFFI());
+  return diplomat::span<const size_t>(result.data, result.len);
+}
+
+inline size_t icu4x::ReorderedIndexMap::len() const {
+  auto result = icu4x::capi::icu4x_ReorderedIndexMap_len_mv1(this->AsFFI());
+  return result;
+}
+
+inline bool icu4x::ReorderedIndexMap::is_empty() const {
+  auto result = icu4x::capi::icu4x_ReorderedIndexMap_is_empty_mv1(this->AsFFI());
+  return result;
+}
+
+inline size_t icu4x::ReorderedIndexMap::get(size_t index) const {
+  auto result = icu4x::capi::icu4x_ReorderedIndexMap_get_mv1(this->AsFFI(),
+    index);
+  return result;
+}
+
+inline const icu4x::capi::ReorderedIndexMap* icu4x::ReorderedIndexMap::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::ReorderedIndexMap*>(this);
+}
+
+inline icu4x::capi::ReorderedIndexMap* icu4x::ReorderedIndexMap::AsFFI() {
+  return reinterpret_cast<icu4x::capi::ReorderedIndexMap*>(this);
+}
+
+inline const icu4x::ReorderedIndexMap* icu4x::ReorderedIndexMap::FromFFI(const icu4x::capi::ReorderedIndexMap* ptr) {
+  return reinterpret_cast<const icu4x::ReorderedIndexMap*>(ptr);
+}
+
+inline icu4x::ReorderedIndexMap* icu4x::ReorderedIndexMap::FromFFI(icu4x::capi::ReorderedIndexMap* ptr) {
+  return reinterpret_cast<icu4x::ReorderedIndexMap*>(ptr);
+}
+
+inline void icu4x::ReorderedIndexMap::operator delete(void* ptr) {
+  icu4x::capi::icu4x_ReorderedIndexMap_destroy_mv1(reinterpret_cast<icu4x::capi::ReorderedIndexMap*>(ptr));
+}
+
+
+#endif // icu4x_ReorderedIndexMap_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/ScriptExtensionsSet.d.hpp b/ffi/capi/bindings/cpp/icu4x/ScriptExtensionsSet.d.hpp
new file mode 100644
index 00000000000..df82726c6a6
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/ScriptExtensionsSet.d.hpp
@@ -0,0 +1,44 @@
+#ifndef icu4x_ScriptExtensionsSet_D_HPP
+#define icu4x_ScriptExtensionsSet_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    struct ScriptExtensionsSet;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class ScriptExtensionsSet {
+public:
+
+  inline bool contains(uint16_t script) const;
+
+  inline size_t count() const;
+
+  inline std::optional<uint16_t> script_at(size_t index) const;
+
+  inline const icu4x::capi::ScriptExtensionsSet* AsFFI() const;
+  inline icu4x::capi::ScriptExtensionsSet* AsFFI();
+  inline static const icu4x::ScriptExtensionsSet* FromFFI(const icu4x::capi::ScriptExtensionsSet* ptr);
+  inline static icu4x::ScriptExtensionsSet* FromFFI(icu4x::capi::ScriptExtensionsSet* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  ScriptExtensionsSet() = delete;
+  ScriptExtensionsSet(const icu4x::ScriptExtensionsSet&) = delete;
+  ScriptExtensionsSet(icu4x::ScriptExtensionsSet&&) noexcept = delete;
+  ScriptExtensionsSet operator=(const icu4x::ScriptExtensionsSet&) = delete;
+  ScriptExtensionsSet operator=(icu4x::ScriptExtensionsSet&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_ScriptExtensionsSet_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/ScriptExtensionsSet.hpp b/ffi/capi/bindings/cpp/icu4x/ScriptExtensionsSet.hpp
new file mode 100644
index 00000000000..b9d921b9030
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/ScriptExtensionsSet.hpp
@@ -0,0 +1,71 @@
+#ifndef icu4x_ScriptExtensionsSet_HPP
+#define icu4x_ScriptExtensionsSet_HPP
+
+#include "ScriptExtensionsSet.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    bool icu4x_ScriptExtensionsSet_contains_mv1(const icu4x::capi::ScriptExtensionsSet* self, uint16_t script);
+    
+    size_t icu4x_ScriptExtensionsSet_count_mv1(const icu4x::capi::ScriptExtensionsSet* self);
+    
+    typedef struct icu4x_ScriptExtensionsSet_script_at_mv1_result {union {uint16_t ok; }; bool is_ok;} icu4x_ScriptExtensionsSet_script_at_mv1_result;
+    icu4x_ScriptExtensionsSet_script_at_mv1_result icu4x_ScriptExtensionsSet_script_at_mv1(const icu4x::capi::ScriptExtensionsSet* self, size_t index);
+    
+    
+    void icu4x_ScriptExtensionsSet_destroy_mv1(ScriptExtensionsSet* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline bool icu4x::ScriptExtensionsSet::contains(uint16_t script) const {
+  auto result = icu4x::capi::icu4x_ScriptExtensionsSet_contains_mv1(this->AsFFI(),
+    script);
+  return result;
+}
+
+inline size_t icu4x::ScriptExtensionsSet::count() const {
+  auto result = icu4x::capi::icu4x_ScriptExtensionsSet_count_mv1(this->AsFFI());
+  return result;
+}
+
+inline std::optional<uint16_t> icu4x::ScriptExtensionsSet::script_at(size_t index) const {
+  auto result = icu4x::capi::icu4x_ScriptExtensionsSet_script_at_mv1(this->AsFFI(),
+    index);
+  return result.is_ok ? std::optional<uint16_t>(result.ok) : std::nullopt;
+}
+
+inline const icu4x::capi::ScriptExtensionsSet* icu4x::ScriptExtensionsSet::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::ScriptExtensionsSet*>(this);
+}
+
+inline icu4x::capi::ScriptExtensionsSet* icu4x::ScriptExtensionsSet::AsFFI() {
+  return reinterpret_cast<icu4x::capi::ScriptExtensionsSet*>(this);
+}
+
+inline const icu4x::ScriptExtensionsSet* icu4x::ScriptExtensionsSet::FromFFI(const icu4x::capi::ScriptExtensionsSet* ptr) {
+  return reinterpret_cast<const icu4x::ScriptExtensionsSet*>(ptr);
+}
+
+inline icu4x::ScriptExtensionsSet* icu4x::ScriptExtensionsSet::FromFFI(icu4x::capi::ScriptExtensionsSet* ptr) {
+  return reinterpret_cast<icu4x::ScriptExtensionsSet*>(ptr);
+}
+
+inline void icu4x::ScriptExtensionsSet::operator delete(void* ptr) {
+  icu4x::capi::icu4x_ScriptExtensionsSet_destroy_mv1(reinterpret_cast<icu4x::capi::ScriptExtensionsSet*>(ptr));
+}
+
+
+#endif // icu4x_ScriptExtensionsSet_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/ScriptWithExtensions.d.hpp b/ffi/capi/bindings/cpp/icu4x/ScriptWithExtensions.d.hpp
new file mode 100644
index 00000000000..1d47a2674cc
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/ScriptWithExtensions.d.hpp
@@ -0,0 +1,60 @@
+#ifndef icu4x_ScriptWithExtensions_D_HPP
+#define icu4x_ScriptWithExtensions_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct CodePointRangeIterator; }
+class CodePointRangeIterator;
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct ScriptWithExtensions; }
+class ScriptWithExtensions;
+namespace capi { struct ScriptWithExtensionsBorrowed; }
+class ScriptWithExtensionsBorrowed;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct ScriptWithExtensions;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class ScriptWithExtensions {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::ScriptWithExtensions>, icu4x::DataError> create(const icu4x::DataProvider& provider);
+
+  inline uint16_t get_script_val(uint32_t code_point) const;
+
+  inline bool has_script(uint32_t code_point, uint16_t script) const;
+
+  inline std::unique_ptr<icu4x::ScriptWithExtensionsBorrowed> as_borrowed() const;
+
+  inline std::unique_ptr<icu4x::CodePointRangeIterator> iter_ranges_for_script(uint16_t script) const;
+
+  inline const icu4x::capi::ScriptWithExtensions* AsFFI() const;
+  inline icu4x::capi::ScriptWithExtensions* AsFFI();
+  inline static const icu4x::ScriptWithExtensions* FromFFI(const icu4x::capi::ScriptWithExtensions* ptr);
+  inline static icu4x::ScriptWithExtensions* FromFFI(icu4x::capi::ScriptWithExtensions* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  ScriptWithExtensions() = delete;
+  ScriptWithExtensions(const icu4x::ScriptWithExtensions&) = delete;
+  ScriptWithExtensions(icu4x::ScriptWithExtensions&&) noexcept = delete;
+  ScriptWithExtensions operator=(const icu4x::ScriptWithExtensions&) = delete;
+  ScriptWithExtensions operator=(icu4x::ScriptWithExtensions&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_ScriptWithExtensions_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/ScriptWithExtensions.hpp b/ffi/capi/bindings/cpp/icu4x/ScriptWithExtensions.hpp
new file mode 100644
index 00000000000..58809683839
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/ScriptWithExtensions.hpp
@@ -0,0 +1,91 @@
+#ifndef icu4x_ScriptWithExtensions_HPP
+#define icu4x_ScriptWithExtensions_HPP
+
+#include "ScriptWithExtensions.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "CodePointRangeIterator.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "ScriptWithExtensionsBorrowed.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_ScriptWithExtensions_create_mv1_result {union {icu4x::capi::ScriptWithExtensions* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_ScriptWithExtensions_create_mv1_result;
+    icu4x_ScriptWithExtensions_create_mv1_result icu4x_ScriptWithExtensions_create_mv1(const icu4x::capi::DataProvider* provider);
+    
+    uint16_t icu4x_ScriptWithExtensions_get_script_val_mv1(const icu4x::capi::ScriptWithExtensions* self, uint32_t code_point);
+    
+    bool icu4x_ScriptWithExtensions_has_script_mv1(const icu4x::capi::ScriptWithExtensions* self, uint32_t code_point, uint16_t script);
+    
+    icu4x::capi::ScriptWithExtensionsBorrowed* icu4x_ScriptWithExtensions_as_borrowed_mv1(const icu4x::capi::ScriptWithExtensions* self);
+    
+    icu4x::capi::CodePointRangeIterator* icu4x_ScriptWithExtensions_iter_ranges_for_script_mv1(const icu4x::capi::ScriptWithExtensions* self, uint16_t script);
+    
+    
+    void icu4x_ScriptWithExtensions_destroy_mv1(ScriptWithExtensions* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::ScriptWithExtensions>, icu4x::DataError> icu4x::ScriptWithExtensions::create(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_ScriptWithExtensions_create_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::ScriptWithExtensions>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::ScriptWithExtensions>>(std::unique_ptr<icu4x::ScriptWithExtensions>(icu4x::ScriptWithExtensions::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::ScriptWithExtensions>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline uint16_t icu4x::ScriptWithExtensions::get_script_val(uint32_t code_point) const {
+  auto result = icu4x::capi::icu4x_ScriptWithExtensions_get_script_val_mv1(this->AsFFI(),
+    code_point);
+  return result;
+}
+
+inline bool icu4x::ScriptWithExtensions::has_script(uint32_t code_point, uint16_t script) const {
+  auto result = icu4x::capi::icu4x_ScriptWithExtensions_has_script_mv1(this->AsFFI(),
+    code_point,
+    script);
+  return result;
+}
+
+inline std::unique_ptr<icu4x::ScriptWithExtensionsBorrowed> icu4x::ScriptWithExtensions::as_borrowed() const {
+  auto result = icu4x::capi::icu4x_ScriptWithExtensions_as_borrowed_mv1(this->AsFFI());
+  return std::unique_ptr<icu4x::ScriptWithExtensionsBorrowed>(icu4x::ScriptWithExtensionsBorrowed::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::CodePointRangeIterator> icu4x::ScriptWithExtensions::iter_ranges_for_script(uint16_t script) const {
+  auto result = icu4x::capi::icu4x_ScriptWithExtensions_iter_ranges_for_script_mv1(this->AsFFI(),
+    script);
+  return std::unique_ptr<icu4x::CodePointRangeIterator>(icu4x::CodePointRangeIterator::FromFFI(result));
+}
+
+inline const icu4x::capi::ScriptWithExtensions* icu4x::ScriptWithExtensions::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::ScriptWithExtensions*>(this);
+}
+
+inline icu4x::capi::ScriptWithExtensions* icu4x::ScriptWithExtensions::AsFFI() {
+  return reinterpret_cast<icu4x::capi::ScriptWithExtensions*>(this);
+}
+
+inline const icu4x::ScriptWithExtensions* icu4x::ScriptWithExtensions::FromFFI(const icu4x::capi::ScriptWithExtensions* ptr) {
+  return reinterpret_cast<const icu4x::ScriptWithExtensions*>(ptr);
+}
+
+inline icu4x::ScriptWithExtensions* icu4x::ScriptWithExtensions::FromFFI(icu4x::capi::ScriptWithExtensions* ptr) {
+  return reinterpret_cast<icu4x::ScriptWithExtensions*>(ptr);
+}
+
+inline void icu4x::ScriptWithExtensions::operator delete(void* ptr) {
+  icu4x::capi::icu4x_ScriptWithExtensions_destroy_mv1(reinterpret_cast<icu4x::capi::ScriptWithExtensions*>(ptr));
+}
+
+
+#endif // icu4x_ScriptWithExtensions_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/ScriptWithExtensionsBorrowed.d.hpp b/ffi/capi/bindings/cpp/icu4x/ScriptWithExtensionsBorrowed.d.hpp
new file mode 100644
index 00000000000..9ebe66fb85a
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/ScriptWithExtensionsBorrowed.d.hpp
@@ -0,0 +1,53 @@
+#ifndef icu4x_ScriptWithExtensionsBorrowed_D_HPP
+#define icu4x_ScriptWithExtensionsBorrowed_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct CodePointSetData; }
+class CodePointSetData;
+namespace capi { struct ScriptExtensionsSet; }
+class ScriptExtensionsSet;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct ScriptWithExtensionsBorrowed;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class ScriptWithExtensionsBorrowed {
+public:
+
+  inline uint16_t get_script_val(uint32_t code_point) const;
+
+  inline std::unique_ptr<icu4x::ScriptExtensionsSet> get_script_extensions_val(uint32_t code_point) const;
+
+  inline bool has_script(uint32_t code_point, uint16_t script) const;
+
+  inline std::unique_ptr<icu4x::CodePointSetData> get_script_extensions_set(uint16_t script) const;
+
+  inline const icu4x::capi::ScriptWithExtensionsBorrowed* AsFFI() const;
+  inline icu4x::capi::ScriptWithExtensionsBorrowed* AsFFI();
+  inline static const icu4x::ScriptWithExtensionsBorrowed* FromFFI(const icu4x::capi::ScriptWithExtensionsBorrowed* ptr);
+  inline static icu4x::ScriptWithExtensionsBorrowed* FromFFI(icu4x::capi::ScriptWithExtensionsBorrowed* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  ScriptWithExtensionsBorrowed() = delete;
+  ScriptWithExtensionsBorrowed(const icu4x::ScriptWithExtensionsBorrowed&) = delete;
+  ScriptWithExtensionsBorrowed(icu4x::ScriptWithExtensionsBorrowed&&) noexcept = delete;
+  ScriptWithExtensionsBorrowed operator=(const icu4x::ScriptWithExtensionsBorrowed&) = delete;
+  ScriptWithExtensionsBorrowed operator=(icu4x::ScriptWithExtensionsBorrowed&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_ScriptWithExtensionsBorrowed_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/ScriptWithExtensionsBorrowed.hpp b/ffi/capi/bindings/cpp/icu4x/ScriptWithExtensionsBorrowed.hpp
new file mode 100644
index 00000000000..fedcbd49f43
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/ScriptWithExtensionsBorrowed.hpp
@@ -0,0 +1,82 @@
+#ifndef icu4x_ScriptWithExtensionsBorrowed_HPP
+#define icu4x_ScriptWithExtensionsBorrowed_HPP
+
+#include "ScriptWithExtensionsBorrowed.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "CodePointSetData.hpp"
+#include "ScriptExtensionsSet.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    uint16_t icu4x_ScriptWithExtensionsBorrowed_get_script_val_mv1(const icu4x::capi::ScriptWithExtensionsBorrowed* self, uint32_t code_point);
+    
+    icu4x::capi::ScriptExtensionsSet* icu4x_ScriptWithExtensionsBorrowed_get_script_extensions_val_mv1(const icu4x::capi::ScriptWithExtensionsBorrowed* self, uint32_t code_point);
+    
+    bool icu4x_ScriptWithExtensionsBorrowed_has_script_mv1(const icu4x::capi::ScriptWithExtensionsBorrowed* self, uint32_t code_point, uint16_t script);
+    
+    icu4x::capi::CodePointSetData* icu4x_ScriptWithExtensionsBorrowed_get_script_extensions_set_mv1(const icu4x::capi::ScriptWithExtensionsBorrowed* self, uint16_t script);
+    
+    
+    void icu4x_ScriptWithExtensionsBorrowed_destroy_mv1(ScriptWithExtensionsBorrowed* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline uint16_t icu4x::ScriptWithExtensionsBorrowed::get_script_val(uint32_t code_point) const {
+  auto result = icu4x::capi::icu4x_ScriptWithExtensionsBorrowed_get_script_val_mv1(this->AsFFI(),
+    code_point);
+  return result;
+}
+
+inline std::unique_ptr<icu4x::ScriptExtensionsSet> icu4x::ScriptWithExtensionsBorrowed::get_script_extensions_val(uint32_t code_point) const {
+  auto result = icu4x::capi::icu4x_ScriptWithExtensionsBorrowed_get_script_extensions_val_mv1(this->AsFFI(),
+    code_point);
+  return std::unique_ptr<icu4x::ScriptExtensionsSet>(icu4x::ScriptExtensionsSet::FromFFI(result));
+}
+
+inline bool icu4x::ScriptWithExtensionsBorrowed::has_script(uint32_t code_point, uint16_t script) const {
+  auto result = icu4x::capi::icu4x_ScriptWithExtensionsBorrowed_has_script_mv1(this->AsFFI(),
+    code_point,
+    script);
+  return result;
+}
+
+inline std::unique_ptr<icu4x::CodePointSetData> icu4x::ScriptWithExtensionsBorrowed::get_script_extensions_set(uint16_t script) const {
+  auto result = icu4x::capi::icu4x_ScriptWithExtensionsBorrowed_get_script_extensions_set_mv1(this->AsFFI(),
+    script);
+  return std::unique_ptr<icu4x::CodePointSetData>(icu4x::CodePointSetData::FromFFI(result));
+}
+
+inline const icu4x::capi::ScriptWithExtensionsBorrowed* icu4x::ScriptWithExtensionsBorrowed::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::ScriptWithExtensionsBorrowed*>(this);
+}
+
+inline icu4x::capi::ScriptWithExtensionsBorrowed* icu4x::ScriptWithExtensionsBorrowed::AsFFI() {
+  return reinterpret_cast<icu4x::capi::ScriptWithExtensionsBorrowed*>(this);
+}
+
+inline const icu4x::ScriptWithExtensionsBorrowed* icu4x::ScriptWithExtensionsBorrowed::FromFFI(const icu4x::capi::ScriptWithExtensionsBorrowed* ptr) {
+  return reinterpret_cast<const icu4x::ScriptWithExtensionsBorrowed*>(ptr);
+}
+
+inline icu4x::ScriptWithExtensionsBorrowed* icu4x::ScriptWithExtensionsBorrowed::FromFFI(icu4x::capi::ScriptWithExtensionsBorrowed* ptr) {
+  return reinterpret_cast<icu4x::ScriptWithExtensionsBorrowed*>(ptr);
+}
+
+inline void icu4x::ScriptWithExtensionsBorrowed::operator delete(void* ptr) {
+  icu4x::capi::icu4x_ScriptWithExtensionsBorrowed_destroy_mv1(reinterpret_cast<icu4x::capi::ScriptWithExtensionsBorrowed*>(ptr));
+}
+
+
+#endif // icu4x_ScriptWithExtensionsBorrowed_HPP
diff --git a/ffi/capi/bindings/cpp/SegmenterWordType.d.hpp b/ffi/capi/bindings/cpp/icu4x/SegmenterWordType.d.hpp
similarity index 68%
rename from ffi/capi/bindings/cpp/SegmenterWordType.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/SegmenterWordType.d.hpp
index 803a2392784..566fb55f30e 100644
--- a/ffi/capi/bindings/cpp/SegmenterWordType.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/SegmenterWordType.d.hpp
@@ -1,5 +1,5 @@
-#ifndef SegmenterWordType_D_HPP
-#define SegmenterWordType_D_HPP
+#ifndef icu4x_SegmenterWordType_D_HPP
+#define icu4x_SegmenterWordType_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum SegmenterWordType {
       SegmenterWordType_None = 0,
@@ -20,6 +20,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class SegmenterWordType {
 public:
   enum Value {
@@ -37,11 +38,11 @@ class SegmenterWordType {
 
   inline bool is_word_like();
 
-  inline diplomat::capi::SegmenterWordType AsFFI() const;
-  inline static SegmenterWordType FromFFI(diplomat::capi::SegmenterWordType c_enum);
+  inline icu4x::capi::SegmenterWordType AsFFI() const;
+  inline static icu4x::SegmenterWordType FromFFI(icu4x::capi::SegmenterWordType c_enum);
 private:
     Value value;
 };
 
-
-#endif // SegmenterWordType_D_HPP
+} // namespace
+#endif // icu4x_SegmenterWordType_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/SegmenterWordType.hpp b/ffi/capi/bindings/cpp/icu4x/SegmenterWordType.hpp
new file mode 100644
index 00000000000..d1fb76afc31
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/SegmenterWordType.hpp
@@ -0,0 +1,45 @@
+#ifndef icu4x_SegmenterWordType_HPP
+#define icu4x_SegmenterWordType_HPP
+
+#include "SegmenterWordType.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    bool icu4x_SegmenterWordType_is_word_like_mv1(icu4x::capi::SegmenterWordType self);
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::SegmenterWordType icu4x::SegmenterWordType::AsFFI() const {
+  return static_cast<icu4x::capi::SegmenterWordType>(value);
+}
+
+inline icu4x::SegmenterWordType icu4x::SegmenterWordType::FromFFI(icu4x::capi::SegmenterWordType c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::SegmenterWordType_None:
+    case icu4x::capi::SegmenterWordType_Number:
+    case icu4x::capi::SegmenterWordType_Letter:
+      return static_cast<icu4x::SegmenterWordType::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+
+inline bool icu4x::SegmenterWordType::is_word_like() {
+  auto result = icu4x::capi::icu4x_SegmenterWordType_is_word_like_mv1(this->AsFFI());
+  return result;
+}
+#endif // icu4x_SegmenterWordType_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorLatin1.d.hpp b/ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorLatin1.d.hpp
new file mode 100644
index 00000000000..471660636a0
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorLatin1.d.hpp
@@ -0,0 +1,40 @@
+#ifndef icu4x_SentenceBreakIteratorLatin1_D_HPP
+#define icu4x_SentenceBreakIteratorLatin1_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    struct SentenceBreakIteratorLatin1;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class SentenceBreakIteratorLatin1 {
+public:
+
+  inline int32_t next();
+
+  inline const icu4x::capi::SentenceBreakIteratorLatin1* AsFFI() const;
+  inline icu4x::capi::SentenceBreakIteratorLatin1* AsFFI();
+  inline static const icu4x::SentenceBreakIteratorLatin1* FromFFI(const icu4x::capi::SentenceBreakIteratorLatin1* ptr);
+  inline static icu4x::SentenceBreakIteratorLatin1* FromFFI(icu4x::capi::SentenceBreakIteratorLatin1* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  SentenceBreakIteratorLatin1() = delete;
+  SentenceBreakIteratorLatin1(const icu4x::SentenceBreakIteratorLatin1&) = delete;
+  SentenceBreakIteratorLatin1(icu4x::SentenceBreakIteratorLatin1&&) noexcept = delete;
+  SentenceBreakIteratorLatin1 operator=(const icu4x::SentenceBreakIteratorLatin1&) = delete;
+  SentenceBreakIteratorLatin1 operator=(icu4x::SentenceBreakIteratorLatin1&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_SentenceBreakIteratorLatin1_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorLatin1.hpp b/ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorLatin1.hpp
new file mode 100644
index 00000000000..2da8cde9f2e
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorLatin1.hpp
@@ -0,0 +1,54 @@
+#ifndef icu4x_SentenceBreakIteratorLatin1_HPP
+#define icu4x_SentenceBreakIteratorLatin1_HPP
+
+#include "SentenceBreakIteratorLatin1.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    int32_t icu4x_SentenceBreakIteratorLatin1_next_mv1(icu4x::capi::SentenceBreakIteratorLatin1* self);
+    
+    
+    void icu4x_SentenceBreakIteratorLatin1_destroy_mv1(SentenceBreakIteratorLatin1* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline int32_t icu4x::SentenceBreakIteratorLatin1::next() {
+  auto result = icu4x::capi::icu4x_SentenceBreakIteratorLatin1_next_mv1(this->AsFFI());
+  return result;
+}
+
+inline const icu4x::capi::SentenceBreakIteratorLatin1* icu4x::SentenceBreakIteratorLatin1::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::SentenceBreakIteratorLatin1*>(this);
+}
+
+inline icu4x::capi::SentenceBreakIteratorLatin1* icu4x::SentenceBreakIteratorLatin1::AsFFI() {
+  return reinterpret_cast<icu4x::capi::SentenceBreakIteratorLatin1*>(this);
+}
+
+inline const icu4x::SentenceBreakIteratorLatin1* icu4x::SentenceBreakIteratorLatin1::FromFFI(const icu4x::capi::SentenceBreakIteratorLatin1* ptr) {
+  return reinterpret_cast<const icu4x::SentenceBreakIteratorLatin1*>(ptr);
+}
+
+inline icu4x::SentenceBreakIteratorLatin1* icu4x::SentenceBreakIteratorLatin1::FromFFI(icu4x::capi::SentenceBreakIteratorLatin1* ptr) {
+  return reinterpret_cast<icu4x::SentenceBreakIteratorLatin1*>(ptr);
+}
+
+inline void icu4x::SentenceBreakIteratorLatin1::operator delete(void* ptr) {
+  icu4x::capi::icu4x_SentenceBreakIteratorLatin1_destroy_mv1(reinterpret_cast<icu4x::capi::SentenceBreakIteratorLatin1*>(ptr));
+}
+
+
+#endif // icu4x_SentenceBreakIteratorLatin1_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorUtf16.d.hpp b/ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorUtf16.d.hpp
new file mode 100644
index 00000000000..5f5eb1fca2a
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorUtf16.d.hpp
@@ -0,0 +1,40 @@
+#ifndef icu4x_SentenceBreakIteratorUtf16_D_HPP
+#define icu4x_SentenceBreakIteratorUtf16_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    struct SentenceBreakIteratorUtf16;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class SentenceBreakIteratorUtf16 {
+public:
+
+  inline int32_t next();
+
+  inline const icu4x::capi::SentenceBreakIteratorUtf16* AsFFI() const;
+  inline icu4x::capi::SentenceBreakIteratorUtf16* AsFFI();
+  inline static const icu4x::SentenceBreakIteratorUtf16* FromFFI(const icu4x::capi::SentenceBreakIteratorUtf16* ptr);
+  inline static icu4x::SentenceBreakIteratorUtf16* FromFFI(icu4x::capi::SentenceBreakIteratorUtf16* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  SentenceBreakIteratorUtf16() = delete;
+  SentenceBreakIteratorUtf16(const icu4x::SentenceBreakIteratorUtf16&) = delete;
+  SentenceBreakIteratorUtf16(icu4x::SentenceBreakIteratorUtf16&&) noexcept = delete;
+  SentenceBreakIteratorUtf16 operator=(const icu4x::SentenceBreakIteratorUtf16&) = delete;
+  SentenceBreakIteratorUtf16 operator=(icu4x::SentenceBreakIteratorUtf16&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_SentenceBreakIteratorUtf16_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorUtf16.hpp b/ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorUtf16.hpp
new file mode 100644
index 00000000000..0c98be62fb9
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorUtf16.hpp
@@ -0,0 +1,54 @@
+#ifndef icu4x_SentenceBreakIteratorUtf16_HPP
+#define icu4x_SentenceBreakIteratorUtf16_HPP
+
+#include "SentenceBreakIteratorUtf16.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    int32_t icu4x_SentenceBreakIteratorUtf16_next_mv1(icu4x::capi::SentenceBreakIteratorUtf16* self);
+    
+    
+    void icu4x_SentenceBreakIteratorUtf16_destroy_mv1(SentenceBreakIteratorUtf16* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline int32_t icu4x::SentenceBreakIteratorUtf16::next() {
+  auto result = icu4x::capi::icu4x_SentenceBreakIteratorUtf16_next_mv1(this->AsFFI());
+  return result;
+}
+
+inline const icu4x::capi::SentenceBreakIteratorUtf16* icu4x::SentenceBreakIteratorUtf16::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::SentenceBreakIteratorUtf16*>(this);
+}
+
+inline icu4x::capi::SentenceBreakIteratorUtf16* icu4x::SentenceBreakIteratorUtf16::AsFFI() {
+  return reinterpret_cast<icu4x::capi::SentenceBreakIteratorUtf16*>(this);
+}
+
+inline const icu4x::SentenceBreakIteratorUtf16* icu4x::SentenceBreakIteratorUtf16::FromFFI(const icu4x::capi::SentenceBreakIteratorUtf16* ptr) {
+  return reinterpret_cast<const icu4x::SentenceBreakIteratorUtf16*>(ptr);
+}
+
+inline icu4x::SentenceBreakIteratorUtf16* icu4x::SentenceBreakIteratorUtf16::FromFFI(icu4x::capi::SentenceBreakIteratorUtf16* ptr) {
+  return reinterpret_cast<icu4x::SentenceBreakIteratorUtf16*>(ptr);
+}
+
+inline void icu4x::SentenceBreakIteratorUtf16::operator delete(void* ptr) {
+  icu4x::capi::icu4x_SentenceBreakIteratorUtf16_destroy_mv1(reinterpret_cast<icu4x::capi::SentenceBreakIteratorUtf16*>(ptr));
+}
+
+
+#endif // icu4x_SentenceBreakIteratorUtf16_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorUtf8.d.hpp b/ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorUtf8.d.hpp
new file mode 100644
index 00000000000..36eb329f8f2
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorUtf8.d.hpp
@@ -0,0 +1,40 @@
+#ifndef icu4x_SentenceBreakIteratorUtf8_D_HPP
+#define icu4x_SentenceBreakIteratorUtf8_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    struct SentenceBreakIteratorUtf8;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class SentenceBreakIteratorUtf8 {
+public:
+
+  inline int32_t next();
+
+  inline const icu4x::capi::SentenceBreakIteratorUtf8* AsFFI() const;
+  inline icu4x::capi::SentenceBreakIteratorUtf8* AsFFI();
+  inline static const icu4x::SentenceBreakIteratorUtf8* FromFFI(const icu4x::capi::SentenceBreakIteratorUtf8* ptr);
+  inline static icu4x::SentenceBreakIteratorUtf8* FromFFI(icu4x::capi::SentenceBreakIteratorUtf8* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  SentenceBreakIteratorUtf8() = delete;
+  SentenceBreakIteratorUtf8(const icu4x::SentenceBreakIteratorUtf8&) = delete;
+  SentenceBreakIteratorUtf8(icu4x::SentenceBreakIteratorUtf8&&) noexcept = delete;
+  SentenceBreakIteratorUtf8 operator=(const icu4x::SentenceBreakIteratorUtf8&) = delete;
+  SentenceBreakIteratorUtf8 operator=(icu4x::SentenceBreakIteratorUtf8&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_SentenceBreakIteratorUtf8_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorUtf8.hpp b/ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorUtf8.hpp
new file mode 100644
index 00000000000..d56b8324786
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/SentenceBreakIteratorUtf8.hpp
@@ -0,0 +1,54 @@
+#ifndef icu4x_SentenceBreakIteratorUtf8_HPP
+#define icu4x_SentenceBreakIteratorUtf8_HPP
+
+#include "SentenceBreakIteratorUtf8.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    int32_t icu4x_SentenceBreakIteratorUtf8_next_mv1(icu4x::capi::SentenceBreakIteratorUtf8* self);
+    
+    
+    void icu4x_SentenceBreakIteratorUtf8_destroy_mv1(SentenceBreakIteratorUtf8* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline int32_t icu4x::SentenceBreakIteratorUtf8::next() {
+  auto result = icu4x::capi::icu4x_SentenceBreakIteratorUtf8_next_mv1(this->AsFFI());
+  return result;
+}
+
+inline const icu4x::capi::SentenceBreakIteratorUtf8* icu4x::SentenceBreakIteratorUtf8::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::SentenceBreakIteratorUtf8*>(this);
+}
+
+inline icu4x::capi::SentenceBreakIteratorUtf8* icu4x::SentenceBreakIteratorUtf8::AsFFI() {
+  return reinterpret_cast<icu4x::capi::SentenceBreakIteratorUtf8*>(this);
+}
+
+inline const icu4x::SentenceBreakIteratorUtf8* icu4x::SentenceBreakIteratorUtf8::FromFFI(const icu4x::capi::SentenceBreakIteratorUtf8* ptr) {
+  return reinterpret_cast<const icu4x::SentenceBreakIteratorUtf8*>(ptr);
+}
+
+inline icu4x::SentenceBreakIteratorUtf8* icu4x::SentenceBreakIteratorUtf8::FromFFI(icu4x::capi::SentenceBreakIteratorUtf8* ptr) {
+  return reinterpret_cast<icu4x::SentenceBreakIteratorUtf8*>(ptr);
+}
+
+inline void icu4x::SentenceBreakIteratorUtf8::operator delete(void* ptr) {
+  icu4x::capi::icu4x_SentenceBreakIteratorUtf8_destroy_mv1(reinterpret_cast<icu4x::capi::SentenceBreakIteratorUtf8*>(ptr));
+}
+
+
+#endif // icu4x_SentenceBreakIteratorUtf8_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/SentenceSegmenter.d.hpp b/ffi/capi/bindings/cpp/icu4x/SentenceSegmenter.d.hpp
new file mode 100644
index 00000000000..2e736841eb5
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/SentenceSegmenter.d.hpp
@@ -0,0 +1,60 @@
+#ifndef icu4x_SentenceSegmenter_D_HPP
+#define icu4x_SentenceSegmenter_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct SentenceBreakIteratorLatin1; }
+class SentenceBreakIteratorLatin1;
+namespace capi { struct SentenceBreakIteratorUtf16; }
+class SentenceBreakIteratorUtf16;
+namespace capi { struct SentenceBreakIteratorUtf8; }
+class SentenceBreakIteratorUtf8;
+namespace capi { struct SentenceSegmenter; }
+class SentenceSegmenter;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct SentenceSegmenter;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class SentenceSegmenter {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::SentenceSegmenter>, icu4x::DataError> create(const icu4x::DataProvider& provider);
+
+  inline std::unique_ptr<icu4x::SentenceBreakIteratorUtf8> segment(std::string_view input) const;
+
+  inline std::unique_ptr<icu4x::SentenceBreakIteratorUtf16> segment16(std::u16string_view input) const;
+
+  inline std::unique_ptr<icu4x::SentenceBreakIteratorLatin1> segment_latin1(diplomat::span<const uint8_t> input) const;
+
+  inline const icu4x::capi::SentenceSegmenter* AsFFI() const;
+  inline icu4x::capi::SentenceSegmenter* AsFFI();
+  inline static const icu4x::SentenceSegmenter* FromFFI(const icu4x::capi::SentenceSegmenter* ptr);
+  inline static icu4x::SentenceSegmenter* FromFFI(icu4x::capi::SentenceSegmenter* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  SentenceSegmenter() = delete;
+  SentenceSegmenter(const icu4x::SentenceSegmenter&) = delete;
+  SentenceSegmenter(icu4x::SentenceSegmenter&&) noexcept = delete;
+  SentenceSegmenter operator=(const icu4x::SentenceSegmenter&) = delete;
+  SentenceSegmenter operator=(icu4x::SentenceSegmenter&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_SentenceSegmenter_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/SentenceSegmenter.hpp b/ffi/capi/bindings/cpp/icu4x/SentenceSegmenter.hpp
new file mode 100644
index 00000000000..6d373d0d803
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/SentenceSegmenter.hpp
@@ -0,0 +1,87 @@
+#ifndef icu4x_SentenceSegmenter_HPP
+#define icu4x_SentenceSegmenter_HPP
+
+#include "SentenceSegmenter.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "SentenceBreakIteratorLatin1.hpp"
+#include "SentenceBreakIteratorUtf16.hpp"
+#include "SentenceBreakIteratorUtf8.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_SentenceSegmenter_create_mv1_result {union {icu4x::capi::SentenceSegmenter* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_SentenceSegmenter_create_mv1_result;
+    icu4x_SentenceSegmenter_create_mv1_result icu4x_SentenceSegmenter_create_mv1(const icu4x::capi::DataProvider* provider);
+    
+    icu4x::capi::SentenceBreakIteratorUtf8* icu4x_SentenceSegmenter_segment_utf8_mv1(const icu4x::capi::SentenceSegmenter* self, const char* input_data, size_t input_len);
+    
+    icu4x::capi::SentenceBreakIteratorUtf16* icu4x_SentenceSegmenter_segment_utf16_mv1(const icu4x::capi::SentenceSegmenter* self, const char16_t* input_data, size_t input_len);
+    
+    icu4x::capi::SentenceBreakIteratorLatin1* icu4x_SentenceSegmenter_segment_latin1_mv1(const icu4x::capi::SentenceSegmenter* self, const uint8_t* input_data, size_t input_len);
+    
+    
+    void icu4x_SentenceSegmenter_destroy_mv1(SentenceSegmenter* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::SentenceSegmenter>, icu4x::DataError> icu4x::SentenceSegmenter::create(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_SentenceSegmenter_create_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::SentenceSegmenter>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::SentenceSegmenter>>(std::unique_ptr<icu4x::SentenceSegmenter>(icu4x::SentenceSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::SentenceSegmenter>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline std::unique_ptr<icu4x::SentenceBreakIteratorUtf8> icu4x::SentenceSegmenter::segment(std::string_view input) const {
+  auto result = icu4x::capi::icu4x_SentenceSegmenter_segment_utf8_mv1(this->AsFFI(),
+    input.data(),
+    input.size());
+  return std::unique_ptr<icu4x::SentenceBreakIteratorUtf8>(icu4x::SentenceBreakIteratorUtf8::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::SentenceBreakIteratorUtf16> icu4x::SentenceSegmenter::segment16(std::u16string_view input) const {
+  auto result = icu4x::capi::icu4x_SentenceSegmenter_segment_utf16_mv1(this->AsFFI(),
+    input.data(),
+    input.size());
+  return std::unique_ptr<icu4x::SentenceBreakIteratorUtf16>(icu4x::SentenceBreakIteratorUtf16::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::SentenceBreakIteratorLatin1> icu4x::SentenceSegmenter::segment_latin1(diplomat::span<const uint8_t> input) const {
+  auto result = icu4x::capi::icu4x_SentenceSegmenter_segment_latin1_mv1(this->AsFFI(),
+    input.data(),
+    input.size());
+  return std::unique_ptr<icu4x::SentenceBreakIteratorLatin1>(icu4x::SentenceBreakIteratorLatin1::FromFFI(result));
+}
+
+inline const icu4x::capi::SentenceSegmenter* icu4x::SentenceSegmenter::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::SentenceSegmenter*>(this);
+}
+
+inline icu4x::capi::SentenceSegmenter* icu4x::SentenceSegmenter::AsFFI() {
+  return reinterpret_cast<icu4x::capi::SentenceSegmenter*>(this);
+}
+
+inline const icu4x::SentenceSegmenter* icu4x::SentenceSegmenter::FromFFI(const icu4x::capi::SentenceSegmenter* ptr) {
+  return reinterpret_cast<const icu4x::SentenceSegmenter*>(ptr);
+}
+
+inline icu4x::SentenceSegmenter* icu4x::SentenceSegmenter::FromFFI(icu4x::capi::SentenceSegmenter* ptr) {
+  return reinterpret_cast<icu4x::SentenceSegmenter*>(ptr);
+}
+
+inline void icu4x::SentenceSegmenter::operator delete(void* ptr) {
+  icu4x::capi::icu4x_SentenceSegmenter_destroy_mv1(reinterpret_cast<icu4x::capi::SentenceSegmenter*>(ptr));
+}
+
+
+#endif // icu4x_SentenceSegmenter_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/Time.d.hpp b/ffi/capi/bindings/cpp/icu4x/Time.d.hpp
new file mode 100644
index 00000000000..aea1146c1a5
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/Time.d.hpp
@@ -0,0 +1,59 @@
+#ifndef icu4x_Time_D_HPP
+#define icu4x_Time_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct Time; }
+class Time;
+class CalendarError;
+class CalendarParseError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct Time;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class Time {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::Time>, icu4x::CalendarError> create(uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::Time>, icu4x::CalendarParseError> from_string(std::string_view v);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::Time>, icu4x::CalendarError> midnight();
+
+  inline uint8_t hour() const;
+
+  inline uint8_t minute() const;
+
+  inline uint8_t second() const;
+
+  inline uint32_t nanosecond() const;
+
+  inline const icu4x::capi::Time* AsFFI() const;
+  inline icu4x::capi::Time* AsFFI();
+  inline static const icu4x::Time* FromFFI(const icu4x::capi::Time* ptr);
+  inline static icu4x::Time* FromFFI(icu4x::capi::Time* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  Time() = delete;
+  Time(const icu4x::Time&) = delete;
+  Time(icu4x::Time&&) noexcept = delete;
+  Time operator=(const icu4x::Time&) = delete;
+  Time operator=(icu4x::Time&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_Time_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/Time.hpp b/ffi/capi/bindings/cpp/icu4x/Time.hpp
new file mode 100644
index 00000000000..423005b3a5c
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/Time.hpp
@@ -0,0 +1,105 @@
+#ifndef icu4x_Time_HPP
+#define icu4x_Time_HPP
+
+#include "Time.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "CalendarError.hpp"
+#include "CalendarParseError.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_Time_create_mv1_result {union {icu4x::capi::Time* ok; icu4x::capi::CalendarError err;}; bool is_ok;} icu4x_Time_create_mv1_result;
+    icu4x_Time_create_mv1_result icu4x_Time_create_mv1(uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond);
+    
+    typedef struct icu4x_Time_from_string_mv1_result {union {icu4x::capi::Time* ok; icu4x::capi::CalendarParseError err;}; bool is_ok;} icu4x_Time_from_string_mv1_result;
+    icu4x_Time_from_string_mv1_result icu4x_Time_from_string_mv1(const char* v_data, size_t v_len);
+    
+    typedef struct icu4x_Time_midnight_mv1_result {union {icu4x::capi::Time* ok; icu4x::capi::CalendarError err;}; bool is_ok;} icu4x_Time_midnight_mv1_result;
+    icu4x_Time_midnight_mv1_result icu4x_Time_midnight_mv1(void);
+    
+    uint8_t icu4x_Time_hour_mv1(const icu4x::capi::Time* self);
+    
+    uint8_t icu4x_Time_minute_mv1(const icu4x::capi::Time* self);
+    
+    uint8_t icu4x_Time_second_mv1(const icu4x::capi::Time* self);
+    
+    uint32_t icu4x_Time_nanosecond_mv1(const icu4x::capi::Time* self);
+    
+    
+    void icu4x_Time_destroy_mv1(Time* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::Time>, icu4x::CalendarError> icu4x::Time::create(uint8_t hour, uint8_t minute, uint8_t second, uint32_t nanosecond) {
+  auto result = icu4x::capi::icu4x_Time_create_mv1(hour,
+    minute,
+    second,
+    nanosecond);
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::Time>, icu4x::CalendarError>(diplomat::Ok<std::unique_ptr<icu4x::Time>>(std::unique_ptr<icu4x::Time>(icu4x::Time::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::Time>, icu4x::CalendarError>(diplomat::Err<icu4x::CalendarError>(icu4x::CalendarError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::Time>, icu4x::CalendarParseError> icu4x::Time::from_string(std::string_view v) {
+  auto result = icu4x::capi::icu4x_Time_from_string_mv1(v.data(),
+    v.size());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::Time>, icu4x::CalendarParseError>(diplomat::Ok<std::unique_ptr<icu4x::Time>>(std::unique_ptr<icu4x::Time>(icu4x::Time::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::Time>, icu4x::CalendarParseError>(diplomat::Err<icu4x::CalendarParseError>(icu4x::CalendarParseError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::Time>, icu4x::CalendarError> icu4x::Time::midnight() {
+  auto result = icu4x::capi::icu4x_Time_midnight_mv1();
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::Time>, icu4x::CalendarError>(diplomat::Ok<std::unique_ptr<icu4x::Time>>(std::unique_ptr<icu4x::Time>(icu4x::Time::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::Time>, icu4x::CalendarError>(diplomat::Err<icu4x::CalendarError>(icu4x::CalendarError::FromFFI(result.err)));
+}
+
+inline uint8_t icu4x::Time::hour() const {
+  auto result = icu4x::capi::icu4x_Time_hour_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint8_t icu4x::Time::minute() const {
+  auto result = icu4x::capi::icu4x_Time_minute_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint8_t icu4x::Time::second() const {
+  auto result = icu4x::capi::icu4x_Time_second_mv1(this->AsFFI());
+  return result;
+}
+
+inline uint32_t icu4x::Time::nanosecond() const {
+  auto result = icu4x::capi::icu4x_Time_nanosecond_mv1(this->AsFFI());
+  return result;
+}
+
+inline const icu4x::capi::Time* icu4x::Time::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::Time*>(this);
+}
+
+inline icu4x::capi::Time* icu4x::Time::AsFFI() {
+  return reinterpret_cast<icu4x::capi::Time*>(this);
+}
+
+inline const icu4x::Time* icu4x::Time::FromFFI(const icu4x::capi::Time* ptr) {
+  return reinterpret_cast<const icu4x::Time*>(ptr);
+}
+
+inline icu4x::Time* icu4x::Time::FromFFI(icu4x::capi::Time* ptr) {
+  return reinterpret_cast<icu4x::Time*>(ptr);
+}
+
+inline void icu4x::Time::operator delete(void* ptr) {
+  icu4x::capi::icu4x_Time_destroy_mv1(reinterpret_cast<icu4x::capi::Time*>(ptr));
+}
+
+
+#endif // icu4x_Time_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/TimeFormatter.d.hpp b/ffi/capi/bindings/cpp/icu4x/TimeFormatter.d.hpp
new file mode 100644
index 00000000000..c400dea94d6
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/TimeFormatter.d.hpp
@@ -0,0 +1,63 @@
+#ifndef icu4x_TimeFormatter_D_HPP
+#define icu4x_TimeFormatter_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct DateTime; }
+class DateTime;
+namespace capi { struct IsoDateTime; }
+class IsoDateTime;
+namespace capi { struct Locale; }
+class Locale;
+namespace capi { struct Time; }
+class Time;
+namespace capi { struct TimeFormatter; }
+class TimeFormatter;
+class Error;
+class TimeLength;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct TimeFormatter;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class TimeFormatter {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::TimeFormatter>, icu4x::Error> create_with_length(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::TimeLength length);
+
+  inline std::string format_time(const icu4x::Time& value) const;
+
+  inline std::string format_datetime(const icu4x::DateTime& value) const;
+
+  inline std::string format_iso_datetime(const icu4x::IsoDateTime& value) const;
+
+  inline const icu4x::capi::TimeFormatter* AsFFI() const;
+  inline icu4x::capi::TimeFormatter* AsFFI();
+  inline static const icu4x::TimeFormatter* FromFFI(const icu4x::capi::TimeFormatter* ptr);
+  inline static icu4x::TimeFormatter* FromFFI(icu4x::capi::TimeFormatter* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  TimeFormatter() = delete;
+  TimeFormatter(const icu4x::TimeFormatter&) = delete;
+  TimeFormatter(icu4x::TimeFormatter&&) noexcept = delete;
+  TimeFormatter operator=(const icu4x::TimeFormatter&) = delete;
+  TimeFormatter operator=(icu4x::TimeFormatter&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_TimeFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/TimeFormatter.hpp b/ffi/capi/bindings/cpp/icu4x/TimeFormatter.hpp
new file mode 100644
index 00000000000..038c15dbd19
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/TimeFormatter.hpp
@@ -0,0 +1,97 @@
+#ifndef icu4x_TimeFormatter_HPP
+#define icu4x_TimeFormatter_HPP
+
+#include "TimeFormatter.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataProvider.hpp"
+#include "DateTime.hpp"
+#include "Error.hpp"
+#include "IsoDateTime.hpp"
+#include "Locale.hpp"
+#include "Time.hpp"
+#include "TimeLength.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_TimeFormatter_create_with_length_mv1_result {union {icu4x::capi::TimeFormatter* ok; icu4x::capi::Error err;}; bool is_ok;} icu4x_TimeFormatter_create_with_length_mv1_result;
+    icu4x_TimeFormatter_create_with_length_mv1_result icu4x_TimeFormatter_create_with_length_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale, icu4x::capi::TimeLength length);
+    
+    void icu4x_TimeFormatter_format_time_mv1(const icu4x::capi::TimeFormatter* self, const icu4x::capi::Time* value, diplomat::capi::DiplomatWrite* write);
+    
+    void icu4x_TimeFormatter_format_datetime_mv1(const icu4x::capi::TimeFormatter* self, const icu4x::capi::DateTime* value, diplomat::capi::DiplomatWrite* write);
+    
+    void icu4x_TimeFormatter_format_iso_datetime_mv1(const icu4x::capi::TimeFormatter* self, const icu4x::capi::IsoDateTime* value, diplomat::capi::DiplomatWrite* write);
+    
+    
+    void icu4x_TimeFormatter_destroy_mv1(TimeFormatter* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::TimeFormatter>, icu4x::Error> icu4x::TimeFormatter::create_with_length(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::TimeLength length) {
+  auto result = icu4x::capi::icu4x_TimeFormatter_create_with_length_mv1(provider.AsFFI(),
+    locale.AsFFI(),
+    length.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::TimeFormatter>, icu4x::Error>(diplomat::Ok<std::unique_ptr<icu4x::TimeFormatter>>(std::unique_ptr<icu4x::TimeFormatter>(icu4x::TimeFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::TimeFormatter>, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline std::string icu4x::TimeFormatter::format_time(const icu4x::Time& value) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_TimeFormatter_format_time_mv1(this->AsFFI(),
+    value.AsFFI(),
+    &write);
+  return output;
+}
+
+inline std::string icu4x::TimeFormatter::format_datetime(const icu4x::DateTime& value) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_TimeFormatter_format_datetime_mv1(this->AsFFI(),
+    value.AsFFI(),
+    &write);
+  return output;
+}
+
+inline std::string icu4x::TimeFormatter::format_iso_datetime(const icu4x::IsoDateTime& value) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_TimeFormatter_format_iso_datetime_mv1(this->AsFFI(),
+    value.AsFFI(),
+    &write);
+  return output;
+}
+
+inline const icu4x::capi::TimeFormatter* icu4x::TimeFormatter::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::TimeFormatter*>(this);
+}
+
+inline icu4x::capi::TimeFormatter* icu4x::TimeFormatter::AsFFI() {
+  return reinterpret_cast<icu4x::capi::TimeFormatter*>(this);
+}
+
+inline const icu4x::TimeFormatter* icu4x::TimeFormatter::FromFFI(const icu4x::capi::TimeFormatter* ptr) {
+  return reinterpret_cast<const icu4x::TimeFormatter*>(ptr);
+}
+
+inline icu4x::TimeFormatter* icu4x::TimeFormatter::FromFFI(icu4x::capi::TimeFormatter* ptr) {
+  return reinterpret_cast<icu4x::TimeFormatter*>(ptr);
+}
+
+inline void icu4x::TimeFormatter::operator delete(void* ptr) {
+  icu4x::capi::icu4x_TimeFormatter_destroy_mv1(reinterpret_cast<icu4x::capi::TimeFormatter*>(ptr));
+}
+
+
+#endif // icu4x_TimeFormatter_HPP
diff --git a/ffi/capi/bindings/cpp/TimeLength.d.hpp b/ffi/capi/bindings/cpp/icu4x/TimeLength.d.hpp
similarity index 69%
rename from ffi/capi/bindings/cpp/TimeLength.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/TimeLength.d.hpp
index 9325ff8843a..6136848150e 100644
--- a/ffi/capi/bindings/cpp/TimeLength.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/TimeLength.d.hpp
@@ -1,5 +1,5 @@
-#ifndef TimeLength_D_HPP
-#define TimeLength_D_HPP
+#ifndef icu4x_TimeLength_D_HPP
+#define icu4x_TimeLength_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum TimeLength {
       TimeLength_Full = 0,
@@ -21,6 +21,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class TimeLength {
 public:
   enum Value {
@@ -37,11 +38,11 @@ class TimeLength {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::TimeLength AsFFI() const;
-  inline static TimeLength FromFFI(diplomat::capi::TimeLength c_enum);
+  inline icu4x::capi::TimeLength AsFFI() const;
+  inline static icu4x::TimeLength FromFFI(icu4x::capi::TimeLength c_enum);
 private:
     Value value;
 };
 
-
-#endif // TimeLength_D_HPP
+} // namespace
+#endif // icu4x_TimeLength_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/TimeLength.hpp b/ffi/capi/bindings/cpp/icu4x/TimeLength.hpp
new file mode 100644
index 00000000000..f1635eb7c7f
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/TimeLength.hpp
@@ -0,0 +1,39 @@
+#ifndef icu4x_TimeLength_HPP
+#define icu4x_TimeLength_HPP
+
+#include "TimeLength.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::TimeLength icu4x::TimeLength::AsFFI() const {
+  return static_cast<icu4x::capi::TimeLength>(value);
+}
+
+inline icu4x::TimeLength icu4x::TimeLength::FromFFI(icu4x::capi::TimeLength c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::TimeLength_Full:
+    case icu4x::capi::TimeLength_Long:
+    case icu4x::capi::TimeLength_Medium:
+    case icu4x::capi::TimeLength_Short:
+      return static_cast<icu4x::TimeLength::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_TimeLength_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/TimeZoneFormatter.d.hpp b/ffi/capi/bindings/cpp/icu4x/TimeZoneFormatter.d.hpp
new file mode 100644
index 00000000000..2f705bd9bf7
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/TimeZoneFormatter.d.hpp
@@ -0,0 +1,73 @@
+#ifndef icu4x_TimeZoneFormatter_D_HPP
+#define icu4x_TimeZoneFormatter_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct CustomTimeZone; }
+class CustomTimeZone;
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct Locale; }
+class Locale;
+namespace capi { struct TimeZoneFormatter; }
+class TimeZoneFormatter;
+struct IsoTimeZoneOptions;
+class Error;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct TimeZoneFormatter;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class TimeZoneFormatter {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::TimeZoneFormatter>, icu4x::Error> create_with_localized_gmt_fallback(const icu4x::DataProvider& provider, const icu4x::Locale& locale);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::TimeZoneFormatter>, icu4x::Error> create_with_iso_8601_fallback(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::IsoTimeZoneOptions options);
+
+  inline diplomat::result<std::monostate, icu4x::Error> load_generic_non_location_long(const icu4x::DataProvider& provider);
+
+  inline diplomat::result<std::monostate, icu4x::Error> load_generic_non_location_short(const icu4x::DataProvider& provider);
+
+  inline diplomat::result<std::monostate, icu4x::Error> load_specific_non_location_long(const icu4x::DataProvider& provider);
+
+  inline diplomat::result<std::monostate, icu4x::Error> load_specific_non_location_short(const icu4x::DataProvider& provider);
+
+  inline diplomat::result<std::monostate, icu4x::Error> load_generic_location_format(const icu4x::DataProvider& provider);
+
+  inline diplomat::result<std::monostate, icu4x::Error> include_localized_gmt_format();
+
+  inline diplomat::result<std::monostate, icu4x::Error> load_iso_8601_format(icu4x::IsoTimeZoneOptions options);
+
+  inline std::string format_custom_time_zone(const icu4x::CustomTimeZone& value) const;
+
+  inline diplomat::result<std::string, icu4x::Error> format_custom_time_zone_no_fallback(const icu4x::CustomTimeZone& value) const;
+
+  inline const icu4x::capi::TimeZoneFormatter* AsFFI() const;
+  inline icu4x::capi::TimeZoneFormatter* AsFFI();
+  inline static const icu4x::TimeZoneFormatter* FromFFI(const icu4x::capi::TimeZoneFormatter* ptr);
+  inline static icu4x::TimeZoneFormatter* FromFFI(icu4x::capi::TimeZoneFormatter* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  TimeZoneFormatter() = delete;
+  TimeZoneFormatter(const icu4x::TimeZoneFormatter&) = delete;
+  TimeZoneFormatter(icu4x::TimeZoneFormatter&&) noexcept = delete;
+  TimeZoneFormatter operator=(const icu4x::TimeZoneFormatter&) = delete;
+  TimeZoneFormatter operator=(icu4x::TimeZoneFormatter&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_TimeZoneFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/TimeZoneFormatter.hpp b/ffi/capi/bindings/cpp/icu4x/TimeZoneFormatter.hpp
new file mode 100644
index 00000000000..733e9e2a6ed
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/TimeZoneFormatter.hpp
@@ -0,0 +1,156 @@
+#ifndef icu4x_TimeZoneFormatter_HPP
+#define icu4x_TimeZoneFormatter_HPP
+
+#include "TimeZoneFormatter.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "CustomTimeZone.hpp"
+#include "DataProvider.hpp"
+#include "Error.hpp"
+#include "IsoTimeZoneOptions.hpp"
+#include "Locale.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_TimeZoneFormatter_create_with_localized_gmt_fallback_mv1_result {union {icu4x::capi::TimeZoneFormatter* ok; icu4x::capi::Error err;}; bool is_ok;} icu4x_TimeZoneFormatter_create_with_localized_gmt_fallback_mv1_result;
+    icu4x_TimeZoneFormatter_create_with_localized_gmt_fallback_mv1_result icu4x_TimeZoneFormatter_create_with_localized_gmt_fallback_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale);
+    
+    typedef struct icu4x_TimeZoneFormatter_create_with_iso_8601_fallback_mv1_result {union {icu4x::capi::TimeZoneFormatter* ok; icu4x::capi::Error err;}; bool is_ok;} icu4x_TimeZoneFormatter_create_with_iso_8601_fallback_mv1_result;
+    icu4x_TimeZoneFormatter_create_with_iso_8601_fallback_mv1_result icu4x_TimeZoneFormatter_create_with_iso_8601_fallback_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale, icu4x::capi::IsoTimeZoneOptions options);
+    
+    typedef struct icu4x_TimeZoneFormatter_load_generic_non_location_long_mv1_result {union { icu4x::capi::Error err;}; bool is_ok;} icu4x_TimeZoneFormatter_load_generic_non_location_long_mv1_result;
+    icu4x_TimeZoneFormatter_load_generic_non_location_long_mv1_result icu4x_TimeZoneFormatter_load_generic_non_location_long_mv1(icu4x::capi::TimeZoneFormatter* self, const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_TimeZoneFormatter_load_generic_non_location_short_mv1_result {union { icu4x::capi::Error err;}; bool is_ok;} icu4x_TimeZoneFormatter_load_generic_non_location_short_mv1_result;
+    icu4x_TimeZoneFormatter_load_generic_non_location_short_mv1_result icu4x_TimeZoneFormatter_load_generic_non_location_short_mv1(icu4x::capi::TimeZoneFormatter* self, const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_TimeZoneFormatter_load_specific_non_location_long_mv1_result {union { icu4x::capi::Error err;}; bool is_ok;} icu4x_TimeZoneFormatter_load_specific_non_location_long_mv1_result;
+    icu4x_TimeZoneFormatter_load_specific_non_location_long_mv1_result icu4x_TimeZoneFormatter_load_specific_non_location_long_mv1(icu4x::capi::TimeZoneFormatter* self, const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_TimeZoneFormatter_load_specific_non_location_short_mv1_result {union { icu4x::capi::Error err;}; bool is_ok;} icu4x_TimeZoneFormatter_load_specific_non_location_short_mv1_result;
+    icu4x_TimeZoneFormatter_load_specific_non_location_short_mv1_result icu4x_TimeZoneFormatter_load_specific_non_location_short_mv1(icu4x::capi::TimeZoneFormatter* self, const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_TimeZoneFormatter_load_generic_location_format_mv1_result {union { icu4x::capi::Error err;}; bool is_ok;} icu4x_TimeZoneFormatter_load_generic_location_format_mv1_result;
+    icu4x_TimeZoneFormatter_load_generic_location_format_mv1_result icu4x_TimeZoneFormatter_load_generic_location_format_mv1(icu4x::capi::TimeZoneFormatter* self, const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_TimeZoneFormatter_include_localized_gmt_format_mv1_result {union { icu4x::capi::Error err;}; bool is_ok;} icu4x_TimeZoneFormatter_include_localized_gmt_format_mv1_result;
+    icu4x_TimeZoneFormatter_include_localized_gmt_format_mv1_result icu4x_TimeZoneFormatter_include_localized_gmt_format_mv1(icu4x::capi::TimeZoneFormatter* self);
+    
+    typedef struct icu4x_TimeZoneFormatter_load_iso_8601_format_mv1_result {union { icu4x::capi::Error err;}; bool is_ok;} icu4x_TimeZoneFormatter_load_iso_8601_format_mv1_result;
+    icu4x_TimeZoneFormatter_load_iso_8601_format_mv1_result icu4x_TimeZoneFormatter_load_iso_8601_format_mv1(icu4x::capi::TimeZoneFormatter* self, icu4x::capi::IsoTimeZoneOptions options);
+    
+    void icu4x_TimeZoneFormatter_format_custom_time_zone_mv1(const icu4x::capi::TimeZoneFormatter* self, const icu4x::capi::CustomTimeZone* value, diplomat::capi::DiplomatWrite* write);
+    
+    typedef struct icu4x_TimeZoneFormatter_format_custom_time_zone_no_fallback_mv1_result {union { icu4x::capi::Error err;}; bool is_ok;} icu4x_TimeZoneFormatter_format_custom_time_zone_no_fallback_mv1_result;
+    icu4x_TimeZoneFormatter_format_custom_time_zone_no_fallback_mv1_result icu4x_TimeZoneFormatter_format_custom_time_zone_no_fallback_mv1(const icu4x::capi::TimeZoneFormatter* self, const icu4x::capi::CustomTimeZone* value, diplomat::capi::DiplomatWrite* write);
+    
+    
+    void icu4x_TimeZoneFormatter_destroy_mv1(TimeZoneFormatter* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::TimeZoneFormatter>, icu4x::Error> icu4x::TimeZoneFormatter::create_with_localized_gmt_fallback(const icu4x::DataProvider& provider, const icu4x::Locale& locale) {
+  auto result = icu4x::capi::icu4x_TimeZoneFormatter_create_with_localized_gmt_fallback_mv1(provider.AsFFI(),
+    locale.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::TimeZoneFormatter>, icu4x::Error>(diplomat::Ok<std::unique_ptr<icu4x::TimeZoneFormatter>>(std::unique_ptr<icu4x::TimeZoneFormatter>(icu4x::TimeZoneFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::TimeZoneFormatter>, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::TimeZoneFormatter>, icu4x::Error> icu4x::TimeZoneFormatter::create_with_iso_8601_fallback(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::IsoTimeZoneOptions options) {
+  auto result = icu4x::capi::icu4x_TimeZoneFormatter_create_with_iso_8601_fallback_mv1(provider.AsFFI(),
+    locale.AsFFI(),
+    options.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::TimeZoneFormatter>, icu4x::Error>(diplomat::Ok<std::unique_ptr<icu4x::TimeZoneFormatter>>(std::unique_ptr<icu4x::TimeZoneFormatter>(icu4x::TimeZoneFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::TimeZoneFormatter>, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::monostate, icu4x::Error> icu4x::TimeZoneFormatter::load_generic_non_location_long(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_TimeZoneFormatter_load_generic_non_location_long_mv1(this->AsFFI(),
+    provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::monostate, icu4x::Error>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::monostate, icu4x::Error> icu4x::TimeZoneFormatter::load_generic_non_location_short(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_TimeZoneFormatter_load_generic_non_location_short_mv1(this->AsFFI(),
+    provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::monostate, icu4x::Error>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::monostate, icu4x::Error> icu4x::TimeZoneFormatter::load_specific_non_location_long(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_TimeZoneFormatter_load_specific_non_location_long_mv1(this->AsFFI(),
+    provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::monostate, icu4x::Error>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::monostate, icu4x::Error> icu4x::TimeZoneFormatter::load_specific_non_location_short(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_TimeZoneFormatter_load_specific_non_location_short_mv1(this->AsFFI(),
+    provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::monostate, icu4x::Error>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::monostate, icu4x::Error> icu4x::TimeZoneFormatter::load_generic_location_format(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_TimeZoneFormatter_load_generic_location_format_mv1(this->AsFFI(),
+    provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::monostate, icu4x::Error>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::monostate, icu4x::Error> icu4x::TimeZoneFormatter::include_localized_gmt_format() {
+  auto result = icu4x::capi::icu4x_TimeZoneFormatter_include_localized_gmt_format_mv1(this->AsFFI());
+  return result.is_ok ? diplomat::result<std::monostate, icu4x::Error>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::monostate, icu4x::Error> icu4x::TimeZoneFormatter::load_iso_8601_format(icu4x::IsoTimeZoneOptions options) {
+  auto result = icu4x::capi::icu4x_TimeZoneFormatter_load_iso_8601_format_mv1(this->AsFFI(),
+    options.AsFFI());
+  return result.is_ok ? diplomat::result<std::monostate, icu4x::Error>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline std::string icu4x::TimeZoneFormatter::format_custom_time_zone(const icu4x::CustomTimeZone& value) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_TimeZoneFormatter_format_custom_time_zone_mv1(this->AsFFI(),
+    value.AsFFI(),
+    &write);
+  return output;
+}
+
+inline diplomat::result<std::string, icu4x::Error> icu4x::TimeZoneFormatter::format_custom_time_zone_no_fallback(const icu4x::CustomTimeZone& value) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_TimeZoneFormatter_format_custom_time_zone_no_fallback_mv1(this->AsFFI(),
+    value.AsFFI(),
+    &write);
+  return result.is_ok ? diplomat::result<std::string, icu4x::Error>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline const icu4x::capi::TimeZoneFormatter* icu4x::TimeZoneFormatter::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::TimeZoneFormatter*>(this);
+}
+
+inline icu4x::capi::TimeZoneFormatter* icu4x::TimeZoneFormatter::AsFFI() {
+  return reinterpret_cast<icu4x::capi::TimeZoneFormatter*>(this);
+}
+
+inline const icu4x::TimeZoneFormatter* icu4x::TimeZoneFormatter::FromFFI(const icu4x::capi::TimeZoneFormatter* ptr) {
+  return reinterpret_cast<const icu4x::TimeZoneFormatter*>(ptr);
+}
+
+inline icu4x::TimeZoneFormatter* icu4x::TimeZoneFormatter::FromFFI(icu4x::capi::TimeZoneFormatter* ptr) {
+  return reinterpret_cast<icu4x::TimeZoneFormatter*>(ptr);
+}
+
+inline void icu4x::TimeZoneFormatter::operator delete(void* ptr) {
+  icu4x::capi::icu4x_TimeZoneFormatter_destroy_mv1(reinterpret_cast<icu4x::capi::TimeZoneFormatter*>(ptr));
+}
+
+
+#endif // icu4x_TimeZoneFormatter_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/TimeZoneIdMapper.d.hpp b/ffi/capi/bindings/cpp/icu4x/TimeZoneIdMapper.d.hpp
new file mode 100644
index 00000000000..5e79bfd417f
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/TimeZoneIdMapper.d.hpp
@@ -0,0 +1,57 @@
+#ifndef icu4x_TimeZoneIdMapper_D_HPP
+#define icu4x_TimeZoneIdMapper_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct TimeZoneIdMapper; }
+class TimeZoneIdMapper;
+struct TimeZoneInvalidIdError;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct TimeZoneIdMapper;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class TimeZoneIdMapper {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::TimeZoneIdMapper>, icu4x::DataError> create(const icu4x::DataProvider& provider);
+
+  inline diplomat::result<std::string, icu4x::TimeZoneInvalidIdError> iana_to_bcp47(std::string_view value) const;
+
+  inline diplomat::result<diplomat::result<std::string, icu4x::TimeZoneInvalidIdError>, diplomat::Utf8Error> normalize_iana(std::string_view value) const;
+
+  inline diplomat::result<diplomat::result<std::string, icu4x::TimeZoneInvalidIdError>, diplomat::Utf8Error> canonicalize_iana(std::string_view value) const;
+
+  inline diplomat::result<std::string, icu4x::TimeZoneInvalidIdError> find_canonical_iana_from_bcp47(std::string_view value) const;
+
+  inline const icu4x::capi::TimeZoneIdMapper* AsFFI() const;
+  inline icu4x::capi::TimeZoneIdMapper* AsFFI();
+  inline static const icu4x::TimeZoneIdMapper* FromFFI(const icu4x::capi::TimeZoneIdMapper* ptr);
+  inline static icu4x::TimeZoneIdMapper* FromFFI(icu4x::capi::TimeZoneIdMapper* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  TimeZoneIdMapper() = delete;
+  TimeZoneIdMapper(const icu4x::TimeZoneIdMapper&) = delete;
+  TimeZoneIdMapper(icu4x::TimeZoneIdMapper&&) noexcept = delete;
+  TimeZoneIdMapper operator=(const icu4x::TimeZoneIdMapper&) = delete;
+  TimeZoneIdMapper operator=(icu4x::TimeZoneIdMapper&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_TimeZoneIdMapper_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/TimeZoneIdMapper.hpp b/ffi/capi/bindings/cpp/icu4x/TimeZoneIdMapper.hpp
new file mode 100644
index 00000000000..2f41388ba29
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/TimeZoneIdMapper.hpp
@@ -0,0 +1,116 @@
+#ifndef icu4x_TimeZoneIdMapper_HPP
+#define icu4x_TimeZoneIdMapper_HPP
+
+#include "TimeZoneIdMapper.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "TimeZoneInvalidIdError.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_TimeZoneIdMapper_create_mv1_result {union {icu4x::capi::TimeZoneIdMapper* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_TimeZoneIdMapper_create_mv1_result;
+    icu4x_TimeZoneIdMapper_create_mv1_result icu4x_TimeZoneIdMapper_create_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_TimeZoneIdMapper_iana_to_bcp47_mv1_result { bool is_ok;} icu4x_TimeZoneIdMapper_iana_to_bcp47_mv1_result;
+    icu4x_TimeZoneIdMapper_iana_to_bcp47_mv1_result icu4x_TimeZoneIdMapper_iana_to_bcp47_mv1(const icu4x::capi::TimeZoneIdMapper* self, const char* value_data, size_t value_len, diplomat::capi::DiplomatWrite* write);
+    
+    typedef struct icu4x_TimeZoneIdMapper_normalize_iana_mv1_result { bool is_ok;} icu4x_TimeZoneIdMapper_normalize_iana_mv1_result;
+    icu4x_TimeZoneIdMapper_normalize_iana_mv1_result icu4x_TimeZoneIdMapper_normalize_iana_mv1(const icu4x::capi::TimeZoneIdMapper* self, const char* value_data, size_t value_len, diplomat::capi::DiplomatWrite* write);
+    
+    typedef struct icu4x_TimeZoneIdMapper_canonicalize_iana_mv1_result { bool is_ok;} icu4x_TimeZoneIdMapper_canonicalize_iana_mv1_result;
+    icu4x_TimeZoneIdMapper_canonicalize_iana_mv1_result icu4x_TimeZoneIdMapper_canonicalize_iana_mv1(const icu4x::capi::TimeZoneIdMapper* self, const char* value_data, size_t value_len, diplomat::capi::DiplomatWrite* write);
+    
+    typedef struct icu4x_TimeZoneIdMapper_find_canonical_iana_from_bcp47_mv1_result { bool is_ok;} icu4x_TimeZoneIdMapper_find_canonical_iana_from_bcp47_mv1_result;
+    icu4x_TimeZoneIdMapper_find_canonical_iana_from_bcp47_mv1_result icu4x_TimeZoneIdMapper_find_canonical_iana_from_bcp47_mv1(const icu4x::capi::TimeZoneIdMapper* self, const char* value_data, size_t value_len, diplomat::capi::DiplomatWrite* write);
+    
+    
+    void icu4x_TimeZoneIdMapper_destroy_mv1(TimeZoneIdMapper* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::TimeZoneIdMapper>, icu4x::DataError> icu4x::TimeZoneIdMapper::create(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_TimeZoneIdMapper_create_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::TimeZoneIdMapper>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::TimeZoneIdMapper>>(std::unique_ptr<icu4x::TimeZoneIdMapper>(icu4x::TimeZoneIdMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::TimeZoneIdMapper>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::string, icu4x::TimeZoneInvalidIdError> icu4x::TimeZoneIdMapper::iana_to_bcp47(std::string_view value) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_TimeZoneIdMapper_iana_to_bcp47_mv1(this->AsFFI(),
+    value.data(),
+    value.size(),
+    &write);
+  return result.is_ok ? diplomat::result<std::string, icu4x::TimeZoneInvalidIdError>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, icu4x::TimeZoneInvalidIdError>(diplomat::Err<icu4x::TimeZoneInvalidIdError>(icu4x::TimeZoneInvalidIdError {}));
+}
+
+inline diplomat::result<diplomat::result<std::string, icu4x::TimeZoneInvalidIdError>, diplomat::Utf8Error> icu4x::TimeZoneIdMapper::normalize_iana(std::string_view value) const {
+  if (!diplomat::capi::diplomat_is_str(value.data(), value.size())) {
+    return diplomat::Err<diplomat::Utf8Error>(diplomat::Utf8Error());
+  }
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_TimeZoneIdMapper_normalize_iana_mv1(this->AsFFI(),
+    value.data(),
+    value.size(),
+    &write);
+  return diplomat::Ok<diplomat::result<std::string, icu4x::TimeZoneInvalidIdError>>(result.is_ok ? diplomat::result<std::string, icu4x::TimeZoneInvalidIdError>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, icu4x::TimeZoneInvalidIdError>(diplomat::Err<icu4x::TimeZoneInvalidIdError>(icu4x::TimeZoneInvalidIdError {})));
+}
+
+inline diplomat::result<diplomat::result<std::string, icu4x::TimeZoneInvalidIdError>, diplomat::Utf8Error> icu4x::TimeZoneIdMapper::canonicalize_iana(std::string_view value) const {
+  if (!diplomat::capi::diplomat_is_str(value.data(), value.size())) {
+    return diplomat::Err<diplomat::Utf8Error>(diplomat::Utf8Error());
+  }
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_TimeZoneIdMapper_canonicalize_iana_mv1(this->AsFFI(),
+    value.data(),
+    value.size(),
+    &write);
+  return diplomat::Ok<diplomat::result<std::string, icu4x::TimeZoneInvalidIdError>>(result.is_ok ? diplomat::result<std::string, icu4x::TimeZoneInvalidIdError>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, icu4x::TimeZoneInvalidIdError>(diplomat::Err<icu4x::TimeZoneInvalidIdError>(icu4x::TimeZoneInvalidIdError {})));
+}
+
+inline diplomat::result<std::string, icu4x::TimeZoneInvalidIdError> icu4x::TimeZoneIdMapper::find_canonical_iana_from_bcp47(std::string_view value) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_TimeZoneIdMapper_find_canonical_iana_from_bcp47_mv1(this->AsFFI(),
+    value.data(),
+    value.size(),
+    &write);
+  return result.is_ok ? diplomat::result<std::string, icu4x::TimeZoneInvalidIdError>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, icu4x::TimeZoneInvalidIdError>(diplomat::Err<icu4x::TimeZoneInvalidIdError>(icu4x::TimeZoneInvalidIdError {}));
+}
+
+inline const icu4x::capi::TimeZoneIdMapper* icu4x::TimeZoneIdMapper::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::TimeZoneIdMapper*>(this);
+}
+
+inline icu4x::capi::TimeZoneIdMapper* icu4x::TimeZoneIdMapper::AsFFI() {
+  return reinterpret_cast<icu4x::capi::TimeZoneIdMapper*>(this);
+}
+
+inline const icu4x::TimeZoneIdMapper* icu4x::TimeZoneIdMapper::FromFFI(const icu4x::capi::TimeZoneIdMapper* ptr) {
+  return reinterpret_cast<const icu4x::TimeZoneIdMapper*>(ptr);
+}
+
+inline icu4x::TimeZoneIdMapper* icu4x::TimeZoneIdMapper::FromFFI(icu4x::capi::TimeZoneIdMapper* ptr) {
+  return reinterpret_cast<icu4x::TimeZoneIdMapper*>(ptr);
+}
+
+inline void icu4x::TimeZoneIdMapper::operator delete(void* ptr) {
+  icu4x::capi::icu4x_TimeZoneIdMapper_destroy_mv1(reinterpret_cast<icu4x::capi::TimeZoneIdMapper*>(ptr));
+}
+
+
+#endif // icu4x_TimeZoneIdMapper_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/TimeZoneIdMapperWithFastCanonicalization.d.hpp b/ffi/capi/bindings/cpp/icu4x/TimeZoneIdMapperWithFastCanonicalization.d.hpp
new file mode 100644
index 00000000000..91641e83df0
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/TimeZoneIdMapperWithFastCanonicalization.d.hpp
@@ -0,0 +1,53 @@
+#ifndef icu4x_TimeZoneIdMapperWithFastCanonicalization_D_HPP
+#define icu4x_TimeZoneIdMapperWithFastCanonicalization_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct TimeZoneIdMapperWithFastCanonicalization; }
+class TimeZoneIdMapperWithFastCanonicalization;
+struct TimeZoneInvalidIdError;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct TimeZoneIdMapperWithFastCanonicalization;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class TimeZoneIdMapperWithFastCanonicalization {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::TimeZoneIdMapperWithFastCanonicalization>, icu4x::DataError> create(const icu4x::DataProvider& provider);
+
+  inline diplomat::result<diplomat::result<std::string, icu4x::TimeZoneInvalidIdError>, diplomat::Utf8Error> canonicalize_iana(std::string_view value) const;
+
+  inline diplomat::result<std::string, icu4x::TimeZoneInvalidIdError> canonical_iana_from_bcp47(std::string_view value) const;
+
+  inline const icu4x::capi::TimeZoneIdMapperWithFastCanonicalization* AsFFI() const;
+  inline icu4x::capi::TimeZoneIdMapperWithFastCanonicalization* AsFFI();
+  inline static const icu4x::TimeZoneIdMapperWithFastCanonicalization* FromFFI(const icu4x::capi::TimeZoneIdMapperWithFastCanonicalization* ptr);
+  inline static icu4x::TimeZoneIdMapperWithFastCanonicalization* FromFFI(icu4x::capi::TimeZoneIdMapperWithFastCanonicalization* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  TimeZoneIdMapperWithFastCanonicalization() = delete;
+  TimeZoneIdMapperWithFastCanonicalization(const icu4x::TimeZoneIdMapperWithFastCanonicalization&) = delete;
+  TimeZoneIdMapperWithFastCanonicalization(icu4x::TimeZoneIdMapperWithFastCanonicalization&&) noexcept = delete;
+  TimeZoneIdMapperWithFastCanonicalization operator=(const icu4x::TimeZoneIdMapperWithFastCanonicalization&) = delete;
+  TimeZoneIdMapperWithFastCanonicalization operator=(icu4x::TimeZoneIdMapperWithFastCanonicalization&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_TimeZoneIdMapperWithFastCanonicalization_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/TimeZoneIdMapperWithFastCanonicalization.hpp b/ffi/capi/bindings/cpp/icu4x/TimeZoneIdMapperWithFastCanonicalization.hpp
new file mode 100644
index 00000000000..5df2f98400e
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/TimeZoneIdMapperWithFastCanonicalization.hpp
@@ -0,0 +1,87 @@
+#ifndef icu4x_TimeZoneIdMapperWithFastCanonicalization_HPP
+#define icu4x_TimeZoneIdMapperWithFastCanonicalization_HPP
+
+#include "TimeZoneIdMapperWithFastCanonicalization.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "TimeZoneInvalidIdError.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_TimeZoneIdMapperWithFastCanonicalization_create_mv1_result {union {icu4x::capi::TimeZoneIdMapperWithFastCanonicalization* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_TimeZoneIdMapperWithFastCanonicalization_create_mv1_result;
+    icu4x_TimeZoneIdMapperWithFastCanonicalization_create_mv1_result icu4x_TimeZoneIdMapperWithFastCanonicalization_create_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_TimeZoneIdMapperWithFastCanonicalization_canonicalize_iana_mv1_result { bool is_ok;} icu4x_TimeZoneIdMapperWithFastCanonicalization_canonicalize_iana_mv1_result;
+    icu4x_TimeZoneIdMapperWithFastCanonicalization_canonicalize_iana_mv1_result icu4x_TimeZoneIdMapperWithFastCanonicalization_canonicalize_iana_mv1(const icu4x::capi::TimeZoneIdMapperWithFastCanonicalization* self, const char* value_data, size_t value_len, diplomat::capi::DiplomatWrite* write);
+    
+    typedef struct icu4x_TimeZoneIdMapperWithFastCanonicalization_canonical_iana_from_bcp47_mv1_result { bool is_ok;} icu4x_TimeZoneIdMapperWithFastCanonicalization_canonical_iana_from_bcp47_mv1_result;
+    icu4x_TimeZoneIdMapperWithFastCanonicalization_canonical_iana_from_bcp47_mv1_result icu4x_TimeZoneIdMapperWithFastCanonicalization_canonical_iana_from_bcp47_mv1(const icu4x::capi::TimeZoneIdMapperWithFastCanonicalization* self, const char* value_data, size_t value_len, diplomat::capi::DiplomatWrite* write);
+    
+    
+    void icu4x_TimeZoneIdMapperWithFastCanonicalization_destroy_mv1(TimeZoneIdMapperWithFastCanonicalization* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::TimeZoneIdMapperWithFastCanonicalization>, icu4x::DataError> icu4x::TimeZoneIdMapperWithFastCanonicalization::create(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_TimeZoneIdMapperWithFastCanonicalization_create_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::TimeZoneIdMapperWithFastCanonicalization>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::TimeZoneIdMapperWithFastCanonicalization>>(std::unique_ptr<icu4x::TimeZoneIdMapperWithFastCanonicalization>(icu4x::TimeZoneIdMapperWithFastCanonicalization::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::TimeZoneIdMapperWithFastCanonicalization>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<diplomat::result<std::string, icu4x::TimeZoneInvalidIdError>, diplomat::Utf8Error> icu4x::TimeZoneIdMapperWithFastCanonicalization::canonicalize_iana(std::string_view value) const {
+  if (!diplomat::capi::diplomat_is_str(value.data(), value.size())) {
+    return diplomat::Err<diplomat::Utf8Error>(diplomat::Utf8Error());
+  }
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_TimeZoneIdMapperWithFastCanonicalization_canonicalize_iana_mv1(this->AsFFI(),
+    value.data(),
+    value.size(),
+    &write);
+  return diplomat::Ok<diplomat::result<std::string, icu4x::TimeZoneInvalidIdError>>(result.is_ok ? diplomat::result<std::string, icu4x::TimeZoneInvalidIdError>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, icu4x::TimeZoneInvalidIdError>(diplomat::Err<icu4x::TimeZoneInvalidIdError>(icu4x::TimeZoneInvalidIdError {})));
+}
+
+inline diplomat::result<std::string, icu4x::TimeZoneInvalidIdError> icu4x::TimeZoneIdMapperWithFastCanonicalization::canonical_iana_from_bcp47(std::string_view value) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_TimeZoneIdMapperWithFastCanonicalization_canonical_iana_from_bcp47_mv1(this->AsFFI(),
+    value.data(),
+    value.size(),
+    &write);
+  return result.is_ok ? diplomat::result<std::string, icu4x::TimeZoneInvalidIdError>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, icu4x::TimeZoneInvalidIdError>(diplomat::Err<icu4x::TimeZoneInvalidIdError>(icu4x::TimeZoneInvalidIdError {}));
+}
+
+inline const icu4x::capi::TimeZoneIdMapperWithFastCanonicalization* icu4x::TimeZoneIdMapperWithFastCanonicalization::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::TimeZoneIdMapperWithFastCanonicalization*>(this);
+}
+
+inline icu4x::capi::TimeZoneIdMapperWithFastCanonicalization* icu4x::TimeZoneIdMapperWithFastCanonicalization::AsFFI() {
+  return reinterpret_cast<icu4x::capi::TimeZoneIdMapperWithFastCanonicalization*>(this);
+}
+
+inline const icu4x::TimeZoneIdMapperWithFastCanonicalization* icu4x::TimeZoneIdMapperWithFastCanonicalization::FromFFI(const icu4x::capi::TimeZoneIdMapperWithFastCanonicalization* ptr) {
+  return reinterpret_cast<const icu4x::TimeZoneIdMapperWithFastCanonicalization*>(ptr);
+}
+
+inline icu4x::TimeZoneIdMapperWithFastCanonicalization* icu4x::TimeZoneIdMapperWithFastCanonicalization::FromFFI(icu4x::capi::TimeZoneIdMapperWithFastCanonicalization* ptr) {
+  return reinterpret_cast<icu4x::TimeZoneIdMapperWithFastCanonicalization*>(ptr);
+}
+
+inline void icu4x::TimeZoneIdMapperWithFastCanonicalization::operator delete(void* ptr) {
+  icu4x::capi::icu4x_TimeZoneIdMapperWithFastCanonicalization_destroy_mv1(reinterpret_cast<icu4x::capi::TimeZoneIdMapperWithFastCanonicalization*>(ptr));
+}
+
+
+#endif // icu4x_TimeZoneIdMapperWithFastCanonicalization_HPP
diff --git a/ffi/capi/bindings/cpp/TimeZoneInvalidIdError.d.hpp b/ffi/capi/bindings/cpp/icu4x/TimeZoneInvalidIdError.d.hpp
similarity index 50%
rename from ffi/capi/bindings/cpp/TimeZoneInvalidIdError.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/TimeZoneInvalidIdError.d.hpp
index 62d2fc832af..c81d5f930dd 100644
--- a/ffi/capi/bindings/cpp/TimeZoneInvalidIdError.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/TimeZoneInvalidIdError.d.hpp
@@ -1,5 +1,5 @@
-#ifndef TimeZoneInvalidIdError_D_HPP
-#define TimeZoneInvalidIdError_D_HPP
+#ifndef icu4x_TimeZoneInvalidIdError_D_HPP
+#define icu4x_TimeZoneInvalidIdError_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,19 +7,20 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     
 } // namespace capi
 } // namespace
 
 
+namespace icu4x {
 struct TimeZoneInvalidIdError {
 
 };
 
-
-#endif // TimeZoneInvalidIdError_D_HPP
+} // namespace
+#endif // icu4x_TimeZoneInvalidIdError_D_HPP
diff --git a/ffi/capi/bindings/cpp/TimeZoneInvalidIdError.hpp b/ffi/capi/bindings/cpp/icu4x/TimeZoneInvalidIdError.hpp
similarity index 59%
rename from ffi/capi/bindings/cpp/TimeZoneInvalidIdError.hpp
rename to ffi/capi/bindings/cpp/icu4x/TimeZoneInvalidIdError.hpp
index f932d142488..31e4a24e629 100644
--- a/ffi/capi/bindings/cpp/TimeZoneInvalidIdError.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/TimeZoneInvalidIdError.hpp
@@ -1,5 +1,5 @@
-#ifndef TimeZoneInvalidIdError_HPP
-#define TimeZoneInvalidIdError_HPP
+#ifndef icu4x_TimeZoneInvalidIdError_HPP
+#define icu4x_TimeZoneInvalidIdError_HPP
 
 #include "TimeZoneInvalidIdError.d.hpp"
 
@@ -9,10 +9,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     extern "C" {
     
@@ -24,4 +24,4 @@ namespace capi {
 
 
 
-#endif // TimeZoneInvalidIdError_HPP
+#endif // icu4x_TimeZoneInvalidIdError_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/TimeZoneInvalidOffsetError.d.hpp b/ffi/capi/bindings/cpp/icu4x/TimeZoneInvalidOffsetError.d.hpp
new file mode 100644
index 00000000000..bc2854dcc8e
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/TimeZoneInvalidOffsetError.d.hpp
@@ -0,0 +1,26 @@
+#ifndef icu4x_TimeZoneInvalidOffsetError_D_HPP
+#define icu4x_TimeZoneInvalidOffsetError_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    
+} // namespace capi
+} // namespace
+
+
+namespace icu4x {
+struct TimeZoneInvalidOffsetError {
+
+};
+
+} // namespace
+#endif // icu4x_TimeZoneInvalidOffsetError_D_HPP
diff --git a/ffi/capi/bindings/cpp/TimeZoneInvalidOffsetError.hpp b/ffi/capi/bindings/cpp/icu4x/TimeZoneInvalidOffsetError.hpp
similarity index 58%
rename from ffi/capi/bindings/cpp/TimeZoneInvalidOffsetError.hpp
rename to ffi/capi/bindings/cpp/icu4x/TimeZoneInvalidOffsetError.hpp
index d3d9cac5b4d..bb4d7fd36b1 100644
--- a/ffi/capi/bindings/cpp/TimeZoneInvalidOffsetError.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/TimeZoneInvalidOffsetError.hpp
@@ -1,5 +1,5 @@
-#ifndef TimeZoneInvalidOffsetError_HPP
-#define TimeZoneInvalidOffsetError_HPP
+#ifndef icu4x_TimeZoneInvalidOffsetError_HPP
+#define icu4x_TimeZoneInvalidOffsetError_HPP
 
 #include "TimeZoneInvalidOffsetError.d.hpp"
 
@@ -9,10 +9,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     extern "C" {
     
@@ -24,4 +24,4 @@ namespace capi {
 
 
 
-#endif // TimeZoneInvalidOffsetError_HPP
+#endif // icu4x_TimeZoneInvalidOffsetError_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/TitlecaseMapper.d.hpp b/ffi/capi/bindings/cpp/icu4x/TitlecaseMapper.d.hpp
new file mode 100644
index 00000000000..83498c4e0f5
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/TitlecaseMapper.d.hpp
@@ -0,0 +1,53 @@
+#ifndef icu4x_TitlecaseMapper_D_HPP
+#define icu4x_TitlecaseMapper_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct Locale; }
+class Locale;
+namespace capi { struct TitlecaseMapper; }
+class TitlecaseMapper;
+struct TitlecaseOptionsV1;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct TitlecaseMapper;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class TitlecaseMapper {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::TitlecaseMapper>, icu4x::DataError> create(const icu4x::DataProvider& provider);
+
+  inline diplomat::result<std::string, diplomat::Utf8Error> titlecase_segment_v1(std::string_view s, const icu4x::Locale& locale, icu4x::TitlecaseOptionsV1 options) const;
+
+  inline const icu4x::capi::TitlecaseMapper* AsFFI() const;
+  inline icu4x::capi::TitlecaseMapper* AsFFI();
+  inline static const icu4x::TitlecaseMapper* FromFFI(const icu4x::capi::TitlecaseMapper* ptr);
+  inline static icu4x::TitlecaseMapper* FromFFI(icu4x::capi::TitlecaseMapper* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  TitlecaseMapper() = delete;
+  TitlecaseMapper(const icu4x::TitlecaseMapper&) = delete;
+  TitlecaseMapper(icu4x::TitlecaseMapper&&) noexcept = delete;
+  TitlecaseMapper operator=(const icu4x::TitlecaseMapper&) = delete;
+  TitlecaseMapper operator=(icu4x::TitlecaseMapper&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_TitlecaseMapper_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/TitlecaseMapper.hpp b/ffi/capi/bindings/cpp/icu4x/TitlecaseMapper.hpp
new file mode 100644
index 00000000000..5b8f2b7a6ac
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/TitlecaseMapper.hpp
@@ -0,0 +1,76 @@
+#ifndef icu4x_TitlecaseMapper_HPP
+#define icu4x_TitlecaseMapper_HPP
+
+#include "TitlecaseMapper.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "Locale.hpp"
+#include "TitlecaseOptionsV1.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_TitlecaseMapper_create_mv1_result {union {icu4x::capi::TitlecaseMapper* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_TitlecaseMapper_create_mv1_result;
+    icu4x_TitlecaseMapper_create_mv1_result icu4x_TitlecaseMapper_create_mv1(const icu4x::capi::DataProvider* provider);
+    
+    void icu4x_TitlecaseMapper_titlecase_segment_v1_mv1(const icu4x::capi::TitlecaseMapper* self, const char* s_data, size_t s_len, const icu4x::capi::Locale* locale, icu4x::capi::TitlecaseOptionsV1 options, diplomat::capi::DiplomatWrite* write);
+    
+    
+    void icu4x_TitlecaseMapper_destroy_mv1(TitlecaseMapper* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::TitlecaseMapper>, icu4x::DataError> icu4x::TitlecaseMapper::create(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_TitlecaseMapper_create_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::TitlecaseMapper>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::TitlecaseMapper>>(std::unique_ptr<icu4x::TitlecaseMapper>(icu4x::TitlecaseMapper::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::TitlecaseMapper>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::string, diplomat::Utf8Error> icu4x::TitlecaseMapper::titlecase_segment_v1(std::string_view s, const icu4x::Locale& locale, icu4x::TitlecaseOptionsV1 options) const {
+  if (!diplomat::capi::diplomat_is_str(s.data(), s.size())) {
+    return diplomat::Err<diplomat::Utf8Error>(diplomat::Utf8Error());
+  }
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  icu4x::capi::icu4x_TitlecaseMapper_titlecase_segment_v1_mv1(this->AsFFI(),
+    s.data(),
+    s.size(),
+    locale.AsFFI(),
+    options.AsFFI(),
+    &write);
+  return diplomat::Ok<std::string>(std::move(output));
+}
+
+inline const icu4x::capi::TitlecaseMapper* icu4x::TitlecaseMapper::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::TitlecaseMapper*>(this);
+}
+
+inline icu4x::capi::TitlecaseMapper* icu4x::TitlecaseMapper::AsFFI() {
+  return reinterpret_cast<icu4x::capi::TitlecaseMapper*>(this);
+}
+
+inline const icu4x::TitlecaseMapper* icu4x::TitlecaseMapper::FromFFI(const icu4x::capi::TitlecaseMapper* ptr) {
+  return reinterpret_cast<const icu4x::TitlecaseMapper*>(ptr);
+}
+
+inline icu4x::TitlecaseMapper* icu4x::TitlecaseMapper::FromFFI(icu4x::capi::TitlecaseMapper* ptr) {
+  return reinterpret_cast<icu4x::TitlecaseMapper*>(ptr);
+}
+
+inline void icu4x::TitlecaseMapper::operator delete(void* ptr) {
+  icu4x::capi::icu4x_TitlecaseMapper_destroy_mv1(reinterpret_cast<icu4x::capi::TitlecaseMapper*>(ptr));
+}
+
+
+#endif // icu4x_TitlecaseMapper_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/TitlecaseOptionsV1.d.hpp b/ffi/capi/bindings/cpp/icu4x/TitlecaseOptionsV1.d.hpp
new file mode 100644
index 00000000000..2f804aeae14
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/TitlecaseOptionsV1.d.hpp
@@ -0,0 +1,43 @@
+#ifndef icu4x_TitlecaseOptionsV1_D_HPP
+#define icu4x_TitlecaseOptionsV1_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "LeadingAdjustment.d.hpp"
+#include "TrailingCase.d.hpp"
+
+namespace icu4x {
+struct TitlecaseOptionsV1;
+class LeadingAdjustment;
+class TrailingCase;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct TitlecaseOptionsV1 {
+      icu4x::capi::LeadingAdjustment leading_adjustment;
+      icu4x::capi::TrailingCase trailing_case;
+    };
+} // namespace capi
+} // namespace
+
+
+namespace icu4x {
+struct TitlecaseOptionsV1 {
+  icu4x::LeadingAdjustment leading_adjustment;
+  icu4x::TrailingCase trailing_case;
+
+  inline static icu4x::TitlecaseOptionsV1 default_options();
+
+  inline icu4x::capi::TitlecaseOptionsV1 AsFFI() const;
+  inline static icu4x::TitlecaseOptionsV1 FromFFI(icu4x::capi::TitlecaseOptionsV1 c_struct);
+};
+
+} // namespace
+#endif // icu4x_TitlecaseOptionsV1_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/TitlecaseOptionsV1.hpp b/ffi/capi/bindings/cpp/icu4x/TitlecaseOptionsV1.hpp
new file mode 100644
index 00000000000..4b7dd5d625b
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/TitlecaseOptionsV1.hpp
@@ -0,0 +1,49 @@
+#ifndef icu4x_TitlecaseOptionsV1_HPP
+#define icu4x_TitlecaseOptionsV1_HPP
+
+#include "TitlecaseOptionsV1.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "LeadingAdjustment.hpp"
+#include "TrailingCase.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    icu4x::capi::TitlecaseOptionsV1 icu4x_TitlecaseOptionsV1_default_mv1(void);
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::TitlecaseOptionsV1 icu4x::TitlecaseOptionsV1::default_options() {
+  auto result = icu4x::capi::icu4x_TitlecaseOptionsV1_default_mv1();
+  return icu4x::TitlecaseOptionsV1::FromFFI(result);
+}
+
+
+inline icu4x::capi::TitlecaseOptionsV1 icu4x::TitlecaseOptionsV1::AsFFI() const {
+  return icu4x::capi::TitlecaseOptionsV1 {
+    /* .leading_adjustment = */ leading_adjustment.AsFFI(),
+    /* .trailing_case = */ trailing_case.AsFFI(),
+  };
+}
+
+inline icu4x::TitlecaseOptionsV1 icu4x::TitlecaseOptionsV1::FromFFI(icu4x::capi::TitlecaseOptionsV1 c_struct) {
+  return icu4x::TitlecaseOptionsV1 {
+    /* .leading_adjustment = */ icu4x::LeadingAdjustment::FromFFI(c_struct.leading_adjustment),
+    /* .trailing_case = */ icu4x::TrailingCase::FromFFI(c_struct.trailing_case),
+  };
+}
+
+
+#endif // icu4x_TitlecaseOptionsV1_HPP
diff --git a/ffi/capi/bindings/cpp/TrailingCase.d.hpp b/ffi/capi/bindings/cpp/icu4x/TrailingCase.d.hpp
similarity index 67%
rename from ffi/capi/bindings/cpp/TrailingCase.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/TrailingCase.d.hpp
index ae79b889a7f..c5a5caac0fe 100644
--- a/ffi/capi/bindings/cpp/TrailingCase.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/TrailingCase.d.hpp
@@ -1,5 +1,5 @@
-#ifndef TrailingCase_D_HPP
-#define TrailingCase_D_HPP
+#ifndef icu4x_TrailingCase_D_HPP
+#define icu4x_TrailingCase_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum TrailingCase {
       TrailingCase_Lower = 0,
@@ -19,6 +19,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class TrailingCase {
 public:
   enum Value {
@@ -33,11 +34,11 @@ class TrailingCase {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::TrailingCase AsFFI() const;
-  inline static TrailingCase FromFFI(diplomat::capi::TrailingCase c_enum);
+  inline icu4x::capi::TrailingCase AsFFI() const;
+  inline static icu4x::TrailingCase FromFFI(icu4x::capi::TrailingCase c_enum);
 private:
     Value value;
 };
 
-
-#endif // TrailingCase_D_HPP
+} // namespace
+#endif // icu4x_TrailingCase_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/TrailingCase.hpp b/ffi/capi/bindings/cpp/icu4x/TrailingCase.hpp
new file mode 100644
index 00000000000..eca0b37aaf4
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/TrailingCase.hpp
@@ -0,0 +1,37 @@
+#ifndef icu4x_TrailingCase_HPP
+#define icu4x_TrailingCase_HPP
+
+#include "TrailingCase.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::TrailingCase icu4x::TrailingCase::AsFFI() const {
+  return static_cast<icu4x::capi::TrailingCase>(value);
+}
+
+inline icu4x::TrailingCase icu4x::TrailingCase::FromFFI(icu4x::capi::TrailingCase c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::TrailingCase_Lower:
+    case icu4x::capi::TrailingCase_Unchanged:
+      return static_cast<icu4x::TrailingCase::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_TrailingCase_HPP
diff --git a/ffi/capi/bindings/cpp/TransformResult.d.hpp b/ffi/capi/bindings/cpp/icu4x/TransformResult.d.hpp
similarity index 66%
rename from ffi/capi/bindings/cpp/TransformResult.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/TransformResult.d.hpp
index deaa4778122..7fd97bbe7a2 100644
--- a/ffi/capi/bindings/cpp/TransformResult.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/TransformResult.d.hpp
@@ -1,5 +1,5 @@
-#ifndef TransformResult_D_HPP
-#define TransformResult_D_HPP
+#ifndef icu4x_TransformResult_D_HPP
+#define icu4x_TransformResult_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum TransformResult {
       TransformResult_Modified = 0,
@@ -19,6 +19,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class TransformResult {
 public:
   enum Value {
@@ -33,11 +34,11 @@ class TransformResult {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::TransformResult AsFFI() const;
-  inline static TransformResult FromFFI(diplomat::capi::TransformResult c_enum);
+  inline icu4x::capi::TransformResult AsFFI() const;
+  inline static icu4x::TransformResult FromFFI(icu4x::capi::TransformResult c_enum);
 private:
     Value value;
 };
 
-
-#endif // TransformResult_D_HPP
+} // namespace
+#endif // icu4x_TransformResult_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/TransformResult.hpp b/ffi/capi/bindings/cpp/icu4x/TransformResult.hpp
new file mode 100644
index 00000000000..2fb98a94d15
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/TransformResult.hpp
@@ -0,0 +1,37 @@
+#ifndef icu4x_TransformResult_HPP
+#define icu4x_TransformResult_HPP
+
+#include "TransformResult.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::TransformResult icu4x::TransformResult::AsFFI() const {
+  return static_cast<icu4x::capi::TransformResult>(value);
+}
+
+inline icu4x::TransformResult icu4x::TransformResult::FromFFI(icu4x::capi::TransformResult c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::TransformResult_Modified:
+    case icu4x::capi::TransformResult_Unmodified:
+      return static_cast<icu4x::TransformResult::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_TransformResult_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/UnicodeSetData.d.hpp b/ffi/capi/bindings/cpp/icu4x/UnicodeSetData.d.hpp
new file mode 100644
index 00000000000..02904ea9703
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/UnicodeSetData.d.hpp
@@ -0,0 +1,64 @@
+#ifndef icu4x_UnicodeSetData_D_HPP
+#define icu4x_UnicodeSetData_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct Locale; }
+class Locale;
+namespace capi { struct UnicodeSetData; }
+class UnicodeSetData;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct UnicodeSetData;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class UnicodeSetData {
+public:
+
+  inline bool contains(std::string_view s) const;
+
+  inline bool contains_char(char32_t cp) const;
+
+  inline static diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError> load_basic_emoji(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError> load_exemplars_main(const icu4x::DataProvider& provider, const icu4x::Locale& locale);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError> load_exemplars_auxiliary(const icu4x::DataProvider& provider, const icu4x::Locale& locale);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError> load_exemplars_punctuation(const icu4x::DataProvider& provider, const icu4x::Locale& locale);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError> load_exemplars_numbers(const icu4x::DataProvider& provider, const icu4x::Locale& locale);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError> load_exemplars_index(const icu4x::DataProvider& provider, const icu4x::Locale& locale);
+
+  inline const icu4x::capi::UnicodeSetData* AsFFI() const;
+  inline icu4x::capi::UnicodeSetData* AsFFI();
+  inline static const icu4x::UnicodeSetData* FromFFI(const icu4x::capi::UnicodeSetData* ptr);
+  inline static icu4x::UnicodeSetData* FromFFI(icu4x::capi::UnicodeSetData* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  UnicodeSetData() = delete;
+  UnicodeSetData(const icu4x::UnicodeSetData&) = delete;
+  UnicodeSetData(icu4x::UnicodeSetData&&) noexcept = delete;
+  UnicodeSetData operator=(const icu4x::UnicodeSetData&) = delete;
+  UnicodeSetData operator=(icu4x::UnicodeSetData&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_UnicodeSetData_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/UnicodeSetData.hpp b/ffi/capi/bindings/cpp/icu4x/UnicodeSetData.hpp
new file mode 100644
index 00000000000..a7264333cd4
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/UnicodeSetData.hpp
@@ -0,0 +1,120 @@
+#ifndef icu4x_UnicodeSetData_HPP
+#define icu4x_UnicodeSetData_HPP
+
+#include "UnicodeSetData.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "Locale.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    bool icu4x_UnicodeSetData_contains_mv1(const icu4x::capi::UnicodeSetData* self, const char* s_data, size_t s_len);
+    
+    bool icu4x_UnicodeSetData_contains_char_mv1(const icu4x::capi::UnicodeSetData* self, char32_t cp);
+    
+    typedef struct icu4x_UnicodeSetData_load_basic_emoji_mv1_result {union {icu4x::capi::UnicodeSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_UnicodeSetData_load_basic_emoji_mv1_result;
+    icu4x_UnicodeSetData_load_basic_emoji_mv1_result icu4x_UnicodeSetData_load_basic_emoji_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_UnicodeSetData_load_exemplars_main_mv1_result {union {icu4x::capi::UnicodeSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_UnicodeSetData_load_exemplars_main_mv1_result;
+    icu4x_UnicodeSetData_load_exemplars_main_mv1_result icu4x_UnicodeSetData_load_exemplars_main_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale);
+    
+    typedef struct icu4x_UnicodeSetData_load_exemplars_auxiliary_mv1_result {union {icu4x::capi::UnicodeSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_UnicodeSetData_load_exemplars_auxiliary_mv1_result;
+    icu4x_UnicodeSetData_load_exemplars_auxiliary_mv1_result icu4x_UnicodeSetData_load_exemplars_auxiliary_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale);
+    
+    typedef struct icu4x_UnicodeSetData_load_exemplars_punctuation_mv1_result {union {icu4x::capi::UnicodeSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_UnicodeSetData_load_exemplars_punctuation_mv1_result;
+    icu4x_UnicodeSetData_load_exemplars_punctuation_mv1_result icu4x_UnicodeSetData_load_exemplars_punctuation_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale);
+    
+    typedef struct icu4x_UnicodeSetData_load_exemplars_numbers_mv1_result {union {icu4x::capi::UnicodeSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_UnicodeSetData_load_exemplars_numbers_mv1_result;
+    icu4x_UnicodeSetData_load_exemplars_numbers_mv1_result icu4x_UnicodeSetData_load_exemplars_numbers_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale);
+    
+    typedef struct icu4x_UnicodeSetData_load_exemplars_index_mv1_result {union {icu4x::capi::UnicodeSetData* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_UnicodeSetData_load_exemplars_index_mv1_result;
+    icu4x_UnicodeSetData_load_exemplars_index_mv1_result icu4x_UnicodeSetData_load_exemplars_index_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale);
+    
+    
+    void icu4x_UnicodeSetData_destroy_mv1(UnicodeSetData* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline bool icu4x::UnicodeSetData::contains(std::string_view s) const {
+  auto result = icu4x::capi::icu4x_UnicodeSetData_contains_mv1(this->AsFFI(),
+    s.data(),
+    s.size());
+  return result;
+}
+
+inline bool icu4x::UnicodeSetData::contains_char(char32_t cp) const {
+  auto result = icu4x::capi::icu4x_UnicodeSetData_contains_char_mv1(this->AsFFI(),
+    cp);
+  return result;
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError> icu4x::UnicodeSetData::load_basic_emoji(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_UnicodeSetData_load_basic_emoji_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::UnicodeSetData>>(std::unique_ptr<icu4x::UnicodeSetData>(icu4x::UnicodeSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError> icu4x::UnicodeSetData::load_exemplars_main(const icu4x::DataProvider& provider, const icu4x::Locale& locale) {
+  auto result = icu4x::capi::icu4x_UnicodeSetData_load_exemplars_main_mv1(provider.AsFFI(),
+    locale.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::UnicodeSetData>>(std::unique_ptr<icu4x::UnicodeSetData>(icu4x::UnicodeSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError> icu4x::UnicodeSetData::load_exemplars_auxiliary(const icu4x::DataProvider& provider, const icu4x::Locale& locale) {
+  auto result = icu4x::capi::icu4x_UnicodeSetData_load_exemplars_auxiliary_mv1(provider.AsFFI(),
+    locale.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::UnicodeSetData>>(std::unique_ptr<icu4x::UnicodeSetData>(icu4x::UnicodeSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError> icu4x::UnicodeSetData::load_exemplars_punctuation(const icu4x::DataProvider& provider, const icu4x::Locale& locale) {
+  auto result = icu4x::capi::icu4x_UnicodeSetData_load_exemplars_punctuation_mv1(provider.AsFFI(),
+    locale.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::UnicodeSetData>>(std::unique_ptr<icu4x::UnicodeSetData>(icu4x::UnicodeSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError> icu4x::UnicodeSetData::load_exemplars_numbers(const icu4x::DataProvider& provider, const icu4x::Locale& locale) {
+  auto result = icu4x::capi::icu4x_UnicodeSetData_load_exemplars_numbers_mv1(provider.AsFFI(),
+    locale.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::UnicodeSetData>>(std::unique_ptr<icu4x::UnicodeSetData>(icu4x::UnicodeSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError> icu4x::UnicodeSetData::load_exemplars_index(const icu4x::DataProvider& provider, const icu4x::Locale& locale) {
+  auto result = icu4x::capi::icu4x_UnicodeSetData_load_exemplars_index_mv1(provider.AsFFI(),
+    locale.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::UnicodeSetData>>(std::unique_ptr<icu4x::UnicodeSetData>(icu4x::UnicodeSetData::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::UnicodeSetData>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline const icu4x::capi::UnicodeSetData* icu4x::UnicodeSetData::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::UnicodeSetData*>(this);
+}
+
+inline icu4x::capi::UnicodeSetData* icu4x::UnicodeSetData::AsFFI() {
+  return reinterpret_cast<icu4x::capi::UnicodeSetData*>(this);
+}
+
+inline const icu4x::UnicodeSetData* icu4x::UnicodeSetData::FromFFI(const icu4x::capi::UnicodeSetData* ptr) {
+  return reinterpret_cast<const icu4x::UnicodeSetData*>(ptr);
+}
+
+inline icu4x::UnicodeSetData* icu4x::UnicodeSetData::FromFFI(icu4x::capi::UnicodeSetData* ptr) {
+  return reinterpret_cast<icu4x::UnicodeSetData*>(ptr);
+}
+
+inline void icu4x::UnicodeSetData::operator delete(void* ptr) {
+  icu4x::capi::icu4x_UnicodeSetData_destroy_mv1(reinterpret_cast<icu4x::capi::UnicodeSetData*>(ptr));
+}
+
+
+#endif // icu4x_UnicodeSetData_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/UnitsConverter.d.hpp b/ffi/capi/bindings/cpp/icu4x/UnitsConverter.d.hpp
new file mode 100644
index 00000000000..4005a94bce6
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/UnitsConverter.d.hpp
@@ -0,0 +1,47 @@
+#ifndef icu4x_UnitsConverter_D_HPP
+#define icu4x_UnitsConverter_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct UnitsConverter; }
+class UnitsConverter;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct UnitsConverter;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class UnitsConverter {
+public:
+
+  inline double convert(double value) const;
+
+  inline std::unique_ptr<icu4x::UnitsConverter> clone() const;
+
+  inline const icu4x::capi::UnitsConverter* AsFFI() const;
+  inline icu4x::capi::UnitsConverter* AsFFI();
+  inline static const icu4x::UnitsConverter* FromFFI(const icu4x::capi::UnitsConverter* ptr);
+  inline static icu4x::UnitsConverter* FromFFI(icu4x::capi::UnitsConverter* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  UnitsConverter() = delete;
+  UnitsConverter(const icu4x::UnitsConverter&) = delete;
+  UnitsConverter(icu4x::UnitsConverter&&) noexcept = delete;
+  UnitsConverter operator=(const icu4x::UnitsConverter&) = delete;
+  UnitsConverter operator=(icu4x::UnitsConverter&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_UnitsConverter_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/UnitsConverter.hpp b/ffi/capi/bindings/cpp/icu4x/UnitsConverter.hpp
new file mode 100644
index 00000000000..d4262342c31
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/UnitsConverter.hpp
@@ -0,0 +1,62 @@
+#ifndef icu4x_UnitsConverter_HPP
+#define icu4x_UnitsConverter_HPP
+
+#include "UnitsConverter.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    double icu4x_UnitsConverter_convert_double_mv1(const icu4x::capi::UnitsConverter* self, double value);
+    
+    icu4x::capi::UnitsConverter* icu4x_UnitsConverter_clone_mv1(const icu4x::capi::UnitsConverter* self);
+    
+    
+    void icu4x_UnitsConverter_destroy_mv1(UnitsConverter* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline double icu4x::UnitsConverter::convert(double value) const {
+  auto result = icu4x::capi::icu4x_UnitsConverter_convert_double_mv1(this->AsFFI(),
+    value);
+  return result;
+}
+
+inline std::unique_ptr<icu4x::UnitsConverter> icu4x::UnitsConverter::clone() const {
+  auto result = icu4x::capi::icu4x_UnitsConverter_clone_mv1(this->AsFFI());
+  return std::unique_ptr<icu4x::UnitsConverter>(icu4x::UnitsConverter::FromFFI(result));
+}
+
+inline const icu4x::capi::UnitsConverter* icu4x::UnitsConverter::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::UnitsConverter*>(this);
+}
+
+inline icu4x::capi::UnitsConverter* icu4x::UnitsConverter::AsFFI() {
+  return reinterpret_cast<icu4x::capi::UnitsConverter*>(this);
+}
+
+inline const icu4x::UnitsConverter* icu4x::UnitsConverter::FromFFI(const icu4x::capi::UnitsConverter* ptr) {
+  return reinterpret_cast<const icu4x::UnitsConverter*>(ptr);
+}
+
+inline icu4x::UnitsConverter* icu4x::UnitsConverter::FromFFI(icu4x::capi::UnitsConverter* ptr) {
+  return reinterpret_cast<icu4x::UnitsConverter*>(ptr);
+}
+
+inline void icu4x::UnitsConverter::operator delete(void* ptr) {
+  icu4x::capi::icu4x_UnitsConverter_destroy_mv1(reinterpret_cast<icu4x::capi::UnitsConverter*>(ptr));
+}
+
+
+#endif // icu4x_UnitsConverter_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/UnitsConverterFactory.d.hpp b/ffi/capi/bindings/cpp/icu4x/UnitsConverterFactory.d.hpp
new file mode 100644
index 00000000000..4da7363f316
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/UnitsConverterFactory.d.hpp
@@ -0,0 +1,58 @@
+#ifndef icu4x_UnitsConverterFactory_D_HPP
+#define icu4x_UnitsConverterFactory_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct MeasureUnit; }
+class MeasureUnit;
+namespace capi { struct MeasureUnitParser; }
+class MeasureUnitParser;
+namespace capi { struct UnitsConverter; }
+class UnitsConverter;
+namespace capi { struct UnitsConverterFactory; }
+class UnitsConverterFactory;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct UnitsConverterFactory;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class UnitsConverterFactory {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::UnitsConverterFactory>, icu4x::DataError> create(const icu4x::DataProvider& provider);
+
+  inline std::unique_ptr<icu4x::UnitsConverter> converter(const icu4x::MeasureUnit& from, const icu4x::MeasureUnit& to) const;
+
+  inline std::unique_ptr<icu4x::MeasureUnitParser> parser() const;
+
+  inline const icu4x::capi::UnitsConverterFactory* AsFFI() const;
+  inline icu4x::capi::UnitsConverterFactory* AsFFI();
+  inline static const icu4x::UnitsConverterFactory* FromFFI(const icu4x::capi::UnitsConverterFactory* ptr);
+  inline static icu4x::UnitsConverterFactory* FromFFI(icu4x::capi::UnitsConverterFactory* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  UnitsConverterFactory() = delete;
+  UnitsConverterFactory(const icu4x::UnitsConverterFactory&) = delete;
+  UnitsConverterFactory(icu4x::UnitsConverterFactory&&) noexcept = delete;
+  UnitsConverterFactory operator=(const icu4x::UnitsConverterFactory&) = delete;
+  UnitsConverterFactory operator=(icu4x::UnitsConverterFactory&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_UnitsConverterFactory_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/UnitsConverterFactory.hpp b/ffi/capi/bindings/cpp/icu4x/UnitsConverterFactory.hpp
new file mode 100644
index 00000000000..b267f13fec0
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/UnitsConverterFactory.hpp
@@ -0,0 +1,76 @@
+#ifndef icu4x_UnitsConverterFactory_HPP
+#define icu4x_UnitsConverterFactory_HPP
+
+#include "UnitsConverterFactory.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "MeasureUnit.hpp"
+#include "MeasureUnitParser.hpp"
+#include "UnitsConverter.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_UnitsConverterFactory_create_mv1_result {union {icu4x::capi::UnitsConverterFactory* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_UnitsConverterFactory_create_mv1_result;
+    icu4x_UnitsConverterFactory_create_mv1_result icu4x_UnitsConverterFactory_create_mv1(const icu4x::capi::DataProvider* provider);
+    
+    icu4x::capi::UnitsConverter* icu4x_UnitsConverterFactory_converter_mv1(const icu4x::capi::UnitsConverterFactory* self, const icu4x::capi::MeasureUnit* from, const icu4x::capi::MeasureUnit* to);
+    
+    icu4x::capi::MeasureUnitParser* icu4x_UnitsConverterFactory_parser_mv1(const icu4x::capi::UnitsConverterFactory* self);
+    
+    
+    void icu4x_UnitsConverterFactory_destroy_mv1(UnitsConverterFactory* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::UnitsConverterFactory>, icu4x::DataError> icu4x::UnitsConverterFactory::create(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_UnitsConverterFactory_create_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::UnitsConverterFactory>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::UnitsConverterFactory>>(std::unique_ptr<icu4x::UnitsConverterFactory>(icu4x::UnitsConverterFactory::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::UnitsConverterFactory>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline std::unique_ptr<icu4x::UnitsConverter> icu4x::UnitsConverterFactory::converter(const icu4x::MeasureUnit& from, const icu4x::MeasureUnit& to) const {
+  auto result = icu4x::capi::icu4x_UnitsConverterFactory_converter_mv1(this->AsFFI(),
+    from.AsFFI(),
+    to.AsFFI());
+  return std::unique_ptr<icu4x::UnitsConverter>(icu4x::UnitsConverter::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::MeasureUnitParser> icu4x::UnitsConverterFactory::parser() const {
+  auto result = icu4x::capi::icu4x_UnitsConverterFactory_parser_mv1(this->AsFFI());
+  return std::unique_ptr<icu4x::MeasureUnitParser>(icu4x::MeasureUnitParser::FromFFI(result));
+}
+
+inline const icu4x::capi::UnitsConverterFactory* icu4x::UnitsConverterFactory::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::UnitsConverterFactory*>(this);
+}
+
+inline icu4x::capi::UnitsConverterFactory* icu4x::UnitsConverterFactory::AsFFI() {
+  return reinterpret_cast<icu4x::capi::UnitsConverterFactory*>(this);
+}
+
+inline const icu4x::UnitsConverterFactory* icu4x::UnitsConverterFactory::FromFFI(const icu4x::capi::UnitsConverterFactory* ptr) {
+  return reinterpret_cast<const icu4x::UnitsConverterFactory*>(ptr);
+}
+
+inline icu4x::UnitsConverterFactory* icu4x::UnitsConverterFactory::FromFFI(icu4x::capi::UnitsConverterFactory* ptr) {
+  return reinterpret_cast<icu4x::UnitsConverterFactory*>(ptr);
+}
+
+inline void icu4x::UnitsConverterFactory::operator delete(void* ptr) {
+  icu4x::capi::icu4x_UnitsConverterFactory_destroy_mv1(reinterpret_cast<icu4x::capi::UnitsConverterFactory*>(ptr));
+}
+
+
+#endif // icu4x_UnitsConverterFactory_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/WeekCalculator.d.hpp b/ffi/capi/bindings/cpp/icu4x/WeekCalculator.d.hpp
new file mode 100644
index 00000000000..3c2ba89ebf2
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/WeekCalculator.d.hpp
@@ -0,0 +1,60 @@
+#ifndef icu4x_WeekCalculator_D_HPP
+#define icu4x_WeekCalculator_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct Locale; }
+class Locale;
+namespace capi { struct WeekCalculator; }
+class WeekCalculator;
+struct WeekendContainsDay;
+class DataError;
+class IsoWeekday;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct WeekCalculator;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class WeekCalculator {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::WeekCalculator>, icu4x::DataError> create(const icu4x::DataProvider& provider, const icu4x::Locale& locale);
+
+  inline static std::unique_ptr<icu4x::WeekCalculator> from_first_day_of_week_and_min_week_days(icu4x::IsoWeekday first_weekday, uint8_t min_week_days);
+
+  inline icu4x::IsoWeekday first_weekday() const;
+
+  inline uint8_t min_week_days() const;
+
+  inline icu4x::WeekendContainsDay weekend() const;
+
+  inline const icu4x::capi::WeekCalculator* AsFFI() const;
+  inline icu4x::capi::WeekCalculator* AsFFI();
+  inline static const icu4x::WeekCalculator* FromFFI(const icu4x::capi::WeekCalculator* ptr);
+  inline static icu4x::WeekCalculator* FromFFI(icu4x::capi::WeekCalculator* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  WeekCalculator() = delete;
+  WeekCalculator(const icu4x::WeekCalculator&) = delete;
+  WeekCalculator(icu4x::WeekCalculator&&) noexcept = delete;
+  WeekCalculator operator=(const icu4x::WeekCalculator&) = delete;
+  WeekCalculator operator=(icu4x::WeekCalculator&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_WeekCalculator_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/WeekCalculator.hpp b/ffi/capi/bindings/cpp/icu4x/WeekCalculator.hpp
new file mode 100644
index 00000000000..afa5fe22850
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/WeekCalculator.hpp
@@ -0,0 +1,90 @@
+#ifndef icu4x_WeekCalculator_HPP
+#define icu4x_WeekCalculator_HPP
+
+#include "WeekCalculator.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "IsoWeekday.hpp"
+#include "Locale.hpp"
+#include "WeekendContainsDay.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_WeekCalculator_create_mv1_result {union {icu4x::capi::WeekCalculator* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_WeekCalculator_create_mv1_result;
+    icu4x_WeekCalculator_create_mv1_result icu4x_WeekCalculator_create_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale);
+    
+    icu4x::capi::WeekCalculator* icu4x_WeekCalculator_from_first_day_of_week_and_min_week_days_mv1(icu4x::capi::IsoWeekday first_weekday, uint8_t min_week_days);
+    
+    icu4x::capi::IsoWeekday icu4x_WeekCalculator_first_weekday_mv1(const icu4x::capi::WeekCalculator* self);
+    
+    uint8_t icu4x_WeekCalculator_min_week_days_mv1(const icu4x::capi::WeekCalculator* self);
+    
+    icu4x::capi::WeekendContainsDay icu4x_WeekCalculator_weekend_mv1(const icu4x::capi::WeekCalculator* self);
+    
+    
+    void icu4x_WeekCalculator_destroy_mv1(WeekCalculator* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::WeekCalculator>, icu4x::DataError> icu4x::WeekCalculator::create(const icu4x::DataProvider& provider, const icu4x::Locale& locale) {
+  auto result = icu4x::capi::icu4x_WeekCalculator_create_mv1(provider.AsFFI(),
+    locale.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::WeekCalculator>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::WeekCalculator>>(std::unique_ptr<icu4x::WeekCalculator>(icu4x::WeekCalculator::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::WeekCalculator>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline std::unique_ptr<icu4x::WeekCalculator> icu4x::WeekCalculator::from_first_day_of_week_and_min_week_days(icu4x::IsoWeekday first_weekday, uint8_t min_week_days) {
+  auto result = icu4x::capi::icu4x_WeekCalculator_from_first_day_of_week_and_min_week_days_mv1(first_weekday.AsFFI(),
+    min_week_days);
+  return std::unique_ptr<icu4x::WeekCalculator>(icu4x::WeekCalculator::FromFFI(result));
+}
+
+inline icu4x::IsoWeekday icu4x::WeekCalculator::first_weekday() const {
+  auto result = icu4x::capi::icu4x_WeekCalculator_first_weekday_mv1(this->AsFFI());
+  return icu4x::IsoWeekday::FromFFI(result);
+}
+
+inline uint8_t icu4x::WeekCalculator::min_week_days() const {
+  auto result = icu4x::capi::icu4x_WeekCalculator_min_week_days_mv1(this->AsFFI());
+  return result;
+}
+
+inline icu4x::WeekendContainsDay icu4x::WeekCalculator::weekend() const {
+  auto result = icu4x::capi::icu4x_WeekCalculator_weekend_mv1(this->AsFFI());
+  return icu4x::WeekendContainsDay::FromFFI(result);
+}
+
+inline const icu4x::capi::WeekCalculator* icu4x::WeekCalculator::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::WeekCalculator*>(this);
+}
+
+inline icu4x::capi::WeekCalculator* icu4x::WeekCalculator::AsFFI() {
+  return reinterpret_cast<icu4x::capi::WeekCalculator*>(this);
+}
+
+inline const icu4x::WeekCalculator* icu4x::WeekCalculator::FromFFI(const icu4x::capi::WeekCalculator* ptr) {
+  return reinterpret_cast<const icu4x::WeekCalculator*>(ptr);
+}
+
+inline icu4x::WeekCalculator* icu4x::WeekCalculator::FromFFI(icu4x::capi::WeekCalculator* ptr) {
+  return reinterpret_cast<icu4x::WeekCalculator*>(ptr);
+}
+
+inline void icu4x::WeekCalculator::operator delete(void* ptr) {
+  icu4x::capi::icu4x_WeekCalculator_destroy_mv1(reinterpret_cast<icu4x::capi::WeekCalculator*>(ptr));
+}
+
+
+#endif // icu4x_WeekCalculator_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/WeekOf.d.hpp b/ffi/capi/bindings/cpp/icu4x/WeekOf.d.hpp
new file mode 100644
index 00000000000..920fb9801b1
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/WeekOf.d.hpp
@@ -0,0 +1,38 @@
+#ifndef icu4x_WeekOf_D_HPP
+#define icu4x_WeekOf_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "WeekRelativeUnit.d.hpp"
+
+namespace icu4x {
+class WeekRelativeUnit;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct WeekOf {
+      uint16_t week;
+      icu4x::capi::WeekRelativeUnit unit;
+    };
+} // namespace capi
+} // namespace
+
+
+namespace icu4x {
+struct WeekOf {
+  uint16_t week;
+  icu4x::WeekRelativeUnit unit;
+
+  inline icu4x::capi::WeekOf AsFFI() const;
+  inline static icu4x::WeekOf FromFFI(icu4x::capi::WeekOf c_struct);
+};
+
+} // namespace
+#endif // icu4x_WeekOf_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/WeekOf.hpp b/ffi/capi/bindings/cpp/icu4x/WeekOf.hpp
new file mode 100644
index 00000000000..11e1e097169
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/WeekOf.hpp
@@ -0,0 +1,41 @@
+#ifndef icu4x_WeekOf_HPP
+#define icu4x_WeekOf_HPP
+
+#include "WeekOf.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "WeekRelativeUnit.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+
+inline icu4x::capi::WeekOf icu4x::WeekOf::AsFFI() const {
+  return icu4x::capi::WeekOf {
+    /* .week = */ week,
+    /* .unit = */ unit.AsFFI(),
+  };
+}
+
+inline icu4x::WeekOf icu4x::WeekOf::FromFFI(icu4x::capi::WeekOf c_struct) {
+  return icu4x::WeekOf {
+    /* .week = */ c_struct.week,
+    /* .unit = */ icu4x::WeekRelativeUnit::FromFFI(c_struct.unit),
+  };
+}
+
+
+#endif // icu4x_WeekOf_HPP
diff --git a/ffi/capi/bindings/cpp/WeekRelativeUnit.d.hpp b/ffi/capi/bindings/cpp/icu4x/WeekRelativeUnit.d.hpp
similarity index 67%
rename from ffi/capi/bindings/cpp/WeekRelativeUnit.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/WeekRelativeUnit.d.hpp
index 8246aa60cb7..2801e505137 100644
--- a/ffi/capi/bindings/cpp/WeekRelativeUnit.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/WeekRelativeUnit.d.hpp
@@ -1,5 +1,5 @@
-#ifndef WeekRelativeUnit_D_HPP
-#define WeekRelativeUnit_D_HPP
+#ifndef icu4x_WeekRelativeUnit_D_HPP
+#define icu4x_WeekRelativeUnit_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     enum WeekRelativeUnit {
       WeekRelativeUnit_Previous = 0,
@@ -20,6 +20,7 @@ namespace capi {
 } // namespace capi
 } // namespace
 
+namespace icu4x {
 class WeekRelativeUnit {
 public:
   enum Value {
@@ -35,11 +36,11 @@ class WeekRelativeUnit {
   // Prevent usage as boolean value
   explicit operator bool() const = delete;
 
-  inline diplomat::capi::WeekRelativeUnit AsFFI() const;
-  inline static WeekRelativeUnit FromFFI(diplomat::capi::WeekRelativeUnit c_enum);
+  inline icu4x::capi::WeekRelativeUnit AsFFI() const;
+  inline static icu4x::WeekRelativeUnit FromFFI(icu4x::capi::WeekRelativeUnit c_enum);
 private:
     Value value;
 };
 
-
-#endif // WeekRelativeUnit_D_HPP
+} // namespace
+#endif // icu4x_WeekRelativeUnit_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/WeekRelativeUnit.hpp b/ffi/capi/bindings/cpp/icu4x/WeekRelativeUnit.hpp
new file mode 100644
index 00000000000..9e247090a76
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/WeekRelativeUnit.hpp
@@ -0,0 +1,38 @@
+#ifndef icu4x_WeekRelativeUnit_HPP
+#define icu4x_WeekRelativeUnit_HPP
+
+#include "WeekRelativeUnit.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline icu4x::capi::WeekRelativeUnit icu4x::WeekRelativeUnit::AsFFI() const {
+  return static_cast<icu4x::capi::WeekRelativeUnit>(value);
+}
+
+inline icu4x::WeekRelativeUnit icu4x::WeekRelativeUnit::FromFFI(icu4x::capi::WeekRelativeUnit c_enum) {
+  switch (c_enum) {
+    case icu4x::capi::WeekRelativeUnit_Previous:
+    case icu4x::capi::WeekRelativeUnit_Current:
+    case icu4x::capi::WeekRelativeUnit_Next:
+      return static_cast<icu4x::WeekRelativeUnit::Value>(c_enum);
+    default:
+      abort();
+  }
+}
+#endif // icu4x_WeekRelativeUnit_HPP
diff --git a/ffi/capi/bindings/cpp/WeekendContainsDay.d.hpp b/ffi/capi/bindings/cpp/icu4x/WeekendContainsDay.d.hpp
similarity index 58%
rename from ffi/capi/bindings/cpp/WeekendContainsDay.d.hpp
rename to ffi/capi/bindings/cpp/icu4x/WeekendContainsDay.d.hpp
index cda7450ad8a..356d9d13223 100644
--- a/ffi/capi/bindings/cpp/WeekendContainsDay.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/WeekendContainsDay.d.hpp
@@ -1,5 +1,5 @@
-#ifndef WeekendContainsDay_D_HPP
-#define WeekendContainsDay_D_HPP
+#ifndef icu4x_WeekendContainsDay_D_HPP
+#define icu4x_WeekendContainsDay_D_HPP
 
 #include <stdio.h>
 #include <stdint.h>
@@ -7,10 +7,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     struct WeekendContainsDay {
       bool monday;
@@ -25,6 +25,7 @@ namespace capi {
 } // namespace
 
 
+namespace icu4x {
 struct WeekendContainsDay {
   bool monday;
   bool tuesday;
@@ -34,9 +35,9 @@ struct WeekendContainsDay {
   bool saturday;
   bool sunday;
 
-  inline diplomat::capi::WeekendContainsDay AsFFI() const;
-  inline static WeekendContainsDay FromFFI(diplomat::capi::WeekendContainsDay c_struct);
+  inline icu4x::capi::WeekendContainsDay AsFFI() const;
+  inline static icu4x::WeekendContainsDay FromFFI(icu4x::capi::WeekendContainsDay c_struct);
 };
 
-
-#endif // WeekendContainsDay_D_HPP
+} // namespace
+#endif // icu4x_WeekendContainsDay_D_HPP
diff --git a/ffi/capi/bindings/cpp/WeekendContainsDay.hpp b/ffi/capi/bindings/cpp/icu4x/WeekendContainsDay.hpp
similarity index 63%
rename from ffi/capi/bindings/cpp/WeekendContainsDay.hpp
rename to ffi/capi/bindings/cpp/icu4x/WeekendContainsDay.hpp
index 669c5c9eefa..8eb8de65b32 100644
--- a/ffi/capi/bindings/cpp/WeekendContainsDay.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/WeekendContainsDay.hpp
@@ -1,5 +1,5 @@
-#ifndef WeekendContainsDay_HPP
-#define WeekendContainsDay_HPP
+#ifndef icu4x_WeekendContainsDay_HPP
+#define icu4x_WeekendContainsDay_HPP
 
 #include "WeekendContainsDay.d.hpp"
 
@@ -9,10 +9,10 @@
 #include <stdbool.h>
 #include <memory>
 #include <optional>
-#include "diplomat_runtime.hpp"
+#include "../diplomat_runtime.hpp"
 
 
-namespace diplomat {
+namespace icu4x {
 namespace capi {
     extern "C" {
     
@@ -22,8 +22,8 @@ namespace capi {
 } // namespace
 
 
-inline diplomat::capi::WeekendContainsDay WeekendContainsDay::AsFFI() const {
-  return diplomat::capi::WeekendContainsDay {
+inline icu4x::capi::WeekendContainsDay icu4x::WeekendContainsDay::AsFFI() const {
+  return icu4x::capi::WeekendContainsDay {
     /* .monday = */ monday,
     /* .tuesday = */ tuesday,
     /* .wednesday = */ wednesday,
@@ -34,8 +34,8 @@ inline diplomat::capi::WeekendContainsDay WeekendContainsDay::AsFFI() const {
   };
 }
 
-inline WeekendContainsDay WeekendContainsDay::FromFFI(diplomat::capi::WeekendContainsDay c_struct) {
-  return WeekendContainsDay {
+inline icu4x::WeekendContainsDay icu4x::WeekendContainsDay::FromFFI(icu4x::capi::WeekendContainsDay c_struct) {
+  return icu4x::WeekendContainsDay {
     /* .monday = */ c_struct.monday,
     /* .tuesday = */ c_struct.tuesday,
     /* .wednesday = */ c_struct.wednesday,
@@ -47,4 +47,4 @@ inline WeekendContainsDay WeekendContainsDay::FromFFI(diplomat::capi::WeekendCon
 }
 
 
-#endif // WeekendContainsDay_HPP
+#endif // icu4x_WeekendContainsDay_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/WordBreakIteratorLatin1.d.hpp b/ffi/capi/bindings/cpp/icu4x/WordBreakIteratorLatin1.d.hpp
new file mode 100644
index 00000000000..91db8b64b41
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/WordBreakIteratorLatin1.d.hpp
@@ -0,0 +1,48 @@
+#ifndef icu4x_WordBreakIteratorLatin1_D_HPP
+#define icu4x_WordBreakIteratorLatin1_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+class SegmenterWordType;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct WordBreakIteratorLatin1;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class WordBreakIteratorLatin1 {
+public:
+
+  inline int32_t next();
+
+  inline icu4x::SegmenterWordType word_type() const;
+
+  inline bool is_word_like() const;
+
+  inline const icu4x::capi::WordBreakIteratorLatin1* AsFFI() const;
+  inline icu4x::capi::WordBreakIteratorLatin1* AsFFI();
+  inline static const icu4x::WordBreakIteratorLatin1* FromFFI(const icu4x::capi::WordBreakIteratorLatin1* ptr);
+  inline static icu4x::WordBreakIteratorLatin1* FromFFI(icu4x::capi::WordBreakIteratorLatin1* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  WordBreakIteratorLatin1() = delete;
+  WordBreakIteratorLatin1(const icu4x::WordBreakIteratorLatin1&) = delete;
+  WordBreakIteratorLatin1(icu4x::WordBreakIteratorLatin1&&) noexcept = delete;
+  WordBreakIteratorLatin1 operator=(const icu4x::WordBreakIteratorLatin1&) = delete;
+  WordBreakIteratorLatin1 operator=(icu4x::WordBreakIteratorLatin1&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_WordBreakIteratorLatin1_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/WordBreakIteratorLatin1.hpp b/ffi/capi/bindings/cpp/icu4x/WordBreakIteratorLatin1.hpp
new file mode 100644
index 00000000000..9907dba201a
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/WordBreakIteratorLatin1.hpp
@@ -0,0 +1,69 @@
+#ifndef icu4x_WordBreakIteratorLatin1_HPP
+#define icu4x_WordBreakIteratorLatin1_HPP
+
+#include "WordBreakIteratorLatin1.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "SegmenterWordType.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    int32_t icu4x_WordBreakIteratorLatin1_next_mv1(icu4x::capi::WordBreakIteratorLatin1* self);
+    
+    icu4x::capi::SegmenterWordType icu4x_WordBreakIteratorLatin1_word_type_mv1(const icu4x::capi::WordBreakIteratorLatin1* self);
+    
+    bool icu4x_WordBreakIteratorLatin1_is_word_like_mv1(const icu4x::capi::WordBreakIteratorLatin1* self);
+    
+    
+    void icu4x_WordBreakIteratorLatin1_destroy_mv1(WordBreakIteratorLatin1* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline int32_t icu4x::WordBreakIteratorLatin1::next() {
+  auto result = icu4x::capi::icu4x_WordBreakIteratorLatin1_next_mv1(this->AsFFI());
+  return result;
+}
+
+inline icu4x::SegmenterWordType icu4x::WordBreakIteratorLatin1::word_type() const {
+  auto result = icu4x::capi::icu4x_WordBreakIteratorLatin1_word_type_mv1(this->AsFFI());
+  return icu4x::SegmenterWordType::FromFFI(result);
+}
+
+inline bool icu4x::WordBreakIteratorLatin1::is_word_like() const {
+  auto result = icu4x::capi::icu4x_WordBreakIteratorLatin1_is_word_like_mv1(this->AsFFI());
+  return result;
+}
+
+inline const icu4x::capi::WordBreakIteratorLatin1* icu4x::WordBreakIteratorLatin1::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::WordBreakIteratorLatin1*>(this);
+}
+
+inline icu4x::capi::WordBreakIteratorLatin1* icu4x::WordBreakIteratorLatin1::AsFFI() {
+  return reinterpret_cast<icu4x::capi::WordBreakIteratorLatin1*>(this);
+}
+
+inline const icu4x::WordBreakIteratorLatin1* icu4x::WordBreakIteratorLatin1::FromFFI(const icu4x::capi::WordBreakIteratorLatin1* ptr) {
+  return reinterpret_cast<const icu4x::WordBreakIteratorLatin1*>(ptr);
+}
+
+inline icu4x::WordBreakIteratorLatin1* icu4x::WordBreakIteratorLatin1::FromFFI(icu4x::capi::WordBreakIteratorLatin1* ptr) {
+  return reinterpret_cast<icu4x::WordBreakIteratorLatin1*>(ptr);
+}
+
+inline void icu4x::WordBreakIteratorLatin1::operator delete(void* ptr) {
+  icu4x::capi::icu4x_WordBreakIteratorLatin1_destroy_mv1(reinterpret_cast<icu4x::capi::WordBreakIteratorLatin1*>(ptr));
+}
+
+
+#endif // icu4x_WordBreakIteratorLatin1_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/WordBreakIteratorUtf16.d.hpp b/ffi/capi/bindings/cpp/icu4x/WordBreakIteratorUtf16.d.hpp
new file mode 100644
index 00000000000..18e511e4dd7
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/WordBreakIteratorUtf16.d.hpp
@@ -0,0 +1,48 @@
+#ifndef icu4x_WordBreakIteratorUtf16_D_HPP
+#define icu4x_WordBreakIteratorUtf16_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+class SegmenterWordType;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct WordBreakIteratorUtf16;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class WordBreakIteratorUtf16 {
+public:
+
+  inline int32_t next();
+
+  inline icu4x::SegmenterWordType word_type() const;
+
+  inline bool is_word_like() const;
+
+  inline const icu4x::capi::WordBreakIteratorUtf16* AsFFI() const;
+  inline icu4x::capi::WordBreakIteratorUtf16* AsFFI();
+  inline static const icu4x::WordBreakIteratorUtf16* FromFFI(const icu4x::capi::WordBreakIteratorUtf16* ptr);
+  inline static icu4x::WordBreakIteratorUtf16* FromFFI(icu4x::capi::WordBreakIteratorUtf16* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  WordBreakIteratorUtf16() = delete;
+  WordBreakIteratorUtf16(const icu4x::WordBreakIteratorUtf16&) = delete;
+  WordBreakIteratorUtf16(icu4x::WordBreakIteratorUtf16&&) noexcept = delete;
+  WordBreakIteratorUtf16 operator=(const icu4x::WordBreakIteratorUtf16&) = delete;
+  WordBreakIteratorUtf16 operator=(icu4x::WordBreakIteratorUtf16&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_WordBreakIteratorUtf16_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/WordBreakIteratorUtf16.hpp b/ffi/capi/bindings/cpp/icu4x/WordBreakIteratorUtf16.hpp
new file mode 100644
index 00000000000..01343383c15
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/WordBreakIteratorUtf16.hpp
@@ -0,0 +1,69 @@
+#ifndef icu4x_WordBreakIteratorUtf16_HPP
+#define icu4x_WordBreakIteratorUtf16_HPP
+
+#include "WordBreakIteratorUtf16.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "SegmenterWordType.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    int32_t icu4x_WordBreakIteratorUtf16_next_mv1(icu4x::capi::WordBreakIteratorUtf16* self);
+    
+    icu4x::capi::SegmenterWordType icu4x_WordBreakIteratorUtf16_word_type_mv1(const icu4x::capi::WordBreakIteratorUtf16* self);
+    
+    bool icu4x_WordBreakIteratorUtf16_is_word_like_mv1(const icu4x::capi::WordBreakIteratorUtf16* self);
+    
+    
+    void icu4x_WordBreakIteratorUtf16_destroy_mv1(WordBreakIteratorUtf16* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline int32_t icu4x::WordBreakIteratorUtf16::next() {
+  auto result = icu4x::capi::icu4x_WordBreakIteratorUtf16_next_mv1(this->AsFFI());
+  return result;
+}
+
+inline icu4x::SegmenterWordType icu4x::WordBreakIteratorUtf16::word_type() const {
+  auto result = icu4x::capi::icu4x_WordBreakIteratorUtf16_word_type_mv1(this->AsFFI());
+  return icu4x::SegmenterWordType::FromFFI(result);
+}
+
+inline bool icu4x::WordBreakIteratorUtf16::is_word_like() const {
+  auto result = icu4x::capi::icu4x_WordBreakIteratorUtf16_is_word_like_mv1(this->AsFFI());
+  return result;
+}
+
+inline const icu4x::capi::WordBreakIteratorUtf16* icu4x::WordBreakIteratorUtf16::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::WordBreakIteratorUtf16*>(this);
+}
+
+inline icu4x::capi::WordBreakIteratorUtf16* icu4x::WordBreakIteratorUtf16::AsFFI() {
+  return reinterpret_cast<icu4x::capi::WordBreakIteratorUtf16*>(this);
+}
+
+inline const icu4x::WordBreakIteratorUtf16* icu4x::WordBreakIteratorUtf16::FromFFI(const icu4x::capi::WordBreakIteratorUtf16* ptr) {
+  return reinterpret_cast<const icu4x::WordBreakIteratorUtf16*>(ptr);
+}
+
+inline icu4x::WordBreakIteratorUtf16* icu4x::WordBreakIteratorUtf16::FromFFI(icu4x::capi::WordBreakIteratorUtf16* ptr) {
+  return reinterpret_cast<icu4x::WordBreakIteratorUtf16*>(ptr);
+}
+
+inline void icu4x::WordBreakIteratorUtf16::operator delete(void* ptr) {
+  icu4x::capi::icu4x_WordBreakIteratorUtf16_destroy_mv1(reinterpret_cast<icu4x::capi::WordBreakIteratorUtf16*>(ptr));
+}
+
+
+#endif // icu4x_WordBreakIteratorUtf16_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/WordBreakIteratorUtf8.d.hpp b/ffi/capi/bindings/cpp/icu4x/WordBreakIteratorUtf8.d.hpp
new file mode 100644
index 00000000000..01b6225baf1
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/WordBreakIteratorUtf8.d.hpp
@@ -0,0 +1,48 @@
+#ifndef icu4x_WordBreakIteratorUtf8_D_HPP
+#define icu4x_WordBreakIteratorUtf8_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+class SegmenterWordType;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct WordBreakIteratorUtf8;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class WordBreakIteratorUtf8 {
+public:
+
+  inline int32_t next();
+
+  inline icu4x::SegmenterWordType word_type() const;
+
+  inline bool is_word_like() const;
+
+  inline const icu4x::capi::WordBreakIteratorUtf8* AsFFI() const;
+  inline icu4x::capi::WordBreakIteratorUtf8* AsFFI();
+  inline static const icu4x::WordBreakIteratorUtf8* FromFFI(const icu4x::capi::WordBreakIteratorUtf8* ptr);
+  inline static icu4x::WordBreakIteratorUtf8* FromFFI(icu4x::capi::WordBreakIteratorUtf8* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  WordBreakIteratorUtf8() = delete;
+  WordBreakIteratorUtf8(const icu4x::WordBreakIteratorUtf8&) = delete;
+  WordBreakIteratorUtf8(icu4x::WordBreakIteratorUtf8&&) noexcept = delete;
+  WordBreakIteratorUtf8 operator=(const icu4x::WordBreakIteratorUtf8&) = delete;
+  WordBreakIteratorUtf8 operator=(icu4x::WordBreakIteratorUtf8&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_WordBreakIteratorUtf8_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/WordBreakIteratorUtf8.hpp b/ffi/capi/bindings/cpp/icu4x/WordBreakIteratorUtf8.hpp
new file mode 100644
index 00000000000..b6fab781bda
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/WordBreakIteratorUtf8.hpp
@@ -0,0 +1,69 @@
+#ifndef icu4x_WordBreakIteratorUtf8_HPP
+#define icu4x_WordBreakIteratorUtf8_HPP
+
+#include "WordBreakIteratorUtf8.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "SegmenterWordType.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    int32_t icu4x_WordBreakIteratorUtf8_next_mv1(icu4x::capi::WordBreakIteratorUtf8* self);
+    
+    icu4x::capi::SegmenterWordType icu4x_WordBreakIteratorUtf8_word_type_mv1(const icu4x::capi::WordBreakIteratorUtf8* self);
+    
+    bool icu4x_WordBreakIteratorUtf8_is_word_like_mv1(const icu4x::capi::WordBreakIteratorUtf8* self);
+    
+    
+    void icu4x_WordBreakIteratorUtf8_destroy_mv1(WordBreakIteratorUtf8* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline int32_t icu4x::WordBreakIteratorUtf8::next() {
+  auto result = icu4x::capi::icu4x_WordBreakIteratorUtf8_next_mv1(this->AsFFI());
+  return result;
+}
+
+inline icu4x::SegmenterWordType icu4x::WordBreakIteratorUtf8::word_type() const {
+  auto result = icu4x::capi::icu4x_WordBreakIteratorUtf8_word_type_mv1(this->AsFFI());
+  return icu4x::SegmenterWordType::FromFFI(result);
+}
+
+inline bool icu4x::WordBreakIteratorUtf8::is_word_like() const {
+  auto result = icu4x::capi::icu4x_WordBreakIteratorUtf8_is_word_like_mv1(this->AsFFI());
+  return result;
+}
+
+inline const icu4x::capi::WordBreakIteratorUtf8* icu4x::WordBreakIteratorUtf8::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::WordBreakIteratorUtf8*>(this);
+}
+
+inline icu4x::capi::WordBreakIteratorUtf8* icu4x::WordBreakIteratorUtf8::AsFFI() {
+  return reinterpret_cast<icu4x::capi::WordBreakIteratorUtf8*>(this);
+}
+
+inline const icu4x::WordBreakIteratorUtf8* icu4x::WordBreakIteratorUtf8::FromFFI(const icu4x::capi::WordBreakIteratorUtf8* ptr) {
+  return reinterpret_cast<const icu4x::WordBreakIteratorUtf8*>(ptr);
+}
+
+inline icu4x::WordBreakIteratorUtf8* icu4x::WordBreakIteratorUtf8::FromFFI(icu4x::capi::WordBreakIteratorUtf8* ptr) {
+  return reinterpret_cast<icu4x::WordBreakIteratorUtf8*>(ptr);
+}
+
+inline void icu4x::WordBreakIteratorUtf8::operator delete(void* ptr) {
+  icu4x::capi::icu4x_WordBreakIteratorUtf8_destroy_mv1(reinterpret_cast<icu4x::capi::WordBreakIteratorUtf8*>(ptr));
+}
+
+
+#endif // icu4x_WordBreakIteratorUtf8_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/WordSegmenter.d.hpp b/ffi/capi/bindings/cpp/icu4x/WordSegmenter.d.hpp
new file mode 100644
index 00000000000..51a41e390ad
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/WordSegmenter.d.hpp
@@ -0,0 +1,64 @@
+#ifndef icu4x_WordSegmenter_D_HPP
+#define icu4x_WordSegmenter_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct WordBreakIteratorLatin1; }
+class WordBreakIteratorLatin1;
+namespace capi { struct WordBreakIteratorUtf16; }
+class WordBreakIteratorUtf16;
+namespace capi { struct WordBreakIteratorUtf8; }
+class WordBreakIteratorUtf8;
+namespace capi { struct WordSegmenter; }
+class WordSegmenter;
+class DataError;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct WordSegmenter;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class WordSegmenter {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::WordSegmenter>, icu4x::DataError> create_auto(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::WordSegmenter>, icu4x::DataError> create_lstm(const icu4x::DataProvider& provider);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::WordSegmenter>, icu4x::DataError> create_dictionary(const icu4x::DataProvider& provider);
+
+  inline std::unique_ptr<icu4x::WordBreakIteratorUtf8> segment(std::string_view input) const;
+
+  inline std::unique_ptr<icu4x::WordBreakIteratorUtf16> segment16(std::u16string_view input) const;
+
+  inline std::unique_ptr<icu4x::WordBreakIteratorLatin1> segment_latin1(diplomat::span<const uint8_t> input) const;
+
+  inline const icu4x::capi::WordSegmenter* AsFFI() const;
+  inline icu4x::capi::WordSegmenter* AsFFI();
+  inline static const icu4x::WordSegmenter* FromFFI(const icu4x::capi::WordSegmenter* ptr);
+  inline static icu4x::WordSegmenter* FromFFI(icu4x::capi::WordSegmenter* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  WordSegmenter() = delete;
+  WordSegmenter(const icu4x::WordSegmenter&) = delete;
+  WordSegmenter(icu4x::WordSegmenter&&) noexcept = delete;
+  WordSegmenter operator=(const icu4x::WordSegmenter&) = delete;
+  WordSegmenter operator=(icu4x::WordSegmenter&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_WordSegmenter_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/WordSegmenter.hpp b/ffi/capi/bindings/cpp/icu4x/WordSegmenter.hpp
new file mode 100644
index 00000000000..d205047d87f
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/WordSegmenter.hpp
@@ -0,0 +1,103 @@
+#ifndef icu4x_WordSegmenter_HPP
+#define icu4x_WordSegmenter_HPP
+
+#include "WordSegmenter.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "DataError.hpp"
+#include "DataProvider.hpp"
+#include "WordBreakIteratorLatin1.hpp"
+#include "WordBreakIteratorUtf16.hpp"
+#include "WordBreakIteratorUtf8.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_WordSegmenter_create_auto_mv1_result {union {icu4x::capi::WordSegmenter* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_WordSegmenter_create_auto_mv1_result;
+    icu4x_WordSegmenter_create_auto_mv1_result icu4x_WordSegmenter_create_auto_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_WordSegmenter_create_lstm_mv1_result {union {icu4x::capi::WordSegmenter* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_WordSegmenter_create_lstm_mv1_result;
+    icu4x_WordSegmenter_create_lstm_mv1_result icu4x_WordSegmenter_create_lstm_mv1(const icu4x::capi::DataProvider* provider);
+    
+    typedef struct icu4x_WordSegmenter_create_dictionary_mv1_result {union {icu4x::capi::WordSegmenter* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_WordSegmenter_create_dictionary_mv1_result;
+    icu4x_WordSegmenter_create_dictionary_mv1_result icu4x_WordSegmenter_create_dictionary_mv1(const icu4x::capi::DataProvider* provider);
+    
+    icu4x::capi::WordBreakIteratorUtf8* icu4x_WordSegmenter_segment_utf8_mv1(const icu4x::capi::WordSegmenter* self, const char* input_data, size_t input_len);
+    
+    icu4x::capi::WordBreakIteratorUtf16* icu4x_WordSegmenter_segment_utf16_mv1(const icu4x::capi::WordSegmenter* self, const char16_t* input_data, size_t input_len);
+    
+    icu4x::capi::WordBreakIteratorLatin1* icu4x_WordSegmenter_segment_latin1_mv1(const icu4x::capi::WordSegmenter* self, const uint8_t* input_data, size_t input_len);
+    
+    
+    void icu4x_WordSegmenter_destroy_mv1(WordSegmenter* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::WordSegmenter>, icu4x::DataError> icu4x::WordSegmenter::create_auto(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_WordSegmenter_create_auto_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::WordSegmenter>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::WordSegmenter>>(std::unique_ptr<icu4x::WordSegmenter>(icu4x::WordSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::WordSegmenter>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::WordSegmenter>, icu4x::DataError> icu4x::WordSegmenter::create_lstm(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_WordSegmenter_create_lstm_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::WordSegmenter>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::WordSegmenter>>(std::unique_ptr<icu4x::WordSegmenter>(icu4x::WordSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::WordSegmenter>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::WordSegmenter>, icu4x::DataError> icu4x::WordSegmenter::create_dictionary(const icu4x::DataProvider& provider) {
+  auto result = icu4x::capi::icu4x_WordSegmenter_create_dictionary_mv1(provider.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::WordSegmenter>, icu4x::DataError>(diplomat::Ok<std::unique_ptr<icu4x::WordSegmenter>>(std::unique_ptr<icu4x::WordSegmenter>(icu4x::WordSegmenter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::WordSegmenter>, icu4x::DataError>(diplomat::Err<icu4x::DataError>(icu4x::DataError::FromFFI(result.err)));
+}
+
+inline std::unique_ptr<icu4x::WordBreakIteratorUtf8> icu4x::WordSegmenter::segment(std::string_view input) const {
+  auto result = icu4x::capi::icu4x_WordSegmenter_segment_utf8_mv1(this->AsFFI(),
+    input.data(),
+    input.size());
+  return std::unique_ptr<icu4x::WordBreakIteratorUtf8>(icu4x::WordBreakIteratorUtf8::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::WordBreakIteratorUtf16> icu4x::WordSegmenter::segment16(std::u16string_view input) const {
+  auto result = icu4x::capi::icu4x_WordSegmenter_segment_utf16_mv1(this->AsFFI(),
+    input.data(),
+    input.size());
+  return std::unique_ptr<icu4x::WordBreakIteratorUtf16>(icu4x::WordBreakIteratorUtf16::FromFFI(result));
+}
+
+inline std::unique_ptr<icu4x::WordBreakIteratorLatin1> icu4x::WordSegmenter::segment_latin1(diplomat::span<const uint8_t> input) const {
+  auto result = icu4x::capi::icu4x_WordSegmenter_segment_latin1_mv1(this->AsFFI(),
+    input.data(),
+    input.size());
+  return std::unique_ptr<icu4x::WordBreakIteratorLatin1>(icu4x::WordBreakIteratorLatin1::FromFFI(result));
+}
+
+inline const icu4x::capi::WordSegmenter* icu4x::WordSegmenter::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::WordSegmenter*>(this);
+}
+
+inline icu4x::capi::WordSegmenter* icu4x::WordSegmenter::AsFFI() {
+  return reinterpret_cast<icu4x::capi::WordSegmenter*>(this);
+}
+
+inline const icu4x::WordSegmenter* icu4x::WordSegmenter::FromFFI(const icu4x::capi::WordSegmenter* ptr) {
+  return reinterpret_cast<const icu4x::WordSegmenter*>(ptr);
+}
+
+inline icu4x::WordSegmenter* icu4x::WordSegmenter::FromFFI(icu4x::capi::WordSegmenter* ptr) {
+  return reinterpret_cast<icu4x::WordSegmenter*>(ptr);
+}
+
+inline void icu4x::WordSegmenter::operator delete(void* ptr) {
+  icu4x::capi::icu4x_WordSegmenter_destroy_mv1(reinterpret_cast<icu4x::capi::WordSegmenter*>(ptr));
+}
+
+
+#endif // icu4x_WordSegmenter_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/ZonedDateTimeFormatter.d.hpp b/ffi/capi/bindings/cpp/icu4x/ZonedDateTimeFormatter.d.hpp
new file mode 100644
index 00000000000..591257d306c
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/ZonedDateTimeFormatter.d.hpp
@@ -0,0 +1,65 @@
+#ifndef icu4x_ZonedDateTimeFormatter_D_HPP
+#define icu4x_ZonedDateTimeFormatter_D_HPP
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+
+namespace icu4x {
+namespace capi { struct CustomTimeZone; }
+class CustomTimeZone;
+namespace capi { struct DataProvider; }
+class DataProvider;
+namespace capi { struct DateTime; }
+class DateTime;
+namespace capi { struct IsoDateTime; }
+class IsoDateTime;
+namespace capi { struct Locale; }
+class Locale;
+namespace capi { struct ZonedDateTimeFormatter; }
+class ZonedDateTimeFormatter;
+struct IsoTimeZoneOptions;
+class DateLength;
+class Error;
+class TimeLength;
+}
+
+
+namespace icu4x {
+namespace capi {
+    struct ZonedDateTimeFormatter;
+} // namespace capi
+} // namespace
+
+namespace icu4x {
+class ZonedDateTimeFormatter {
+public:
+
+  inline static diplomat::result<std::unique_ptr<icu4x::ZonedDateTimeFormatter>, icu4x::Error> create_with_lengths(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::DateLength date_length, icu4x::TimeLength time_length);
+
+  inline static diplomat::result<std::unique_ptr<icu4x::ZonedDateTimeFormatter>, icu4x::Error> create_with_lengths_and_iso_8601_time_zone_fallback(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::DateLength date_length, icu4x::TimeLength time_length, icu4x::IsoTimeZoneOptions zone_options);
+
+  inline diplomat::result<std::string, icu4x::Error> format_datetime_with_custom_time_zone(const icu4x::DateTime& datetime, const icu4x::CustomTimeZone& time_zone) const;
+
+  inline diplomat::result<std::string, icu4x::Error> format_iso_datetime_with_custom_time_zone(const icu4x::IsoDateTime& datetime, const icu4x::CustomTimeZone& time_zone) const;
+
+  inline const icu4x::capi::ZonedDateTimeFormatter* AsFFI() const;
+  inline icu4x::capi::ZonedDateTimeFormatter* AsFFI();
+  inline static const icu4x::ZonedDateTimeFormatter* FromFFI(const icu4x::capi::ZonedDateTimeFormatter* ptr);
+  inline static icu4x::ZonedDateTimeFormatter* FromFFI(icu4x::capi::ZonedDateTimeFormatter* ptr);
+  inline static void operator delete(void* ptr);
+private:
+  ZonedDateTimeFormatter() = delete;
+  ZonedDateTimeFormatter(const icu4x::ZonedDateTimeFormatter&) = delete;
+  ZonedDateTimeFormatter(icu4x::ZonedDateTimeFormatter&&) noexcept = delete;
+  ZonedDateTimeFormatter operator=(const icu4x::ZonedDateTimeFormatter&) = delete;
+  ZonedDateTimeFormatter operator=(icu4x::ZonedDateTimeFormatter&&) noexcept = delete;
+  static void operator delete[](void*, size_t) = delete;
+};
+
+} // namespace
+#endif // icu4x_ZonedDateTimeFormatter_D_HPP
diff --git a/ffi/capi/bindings/cpp/icu4x/ZonedDateTimeFormatter.hpp b/ffi/capi/bindings/cpp/icu4x/ZonedDateTimeFormatter.hpp
new file mode 100644
index 00000000000..ee1fc860433
--- /dev/null
+++ b/ffi/capi/bindings/cpp/icu4x/ZonedDateTimeFormatter.hpp
@@ -0,0 +1,105 @@
+#ifndef icu4x_ZonedDateTimeFormatter_HPP
+#define icu4x_ZonedDateTimeFormatter_HPP
+
+#include "ZonedDateTimeFormatter.d.hpp"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <memory>
+#include <optional>
+#include "../diplomat_runtime.hpp"
+#include "CustomTimeZone.hpp"
+#include "DataProvider.hpp"
+#include "DateLength.hpp"
+#include "DateTime.hpp"
+#include "Error.hpp"
+#include "IsoDateTime.hpp"
+#include "IsoTimeZoneOptions.hpp"
+#include "Locale.hpp"
+#include "TimeLength.hpp"
+
+
+namespace icu4x {
+namespace capi {
+    extern "C" {
+    
+    typedef struct icu4x_ZonedDateTimeFormatter_create_with_lengths_mv1_result {union {icu4x::capi::ZonedDateTimeFormatter* ok; icu4x::capi::Error err;}; bool is_ok;} icu4x_ZonedDateTimeFormatter_create_with_lengths_mv1_result;
+    icu4x_ZonedDateTimeFormatter_create_with_lengths_mv1_result icu4x_ZonedDateTimeFormatter_create_with_lengths_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale, icu4x::capi::DateLength date_length, icu4x::capi::TimeLength time_length);
+    
+    typedef struct icu4x_ZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback_mv1_result {union {icu4x::capi::ZonedDateTimeFormatter* ok; icu4x::capi::Error err;}; bool is_ok;} icu4x_ZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback_mv1_result;
+    icu4x_ZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback_mv1_result icu4x_ZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback_mv1(const icu4x::capi::DataProvider* provider, const icu4x::capi::Locale* locale, icu4x::capi::DateLength date_length, icu4x::capi::TimeLength time_length, icu4x::capi::IsoTimeZoneOptions zone_options);
+    
+    typedef struct icu4x_ZonedDateTimeFormatter_format_datetime_with_custom_time_zone_mv1_result {union { icu4x::capi::Error err;}; bool is_ok;} icu4x_ZonedDateTimeFormatter_format_datetime_with_custom_time_zone_mv1_result;
+    icu4x_ZonedDateTimeFormatter_format_datetime_with_custom_time_zone_mv1_result icu4x_ZonedDateTimeFormatter_format_datetime_with_custom_time_zone_mv1(const icu4x::capi::ZonedDateTimeFormatter* self, const icu4x::capi::DateTime* datetime, const icu4x::capi::CustomTimeZone* time_zone, diplomat::capi::DiplomatWrite* write);
+    
+    typedef struct icu4x_ZonedDateTimeFormatter_format_iso_datetime_with_custom_time_zone_mv1_result {union { icu4x::capi::Error err;}; bool is_ok;} icu4x_ZonedDateTimeFormatter_format_iso_datetime_with_custom_time_zone_mv1_result;
+    icu4x_ZonedDateTimeFormatter_format_iso_datetime_with_custom_time_zone_mv1_result icu4x_ZonedDateTimeFormatter_format_iso_datetime_with_custom_time_zone_mv1(const icu4x::capi::ZonedDateTimeFormatter* self, const icu4x::capi::IsoDateTime* datetime, const icu4x::capi::CustomTimeZone* time_zone, diplomat::capi::DiplomatWrite* write);
+    
+    
+    void icu4x_ZonedDateTimeFormatter_destroy_mv1(ZonedDateTimeFormatter* self);
+    
+    } // extern "C"
+} // namespace capi
+} // namespace
+
+inline diplomat::result<std::unique_ptr<icu4x::ZonedDateTimeFormatter>, icu4x::Error> icu4x::ZonedDateTimeFormatter::create_with_lengths(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::DateLength date_length, icu4x::TimeLength time_length) {
+  auto result = icu4x::capi::icu4x_ZonedDateTimeFormatter_create_with_lengths_mv1(provider.AsFFI(),
+    locale.AsFFI(),
+    date_length.AsFFI(),
+    time_length.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::ZonedDateTimeFormatter>, icu4x::Error>(diplomat::Ok<std::unique_ptr<icu4x::ZonedDateTimeFormatter>>(std::unique_ptr<icu4x::ZonedDateTimeFormatter>(icu4x::ZonedDateTimeFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::ZonedDateTimeFormatter>, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::unique_ptr<icu4x::ZonedDateTimeFormatter>, icu4x::Error> icu4x::ZonedDateTimeFormatter::create_with_lengths_and_iso_8601_time_zone_fallback(const icu4x::DataProvider& provider, const icu4x::Locale& locale, icu4x::DateLength date_length, icu4x::TimeLength time_length, icu4x::IsoTimeZoneOptions zone_options) {
+  auto result = icu4x::capi::icu4x_ZonedDateTimeFormatter_create_with_lengths_and_iso_8601_time_zone_fallback_mv1(provider.AsFFI(),
+    locale.AsFFI(),
+    date_length.AsFFI(),
+    time_length.AsFFI(),
+    zone_options.AsFFI());
+  return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::ZonedDateTimeFormatter>, icu4x::Error>(diplomat::Ok<std::unique_ptr<icu4x::ZonedDateTimeFormatter>>(std::unique_ptr<icu4x::ZonedDateTimeFormatter>(icu4x::ZonedDateTimeFormatter::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::ZonedDateTimeFormatter>, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::string, icu4x::Error> icu4x::ZonedDateTimeFormatter::format_datetime_with_custom_time_zone(const icu4x::DateTime& datetime, const icu4x::CustomTimeZone& time_zone) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_ZonedDateTimeFormatter_format_datetime_with_custom_time_zone_mv1(this->AsFFI(),
+    datetime.AsFFI(),
+    time_zone.AsFFI(),
+    &write);
+  return result.is_ok ? diplomat::result<std::string, icu4x::Error>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline diplomat::result<std::string, icu4x::Error> icu4x::ZonedDateTimeFormatter::format_iso_datetime_with_custom_time_zone(const icu4x::IsoDateTime& datetime, const icu4x::CustomTimeZone& time_zone) const {
+  std::string output;
+  diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output);
+  auto result = icu4x::capi::icu4x_ZonedDateTimeFormatter_format_iso_datetime_with_custom_time_zone_mv1(this->AsFFI(),
+    datetime.AsFFI(),
+    time_zone.AsFFI(),
+    &write);
+  return result.is_ok ? diplomat::result<std::string, icu4x::Error>(diplomat::Ok<std::string>(std::move(output))) : diplomat::result<std::string, icu4x::Error>(diplomat::Err<icu4x::Error>(icu4x::Error::FromFFI(result.err)));
+}
+
+inline const icu4x::capi::ZonedDateTimeFormatter* icu4x::ZonedDateTimeFormatter::AsFFI() const {
+  return reinterpret_cast<const icu4x::capi::ZonedDateTimeFormatter*>(this);
+}
+
+inline icu4x::capi::ZonedDateTimeFormatter* icu4x::ZonedDateTimeFormatter::AsFFI() {
+  return reinterpret_cast<icu4x::capi::ZonedDateTimeFormatter*>(this);
+}
+
+inline const icu4x::ZonedDateTimeFormatter* icu4x::ZonedDateTimeFormatter::FromFFI(const icu4x::capi::ZonedDateTimeFormatter* ptr) {
+  return reinterpret_cast<const icu4x::ZonedDateTimeFormatter*>(ptr);
+}
+
+inline icu4x::ZonedDateTimeFormatter* icu4x::ZonedDateTimeFormatter::FromFFI(icu4x::capi::ZonedDateTimeFormatter* ptr) {
+  return reinterpret_cast<icu4x::ZonedDateTimeFormatter*>(ptr);
+}
+
+inline void icu4x::ZonedDateTimeFormatter::operator delete(void* ptr) {
+  icu4x::capi::icu4x_ZonedDateTimeFormatter_destroy_mv1(reinterpret_cast<icu4x::capi::ZonedDateTimeFormatter*>(ptr));
+}
+
+
+#endif // icu4x_ZonedDateTimeFormatter_HPP
diff --git a/ffi/capi/src/bidi.rs b/ffi/capi/src/bidi.rs
index 39e50513f0c..de90f55dff5 100644
--- a/ffi/capi/src/bidi.rs
+++ b/ffi/capi/src/bidi.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
     use alloc::vec::Vec;
diff --git a/ffi/capi/src/calendar.rs b/ffi/capi/src/calendar.rs
index d70953c2678..813e1648a12 100644
--- a/ffi/capi/src/calendar.rs
+++ b/ffi/capi/src/calendar.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
     use alloc::sync::Arc;
diff --git a/ffi/capi/src/casemap.rs b/ffi/capi/src/casemap.rs
index aba0db7a9a9..10eacf819a7 100644
--- a/ffi/capi/src/casemap.rs
+++ b/ffi/capi/src/casemap.rs
@@ -6,6 +6,7 @@ use icu_casemap::titlecase::TitlecaseOptions;
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/collator.rs b/ffi/capi/src/collator.rs
index 4abef19b007..5a2c044d3db 100644
--- a/ffi/capi/src/collator.rs
+++ b/ffi/capi/src/collator.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/collections_sets.rs b/ffi/capi/src/collections_sets.rs
index d5b5db98a9f..00984621b4e 100644
--- a/ffi/capi/src/collections_sets.rs
+++ b/ffi/capi/src/collections_sets.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/date.rs b/ffi/capi/src/date.rs
index 6b4231a1d77..bbaf6ed21e2 100644
--- a/ffi/capi/src/date.rs
+++ b/ffi/capi/src/date.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
     use alloc::sync::Arc;
diff --git a/ffi/capi/src/datetime.rs b/ffi/capi/src/datetime.rs
index a5c730bba6c..cf1a9f032c3 100644
--- a/ffi/capi/src/datetime.rs
+++ b/ffi/capi/src/datetime.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
     use alloc::sync::Arc;
diff --git a/ffi/capi/src/datetime_formatter.rs b/ffi/capi/src/datetime_formatter.rs
index b23e0448d24..f8818177794 100644
--- a/ffi/capi/src/datetime_formatter.rs
+++ b/ffi/capi/src/datetime_formatter.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/decimal.rs b/ffi/capi/src/decimal.rs
index a2846ca73b8..0103794f13c 100644
--- a/ffi/capi/src/decimal.rs
+++ b/ffi/capi/src/decimal.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/displaynames.rs b/ffi/capi/src/displaynames.rs
index a11e52d7b47..97fbb8ce64f 100644
--- a/ffi/capi/src/displaynames.rs
+++ b/ffi/capi/src/displaynames.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/errors.rs b/ffi/capi/src/errors.rs
index dd928c372ce..4699d68b857 100644
--- a/ffi/capi/src/errors.rs
+++ b/ffi/capi/src/errors.rs
@@ -6,6 +6,7 @@ use ffi::*;
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     #[derive(Debug, PartialEq, Eq)]
     #[repr(C)]
diff --git a/ffi/capi/src/fallbacker.rs b/ffi/capi/src/fallbacker.rs
index b5ae74fab73..a7dc3258a7c 100644
--- a/ffi/capi/src/fallbacker.rs
+++ b/ffi/capi/src/fallbacker.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/fixed_decimal.rs b/ffi/capi/src/fixed_decimal.rs
index af2507feccf..9b32f1dd322 100644
--- a/ffi/capi/src/fixed_decimal.rs
+++ b/ffi/capi/src/fixed_decimal.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/list.rs b/ffi/capi/src/list.rs
index bca11ba4d86..5a45b03ffcb 100644
--- a/ffi/capi/src/list.rs
+++ b/ffi/capi/src/list.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/locale.rs b/ffi/capi/src/locale.rs
index 444f0c21b4d..1d23eb7738e 100644
--- a/ffi/capi/src/locale.rs
+++ b/ffi/capi/src/locale.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/locale_core.rs b/ffi/capi/src/locale_core.rs
index e33f9a823a1..aede0c4ab81 100644
--- a/ffi/capi/src/locale_core.rs
+++ b/ffi/capi/src/locale_core.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/locale_directionality.rs b/ffi/capi/src/locale_directionality.rs
index 937fabe8c7d..e7abab8402a 100644
--- a/ffi/capi/src/locale_directionality.rs
+++ b/ffi/capi/src/locale_directionality.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/logging.rs b/ffi/capi/src/logging.rs
index 754a142e5f8..679e66a9e7b 100644
--- a/ffi/capi/src/logging.rs
+++ b/ffi/capi/src/logging.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/metazone_calculator.rs b/ffi/capi/src/metazone_calculator.rs
index 723588029ed..431ee99ec64 100644
--- a/ffi/capi/src/metazone_calculator.rs
+++ b/ffi/capi/src/metazone_calculator.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/normalizer.rs b/ffi/capi/src/normalizer.rs
index ff588651884..a80919fbd01 100644
--- a/ffi/capi/src/normalizer.rs
+++ b/ffi/capi/src/normalizer.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/normalizer_properties.rs b/ffi/capi/src/normalizer_properties.rs
index 0b2f51d2111..573f0923d64 100644
--- a/ffi/capi/src/normalizer_properties.rs
+++ b/ffi/capi/src/normalizer_properties.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/pluralrules.rs b/ffi/capi/src/pluralrules.rs
index d097f63b115..3bd18c70397 100644
--- a/ffi/capi/src/pluralrules.rs
+++ b/ffi/capi/src/pluralrules.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/properties_iter.rs b/ffi/capi/src/properties_iter.rs
index 0d86f202dc1..902804aa26c 100644
--- a/ffi/capi/src/properties_iter.rs
+++ b/ffi/capi/src/properties_iter.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
     use core::ops::RangeInclusive;
diff --git a/ffi/capi/src/properties_maps.rs b/ffi/capi/src/properties_maps.rs
index d85a277880b..fd337965f7f 100644
--- a/ffi/capi/src/properties_maps.rs
+++ b/ffi/capi/src/properties_maps.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/properties_names.rs b/ffi/capi/src/properties_names.rs
index 61f05faf7b8..171ee5c5bac 100644
--- a/ffi/capi/src/properties_names.rs
+++ b/ffi/capi/src/properties_names.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/properties_sets.rs b/ffi/capi/src/properties_sets.rs
index 20d35cc0016..0d521353c04 100644
--- a/ffi/capi/src/properties_sets.rs
+++ b/ffi/capi/src/properties_sets.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/properties_unisets.rs b/ffi/capi/src/properties_unisets.rs
index 5cc67caf0b9..556e3031b5d 100644
--- a/ffi/capi/src/properties_unisets.rs
+++ b/ffi/capi/src/properties_unisets.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/provider.rs b/ffi/capi/src/provider.rs
index 18661ac0b6a..ff6484614e5 100644
--- a/ffi/capi/src/provider.rs
+++ b/ffi/capi/src/provider.rs
@@ -15,6 +15,7 @@ pub enum DataProviderInner {
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/script.rs b/ffi/capi/src/script.rs
index cdb168f02fc..30f8a6a449a 100644
--- a/ffi/capi/src/script.rs
+++ b/ffi/capi/src/script.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/segmenter_grapheme.rs b/ffi/capi/src/segmenter_grapheme.rs
index 0c65731bd5f..10124c38121 100644
--- a/ffi/capi/src/segmenter_grapheme.rs
+++ b/ffi/capi/src/segmenter_grapheme.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/segmenter_line.rs b/ffi/capi/src/segmenter_line.rs
index fbcb3633df8..c5de93fa83f 100644
--- a/ffi/capi/src/segmenter_line.rs
+++ b/ffi/capi/src/segmenter_line.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/segmenter_sentence.rs b/ffi/capi/src/segmenter_sentence.rs
index be3b8929387..2a14101c46d 100644
--- a/ffi/capi/src/segmenter_sentence.rs
+++ b/ffi/capi/src/segmenter_sentence.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/segmenter_word.rs b/ffi/capi/src/segmenter_word.rs
index f52173c2b66..6f2a097a65d 100644
--- a/ffi/capi/src/segmenter_word.rs
+++ b/ffi/capi/src/segmenter_word.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/time.rs b/ffi/capi/src/time.rs
index a7b420a3553..4f5f130e704 100644
--- a/ffi/capi/src/time.rs
+++ b/ffi/capi/src/time.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/timezone.rs b/ffi/capi/src/timezone.rs
index f69c132ff6f..87d828a0b48 100644
--- a/ffi/capi/src/timezone.rs
+++ b/ffi/capi/src/timezone.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
     use core::fmt::Write;
diff --git a/ffi/capi/src/timezone_formatter.rs b/ffi/capi/src/timezone_formatter.rs
index 75233ea7a45..62dfcc61b19 100644
--- a/ffi/capi/src/timezone_formatter.rs
+++ b/ffi/capi/src/timezone_formatter.rs
@@ -25,6 +25,7 @@ macro_rules! call_method {
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/timezone_mapper.rs b/ffi/capi/src/timezone_mapper.rs
index 57d8d55c857..73f7d011188 100644
--- a/ffi/capi/src/timezone_mapper.rs
+++ b/ffi/capi/src/timezone_mapper.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
     use writeable::Writeable;
diff --git a/ffi/capi/src/units_converter.rs b/ffi/capi/src/units_converter.rs
index dc1a79ed044..c88cd14e650 100644
--- a/ffi/capi/src/units_converter.rs
+++ b/ffi/capi/src/units_converter.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/week.rs b/ffi/capi/src/week.rs
index f3cd716a15d..748c3983bcb 100644
--- a/ffi/capi/src/week.rs
+++ b/ffi/capi/src/week.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/ffi/capi/src/zoned_formatter.rs b/ffi/capi/src/zoned_formatter.rs
index 091902b354e..a4568b10684 100644
--- a/ffi/capi/src/zoned_formatter.rs
+++ b/ffi/capi/src/zoned_formatter.rs
@@ -4,6 +4,7 @@
 
 #[diplomat::bridge]
 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
+#[diplomat::attr(*, namespace = "icu4x")]
 pub mod ffi {
     use alloc::boxed::Box;
 
diff --git a/tutorials/cpp/bidi.cpp b/tutorials/cpp/bidi.cpp
index 53f632eaf7a..a5160779d37 100644
--- a/tutorials/cpp/bidi.cpp
+++ b/tutorials/cpp/bidi.cpp
@@ -2,12 +2,14 @@
 // called LICENSE at the top level of the ICU4X source tree
 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
 
-#include "DataProvider.hpp"
-#include "Bidi.hpp"
-#include "Logger.hpp"
+#include <icu4x/DataProvider.hpp>
+#include <icu4x/Bidi.hpp>
+#include <icu4x/Logger.hpp>
 
 #include <iostream>
 
+using namespace icu4x;
+
 int main() {
     std::unique_ptr<DataProvider> dp = DataProvider::compiled();
     std::unique_ptr<Bidi> bidi = Bidi::create(*dp.get()).ok().value();
diff --git a/tutorials/cpp/casemapping.cpp b/tutorials/cpp/casemapping.cpp
index 194bb317c91..2c905c7c206 100644
--- a/tutorials/cpp/casemapping.cpp
+++ b/tutorials/cpp/casemapping.cpp
@@ -2,14 +2,16 @@
 // called LICENSE at the top level of the ICU4X source tree
 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
 
-#include "CaseMapper.hpp"
-#include "Logger.hpp"
-#include "DataProvider.hpp"
-#include "CodePointSetBuilder.hpp"
-#include "TitlecaseOptionsV1.hpp"
+#include <icu4x/CaseMapper.hpp>
+#include <icu4x/Logger.hpp>
+#include <icu4x/DataProvider.hpp>
+#include <icu4x/CodePointSetBuilder.hpp>
+#include <icu4x/TitlecaseOptionsV1.hpp>
 
 #include <iostream>
 
+using namespace icu4x;
+
 int main() {
     Logger::init_simple_logger();
     std::unique_ptr<Locale> und = Locale::from_string("und").ok().value();
diff --git a/tutorials/cpp/collator.cpp b/tutorials/cpp/collator.cpp
index 8c61b23e66b..379a533e76f 100644
--- a/tutorials/cpp/collator.cpp
+++ b/tutorials/cpp/collator.cpp
@@ -2,14 +2,16 @@
 // called LICENSE at the top level of the ICU4X source tree
 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
 
-#include "Collator.hpp"
-#include "DataProvider.hpp"
-#include "Locale.hpp"
-#include "Logger.hpp"
+#include <icu4x/Collator.hpp>
+#include <icu4x/DataProvider.hpp>
+#include <icu4x/Locale.hpp>
+#include <icu4x/Logger.hpp>
 
 #include <iostream>
 #include <string_view>
 
+using namespace icu4x;
+
 int main() {
   Logger::init_simple_logger();
   std::unique_ptr<DataProvider> dp = DataProvider::compiled();
diff --git a/tutorials/cpp/datetime.cpp b/tutorials/cpp/datetime.cpp
index 92487ef5c6a..f71cff87214 100644
--- a/tutorials/cpp/datetime.cpp
+++ b/tutorials/cpp/datetime.cpp
@@ -2,21 +2,23 @@
 // called LICENSE at the top level of the ICU4X source tree
 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
 
-#include "GregorianDateFormatter.hpp"
-#include "GregorianDateTimeFormatter.hpp"
-#include "DateTimeFormatter.hpp"
-#include "TimeFormatter.hpp"
-#include "Logger.hpp"
-#include "CustomTimeZone.hpp"
-#include "TimeZoneIdMapper.hpp"
-#include "TimeZoneIdMapperWithFastCanonicalization.hpp"
-#include "GregorianZonedDateTimeFormatter.hpp"
-#include "ZonedDateTimeFormatter.hpp"
+#include <icu4x/GregorianDateFormatter.hpp>
+#include <icu4x/GregorianDateTimeFormatter.hpp>
+#include <icu4x/DateTimeFormatter.hpp>
+#include <icu4x/TimeFormatter.hpp>
+#include <icu4x/Logger.hpp>
+#include <icu4x/CustomTimeZone.hpp>
+#include <icu4x/TimeZoneIdMapper.hpp>
+#include <icu4x/TimeZoneIdMapperWithFastCanonicalization.hpp>
+#include <icu4x/GregorianZonedDateTimeFormatter.hpp>
+#include <icu4x/ZonedDateTimeFormatter.hpp>
 
 #include <atomic>
 #include <iostream>
 #include <array>
 
+using namespace icu4x;
+
 int main() {
     Logger::init_simple_logger();
     std::unique_ptr<Locale> locale = Locale::from_string("es").ok().value();
diff --git a/tutorials/cpp/fixeddecimal.cpp b/tutorials/cpp/fixeddecimal.cpp
index b42c0c7ce08..faad6275fea 100644
--- a/tutorials/cpp/fixeddecimal.cpp
+++ b/tutorials/cpp/fixeddecimal.cpp
@@ -2,12 +2,14 @@
 // called LICENSE at the top level of the ICU4X source tree
 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
 
-#include "FixedDecimalFormatter.hpp"
-#include "Logger.hpp"
+#include <icu4x/FixedDecimalFormatter.hpp>
+#include <icu4x/Logger.hpp>
 
 #include <iostream>
 #include <array>
 
+using namespace icu4x;
+
 int main() {
     Logger::init_simple_logger();
     std::unique_ptr<Locale> locale = Locale::from_string("bn").ok().value();
diff --git a/tutorials/cpp/locale.cpp b/tutorials/cpp/locale.cpp
index fe15f4f0dba..78de052440a 100644
--- a/tutorials/cpp/locale.cpp
+++ b/tutorials/cpp/locale.cpp
@@ -2,11 +2,13 @@
 // called LICENSE at the top level of the ICU4X source tree
 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
 
-#include "Locale.hpp"
-#include "Logger.hpp"
+#include <icu4x/Locale.hpp>
+#include <icu4x/Logger.hpp>
 
 #include <iostream>
 
+using namespace icu4x;
+
 static bool test_locale(Locale &locale, std::string_view expectedString,
                         const char *message) {
   std::string actualString = locale.to_string();
diff --git a/tutorials/cpp/pluralrules.cpp b/tutorials/cpp/pluralrules.cpp
index 758f97617e5..780e2a19b66 100644
--- a/tutorials/cpp/pluralrules.cpp
+++ b/tutorials/cpp/pluralrules.cpp
@@ -2,11 +2,13 @@
 // called LICENSE at the top level of the ICU4X source tree
 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
 
-#include "PluralRules.hpp"
-#include "Logger.hpp"
+#include <icu4x/PluralRules.hpp>
+#include <icu4x/Logger.hpp>
 
 #include <iostream>
 
+using namespace icu4x;
+
 const std::string_view path = "../../provider/source/data/debug/";
 
 int main() {
diff --git a/tutorials/cpp/properties.cpp b/tutorials/cpp/properties.cpp
index 5ddd4e0dfbd..0fb99822459 100644
--- a/tutorials/cpp/properties.cpp
+++ b/tutorials/cpp/properties.cpp
@@ -2,16 +2,18 @@
 // called LICENSE at the top level of the ICU4X source tree
 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
 
-#include "CodePointSetData.hpp"
-#include "UnicodeSetData.hpp"
-#include "CodePointMapData16.hpp"
-#include "CodePointMapData8.hpp"
-#include "PropertyValueNameToEnumMapper.hpp"
-#include "GeneralCategoryNameToMaskMapper.hpp"
-#include "Logger.hpp"
+#include <icu4x/CodePointSetData.hpp>
+#include <icu4x/UnicodeSetData.hpp>
+#include <icu4x/CodePointMapData16.hpp>
+#include <icu4x/CodePointMapData8.hpp>
+#include <icu4x/PropertyValueNameToEnumMapper.hpp>
+#include <icu4x/GeneralCategoryNameToMaskMapper.hpp>
+#include <icu4x/Logger.hpp>
 
 #include <iostream>
 
+using namespace icu4x;
+
 int test_set_property(CodePointSetData* data, char32_t included, char32_t excluded) {
     bool contains1 = data->contains(included);
     bool contains2 = data->contains(excluded);
diff --git a/tutorials/cpp/segmenter.cpp b/tutorials/cpp/segmenter.cpp
index 7e8b316f316..e5edb51c0a2 100644
--- a/tutorials/cpp/segmenter.cpp
+++ b/tutorials/cpp/segmenter.cpp
@@ -2,16 +2,18 @@
 // called LICENSE at the top level of the ICU4X source tree
 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
 
-#include "DataProvider.hpp"
-#include "GraphemeClusterSegmenter.hpp"
-#include "LineSegmenter.hpp"
-#include "SentenceSegmenter.hpp"
-#include "WordSegmenter.hpp"
-#include "Logger.hpp"
+#include <icu4x/DataProvider.hpp>
+#include <icu4x/GraphemeClusterSegmenter.hpp>
+#include <icu4x/LineSegmenter.hpp>
+#include <icu4x/SentenceSegmenter.hpp>
+#include <icu4x/WordSegmenter.hpp>
+#include <icu4x/Logger.hpp>
 
 #include <iostream>
 #include <string_view>
 
+using namespace icu4x;
+
 using std::cout;
 using std::endl;
 
diff --git a/tutorials/cpp/units_converter.cpp b/tutorials/cpp/units_converter.cpp
index c6ae29cc1c9..4ef8fbcf835 100644
--- a/tutorials/cpp/units_converter.cpp
+++ b/tutorials/cpp/units_converter.cpp
@@ -2,14 +2,16 @@
 // called LICENSE at the top level of the ICU4X source tree
 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
 
-#include "DataProvider.hpp"
-#include "MeasureUnit.hpp"
-#include "MeasureUnitParser.hpp"
-#include "UnitsConverter.hpp"
-#include "UnitsConverterFactory.hpp"
+#include <icu4x/DataProvider.hpp>
+#include <icu4x/MeasureUnit.hpp>
+#include <icu4x/MeasureUnitParser.hpp>
+#include <icu4x/UnitsConverter.hpp>
+#include <icu4x/UnitsConverterFactory.hpp>
 
 #include <iostream>
 
+using namespace icu4x;
+
 int main() {
   auto dp = DataProvider::compiled();
   auto converter_factory = UnitsConverterFactory::create(*dp.get()).ok().value();