diff --git a/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj b/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj
index 9017ba1d73..accc61fdc9 100644
--- a/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj
+++ b/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj
@@ -70,11 +70,8 @@
-
-
-
@@ -183,6 +180,7 @@
+
diff --git a/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj.filters b/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj.filters
index b57b3da3de..73c1c0a735 100644
--- a/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj.filters
+++ b/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj.filters
@@ -815,15 +815,6 @@
beast_asio\basics
-
- beast_asio\basics
-
-
- beast_asio\basics
-
-
- beast_asio\basics
- beast_asio\basics
@@ -857,6 +848,12 @@
beast_asio\handshake
+
+ beast_asio\basics
+
+
+ beast_core\memory
+
diff --git a/Subtrees/beast/modules/beast_basics/events/beast_OncePerSecond.cpp b/Subtrees/beast/modules/beast_basics/events/beast_OncePerSecond.cpp
index 6b436ec51c..0fed5ec806 100644
--- a/Subtrees/beast/modules/beast_basics/events/beast_OncePerSecond.cpp
+++ b/Subtrees/beast/modules/beast_basics/events/beast_OncePerSecond.cpp
@@ -21,7 +21,7 @@ class OncePerSecond::TimerSingleton
: public SharedSingleton
, private InterruptibleThread::EntryPoint
{
-private:
+public:
TimerSingleton ()
: SharedSingleton (
SingletonLifetime::persistAfterCreation)
diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_GlobalFifoFreeStore.h b/Subtrees/beast/modules/beast_basics/memory/beast_GlobalFifoFreeStore.h
index 987a584cde..bdeff7ce6f 100644
--- a/Subtrees/beast/modules/beast_basics/memory/beast_GlobalFifoFreeStore.h
+++ b/Subtrees/beast/modules/beast_basics/memory/beast_GlobalFifoFreeStore.h
@@ -45,7 +45,7 @@ public:
return new GlobalFifoFreeStore;
}
-private:
+public:
GlobalFifoFreeStore ()
: SharedSingleton >
(SingletonLifetime::persistAfterCreation)
diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_GlobalPagedFreeStore.h b/Subtrees/beast/modules/beast_basics/memory/beast_GlobalPagedFreeStore.h
index 17c88af013..aa52d65066 100644
--- a/Subtrees/beast/modules/beast_basics/memory/beast_GlobalPagedFreeStore.h
+++ b/Subtrees/beast/modules/beast_basics/memory/beast_GlobalPagedFreeStore.h
@@ -30,7 +30,7 @@ class BEAST_API GlobalPagedFreeStore
: public SharedSingleton
, LeakChecked
{
-private:
+public:
GlobalPagedFreeStore ();
~GlobalPagedFreeStore ();
diff --git a/Subtrees/beast/modules/beast_core/beast_core.h b/Subtrees/beast/modules/beast_core/beast_core.h
index 683e845a8b..5cc6d85086 100644
--- a/Subtrees/beast/modules/beast_core/beast_core.h
+++ b/Subtrees/beast/modules/beast_core/beast_core.h
@@ -227,6 +227,7 @@ namespace beast
#include "text/beast_CharPointer_UTF8.h"
#include "text/beast_LexicalCast.h"
+#include "memory/beast_ContainerDeletePolicy.h"
#include "time/beast_PerformedAtExit.h"
#include "diagnostic/beast_LeakChecked.h"
#include "memory/beast_ByteOrder.h"
diff --git a/Subtrees/beast/modules/beast_core/containers/beast_OwnedArray.h b/Subtrees/beast/modules/beast_core/containers/beast_OwnedArray.h
index 684a253d8b..8004e6801a 100644
--- a/Subtrees/beast/modules/beast_core/containers/beast_OwnedArray.h
+++ b/Subtrees/beast/modules/beast_core/containers/beast_OwnedArray.h
@@ -409,9 +409,10 @@ public:
}
}
- delete toDelete; // don't want to use a ScopedPointer here because if the
- // object has a private destructor, both OwnedArray and
- // ScopedPointer would need to be friend classes..
+ // don't want to use a ScopedPointer here because if the
+ // object has a private destructor, both OwnedArray and
+ // ScopedPointer would need to be friend classes..
+ ContainerDeletePolicy ::destroy (toDelete);
}
else
{
@@ -591,9 +592,10 @@ public:
}
}
- delete toDelete; // don't want to use a ScopedPointer here because if the
- // object has a private destructor, both OwnedArray and
- // ScopedPointer would need to be friend classes..
+ // don't want to use a ScopedPointer here because if the
+ // object has a private destructor, both OwnedArray and
+ // ScopedPointer would need to be friend classes..
+ ContainerDeletePolicy ::destroy (toDelete);
if ((numUsed << 1) < data.numAllocated)
minimiseStorageOverheads();
@@ -682,7 +684,7 @@ public:
{
for (int i = startIndex; i < endIndex; ++i)
{
- delete data.elements [i];
+ ContainerDeletePolicy ::destroy (data.elements [i]);
data.elements [i] = nullptr; // (in case one of the destructors accesses this array and hits a dangling pointer)
}
}
@@ -879,7 +881,7 @@ private:
void deleteAllObjects()
{
while (numUsed > 0)
- delete data.elements [--numUsed];
+ ContainerDeletePolicy ::destroy (data.elements [--numUsed]);
}
};
diff --git a/Subtrees/beast/modules/beast_core/memory/beast_ContainerDeletePolicy.h b/Subtrees/beast/modules/beast_core/memory/beast_ContainerDeletePolicy.h
new file mode 100644
index 0000000000..2a282b2940
--- /dev/null
+++ b/Subtrees/beast/modules/beast_core/memory/beast_ContainerDeletePolicy.h
@@ -0,0 +1,48 @@
+//------------------------------------------------------------------------------
+/*
+ This file is part of Beast: https://github.com/vinniefalco/Beast
+ Copyright 2013, Vinnie Falco
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+//==============================================================================
+
+#ifndef BEAST_CONTAINERDELETEPOLICY_H_INCLUDED
+#define BEAST_CONTAINERDELETEPOLICY_H_INCLUDED
+
+/** The DeletePolicy provides a way to destroy objects stored in containers.
+
+ This is a specialized class. The default implementation
+ calls operator delete. You can customize it for your classes
+ by providing a suitable specialization.
+
+ A DeletePolicy must support these concepts:
+ DefaultConstructible
+ MoveConstructible (C++11)
+ CopyConstructible
+ MoveAssignable (C++11)
+ Destructible
+*/
+
+/** The DefaultDeletePolicy simply calls operator delete.
+*/
+template
+struct ContainerDeletePolicy
+{
+ static inline void destroy (T* t)
+ {
+ delete t;
+ }
+};
+
+#endif
diff --git a/Subtrees/beast/modules/beast_core/memory/beast_ScopedPointer.h b/Subtrees/beast/modules/beast_core/memory/beast_ScopedPointer.h
index 32d8aa8327..60d1a2952a 100644
--- a/Subtrees/beast/modules/beast_core/memory/beast_ScopedPointer.h
+++ b/Subtrees/beast/modules/beast_core/memory/beast_ScopedPointer.h
@@ -67,7 +67,8 @@ class ScopedPointer : public Uncopyable
public:
//==============================================================================
/** Creates a ScopedPointer containing a null pointer. */
- inline ScopedPointer() noexcept : object (nullptr)
+ inline ScopedPointer() noexcept
+ : object (nullptr)
{
}
@@ -92,7 +93,10 @@ public:
/** Destructor.
This will delete the object that this ScopedPointer currently refers to.
*/
- inline ~ScopedPointer() { delete object; }
+ inline ~ScopedPointer()
+ {
+ ContainerDeletePolicy ::destroy (object);
+ }
/** Changes this ScopedPointer to point to a new object.
@@ -114,7 +118,7 @@ public:
ObjectType* const oldObject = object;
object = objectToTransferFrom.object;
objectToTransferFrom.object = nullptr;
- delete oldObject;
+ ContainerDeletePolicy ::destroy (oldObject);
}
return *this;
@@ -133,7 +137,7 @@ public:
{
ObjectType* const oldObject = object;
object = newObjectToTakePossessionOf;
- delete oldObject;
+ ContainerDeletePolicy ::destroy (oldObject);
}
return *this;
diff --git a/Subtrees/beast/modules/beast_core/memory/beast_SharedObject.h b/Subtrees/beast/modules/beast_core/memory/beast_SharedObject.h
index 87f3d4b255..7aec64ff81 100644
--- a/Subtrees/beast/modules/beast_core/memory/beast_SharedObject.h
+++ b/Subtrees/beast/modules/beast_core/memory/beast_SharedObject.h
@@ -21,12 +21,11 @@
*/
//==============================================================================
-#ifndef BEAST_REFERENCECOUNTEDOBJECT_BEASTHEADER
-#define BEAST_REFERENCECOUNTEDOBJECT_BEASTHEADER
+#ifndef BEAST_SHAREDOBJECT_H_INCLUDED
+#define BEAST_SHAREDOBJECT_H_INCLUDED
#include "beast_Atomic.h"
-
//==============================================================================
/**
Adds reference-counting to an object.
@@ -75,14 +74,23 @@ public:
/** Decreases the object's reference count.
- If the count gets to zero, the object will be deleted.
+ If doDelete is true the object will be deleted when the reference
+ count drops to zero. The delete is performed using the regular
+ operator and does NOT go through the ContainerDeletePolicy.
+
+ The return value indicates if the reference count dropped to zero,
+ so callers who know the derived type can use the ContainerDeletePolicy.
*/
- inline void decReferenceCount() noexcept
+ inline bool decReferenceCount (bool doDelete = true) noexcept
{
bassert (getReferenceCount() > 0);
-
if (--refCount == 0)
- delete this;
+ {
+ if (doDelete)
+ delete this;
+ return true;
+ }
+ return false;
}
/** Returns the object's current reference count. */
@@ -115,7 +123,6 @@ private:
Atomic refCount;
};
-
//==============================================================================
/**
Adds reference-counting to an object.
@@ -143,16 +150,26 @@ public:
/** Decreases the object's reference count.
- If the count gets to zero, the object will be deleted.
+ If doDelete is true the object will be deleted when the reference
+ count drops to zero. The delete is performed using the regular
+ operator and does NOT go through the ContainerDeletePolicy.
+
+ The return value indicates if the reference count dropped to zero,
+ so callers who know the derived type can use the ContainerDeletePolicy.
*/
- inline void decReferenceCount() noexcept
+ inline bool decReferenceCount (bool doDelete = true) noexcept
{
bassert (getReferenceCount() > 0);
-
if (--refCount == 0)
- delete this;
+ {
+ if (doDelete)
+ delete this;
+ return true;
+ }
+ return false;
}
+
/** Returns the object's current reference count. */
inline int getReferenceCount() const noexcept { return refCount; }
@@ -190,12 +207,12 @@ private:
@see SharedObject, SharedObjectArray
*/
-template
+template
class SharedObjectPtr
{
public:
/** The class being referenced by this pointer. */
- typedef SharedObjectClass ReferencedType;
+ typedef Object ReferencedType;
//==============================================================================
/** Creates a pointer to a null object. */
@@ -208,7 +225,7 @@ public:
This will increment the object's reference-count if it is non-null.
*/
- inline SharedObjectPtr (SharedObjectClass* const refCountedObject) noexcept
+ inline SharedObjectPtr (Object* const refCountedObject) noexcept
: referencedObject (refCountedObject)
{
if (refCountedObject != nullptr)
@@ -239,7 +256,7 @@ public:
*/
template
inline SharedObjectPtr (const SharedObjectPtr& other) noexcept
- : referencedObject (static_cast (other.get()))
+ : referencedObject (static_cast