1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 23:47:45 +00:00

LibTextCodec: Add "process" API for allocation-free code point iteration

This commit adds a new process method to all Decoder subclasses which
do what to_utf8 used to do, and allows callers to customize the handling
of individiual UTF-8 code points through a callback. Decoder::to_utf8
now uses this API to generate a string via StringBuilder, preserving the
original behavior.
This commit is contained in:
sin-ack 2021-08-29 11:44:28 +00:00 committed by Andreas Kling
parent 68bf6db673
commit e6818388e4
2 changed files with 50 additions and 40 deletions

View file

@ -7,12 +7,14 @@
#pragma once
#include <AK/Forward.h>
#include <AK/Function.h>
namespace TextCodec {
class Decoder {
public:
virtual String to_utf8(const StringView&) = 0;
virtual void process(StringView const&, Function<void(u32)> on_code_point) = 0;
virtual String to_utf8(StringView const&);
protected:
virtual ~Decoder() = default;
@ -20,45 +22,47 @@ protected:
class UTF8Decoder final : public Decoder {
public:
virtual String to_utf8(const StringView&) override;
virtual void process(StringView const&, Function<void(u32)> on_code_point) override;
virtual String to_utf8(StringView const&) override;
};
class UTF16BEDecoder final : public Decoder {
public:
virtual String to_utf8(const StringView&) override;
virtual void process(StringView const&, Function<void(u32)> on_code_point) override;
virtual String to_utf8(StringView const&) override;
};
class Latin1Decoder final : public Decoder {
public:
virtual String to_utf8(const StringView&) override;
virtual void process(StringView const&, Function<void(u32)> on_code_point) override;
};
class Latin2Decoder final : public Decoder {
public:
virtual String to_utf8(const StringView&) override;
virtual void process(StringView const&, Function<void(u32)> on_code_point) override;
};
class HebrewDecoder final : public Decoder {
public:
virtual String to_utf8(const StringView&) override;
virtual void process(StringView const&, Function<void(u32)> on_code_point) override;
};
class CyrillicDecoder final : public Decoder {
public:
virtual String to_utf8(const StringView&) override;
virtual void process(StringView const&, Function<void(u32)> on_code_point) override;
};
class Latin9Decoder final : public Decoder {
public:
virtual String to_utf8(const StringView&) override;
virtual void process(StringView const&, Function<void(u32)> on_code_point) override;
};
class TurkishDecoder final : public Decoder {
public:
virtual String to_utf8(const StringView&) override;
virtual void process(StringView const&, Function<void(u32)> on_code_point) override;
};
Decoder* decoder_for(const String& encoding);
Decoder* decoder_for(String const& encoding);
Optional<String> get_standardized_encoding(const String& encoding);
}