Add DISABLE_CLASS_COPY macro (and use it)
authorkwolekr <kwolekr@minetest.net>
Tue, 27 Oct 2015 06:51:43 +0000 (02:51 -0400)
committerkwolekr <kwolekr@minetest.net>
Wed, 28 Oct 2015 02:05:08 +0000 (22:05 -0400)
Use this macro to disallow copying of an object using the assignment
operator or copy constructor.  This catches otherwise silent-but-deadly
mistakes such as "ServerMap map = env->getMap();" at compile time.

If so desired, it is still possible to copy a class, but it now requires
an explicit call to memcpy or std::copy.

src/basicmacros.h
src/client.h
src/emerge.h
src/environment.h
src/map.h
src/mapgen.h
src/objdef.h
src/server.h
src/threading/mutex.h
src/threading/semaphore.h
src/threading/thread.h

index 05987e32f20a5aeab7baa27cfb52ec183678e392..cebf06043a1ca59432ed35d37a6eaf677513bb02 100644 (file)
@@ -30,4 +30,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #define CONTAINS(c, v) (std::find((c).begin(), (c).end(), (v)) != (c).end())
 
+// To disable copy constructors and assignment operations for some class
+// 'Foobar', add the macro DISABLE_CLASS_COPY(Foobar) as a private member.
+// Note this also disables copying for any classes derived from 'Foobar' as well
+// as classes having a 'Foobar' member.
+#define DISABLE_CLASS_COPY(C) \
+       C(const C &);             \
+       C &operator=(const C &)
+
 #endif
index 5b57aa52a6e345a9ead4456086e13e4e2fab4b55..07fb79dcaf6f27a3dbdf92dcf082252a51a2a44d 100644 (file)
@@ -682,6 +682,8 @@ private:
        // TODO: Add callback to update these when g_settings changes
        bool m_cache_smooth_lighting;
        bool m_cache_enable_shaders;
+
+       DISABLE_CLASS_COPY(Client);
 };
 
 #endif // !CLIENT_HEADER
index 47ff218b85a25bc8928db6fbbb2ba4c4ebea1ad9..a143b660ff3646a6127234cdab9da38f2dd74cf0 100644 (file)
@@ -164,6 +164,8 @@ private:
        bool popBlockEmergeData(v3s16 pos, BlockEmergeData *bedata);
 
        friend class EmergeThread;
+
+       DISABLE_CLASS_COPY(EmergeManager);
 };
 
 #endif
index 1984cf40d8d81d8e1e63153cef6ee1d26c8f64aa..cb8be71b2f524ddfceada31727d17f88a24d4e6a 100644 (file)
@@ -137,6 +137,7 @@ protected:
 private:
        Mutex m_time_lock;
 
+       DISABLE_CLASS_COPY(Environment);
 };
 
 /*
index 78af8c8d3feafc83fb759d50e2834e5b1a94fea3..78614d2285f3310263ca5bf2813c56e9f0b6bd0c 100644 (file)
--- a/src/map.h
+++ b/src/map.h
@@ -365,6 +365,8 @@ private:
        u32 m_unprocessed_count;
        u32 m_inc_trending_up_start_time; // milliseconds
        bool m_queue_size_timer_started;
+
+       DISABLE_CLASS_COPY(Map);
 };
 
 /*
index 0561ddf9840f94d2c15ff1ddcce39d484f26e706..57e9958475d9d23ac7fcced16816e7d881517b93 100644 (file)
@@ -182,6 +182,9 @@ public:
 
        virtual void makeChunk(BlockMakeData *data) {}
        virtual int getGroundLevelAtPoint(v2s16 p) { return 0; }
+
+private:
+       DISABLE_CLASS_COPY(Mapgen);
 };
 
 struct MapgenFactory {
index 65e5c0176fe1ffb02c719488d155b92bbeddd70a..e7e956e511d17130e125e0f91a253db53b1072bf 100644 (file)
@@ -90,6 +90,9 @@ protected:
        INodeDefManager *m_ndef;
        std::vector<ObjDef *> m_objects;
        ObjDefType m_objtype;
+
+private:
+       DISABLE_CLASS_COPY(ObjDefManager);
 };
 
 #endif
index fa732010a6d0e7616843270f0112bc8d467d0245..a4be7d3fb78039be4fec1abc44dd86ecd658b630 100644 (file)
@@ -649,6 +649,8 @@ private:
                Particles
        */
        std::vector<u32> m_particlespawner_ids;
+
+       DISABLE_CLASS_COPY(Server);
 };
 
 /*
index 4c9af71bfebc5394d505ccd9fb99d969bcb8fd12..f1a4882b742f1b1bf83e032eb636d7ae52c9571c 100644 (file)
@@ -44,6 +44,7 @@ DEALINGS IN THE SOFTWARE.
        #include <pthread.h>
 #endif
 
+#include "basicmacros.h"
 
 class Mutex
 {
@@ -59,6 +60,8 @@ private:
 #else // pthread
        pthread_mutex_t mutex;
 #endif
+
+       DISABLE_CLASS_COPY(Mutex);
 };
 
 #endif  // C++11
index 58d758f2ebad41c55c396b4a50842b6b5885358b..736f2bc784d145d8801939e587f3b7aef57d28d2 100644 (file)
@@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
        #include <semaphore.h>
 #endif
 
+#include "basicmacros.h"
 
 class Semaphore {
 public:
@@ -46,6 +47,8 @@ private:
 #else
        sem_t semaphore;
 #endif
+
+       DISABLE_CLASS_COPY(Semaphore);
 };
 
 #endif
index 3d85e0eb9b6a43ce7983a6e12828d6318d6a89d0..83ca785c79f4c456986e194a0c46dce9fd8c9cdb 100644 (file)
@@ -161,6 +161,7 @@ private:
        std::thread *m_thread_obj;
 #endif
 
+       DISABLE_CLASS_COPY(Thread);
 };
 
 #endif