summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKUDr <kudr@openttd.org>2007-01-26 11:38:07 +0000
committerKUDr <kudr@openttd.org>2007-01-26 11:38:07 +0000
commit201ba1f5c3d6ee6324db82bde109a310fdb2d04d (patch)
treeac68bde5795292ff114b30e388d7bff3f1eda66e
parent29a332e829c60107d484bacdd2ceb25fe3761089 (diff)
downloadopenttd-201ba1f5c3d6ee6324db82bde109a310fdb2d04d.tar.xz
(svn r8414) -Codechange: Use own AutoPtrT instead of std::auto_ptr.
-Simplifies assignment from raw pointers -Should be harder to crash the program by incorrect assignment into it. -Should help with MorphOS compilation errors
-rw-r--r--projects/openttd.vcproj3
-rw-r--r--projects/openttd_vs80.vcproj3
-rw-r--r--source.list1
-rw-r--r--src/misc/autoptr.hpp95
-rw-r--r--src/station_cmd.cpp35
5 files changed, 119 insertions, 18 deletions
diff --git a/projects/openttd.vcproj b/projects/openttd.vcproj
index 69323471b..8062e4f33 100644
--- a/projects/openttd.vcproj
+++ b/projects/openttd.vcproj
@@ -1021,6 +1021,9 @@
RelativePath=".\..\src\misc\autocopyptr.hpp">
</File>
<File
+ RelativePath=".\..\src\misc\autoptr.hpp">
+ </File>
+ <File
RelativePath=".\..\src\misc\binaryheap.hpp">
</File>
<File
diff --git a/projects/openttd_vs80.vcproj b/projects/openttd_vs80.vcproj
index 26f45f5a9..3705df9df 100644
--- a/projects/openttd_vs80.vcproj
+++ b/projects/openttd_vs80.vcproj
@@ -1304,6 +1304,9 @@
RelativePath=".\..\src\misc\autocopyptr.hpp">
</File>
<File
+ RelativePath=".\..\src\misc\autoptr.hpp">
+ </File>
+ <File
RelativePath=".\..\src\misc\binaryheap.hpp">
</File>
<File
diff --git a/source.list b/source.list
index 9d7c6e9f1..377d6e50a 100644
--- a/source.list
+++ b/source.list
@@ -312,6 +312,7 @@ water_map.h
# Misc
misc/array.hpp
misc/autocopyptr.hpp
+misc/autoptr.hpp
misc/binaryheap.hpp
misc/blob.hpp
misc/countedptr.hpp
diff --git a/src/misc/autoptr.hpp b/src/misc/autoptr.hpp
new file mode 100644
index 000000000..eac3129b9
--- /dev/null
+++ b/src/misc/autoptr.hpp
@@ -0,0 +1,95 @@
+/* $Id:$ */
+
+#ifndef AUTOPTR_HPP
+#define AUTOPTR_HPP
+
+/** AutoPtrT - kind of smart pointer that ensures the owned object gets
+ * deleted when its pointer goes out of scope.
+ * It is non-invasive smart pointer (no reference counter).
+ * When copied, the copy takes ownership of underlying object
+ * and original becomes NULL!
+ * Can be used also for polymorphic data types (interfaces).
+ */
+template <class T>
+class AutoPtrT {
+public:
+ typedef T obj_t;
+
+protected:
+ mutable T* m_p; ///< points to the data
+
+public:
+ FORCEINLINE AutoPtrT()
+ : m_p(NULL)
+ {};
+
+ FORCEINLINE AutoPtrT(const AutoPtrT<T>& src)
+ : m_p(src.m_p)
+ {
+ if (m_p != NULL) src.m_p = NULL;
+ };
+
+ FORCEINLINE AutoPtrT(T *p)
+ : m_p(p)
+ {}
+
+ FORCEINLINE ~AutoPtrT()
+ {
+ if (m_p != NULL) {
+ delete m_p;
+ m_p = NULL;
+ }
+ }
+
+ /** give-up ownership and NULLify the raw pointer */
+ FORCEINLINE T* Release()
+ {
+ T* p = m_p;
+ m_p = NULL;
+ return p;
+ }
+
+ /** raw-pointer cast operator (read only) */
+ FORCEINLINE operator const T* () const
+ {
+ return m_p;
+ }
+
+ /** raw-pointer cast operator */
+ FORCEINLINE operator T* ()
+ {
+ return m_p;
+ }
+
+ /** dereference operator (read only) */
+ FORCEINLINE const T* operator -> () const
+ {
+ assert(m_p != NULL);
+ return m_p;
+ }
+
+ /** dereference operator (read / write) */
+ FORCEINLINE T* operator -> ()
+ {
+ assert(m_p != NULL);
+ return m_p;
+ }
+
+ /** assignment operator */
+ FORCEINLINE AutoPtrT& operator = (const AutoPtrT& src)
+ {
+ m_p = src.m_p;
+ if (m_p != NULL) src.m_p = NULL;
+ return *this;
+ }
+
+ /** forwarding 'lower than' operator to the underlaying items */
+ FORCEINLINE bool operator < (const AutoPtrT& other) const
+ {
+ assert(m_p != NULL);
+ assert(other.m_p != NULL);
+ return (*m_p) < (*other.m_p);
+ }
+};
+
+#endif /* AUTOPTR_HPP */
diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp
index 22f6b5c81..12a735caa 100644
--- a/src/station_cmd.cpp
+++ b/src/station_cmd.cpp
@@ -34,8 +34,7 @@
#include "yapf/yapf.h"
#include "date.h"
#include "helpers.hpp"
-
-#include <memory> // for auto_ptr
+#include "misc/autoptr.hpp"
/**
* Called if a new block is added to the station-pool
@@ -932,7 +931,7 @@ int32 CmdBuildRailroadStation(TileIndex tile_org, uint32 flags, uint32 p1, uint3
/* In case of new station if DC_EXEC is NOT set we still need to create the station
* to test if everything is OK. In this case we need to delete it before return. */
- std::auto_ptr<Station> st_auto_delete;
+ AutoPtrT<Station> st_auto_delete;
if (st != NULL) {
// Reuse an existing station.
@@ -955,7 +954,7 @@ int32 CmdBuildRailroadStation(TileIndex tile_org, uint32 flags, uint32 p1, uint3
if (st == NULL) return CMD_ERROR;
/* ensure that in case of error (or no DC_EXEC) the station gets deleted upon return */
- st_auto_delete = std::auto_ptr<Station>(st);
+ st_auto_delete = st;
st->town = ClosestTownFromTile(tile_org, (uint)-1);
if (!GenerateStationName(st, tile_org, 0)) return CMD_ERROR;
@@ -1044,7 +1043,7 @@ int32 CmdBuildRailroadStation(TileIndex tile_org, uint32 flags, uint32 p1, uint3
RebuildStationLists();
InvalidateWindow(WC_STATION_LIST, st->owner);
/* success, so don't delete the new station */
- st_auto_delete.release();
+ st_auto_delete.Release();
}
return cost;
@@ -1366,7 +1365,7 @@ int32 CmdBuildRoadStop(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
}
/* ensure that in case of error (or no DC_EXEC) the new road stop gets deleted upon return */
- std::auto_ptr<RoadStop> rs_auto_delete(road_stop);
+ AutoPtrT<RoadStop> rs_auto_delete(road_stop);
if (st != NULL &&
GetNumRoadStopsInStation(st, RoadStop::BUS) + GetNumRoadStopsInStation(st, RoadStop::TRUCK) >= RoadStop::LIMIT) {
@@ -1375,7 +1374,7 @@ int32 CmdBuildRoadStop(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
/* In case of new station if DC_EXEC is NOT set we still need to create the station
* to test if everything is OK. In this case we need to delete it before return. */
- std::auto_ptr<Station> st_auto_delete;
+ AutoPtrT<Station> st_auto_delete;
if (st != NULL) {
if (st->owner != OWNER_NONE && st->owner != _current_player) {
@@ -1391,7 +1390,7 @@ int32 CmdBuildRoadStop(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
if (st == NULL) return CMD_ERROR;
/* ensure that in case of error (or no DC_EXEC) the new station gets deleted upon return */
- st_auto_delete = std::auto_ptr<Station>(st);
+ st_auto_delete = st;
Town *t = st->town = ClosestTownFromTile(tile, (uint)-1);
@@ -1425,8 +1424,8 @@ int32 CmdBuildRoadStop(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
RebuildStationLists();
InvalidateWindow(WC_STATION_LIST, st->owner);
/* success, so don't delete the new station and the new road stop */
- st_auto_delete.release();
- rs_auto_delete.release();
+ st_auto_delete.Release();
+ rs_auto_delete.Release();
}
return cost;
}
@@ -1633,7 +1632,7 @@ int32 CmdBuildAirport(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
/* In case of new station if DC_EXEC is NOT set we still need to create the station
* to test if everything is OK. In this case we need to delete it before return. */
- std::auto_ptr<Station> st_auto_delete;
+ AutoPtrT<Station> st_auto_delete;
if (st != NULL) {
if (st->owner != OWNER_NONE && st->owner != _current_player)
@@ -1651,7 +1650,7 @@ int32 CmdBuildAirport(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
if (st == NULL) return CMD_ERROR;
/* ensure that in case of error (or no DC_EXEC) the station gets deleted upon return */
- st_auto_delete = std::auto_ptr<Station>(st);
+ st_auto_delete = st;
st->town = t;
@@ -1699,7 +1698,7 @@ int32 CmdBuildAirport(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
RebuildStationLists();
InvalidateWindow(WC_STATION_LIST, st->owner);
/* success, so don't delete the new station */
- st_auto_delete.release();
+ st_auto_delete.Release();
}
return cost;
@@ -1771,7 +1770,7 @@ int32 CmdBuildBuoy(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
if (st == NULL) return CMD_ERROR;
/* ensure that in case of error (or no DC_EXEC) the station gets deleted upon return */
- std::auto_ptr<Station> st_auto_delete(st);
+ AutoPtrT<Station> st_auto_delete(st);
st->town = ClosestTownFromTile(tile, (uint)-1);
st->sign.width_1 = 0;
@@ -1795,7 +1794,7 @@ int32 CmdBuildBuoy(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
RebuildStationLists();
InvalidateWindow(WC_STATION_LIST, st->owner);
/* success, so don't delete the new station */
- st_auto_delete.release();
+ st_auto_delete.Release();
}
return _price.build_dock;
@@ -1915,7 +1914,7 @@ int32 CmdBuildDock(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
/* In case of new station if DC_EXEC is NOT set we still need to create the station
* to test if everything is OK. In this case we need to delete it before return. */
- std::auto_ptr<Station> st_auto_delete;
+ AutoPtrT<Station> st_auto_delete;
if (st != NULL) {
if (st->owner != OWNER_NONE && st->owner != _current_player)
@@ -1930,7 +1929,7 @@ int32 CmdBuildDock(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
if (st == NULL) return CMD_ERROR;
/* ensure that in case of error (or no DC_EXEC) the station gets deleted upon return */
- st_auto_delete = std::auto_ptr<Station>(st);
+ st_auto_delete = st;
Town *t = st->town = ClosestTownFromTile(tile, (uint)-1);
@@ -1956,7 +1955,7 @@ int32 CmdBuildDock(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
RebuildStationLists();
InvalidateWindow(WC_STATION_LIST, st->owner);
/* success, so don't delete the new station */
- st_auto_delete.release();
+ st_auto_delete.Release();
}
return _price.build_dock;
}