#pragma once
#include <string>

namespace texty { namespace unicode {

enum class UnicodeBlock {
  AEGEAN_NUMBERS,
  AHOM,
  ALCHEMICAL_SYMBOLS,
  ALPHABETIC_PRESENTATION_FORMS,
  ANATOLIAN_HIEROGLYPHS,
  ANCIENT_GREEK_MUSICAL_NOTATION,
  ANCIENT_GREEK_NUMBERS,
  ANCIENT_SYMBOLS,
  ARABIC,
  ARABIC_EXTENDED_A,
  ARABIC_MATHEMATICAL_ALPHABETIC_SYMBOLS,
  ARABIC_PRESENTATION_FORMS_A,
  ARABIC_PRESENTATION_FORMS_B,
  ARABIC_SUPPLEMENT,
  ARMENIAN,
  ARROWS,
  AVESTAN,
  BALINESE,
  BAMUM,
  BAMUM_SUPPLEMENT,
  BASIC_LATIN,
  BASSA_VAH,
  BATAK,
  BENGALI,
  BLOCK_ELEMENTS,
  BOPOMOFO,
  BOPOMOFO_EXTENDED,
  BOX_DRAWING,
  BRAHMI,
  BRAILLE_PATTERNS,
  BUGINESE,
  BUHID,
  BYZANTINE_MUSICAL_SYMBOLS,
  CJK_COMPATIBILITY,
  CJK_COMPATIBILITY_FORMS,
  CJK_COMPATIBILITY_IDEOGRAPHS,
  CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT,
  CJK_RADICALS_SUPPLEMENT,
  CJK_STROKES,
  CJK_SYMBOLS_AND_PUNCTUATION,
  CJK_UNIFIED_IDEOGRAPHS,
  CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A,
  CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B,
  CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C,
  CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D,
  CJK_UNIFIED_IDEOGRAPHS_EXTENSION_E,
  CARIAN,
  CAUCASIAN_ALBANIAN,
  CHAKMA,
  CHAM,
  CHEROKEE,
  CHEROKEE_SUPPLEMENT,
  COMBINING_DIACRITICAL_MARKS,
  COMBINING_DIACRITICAL_MARKS_EXTENDED,
  COMBINING_DIACRITICAL_MARKS_SUPPLEMENT,
  COMBINING_DIACRITICAL_MARKS_FOR_SYMBOLS,
  COMBINING_HALF_MARKS,
  COMMON_INDIC_NUMBER_FORMS,
  CONTROL_PICTURES,
  COPTIC,
  COPTIC_EPACT_NUMBERS,
  COUNTING_ROD_NUMERALS,
  CUNEIFORM,
  CUNEIFORM_NUMBERS_AND_PUNCTUATION,
  CURRENCY_SYMBOLS,
  CYPRIOT_SYLLABARY,
  CYRILLIC,
  CYRILLIC_EXTENDED_A,
  CYRILLIC_EXTENDED_B,
  CYRILLIC_SUPPLEMENT,
  DESERET,
  DEVANAGARI,
  DEVANAGARI_EXTENDED,
  DINGBATS,
  DOMINO_TILES,
  DUPLOYAN,
  EARLY_DYNASTIC_CUNEIFORM,
  EGYPTIAN_HIEROGLYPHS,
  ELBASAN,
  EMOTICONS,
  ENCLOSED_ALPHANUMERIC_SUPPLEMENT,
  ENCLOSED_ALPHANUMERICS,
  ENCLOSED_CJK_LETTERS_AND_MONTHS,
  ENCLOSED_IDEOGRAPHIC_SUPPLEMENT,
  ETHIOPIC,
  ETHIOPIC_EXTENDED,
  ETHIOPIC_EXTENDED_A,
  ETHIOPIC_SUPPLEMENT,
  GENERAL_PUNCTUATION,
  GEOMETRIC_SHAPES,
  GEOMETRIC_SHAPES_EXTENDED,
  GEORGIAN,
  GEORGIAN_SUPPLEMENT,
  GLAGOLITIC,
  GOTHIC,
  GRANTHA,
  GREEK_EXTENDED,
  GREEK_AND_COPTIC,
  GUJARATI,
  GURMUKHI,
  HALFWIDTH_AND_FULLWIDTH_FORMS,
  HANGUL_COMPATIBILITY_JAMO,
  HANGUL_JAMO,
  HANGUL_JAMO_EXTENDED_A,
  HANGUL_JAMO_EXTENDED_B,
  HANGUL_SYLLABLES,
  HANUNOO,
  HATRAN,
  HEBREW,
  HIGH_PRIVATE_USE_SURROGATES,
  HIGH_SURROGATES,
  HIRAGANA,
  IPA_EXTENSIONS,
  IDEOGRAPHIC_DESCRIPTION_CHARACTERS,
  IMPERIAL_ARAMAIC,
  INSCRIPTIONAL_PAHLAVI,
  INSCRIPTIONAL_PARTHIAN,
  JAVANESE,
  KAITHI,
  KANA_SUPPLEMENT,
  KANBUN,
  KANGXI_RADICALS,
  KANNADA,
  KATAKANA,
  KATAKANA_PHONETIC_EXTENSIONS,
  KAYAH_LI,
  KHAROSHTHI,
  KHMER,
  KHMER_SYMBOLS,
  KHOJKI,
  KHUDAWADI,
  LAO,
  LATIN_EXTENDED_ADDITIONAL,
  LATIN_EXTENDED_A,
  LATIN_EXTENDED_B,
  LATIN_EXTENDED_C,
  LATIN_EXTENDED_D,
  LATIN_EXTENDED_E,
  LATIN_1_SUPPLEMENT,
  LEPCHA,
  LETTERLIKE_SYMBOLS,
  LIMBU,
  LINEAR_A,
  LINEAR_B_IDEOGRAMS,
  LINEAR_B_SYLLABARY,
  LISU,
  LOW_SURROGATES,
  LYCIAN,
  LYDIAN,
  MAHAJANI,
  MAHJONG_TILES,
  MALAYALAM,
  MANDAIC,
  MANICHAEAN,
  MATHEMATICAL_ALPHANUMERIC_SYMBOLS,
  MATHEMATICAL_OPERATORS,
  MEETEI_MAYEK,
  MEETEI_MAYEK_EXTENSIONS,
  MENDE_KIKAKUI,
  MEROITIC_CURSIVE,
  MEROITIC_HIEROGLYPHS,
  MIAO,
  MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A,
  MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B,
  MISCELLANEOUS_SYMBOLS,
  MISCELLANEOUS_SYMBOLS_AND_ARROWS,
  MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS,
  MISCELLANEOUS_TECHNICAL,
  MODI,
  MODIFIER_TONE_LETTERS,
  MONGOLIAN,
  MRO,
  MULTANI,
  MUSICAL_SYMBOLS,
  MYANMAR,
  MYANMAR_EXTENDED_A,
  MYANMAR_EXTENDED_B,
  NKO,
  NABATAEAN,
  NEW_TAI_LUE,
  NUMBER_FORMS,
  OGHAM,
  OL_CHIKI,
  OLD_HUNGARIAN,
  OLD_ITALIC,
  OLD_NORTH_ARABIAN,
  OLD_PERMIC,
  OLD_PERSIAN,
  OLD_SOUTH_ARABIAN,
  OLD_TURKIC,
  OPTICAL_CHARACTER_RECOGNITION,
  ORIYA,
  ORNAMENTAL_DINGBATS,
  OSMANYA,
  PAHAWH_HMONG,
  PALMYRENE,
  PAU_CIN_HAU,
  PHAGS_PA,
  PHAISTOS_DISC,
  PHOENICIAN,
  PHONETIC_EXTENSIONS,
  PHONETIC_EXTENSIONS_SUPPLEMENT,
  PLAYING_CARDS,
  PRIVATE_USE_AREA,
  PSALTER_PAHLAVI,
  REJANG,
  RUMI_NUMERAL_SYMBOLS,
  RUNIC,
  SAMARITAN,
  SAURASHTRA,
  SHARADA,
  SHAVIAN,
  SHORTHAND_FORMAT_CONTROLS,
  SIDDHAM,
  SINHALA,
  SINHALA_ARCHAIC_NUMBERS,
  SMALL_FORM_VARIANTS,
  SORA_SOMPENG,
  SPACING_MODIFIER_LETTERS,
  SPECIALS,
  SUNDANESE,
  SUNDANESE_SUPPLEMENT,
  SUPERSCRIPTS_AND_SUBSCRIPTS,
  SUPPLEMENTAL_ARROWS_A,
  SUPPLEMENTAL_ARROWS_B,
  SUPPLEMENTAL_ARROWS_C,
  SUPPLEMENTAL_MATHEMATICAL_OPERATORS,
  SUPPLEMENTAL_PUNCTUATION,
  SUPPLEMENTAL_SYMBOLS_AND_PICTOGRAPHS,
  SUPPLEMENTARY_PRIVATE_USE_AREA_A,
  SUPPLEMENTARY_PRIVATE_USE_AREA_B,
  SUTTON_SIGNWRITING,
  SYLOTI_NAGRI,
  SYRIAC,
  TAGALOG,
  TAGBANWA,
  TAGS,
  TAI_LE,
  TAI_THAM,
  TAI_VIET,
  TAI_XUAN_JING_SYMBOLS,
  TAKRI,
  TAMIL,
  TELUGU,
  THAANA,
  THAI,
  TIBETAN,
  TIFINAGH,
  TIRHUTA,
  TRANSPORT_AND_MAP_SYMBOLS,
  UGARITIC,
  UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS,
  UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED,
  VAI,
  VARIATION_SELECTORS,
  VARIATION_SELECTORS_SUPPLEMENT,
  VEDIC_EXTENSIONS,
  VERTICAL_FORMS,
  WARANG_CITI,
  YI_RADICALS,
  YI_SYLLABLES,
  YIJING_HEXAGRAM_SYMBOLS,
  UNKNOWN
};

UnicodeBlock getUnicodeBlock(uint32_t codePoint);

std::string stringOfUnicodeBlock(UnicodeBlock block);

}} // texty::unicode
