#pragma once

#include <string>

namespace lsp::utils
{
    // ==================== 字符串工具 ====================
    std::string Trim(const std::string& str);
    std::string ToLower(const std::string& str);
    std::string ToUpper(const std::string& str);

    // ==================== 大小写敏感比较 ====================
    bool StartsWith(const std::string& str, const std::string& prefix);
    bool EndsWith(const std::string& str, const std::string& suffix);

    // ==================== 大小写不敏感比较 ====================
    bool IEquals(const std::string& a, const std::string& b);
    bool IStartsWith(const std::string& str, const std::string& prefix);
    bool IEndsWith(const std::string& str, const std::string& suffix);
    int ICompare(const std::string& a, const std::string& b);
    size_t IHash(const std::string& str);

    // ==================== STL 容器比较器 ====================
    struct IHasher
    {
        size_t operator()(const std::string& key) const
        {
            return IHash(key);
        }
    };

    struct IEqualTo
    {
        bool operator()(const std::string& a, const std::string& b) const
        {
            return IEquals(a, b);
        }
    };

    struct ILess
    {
        bool operator()(const std::string& a, const std::string& b) const
        {
            return ICompare(a, b) < 0;
        }
    };
}
