]> git.tdb.fi Git - libs/core.git/commitdiff
Use unique_ptr to manage owned memory
authorMikko Rasa <tdb@tdb.fi>
Tue, 27 Aug 2024 11:51:51 +0000 (14:51 +0300)
committerMikko Rasa <tdb@tdb.fi>
Tue, 27 Aug 2024 11:51:51 +0000 (14:51 +0300)
Required C++ language version is now C++14.

20 files changed:
Build
source/core/application.cpp
source/core/application.h
source/core/getopt.cpp
source/core/getopt.h
source/core/process.cpp
source/core/process.h
source/core/typeregistry.h
source/core/unix/process.cpp
source/core/windows/process.cpp
source/io/base.cpp
source/io/base.h
source/io/generic/asset.cpp
source/stringcodec/codec.cpp
source/stringcodec/codec.h
source/stringcodec/iso2022jp.cpp
source/stringcodec/iso2022jp.h
source/stringcodec/utf16.h
source/time/timer.cpp
source/time/timer.h

diff --git a/Build b/Build
index a2a3040f88af33e145d28e0241153a87864225ba..3d97b2c7119ae41da580471bccfca3c9649892ab 100644 (file)
--- a/Build
+++ b/Build
@@ -7,7 +7,7 @@ package "mspcore"
        build_info
        {
                threads true;
-               standard CXX "c++11";
+               standard CXX "c++14";
        };
        if_arch "linux"
        {
index c214a06316598b54ed59403493df366a60ca568f..5b0fabde5d90a8bc7c70a7e1ffbb1cb61b51c1a1 100644 (file)
@@ -16,7 +16,7 @@ using namespace std;
 
 namespace Msp {
 
-Application *Application::_app = nullptr;
+unique_ptr<Application> Application::_app;
 Application::Starter *Application::_starter = nullptr;
 const char *Application::_argv0 = nullptr;
 string Application::_name;
@@ -59,9 +59,7 @@ int Application::run(int argc, char **argv, void *data, void (*created_callback)
                        created_callback(data);
 
                int result = _app->main();
-               Application *a = _app;
-               _app = nullptr;
-               delete a;
+               unique_ptr<Application> a = move(_app);
                return result;
        }
        catch(const exception &e)
@@ -85,7 +83,6 @@ int Application::run(int argc, char **argv, void *data, void (*created_callback)
                        }
                }
 
-               delete _app;
                _app = nullptr;
 
                return 124;
index d5a571a28a9f73306dffae3e99b470e39a2fcb47..d45a57640400d96456f9e920e66d4a96f6538226 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_CORE_APPLICATION_H_
 #define MSP_CORE_APPLICATION_H_
 
+#include <memory>
 #include <stdexcept>
 #include <string>
 #include "mspcore_api.h"
@@ -21,7 +22,7 @@ protected:
        public:
                virtual ~Starter() = default;
 
-               virtual Application *create_app(int, char **) = 0;
+               virtual std::unique_ptr<Application> create_app(int, char **) = 0;
        };
 
        bool done = false;
@@ -29,7 +30,7 @@ protected:
 
 private:
        static Starter *_starter;
-       static Application *_app;
+       static std::unique_ptr<Application> _app;
        static const char *_argv0;
        static std::string _name;
        static void *_data;
@@ -92,7 +93,7 @@ private:
        class Starter: public Application::Starter
        {
        public:
-               Application *create_app(int argc, char **argv) { return new T(argc, argv); }
+               std::unique_ptr<Application> create_app(int argc, char **argv) { return std::make_unique<T>(argc, argv); }
        };
 
        static Starter _starter;
index cbc0afb0d76e9d5eec8f79e4a835d1cf01ff7700..31e5dc45eb03b3346b68e905464e3ade1cbd8276 100644 (file)
@@ -11,14 +11,6 @@ GetOpt::GetOpt()
        add_option("help", help, NO_ARG).set_help("Displays this help");
 }
 
-GetOpt::~GetOpt()
-{
-       for(OptionImpl *i: opts)
-               delete i;
-       for(ArgumentImpl *i: args)
-               delete i;
-}
-
 GetOpt::OptionImpl &GetOpt::add_option(char s, const string &l, const Store &t, ArgType a)
 {
        if(l.empty())
@@ -29,15 +21,12 @@ GetOpt::OptionImpl &GetOpt::add_option(char s, const string &l, const Store &t,
        for(auto i=opts.begin(); i!=opts.end(); )
        {
                if((s!=0 && (*i)->get_short()==s) || (*i)->get_long()==l)
-               {
-                       delete *i;
                        i = opts.erase(i);
-               }
                else
                        ++i;
        }
 
-       opts.push_back(new OptionImpl(s, l, t, a));
+       opts.push_back(make_unique<OptionImpl>(s, l, t, a));
        return *opts.back();
 }
 
@@ -48,7 +37,7 @@ GetOpt::ArgumentImpl &GetOpt::add_argument(const string &n, const Store &t, ArgT
 
        bool have_list = false;
        bool have_optional = false;
-       for(const ArgumentImpl *a: args)
+       for(const unique_ptr<ArgumentImpl> &a: args)
        {
                if(a->is_list_store())
                        have_list = true;
@@ -61,13 +50,13 @@ GetOpt::ArgumentImpl &GetOpt::add_argument(const string &n, const Store &t, ArgT
        if(have_list && (t.is_list() || y==OPTIONAL_ARG))
                throw invalid_argument("GetOpt::add_argument");
 
-       args.push_back(new ArgumentImpl(n, t, y));
+       args.push_back(make_unique<ArgumentImpl>(n, t, y));
        return *args.back();
 }
 
 GetOpt::OptionImpl &GetOpt::get_option(char s)
 {
-       auto i = find_if(opts, [s](const OptionImpl *o){ return o->get_short()==s; });
+       auto i = find_if(opts, [s](const unique_ptr<OptionImpl> &o){ return o->get_short()==s; });
        if(i!=opts.end())
                return **i;
        throw usage_error(string("Unknown option -")+s);
@@ -75,7 +64,7 @@ GetOpt::OptionImpl &GetOpt::get_option(char s)
 
 GetOpt::OptionImpl &GetOpt::get_option(const string &l)
 {
-       auto i = find_if(opts, [&l](const OptionImpl *o){ return o->get_long()==l; });
+       auto i = find_if(opts, [&l](const unique_ptr<OptionImpl> &o){ return o->get_long()==l; });
        if(i!=opts.end())
                return **i;
        throw usage_error(string("Unknown option --")+l);
@@ -213,7 +202,7 @@ string GetOpt::generate_usage(const string &argv0, bool compact) const
                result += " [options]";
        else
        {
-               for(const OptionImpl *o: opts)
+               for(const unique_ptr<OptionImpl> &o: opts)
                {
                        result += " [";
                        if(o->get_short())
@@ -239,7 +228,7 @@ string GetOpt::generate_usage(const string &argv0, bool compact) const
                }
        }
 
-       for(const ArgumentImpl *a: args)
+       for(const unique_ptr<ArgumentImpl> &a: args)
        {
                result += ' ';
                if(a->get_type()==OPTIONAL_ARG)
@@ -256,11 +245,11 @@ string GetOpt::generate_usage(const string &argv0, bool compact) const
 
 string GetOpt::generate_help() const
 {
-       bool any_short = any_of(opts.begin(), opts.end(), [](const OptionImpl *o){ return o->get_short(); });
+       bool any_short = any_of(opts.begin(), opts.end(), [](const unique_ptr<OptionImpl> &o){ return o->get_short(); });
 
        string::size_type maxw = 0;
        vector<string> switches;
-       for(const OptionImpl *o: opts)
+       for(const unique_ptr<OptionImpl> &o: opts)
        {
                string swtch;
                if(o->get_short())
@@ -289,7 +278,7 @@ string GetOpt::generate_help() const
        }
 
        vector<string> pargs;
-       for(const ArgumentImpl *a: args)
+       for(const unique_ptr<ArgumentImpl> &a: args)
        {
                string parg = format("<%s>", a->get_name());
                pargs.push_back(parg);
@@ -320,11 +309,6 @@ GetOpt::OptionImpl::OptionImpl(char s, const string &l, const Store &t, ArgType
        store(t.clone())
 { }
 
-GetOpt::OptionImpl::~OptionImpl()
-{
-       delete store;
-}
-
 GetOpt::OptionImpl &GetOpt::OptionImpl::set_help(const string &h)
 {
        help = h;
@@ -389,11 +373,6 @@ GetOpt::ArgumentImpl::ArgumentImpl(const string &n, const Store &t, ArgType a):
        store(t.clone())
 { }
 
-GetOpt::ArgumentImpl::~ArgumentImpl()
-{
-       delete store;
-}
-
 GetOpt::ArgumentImpl &GetOpt::ArgumentImpl::set_help(const string &h)
 {
        help = h;
index 59c810c5e4a5ff4182cd42d9736f8af9d708eae9..d8d5bb144fc2a3c49c4551658f9fa31ac88a723c 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_CORE_GETOPT_H_
 
 #include <list>
+#include <memory>
 #include <stdexcept>
 #include <string>
 #include <vector>
@@ -107,7 +108,7 @@ private:
        public:
                virtual ~Store() = default;
 
-               virtual Store *clone() const = 0;
+               virtual std::unique_ptr<Store> clone() const = 0;
 
                virtual bool is_list() const = 0;
                virtual void store() = 0;
@@ -124,11 +125,10 @@ private:
                unsigned *ext_seen_count = nullptr;
                std::string help;
                std::string metavar = "ARG";
-               Store *store = nullptr;
+               std::unique_ptr<Store> store;
 
        public:
                OptionImpl(char, const std::string &, const Store &, ArgType);
-               ~OptionImpl() override;
 
                OptionImpl &set_help(const std::string &) override;
                OptionImpl &set_help(const std::string &, const std::string &) override;
@@ -149,11 +149,10 @@ private:
                std::string name;
                ArgType type = REQUIRED_ARG;
                std::string help;
-               Store *store = nullptr;
+               std::unique_ptr<Store> store;
 
        public:
                ArgumentImpl(const std::string &, const Store &, ArgType);
-               ~ArgumentImpl() override;
 
                ArgumentImpl &set_help(const std::string &) override;
                const std::string &get_name() const { return name; }
@@ -172,8 +171,7 @@ private:
        public:
                SimpleStore(T &d): data(d) { }
 
-               SimpleStore *clone() const override
-               { return new SimpleStore(data); }
+               std::unique_ptr<Store> clone() const override { return std::make_unique<SimpleStore>(data); }
 
                bool is_list() const override { return false; }
 
@@ -192,8 +190,7 @@ private:
        public:
                ListStore(T &d): data(d) { }
 
-               ListStore *clone() const override
-               { return new ListStore(data); }
+               std::unique_ptr<Store> clone() const override { return std::make_unique<ListStore>(data); }
 
                bool is_list() const override { return true; }
 
@@ -204,13 +201,12 @@ private:
        };
 
        bool help = false;
-       std::vector<OptionImpl *> opts;
-       std::vector<ArgumentImpl *> args;
+       std::vector<std::unique_ptr<OptionImpl>> opts;
+       std::vector<std::unique_ptr<ArgumentImpl>> args;
        std::vector<std::string> args_raw;
 
 public:
        GetOpt();
-       ~GetOpt();
 
        /** Adds an option with both short and long forms.  Processing depends on
        the type of the destination variable and whether an argument is taken or
index 4c5ed4651164615fc67b1d8a7c7523856876a233..95a5639cad1356ab9b105d9198b770b0f0fe7f16 100644 (file)
@@ -7,7 +7,7 @@ using namespace std;
 
 namespace Msp {
 
-Process *Process::_self = nullptr;
+unique_ptr<Process> Process::_self;
 
 Process::Process(const Private &p):
        priv(new Private(p))
@@ -23,7 +23,7 @@ Process &Process::self()
        {
                Private _priv;
                platform_get_self_info(_priv);
-               _self = new Process(_priv);
+               _self = unique_ptr<Process>(new Process(_priv));
        }
        return *_self;
 }
@@ -50,7 +50,7 @@ void Process::redirect_cerr(IO::Base &io)
 
 void Process::do_redirect(IO::Base *&ptr, IO::Base &io)
 {
-       if(this==_self)
+       if(this==_self.get())
        {
                if(&ptr==&cin)
                        IO::cin.redirect(io);
index ed997f853e143a52bbfd386cda1e32115c937255..991363062da6d95624dfba26467d58826b994a12 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_CORE_PROCESS_H_
 #define MSP_CORE_PROCESS_H_
 
+#include <memory>
 #include <string>
 #include <vector>
 #include <msp/fs/path.h>
@@ -41,7 +42,7 @@ private:
        bool finished = false;
        unsigned exit_code = 0;
 
-       static Process *_self;
+       static std::unique_ptr<Process> _self;
 
        Process(const Private &);
 public:
index 193fe07fa9810d1426a4a430e53e26d9eeb802c4..84e89431f814f7563894af1e3bcb12f5f76830f1 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_CORE_TYPEREGISTRY_H_
 
 #include <map>
+#include <memory>
 #include <string>
 #include "maputils.h"
 #include "noncopyable.h"
@@ -43,11 +44,9 @@ private:
                void invoke(T arg) const override { action(this->keyword, arg); }
        };
 
-       std::map<std::string, TypeBase *> types;
+       std::map<std::string, std::unique_ptr<TypeBase>> types;
 
 public:
-       ~TypeRegistry();
-
        /** Registers a type. */
        template<typename R>
        void register_type(const std::string &);
@@ -60,13 +59,6 @@ public:
        void invoke_all(T) const;
 };
 
-template<template<typename> class A, typename T>
-TypeRegistry<A, T>::~TypeRegistry()
-{
-       for(auto &kvp: types)
-               delete kvp.second;
-}
-
 template<template<typename> class A, typename T>
 template<typename R>
 void TypeRegistry<A, T>::register_type(const std::string &kw)
@@ -74,7 +66,7 @@ void TypeRegistry<A, T>::register_type(const std::string &kw)
        if(types.count(kw))
                throw key_error(kw);
 
-       types[kw] = new RegisteredType<R>(kw);
+       types[kw] = std::make_unique<RegisteredType<R>>(kw);
 }
 
 template<template<typename> class A, typename T>
index ee0a36d3b783ea30383470f6c411f3a007c54bed..78f64a36f1fa7d699536f62d50aff87225094cb8 100644 (file)
@@ -25,7 +25,7 @@ void Process::platform_get_self_info(Private &priv)
 void Process::execute(const string &command, bool path_search, const Arguments &args)
 {
        pid_t pid = 0;
-       if(this!=_self)
+       if(this!=_self.get())
                pid = fork();
 
        if(pid==-1)
index 0eae33bdab07eb4169d441ff865ac23aadd28b30..ba6d0f9edcb200749c7946384efe373d44e63a09 100644 (file)
@@ -94,7 +94,7 @@ void Process::execute(const string &command, bool path_search, const Arguments &
 
        running = true;
 
-       if(this==_self)
+       if(this==_self.get())
                TerminateProcess(priv->info.hProcess, 0);
 }
 
index bf23ea2ac26ea3e8d25dd07bf2012713add715a9..d94cfee43e76f2f38674b418158ae71560c2977a 100644 (file)
@@ -12,7 +12,6 @@ Base::Base()
 Base::~Base()
 {
        signal_deleted.emit();
-       delete mutex;
 }
 
 void Base::check_access(Mode m) const
@@ -68,7 +67,7 @@ Base::Synchronize::Synchronize(Base &i):
        io(i)
 {
        if(!io.mutex)
-               io.mutex = new Mutex;
+               io.mutex = make_unique<Mutex>();
        io.mutex->lock();
 }
 
index 92c860d266f1923d275c6f568ef99c4a0e715863..18353a39ce58bd2b2fd8483e4861dfdb837df290 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_IO_BASE_H_
 
 #include <cstddef>
+#include <memory>
 #include <sigc++/sigc++.h>
 #include <msp/core/mspcore_api.h>
 #include <msp/core/mutex.h>
@@ -45,7 +46,7 @@ public:
 protected:
        Mode mode = M_READ;
        bool eof_flag = false;
-       Mutex *mutex = nullptr;
+       std::unique_ptr<Mutex> mutex;
 
        Base();
 public:
index b5cad9a47ce1b34097a8f716009aa972fda7e74d..a736d185a4c3d896cf4cda45382034605b226df1 100644 (file)
@@ -9,22 +9,21 @@ namespace IO {
 
 struct Asset::Private
 {
-       Seekable *file;
+       unique_ptr<Seekable> file;
 };
 
 Asset::Asset(const string &name)
 {
-       Seekable *file = new BufferedFile((FS::get_sys_data_dir()/name).str());
+       unique_ptr<Seekable> file = make_unique<BufferedFile>((FS::get_sys_data_dir()/name).str());
 
        priv = new Private;
-       priv->file = file;
+       priv->file = move(file);
 
        priv->file->signal_flush_required.connect(signal_flush_required);
 }
 
 Asset::~Asset()
 {
-       delete priv->file;
        delete priv;
 }
 
index ff2bd63d5e657b8547392163d12aa50b94f40e13..651384878d96f486c5fdbd4e12fa02f6f08618a1 100644 (file)
@@ -17,14 +17,12 @@ namespace StringCodec {
 
 bool Codec::detect(const string &str) const
 {
-       Decoder *dec = create_decoder(IGNORE_ERRORS);
+       unique_ptr<Decoder> dec = create_decoder(IGNORE_ERRORS);
 
        bool result = true;
        for(auto i=str.begin(); (result && i!=str.end()); )
                result = (dec->decode_char(str, i)!=-1);
 
-       delete dec;
-
        return result;
 }
 
@@ -61,7 +59,7 @@ ustring Codec::Decoder::decode(const string &str)
        return buf;
 }
 
-Codec *create_codec(const string &n)
+unique_ptr<Codec> create_codec(const string &n)
 {
        string name;
        string::const_iterator i;
@@ -89,22 +87,22 @@ Codec *create_codec(const string &n)
                        throw invalid_argument("StringCodec::create_codec");
        }
 
-       if(name=="ascii") return new Ascii(em);
-       if(name=="iso2022jp") return new Iso2022Jp(em);
-       if(name=="iso646fi") return new Iso646Fi(em);
-       if(name=="iso88591" || name=="latin1") return new Iso88591(em);
-       if(name=="iso885915" || name=="latin9") return new Iso885915(em);
-       if(name=="jisx0201") return new JisX0201(em);
-       if(name=="jisx0208") return new JisX0208(em);
-       if(name=="utf8") return new Utf8(em);
-       if(name=="utf16") return new Utf16(em, Utf16::AUTO);
-       if(name=="utf16be") return new Utf16(em, Utf16::BIG);
-       if(name=="utf16le") return new Utf16(em, Utf16::LITTLE);
-       if(name=="windows1252" || name=="cp1252") return new Windows1252(em);
+       if(name=="ascii") return make_unique<Ascii>(em);
+       if(name=="iso2022jp") return make_unique<Iso2022Jp>(em);
+       if(name=="iso646fi") return make_unique<Iso646Fi>(em);
+       if(name=="iso88591" || name=="latin1") return make_unique<Iso88591>(em);
+       if(name=="iso885915" || name=="latin9") return make_unique<Iso885915>(em);
+       if(name=="jisx0201") return make_unique<JisX0201>(em);
+       if(name=="jisx0208") return make_unique<JisX0208>(em);
+       if(name=="utf8") return make_unique<Utf8>(em);
+       if(name=="utf16") return make_unique<Utf16>(em, Utf16::AUTO);
+       if(name=="utf16be") return make_unique<Utf16>(em, Utf16::BIG);
+       if(name=="utf16le") return make_unique<Utf16>(em, Utf16::LITTLE);
+       if(name=="windows1252" || name=="cp1252") return make_unique<Windows1252>(em);
        throw invalid_argument("StringCodec::create_codec");
 }
 
-Codec *detect_codec(const string &str)
+unique_ptr<Codec> detect_codec(const string &str)
 {
        bool is_utf8 = true;
        bool is_ascii = true;
@@ -146,13 +144,13 @@ Codec *detect_codec(const string &str)
        }
 
        if(is_ascii)
-               return new Ascii;
+               return make_unique<Ascii>();
        else if(is_utf8)
-               return new Utf8;
+               return make_unique<Utf8>();
        else if(is_latin1)
-               return new Iso88591;
+               return make_unique<Iso88591>();
        else
-               return new Windows1252;
+               return make_unique<Windows1252>();
 }
 
 } // namespace StringCodec
index f53bae5ba1d8ee86de0d469629ff21daad4b57d1..ec46480eabed3f40a772c770e07a62cba373f29b 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_STRINGCODEC_CODEC_H_
 #define MSP_STRINGCODEC_CODEC_H_
 
+#include <memory>
 #include <string>
 #include <msp/core/mspcore_api.h>
 #include "except.h"
@@ -140,10 +141,10 @@ public:
        virtual const char *get_name() const = 0;
 
        /** Creates an encoder for this codec. */
-       virtual Encoder *create_encoder(ErrorMode err_mode = DEFAULT) const = 0;
+       virtual std::unique_ptr<Encoder> create_encoder(ErrorMode err_mode = DEFAULT) const = 0;
 
        /** Creates a decoder for this codec. */
-       virtual Decoder *create_decoder(ErrorMode err_mode = DEFAULT) const = 0;
+       virtual std::unique_ptr<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
@@ -172,11 +173,11 @@ protected:
        { return (em==DEFAULT ? err_mode : em); }
 
 public:
-       Encoder *create_encoder(ErrorMode em = DEFAULT) const override
-       { return new typename C::Encoder(get_error_mode(em)); }
+       std::unique_ptr<Encoder> create_encoder(ErrorMode em = DEFAULT) const override
+       { return std::make_unique<typename C::Encoder>(get_error_mode(em)); }
 
-       Decoder *create_decoder(ErrorMode em = DEFAULT) const override
-       { return new typename C::Decoder(get_error_mode(em)); }
+       std::unique_ptr<Decoder> create_decoder(ErrorMode em = DEFAULT) const override
+       { return std::make_unique<typename C::Decoder>(get_error_mode(em)); }
 };
 
 
@@ -203,13 +204,11 @@ std::string transcode(const std::string &s)
        return encode<T>(decode<F>(s));
 }
 
-/** Creates a codec for an encoding by name.  The caller is responsible for
-deleting the codec when it's no longer needed. */
-MSPCORE_API Codec *create_codec(const std::string &);
+/** Creates a codec for an encoding by name. */
+MSPCORE_API std::unique_ptr<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. */
-MSPCORE_API Codec *detect_codec(const std::string &);
+/** Automatically detects the encoding of a string and creates a codec for it. */
+MSPCORE_API std::unique_ptr<Codec> detect_codec(const std::string &);
 
 } // namespace StringCodec
 } // namespace Msp
index 93c50f489fb8486182a1f2b69711efea71d5e01e..f262c74c469e370e76e82ad12d2990415d28d2a7 100644 (file)
@@ -81,7 +81,7 @@ void Iso2022Jp::Encoder::transliterate(unichar, string &buf)
 
 Iso2022Jp::Decoder::Decoder(ErrorMode em):
        Codec::Decoder(em),
-       dec(new Ascii::Decoder)
+       dec(make_unique<Ascii::Decoder>())
 { }
 
 unichar Iso2022Jp::Decoder::decode_char(const string &str, string::const_iterator &i)
@@ -134,21 +134,18 @@ unichar Iso2022Jp::Decoder::decode_char(const string &str, string::const_iterato
 
 void Iso2022Jp::Decoder::reset()
 {
-       delete dec;
        mode = ASCII;
-       dec = new Ascii::Decoder;
+       dec = make_unique<Ascii::Decoder>();
 }
 
 void Iso2022Jp::Decoder::switch_mode(Mode m)
 {
-       delete dec;
-
        mode = m;
        switch(mode)
        {
-       case ASCII: dec = new Ascii::Decoder; break;
-       case JISX0201: dec = new JisX0201::Decoder; break;
-       case JISX0208: dec = new JisX0208::Decoder; break;
+       case ASCII: dec = make_unique<Ascii::Decoder>(); break;
+       case JISX0201: dec = make_unique<JisX0201::Decoder>(); break;
+       case JISX0208: dec = make_unique<JisX0208::Decoder>(); break;
        }
 }
 
index 0bb1ad3f559f220f4a5e115ab6bcaafd5ff3ba96..488f2eec4adf35bb58e963ce880f55f4e81ab209 100644 (file)
@@ -37,7 +37,7 @@ public:
        {
        private:
                Mode mode = ASCII;
-               Codec::Decoder *dec = nullptr;
+               std::unique_ptr<Codec::Decoder> dec;
 
        public:
                Decoder(ErrorMode = DEFAULT);
index a588b124dddb27461f05c4a41b31aee8a1cd783f..0ed52b2fab88ba3e6b1e03f81a3962e8f62b8053 100644 (file)
@@ -61,11 +61,11 @@ public:
        const char *get_name() const override
        { return endian==BIG ? "UTF-16-BE" : endian==LITTLE ? "UTF-16-LE" : "UTF-16"; }
 
-       Encoder *create_encoder(ErrorMode em = DEFAULT) const override
-       { return new Encoder(get_error_mode(em), endian); }
+       std::unique_ptr<Codec::Encoder> create_encoder(ErrorMode em = DEFAULT) const override
+       { return std::make_unique<Encoder>(get_error_mode(em), endian); }
 
-       Decoder *create_decoder(ErrorMode em = DEFAULT) const override
-       { return new Decoder(get_error_mode(em), endian); }
+       std::unique_ptr<Codec::Decoder> create_decoder(ErrorMode em = DEFAULT) const override
+       { return std::make_unique<Decoder>(get_error_mode(em), endian); }
 };
 
 
index eda782e0d92c5bf82c00418584e12917d03fa673..d3b96d98005da0e641936c4b1a98c03c253b94d6 100644 (file)
@@ -12,41 +12,36 @@ Timer::Timer():
        sem(1)
 { }
 
-Timer::~Timer()
-{
-       for(const SlotProxy &s: slots)
-               delete s.slot;
-}
-
 Timer::Slot &Timer::add(const TimeDelta &td)
 {
-       Slot *s = new Slot(td);
+       unique_ptr<Slot> s = make_unique<Slot>(td);
+       Slot &sref = *s;
        MutexLock l(mutex);
-       slots.push_back({ s });
+       slots.push_back({ move(s) });
        push_heap(slots.begin(), slots.end());
        if(blocking)
                sem.signal();
-       return *s;
+       return sref;
 }
 
 Timer::Slot &Timer::add(const TimeStamp &ts)
 {
-       Slot *s = new Slot(ts);
+       unique_ptr<Slot> s = make_unique<Slot>(ts);
+       Slot &sref = *s;
        MutexLock l(mutex);
-       slots.push_back({ s });
+       slots.push_back({ move(s) });
        push_heap(slots.begin(), slots.end());
        if(blocking)
                sem.signal();
-       return *s;
+       return sref;
 }
 
 void Timer::cancel(Slot &slot)
 {
        MutexLock l(mutex);
-       auto i = find_member(slots, &slot, &SlotProxy::slot);
+       auto i = find_if(slots, [&slot](const SlotProxy &p){ return p.slot.get()==&slot; });
        if(i!=slots.end())
        {
-               delete i->slot;
                slots.erase(i);
                make_heap(slots.begin(), slots.end());
        }
@@ -71,7 +66,7 @@ void Timer::do_tick(const TimeDelta &timeout)
        if(timeout>=zero)
                deadline = now()+timeout;
 
-       Slot *next = nullptr;
+       unique_ptr<Slot> next;
        {
                MutexLock l(mutex);
                while(1)
@@ -80,8 +75,7 @@ void Timer::do_tick(const TimeDelta &timeout)
                        TimeStamp t = now();
                        if(!slots.empty())
                        {
-                               next = slots.begin()->slot;
-                               stamp = next->get_timeout();
+                               stamp = slots.front().slot->get_timeout();
                                if(stamp<=t)
                                        break;
                        }
@@ -104,25 +98,16 @@ void Timer::do_tick(const TimeDelta &timeout)
                                return;
                }
 
+               next = move(slots.front().slot);
                pop_heap(slots.begin(), slots.end());
                slots.pop_back();
        }
 
-       try
-       {
-               if(next->signal_timeout.emit() && next->increment())
-               {
-                       MutexLock l(mutex);
-                       slots.push_back({ next });
-                       push_heap(slots.begin(), slots.end());
-               }
-               else
-                       delete next;
-       }
-       catch(...)
+       if(next->signal_timeout.emit() && next->increment())
        {
-               delete next;
-               throw;
+               MutexLock l(mutex);
+               slots.push_back({ move(next) });
+               push_heap(slots.begin(), slots.end());
        }
 }
 
index 7cb5c764d59979e0316e2e365444940ad8e4d786..79b01db5d653f5f2cf0ea9f929ad8e1b9ee46feb 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_TIME_TIMER_H_
 #define MSP_TIME_TIMER_H_
 
+#include <memory>
 #include <vector>
 #include <sigc++/sigc++.h>
 #include <msp/core/mspcore_api.h>
@@ -42,7 +43,7 @@ public:
 private:
        struct SlotProxy
        {
-               Slot *slot;
+               std::unique_ptr<Slot> slot;
 
                bool operator<(const SlotProxy &) const;
        };
@@ -54,7 +55,6 @@ private:
 
 public:
        Timer();
-       ~Timer();
 
        /** Adds a timer that will be executed periodically as long as the timeout
        signal hander returns true. */