]> git.tdb.fi Git - libs/core.git/blobdiff - source/stringcodec/codec.h
Let the base classes decide the default error mode
[libs/core.git] / source / stringcodec / codec.h
index 00f03b0cc4b4c4f2f4fcd133f2d3fa67e9fac5fb..d0871ff119ab563ea2ff000ece006c55577ddf48 100644 (file)
@@ -10,6 +10,7 @@ namespace StringCodec {
 
 enum ErrorMode
 {
+       DEFAULT,
        THROW_ON_ERROR,
        IGNORE_ERRORS,
        TRANSLITERATE
@@ -40,7 +41,7 @@ public:
        protected:
                ErrorMode err_mode;
 
-               Encoder(ErrorMode em): err_mode(em) { }
+               Encoder(ErrorMode em): err_mode(em==DEFAULT ? THROW_ON_ERROR : em) { }
        public:
                virtual ~Encoder() { }
 
@@ -91,7 +92,7 @@ public:
        protected:
                ErrorMode err_mode;
 
-               Decoder(ErrorMode em): err_mode(em) { }
+               Decoder(ErrorMode em): err_mode(em==DEFAULT ? THROW_ON_ERROR : em) { }
        public:
                virtual ~Decoder() { }
 
@@ -138,10 +139,10 @@ public:
        virtual const char *get_name() const = 0;
 
        /** Creates an encoder for this codec. */
-       virtual Encoder *create_encoder(ErrorMode err_mode = THROW_ON_ERROR) const = 0;
+       virtual Encoder *create_encoder(ErrorMode err_mode = DEFAULT) const = 0;
 
        /** Creates a decoder for this codec. */
-       virtual Decoder *create_decoder(ErrorMode err_mode = THROW_ON_ERROR) const = 0;
+       virtual Decoder *create_decoder(ErrorMode err_mode = DEFAULT) const = 0;
 
        /** Determines whether the given string can be successfully decoded with
        this codec.  Note that this function returning true does not guarantee that
@@ -153,8 +154,30 @@ public:
 typedef Codec::Encoder Encoder;
 typedef Codec::Decoder Decoder;
 
+
+/**
+A helper class to provide some common functionality.
+*/
+template<typename C>
+class StandardCodec: public Codec
+{
+private:
+       ErrorMode err_mode;
+
+protected:
+       StandardCodec(ErrorMode em): err_mode(em==DEFAULT ? THROW_ON_ERROR : em) { }
+
+public:
+       virtual Encoder *create_encoder(ErrorMode em = DEFAULT) const
+       { return new typename C::Encoder(em==DEFAULT ? err_mode : em); }
+
+       virtual Decoder *create_decoder(ErrorMode em = DEFAULT) const
+       { return new typename C::Decoder(em==DEFAULT ? err_mode : em); }
+};
+
+
 /** Convenience function that decodes a string. */
-template<class C>
+template<typename C>
 ustring decode(const std::string &s)
 {
        typename C::Decoder dec;
@@ -162,7 +185,7 @@ ustring decode(const std::string &s)
 }
 
 /** Convenience function that encodes a string. */
-template<class C>
+template<typename C>
 std::string encode(const ustring &s)
 {
        typename C::Encoder enc;
@@ -170,7 +193,7 @@ std::string encode(const ustring &s)
 }
 
 /** Convenience function that transcodes a string from one codec to another. */
-template<class F, class T>
+template<typename F, typename T>
 std::string transcode(const std::string &s)
 {
        return encode<T>(decode<F>(s));