static bool matches(const String& u1, const String& g1, const String& u2, const String& g2, const SVGKerningPair& kerningPair)
{
    if (!stringMatchesUnicodeRange(u1, kerningPair.unicodeRange1, kerningPair.unicodeName1)
        && !stringMatchesGlyphName(g1, kerningPair.glyphName1))
        return false;

    if (!stringMatchesUnicodeRange(u2, kerningPair.unicodeRange2, kerningPair.unicodeName2)
        && !stringMatchesGlyphName(g2, kerningPair.glyphName2))
        return false;

    return true;
}
static inline bool matches(const String& u1, const String& u2, const String& g2, const SVGKerningPair& svgKerningPair)
{
    return stringMatchesUnicodeRange(u1, svgKerningPair.unicodeRange1) && matches(u2, g2, svgKerningPair);
}
static inline bool matches(const String& u2, const String& g2, const SVGKerning& svgKerning)
{
    return stringMatchesGlyphName(g2, svgKerning.glyphName2)
        || stringMatchesUnicodeName(u2, svgKerning.unicodeName2)
        || stringMatchesUnicodeRange(u2, svgKerning.unicodeRange2);
}