#pragma once #include #include namespace xicu { class PropTable { public: PropTable() = default; explicit PropTable(const char* path); ~PropTable(); PropTable(const PropTable&) = delete; PropTable& operator=(const PropTable&) = delete; PropTable(PropTable&& other) noexcept; PropTable& operator=(PropTable&& other) noexcept; bool load(const char* path); bool isLoaded() const { return data_ != nullptr; } std::string_view getName(uint32_t cp) const; bool getPunctuation(uint32_t cp) const; bool getLetter(uint32_t cp) const; int32_t getUppercase_map(uint32_t cp) const; int32_t getLowercase_map(uint32_t cp) const; bool getWhitespace(uint32_t cp) const; bool getSpace(uint32_t cp) const; bool getDecimal(uint32_t cp) const; int32_t getDecimal_val(uint32_t cp) const; private: const uint8_t* data_ = nullptr; size_t data_size_ = 0; bool owns_data_ = false; static uint32_t readVarint(const uint8_t*& ptr); const uint8_t* findFieldData(const char* name, uint8_t& out_type, uint8_t& out_strat) const; const uint8_t* findStringField(const char* name) const; // Decoders bool decodeBitmap(const uint8_t* data, uint32_t cp) const; bool decodeDeltaRangesBool(const uint8_t* data, const uint8_t* data_end, uint32_t cp) const; int32_t decodeDeltaRangesInt(const uint8_t* data, const uint8_t* data_end, uint32_t cp) const; bool decodeSparseMapBool(const uint8_t* data, const uint8_t* data_end, uint32_t cp) const; int32_t decodeSparseMapInt(const uint8_t* data, const uint8_t* data_end, uint32_t cp) const; }; inline std::string_view getName(uint32_t cp) { static PropTable table("../out/xicu.bin"); return table.getName(cp); } inline bool isPunctuation(uint32_t cp) { static PropTable table("../out/xicu.bin"); return table.getPunctuation(cp); } inline bool isLetter(uint32_t cp) { static PropTable table("../out/xicu.bin"); return table.getLetter(cp); } inline int32_t getUppercase_map(uint32_t cp) { static PropTable table("../out/xicu.bin"); return table.getUppercase_map(cp); } inline int32_t getLowercase_map(uint32_t cp) { static PropTable table("../out/xicu.bin"); return table.getLowercase_map(cp); } inline bool isWhitespace(uint32_t cp) { static PropTable table("../out/xicu.bin"); return table.getWhitespace(cp); } inline bool isSpace(uint32_t cp) { static PropTable table("../out/xicu.bin"); return table.getSpace(cp); } inline bool isDecimal(uint32_t cp) { static PropTable table("../out/xicu.bin"); return table.getDecimal(cp); } inline int32_t getDecimal_val(uint32_t cp) { static PropTable table("../out/xicu.bin"); return table.getDecimal_val(cp); } } // namespace xicu