view foosdk/sdk/pfc/charDownConvert.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
line wrap: on
line source

#pragma once
#include "string_base.h"
#include "fixed_map.h"

// This converts to ASCII *and* lowercases for simplified search matching
namespace pfc {
    class CharStorage {
    public:
        CharStorage() { }
        template<typename TSource> CharStorage(const TSource& in) { Import(in); }
        template<typename TSource> const CharStorage& operator=(const TSource& in) { Import(in); return *this; }

        const char* ptr() const { return m_data; }

        void Import(t_uint32 c) {
            t_size l = pfc::utf8_encode_char(c, m_data);
            m_data[l] = 0;
        }
        void Import(const char* c) {
            PFC_ASSERT(strlen(c) < PFC_TABSIZE(m_data));
#ifdef _MSC_VER
            strcpy_s(m_data, c);
#else
            strcpy(m_data, c);
#endif
        }

        char m_data[16] = {};
    };

    class CharDownConvert {
    public:
        CharDownConvert();

        void TransformCharCachedAppend(t_uint32 c, pfc::string_base& out);
        void TransformStringAppend(pfc::string_base& out, const char* src, size_t len = SIZE_MAX);
        void TransformStringHere(pfc::string_base& out, const char* src, size_t len = SIZE_MAX);
        string8 TransformString(const char* src) { pfc::string8 ret; TransformStringAppend(ret, src); return ret; }
        void TransformString(pfc::string_base& out, const char* src) {
            out.reset(); TransformStringAppend(out, src);
        }

        static CharDownConvert& instance();

        struct charMapping_t {
            uint16_t from, to;
        };
        static const charMapping_t* mappings();
        static size_t numMappings();

    private:
        fixed_map<uint32_t, CharStorage> m_charConvertMap;
    };
}