X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fstringcodec%2Fcodec.h;h=f53bae5ba1d8ee86de0d469629ff21daad4b57d1;hb=6af098355f2b037a6f8084f9f6c741e462ffa614;hp=c70e052dd1b35e819a591327777f8eec4dbdc9bd;hpb=d3fc0bf0f20f100f2831188c1ce21461d21c2c7a;p=libs%2Fcore.git diff --git a/source/stringcodec/codec.h b/source/stringcodec/codec.h index c70e052..f53bae5 100644 --- a/source/stringcodec/codec.h +++ b/source/stringcodec/codec.h @@ -2,6 +2,7 @@ #define MSP_STRINGCODEC_CODEC_H_ #include +#include #include "except.h" #include "ustring.h" @@ -25,7 +26,7 @@ Unicode strings are represented as ustrings. An std::string is considered to be an encoded sequence of bytes. A codec is able to determine if an encoded string could be decoded with it. */ -class Codec +class MSPCORE_API Codec { public: /** @@ -36,14 +37,14 @@ public: may find it useful or necessary to implement some other functions too (particularly sync and reset for stateful codecs). */ - class Encoder + class MSPCORE_API Encoder { protected: - ErrorMode err_mode; + ErrorMode err_mode = THROW_ON_ERROR; - Encoder(ErrorMode em): err_mode(em) { } + Encoder(ErrorMode em): err_mode(em==DEFAULT ? THROW_ON_ERROR : em) { } public: - virtual ~Encoder() { } + virtual ~Encoder() = default; /** Encodes a single unicode character. If the character can't be represented in this encoding, error() should be called. */ @@ -87,14 +88,14 @@ public: Each codec class should contain an Decoder class derived from this. */ - class Decoder + class MSPCORE_API Decoder { protected: - ErrorMode err_mode; + ErrorMode err_mode = THROW_ON_ERROR; - Decoder(ErrorMode em): err_mode(em) { } + Decoder(ErrorMode em): err_mode(em==DEFAULT ? THROW_ON_ERROR : em) { } public: - virtual ~Decoder() { } + virtual ~Decoder() = default; /** Decodes a single character from a string. The iterator is advanced to the next character. For stateful codecs, -1 may be returned if a @@ -131,9 +132,9 @@ public: }; protected: - Codec() { } + Codec() = default; public: - virtual ~Codec() { } + virtual ~Codec() = default; /** Returns the name of the encoding handled by this codec. */ virtual const char *get_name() const = 0; @@ -162,22 +163,25 @@ template class StandardCodec: public Codec { private: - ErrorMode err_mode; + ErrorMode err_mode = THROW_ON_ERROR; protected: StandardCodec(ErrorMode em): err_mode(em==DEFAULT ? THROW_ON_ERROR : em) { } + ErrorMode get_error_mode(ErrorMode em = DEFAULT) const + { return (em==DEFAULT ? err_mode : em); } + public: - virtual Encoder *create_encoder(ErrorMode em = DEFAULT) const - { return new typename C::Encoder(em==DEFAULT ? err_mode : em); } + Encoder *create_encoder(ErrorMode em = DEFAULT) const override + { return new typename C::Encoder(get_error_mode(em)); } - virtual Decoder *create_decoder(ErrorMode em = DEFAULT) const - { return new typename C::Decoder(em==DEFAULT ? err_mode : em); } + Decoder *create_decoder(ErrorMode em = DEFAULT) const override + { return new typename C::Decoder(get_error_mode(em)); } }; /** Convenience function that decodes a string. */ -template +template ustring decode(const std::string &s) { typename C::Decoder dec; @@ -185,7 +189,7 @@ ustring decode(const std::string &s) } /** Convenience function that encodes a string. */ -template +template std::string encode(const ustring &s) { typename C::Encoder enc; @@ -193,7 +197,7 @@ std::string encode(const ustring &s) } /** Convenience function that transcodes a string from one codec to another. */ -template +template std::string transcode(const std::string &s) { return encode(decode(s)); @@ -201,11 +205,11 @@ std::string transcode(const std::string &s) /** Creates a codec for an encoding by name. The caller is responsible for deleting the codec when it's no longer needed. */ -Codec *create_codec(const std::string &); +MSPCORE_API Codec *create_codec(const std::string &); /** Automatically detects the encoding of a string and creates a codec for it. The codec must be deleted when it's no longer needed. */ -Codec *detect_codec(const std::string &); +MSPCORE_API Codec *detect_codec(const std::string &); } // namespace StringCodec } // namespace Msp