Make sure all classes have sensible copy semantics
authorMikko Rasa <tdb@tdb.fi>
Wed, 25 Apr 2018 10:16:55 +0000 (13:16 +0300)
committerMikko Rasa <tdb@tdb.fi>
Wed, 25 Apr 2018 10:16:55 +0000 (13:16 +0300)
They must either support copying or be derived from NonCopyable.

16 files changed:
source/core/application.h
source/core/getopt.h
source/core/module.h
source/core/mutex.h
source/core/process.h
source/core/semaphore.h
source/core/thread.h
source/debug/errorreporter.h
source/debug/profiler.h
source/debug/profilingscope.h
source/io/base.h
source/io/eventreader.h
source/io/poll.h
source/strings/format.cpp
source/strings/format.h
source/time/timer.h

index d0985be900fb493714760ab07335d06faaa87298..59d5bf110e9706425f113dd43d1d7d0ef2ca1019 100644 (file)
@@ -3,13 +3,14 @@
 
 #include <stdexcept>
 #include <string>
+#include "noncopyable.h"
 
 namespace Msp {
 
 /**
 Base class for applications.  See also RegisteredApplication.
 */
-class Application
+class Application: private NonCopyable
 {
 protected:
        class Starter
index 407d3459984fce67c42ffd92f1c9ffe7faae4b23..8d78a728169a74e2b5715fce27ee63bccd100cc0 100644 (file)
@@ -6,6 +6,7 @@
 #include <string>
 #include <vector>
 #include <msp/strings/lexicalcast.h>
+#include "noncopyable.h"
 
 namespace Msp {
 
@@ -58,7 +59,7 @@ A built-in --help option is provided and will output a list of options,
 arguments and their associated help texts.  An application may override this by
 providing its own option with the same name.
 */
-class GetOpt
+class GetOpt: private NonCopyable
 {
 public:
        enum ArgType
index 1d008ba621b388f96e27aeade8317715bd6a5342..4a2f04c15ce7bb62f03c1976945317141e200106 100644 (file)
@@ -2,10 +2,11 @@
 #define MSP_CORE_MODULE_H_
 
 #include <string>
+#include "noncopyable.h"
 
 namespace Msp {
 
-class Module
+class Module: private NonCopyable
 {
 private:
        struct Private;
index 71fbdf0c6e5796423274049dc28a05dfba42cbb2..3d3dc84dd3bca28e65c0ea770b00cc6851b6f552 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_CORE_MUTEX_H_
 #define MSP_CORE_MUTEX_H_
 
+#include "noncopyable.h"
 #include "refptr.h"
 
 namespace Msp {
@@ -9,7 +10,7 @@ namespace Msp {
 A class for controlling mutually exclusive access to a resource.  Only one
 thread can hold a lock on the mutex at a time.
 */
-class Mutex
+class Mutex: private NonCopyable
 {
        friend class Semaphore;
 
@@ -18,8 +19,6 @@ private:
 
        Private *priv;
 
-       Mutex(const Mutex &);
-       Mutex &operator=(const Mutex &);
 public:
        Mutex();
        ~Mutex();
index 5413587cd54f164f38714926a53c445308a02461..55b62cd450c534309d72dd7d39fa96f2cedbfb1c 100644 (file)
@@ -5,6 +5,7 @@
 #include <vector>
 #include <msp/fs/path.h>
 #include <msp/io/base.h>
+#include "noncopyable.h"
 
 namespace Msp {
 
@@ -21,7 +22,7 @@ the process or capture its output, use an IO::Pipe.  Redirections performed on
 the self object take effect immediately.  It is recommended to perform such
 redirections directly on the Console objects.
 */
-class Process
+class Process: private NonCopyable
 {
 public:
        typedef std::vector<std::string> Arguments;
index 61118c734febffa1e5da463e5ead628074a144ad..9ab25f2d48306471bcfd63b0439e501ee5f0fc37 100644 (file)
@@ -2,11 +2,11 @@
 #define MSP_CORE_SEMAPHORE_H_
 
 #include <msp/time/timedelta.h>
-#include "mutex.h"
+#include "noncopyable.h"
 
 namespace Msp {
 
-class Semaphore
+class Semaphore: private NonCopyable
 {
 private:
        struct Private;
index 7cf17b8d327ed3e84075bb4c247f4c5d16c4ff6f..6a17912fdc3c03e0d0904aeb768b8a40ee316212 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_CORE_THREAD_H_
 
 #include <string>
+#include "noncopyable.h"
 
 namespace Msp {
 
@@ -12,7 +13,7 @@ automatically started upon creation - you must manually call launch() instead.
 This is to allow initializing variables of the derived class before the thread
 is started.
 */
-class Thread
+class Thread: private NonCopyable
 {
 private:
        struct Private;
@@ -32,9 +33,6 @@ private:
 
 protected:
        Thread(const std::string & = std::string());
-private:
-       Thread(const Thread &);
-       Thread &operator=(const Thread &);
 public:
        virtual ~Thread();
 
index b0385ff15d1c31ce2a0ea769d569b30b9fae37a5..98806ddc72212df5d8ca7e321540fec105afcdcc 100644 (file)
@@ -2,11 +2,12 @@
 #define MSP_DEBUG_ERRORREPORTER_H_
 
 #include <stdexcept>
+#include <msp/core/noncopyable.h>
 
 namespace Msp {
 namespace Debug {
 
-class ErrorReporter
+class ErrorReporter: private NonCopyable
 {
 private:
        ErrorReporter *prev;
index 7a82c5631899699cb42d04773bbf6e4c9ec5b4e9..521ce959c5de7cae234c04ae8de5861ac3f6b42e 100644 (file)
@@ -4,6 +4,7 @@
 #include <map>
 #include <string>
 #include <vector>
+#include <msp/core/noncopyable.h>
 #include <msp/time/timedelta.h>
 #include <msp/time/timestamp.h>
 
@@ -24,7 +25,7 @@ profiled.
 Note: This is not thread-safe.  To profile multiple threads, create a separate
 Profiler for each thread.
 */
-class Profiler
+class Profiler: private NonCopyable
 {
 public:
        struct CallInfo
index 107688886a931db5891049551e6aa1ddc2c2ecba..4e4294e0269d04346c04e1c364d75f870fb231ee 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_DEBUG_PROFILINGSCOPE_H_
 #define MSP_DEBUG_PROFILINGSCOPE_H_
 
+#include <msp/core/noncopyable.h>
 #include <msp/time/timestamp.h>
 #include "profiler.h"
 
@@ -12,7 +13,7 @@ RAII timing class to accompany Profiler.  Timing starts when an object is
 created and ends when it goes out of scope.  If there was another object in an
 outer scope, it is notified of the time used in inner scopes.
 */
-class ProfilingScope
+class ProfilingScope: private NonCopyable
 {
 private:
        Profiler &profiler;
index a6a8827c6d4c28ee981806c4284af063b96de8dd..b6d1ff65a2a83f1b793d10fb5a4d36fd9f966efa 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <sigc++/sigc++.h>
 #include <msp/core/mutex.h>
+#include <msp/core/noncopyable.h>
 #include "handle.h"
 #include "mode.h"
 #include "poll.h"
@@ -13,7 +14,7 @@ namespace IO {
 /**
 Common interface for all I/O objects.
 */
-class Base
+class Base: private NonCopyable
 {
 public:
        /** RAII synchronization primitive.  Prevents concurrent access to the
@@ -45,9 +46,6 @@ protected:
        Mutex *mutex;
 
        Base();
-private:
-       Base(const Base &);
-       Base &operator=(const Base &);
 public:
        virtual ~Base();
 
index 01c3721e895a17e728b89500fd36e8a6bd3e1aa0..3c01f09ed8605cca3b518762700d4c85421bbfe0 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_IO_EVENTREADER_H_
 #define MSP_IO_EVENTREADER_H_
 
+#include <msp/core/noncopyable.h>
 #include "handle.h"
 
 namespace Msp {
@@ -18,7 +19,7 @@ empty, a new overlapped read is started.
 Unix-based systems can poll the fd directly, so this class reduces to a simple
 passthrough to sys_read.
 */
-class EventReader
+class EventReader: private NonCopyable
 {
 private:
        struct Private;
index 952ea896068aff1c0da8bbcf2d14841a5364d3b2..b65166d24bffb7cf8d7aea7e30f09f525c7b84d2 100644 (file)
@@ -4,6 +4,7 @@
 #include <list>
 #include <map>
 #include <vector>
+#include <msp/core/noncopyable.h>
 #include <msp/time/timedelta.h>
 
 namespace Msp {
@@ -31,7 +32,7 @@ inline PollEvent operator~(PollEvent e)
 { return PollEvent(~static_cast<int>(e)); }
 
 
-class Poller
+class Poller: private NonCopyable
 {
 public:
        struct Slot
index 1b8b4650a9efc852e2ab42268c775d7f5cb858f1..773eefac7fc30698bab7c8d6ebfca8fb1188de18 100644 (file)
@@ -11,6 +11,20 @@ Formatter::Formatter(const string &f):
        advance();
 }
 
+Formatter::Formatter(const Formatter &other):
+       fmt(other.fmt),
+       pos(fmt.begin()+(other.pos-other.fmt.begin())),
+       result(other.result)
+{ }
+
+Formatter &Formatter::operator=(const Formatter &other)
+{
+       fmt = other.fmt;
+       pos = fmt.begin()+(other.pos-other.fmt.begin());
+       result = other.result;
+       return *this;
+}
+
 const string &Formatter::str() const
 {
        if(pos!=fmt.end())
index 7bd8264f2407495d4c306501e6979703eb4740e5..ea5d5b070090c770671fc7821435a520e333321c 100644 (file)
@@ -18,6 +18,8 @@ private:
 
 public:
        Formatter(const std::string &);
+       Formatter(const Formatter &);
+       Formatter &operator=(const Formatter &);
 
        /** Extracts the next conversion from the format string and formats the
        given value with it.  Will throw if no more conversions are found. */
index 21aeb2b4b5b02ea0b41932f4a3311028f35c7e55..575599fa6bb92eb16abeeced1f1147bb32cdaa8f 100644 (file)
@@ -4,6 +4,7 @@
 #include <vector>
 #include <sigc++/sigc++.h>
 #include <msp/core/mutex.h>
+#include <msp/core/noncopyable.h>
 #include <msp/core/semaphore.h>
 #include "timedelta.h"
 #include "timestamp.h"
@@ -18,7 +19,7 @@ of the returned slot.
 
 This class is thread-safe, to allow running timers in a separate thread.
 */
-class Timer
+class Timer: private NonCopyable
 {
 public:
        class Slot