#ifndef RANGE_BASED_CASE_CONVERTED_HDR
#define RANGE_BASED_CASE_CONVERTED_HDR

#include "case_tables.hpp"

class RangeBasedCaseConverter {

public:
    RangeBasedCaseConverter(size_t tableSize, const CaseConversionRecord* conversionTable)
        :tableSize_(tableSize), conversionTable_(conversionTable) {
    }

    uint32_t convert(uint32_t code_point) const;

private:
    const CaseConversionRecord* findRecord_(uint32_t code_point) const;
    uint32_t applyRecord_(const CaseConversionRecord* conversionRecord, uint32_t code_point) const;
    bool shouldBeSkipped_(
        const CaseConversionRecord* conversionRecord, uint32_t code_point) const;
    bool isSkipRecord_(const CaseConversionRecord* conversionRecord) const;
    uint32_t applyDelta_(int32_t delta, uint32_t code_point) const;

    size_t tableSize_;
    const CaseConversionRecord* conversionTable_;
};

#endif