diff --git a/beast/Memory.h b/beast/Memory.h index e84e0e682..49ff62c89 100644 --- a/beast/Memory.h +++ b/beast/Memory.h @@ -43,7 +43,7 @@ void zerostruct (Type& structure) noexcept /** Delete an object pointer, and sets the pointer to null. - Remember that it's not good c++ practice to use delete directly - always try to use a ScopedPointer + Remember that it's not good c++ practice to use delete directly - always try to use a std::unique_ptr or other automatic lifetime-management system rather than resorting to deleting raw pointers! */ template diff --git a/beast/SmartPtr.h b/beast/SmartPtr.h index c1f91ff0c..a76a5850c 100644 --- a/beast/SmartPtr.h +++ b/beast/SmartPtr.h @@ -22,9 +22,7 @@ #include -#include #include #include -#include #endif diff --git a/beast/module/core/files/DirectoryIterator.cpp b/beast/module/core/files/DirectoryIterator.cpp index ead47f250..4c5edbc89 100644 --- a/beast/module/core/files/DirectoryIterator.cpp +++ b/beast/module/core/files/DirectoryIterator.cpp @@ -21,8 +21,9 @@ */ //============================================================================== -namespace beast -{ +#include // + +namespace beast { static StringArray parseWildcards (const String& pattern) { @@ -97,8 +98,9 @@ bool DirectoryIterator::next (bool* const isDirResult, bool* const isHiddenResul if (isDirectory) { if (isRecursive && ((whatToLookFor & File::ignoreHiddenFiles) == 0 || ! isHidden)) - subIterator = new DirectoryIterator (File::createFileWithoutCheckingPath (path + filename), - true, wildCard, whatToLookFor); + subIterator = std::make_unique ( + File::createFileWithoutCheckingPath (path + filename), + true, wildCard, whatToLookFor); matches = (whatToLookFor & File::findDirectories) != 0; } diff --git a/beast/module/core/files/DirectoryIterator.h b/beast/module/core/files/DirectoryIterator.h index ebe168d2b..10b9cc8b9 100644 --- a/beast/module/core/files/DirectoryIterator.h +++ b/beast/module/core/files/DirectoryIterator.h @@ -24,8 +24,9 @@ #ifndef BEAST_DIRECTORYITERATOR_H_INCLUDED #define BEAST_DIRECTORYITERATOR_H_INCLUDED -namespace beast -{ +#include + +namespace beast { //============================================================================== /** @@ -129,11 +130,9 @@ private: private: friend class DirectoryIterator; - friend class ScopedPointer; - ScopedPointer pimpl; + std::unique_ptr pimpl; }; - friend class ScopedPointer; StringArray wildCards; NativeIterator fileFinder; String wildCard, path; @@ -142,7 +141,7 @@ private: const int whatToLookFor; const bool isRecursive; bool hasBeenAdvanced; - ScopedPointer subIterator; + std::unique_ptr subIterator; File currentFile; }; diff --git a/beast/module/core/files/File.cpp b/beast/module/core/files/File.cpp index f613ba009..9bf40a1d7 100644 --- a/beast/module/core/files/File.cpp +++ b/beast/module/core/files/File.cpp @@ -22,6 +22,7 @@ //============================================================================== #include +#include namespace beast { @@ -674,7 +675,7 @@ bool File::startAsProcess (const String& parameters) const //============================================================================== FileInputStream* File::createInputStream() const { - ScopedPointer fin (new FileInputStream (*this)); + std::unique_ptr fin (new FileInputStream (*this)); if (fin->openedOk()) return fin.release(); @@ -684,7 +685,7 @@ FileInputStream* File::createInputStream() const FileOutputStream* File::createOutputStream (const size_t bufferSize) const { - ScopedPointer out (new FileOutputStream (*this, bufferSize)); + std::unique_ptr out (new FileOutputStream (*this, bufferSize)); return out->failedToOpen() ? nullptr : out.release(); diff --git a/beast/module/core/files/TemporaryFile.h b/beast/module/core/files/TemporaryFile.h index e11c04ac0..1c47c7ccc 100644 --- a/beast/module/core/files/TemporaryFile.h +++ b/beast/module/core/files/TemporaryFile.h @@ -45,7 +45,7 @@ namespace beast TemporaryFile temp (myTargetFile); // create a stream to the temporary file, and write some data to it... - ScopedPointer out (temp.getFile().createOutputStream()); + std::unique_ptr out (temp.getFile().createOutputStream()); if (out != nullptr) { diff --git a/beast/smart_ptr/ContainerDeletePolicy.h b/beast/smart_ptr/ContainerDeletePolicy.h deleted file mode 100644 index 9d65bf11a..000000000 --- a/beast/smart_ptr/ContainerDeletePolicy.h +++ /dev/null @@ -1,52 +0,0 @@ -//------------------------------------------------------------------------------ -/* - 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_SMARTPTR_CONTAINERDELETEPOLICY_H_INCLUDED -#define BEAST_SMARTPTR_CONTAINERDELETEPOLICY_H_INCLUDED - -namespace beast { - -/** 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/beast/smart_ptr/ScopedPointer.h b/beast/smart_ptr/ScopedPointer.h deleted file mode 100644 index 52eb1c70d..000000000 --- a/beast/smart_ptr/ScopedPointer.h +++ /dev/null @@ -1,271 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - 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_SMARTPTR_SCOPEDPOINTER_H_INCLUDED -#define BEAST_SMARTPTR_SCOPEDPOINTER_H_INCLUDED - -#include -#include -#include -#include -#include - -namespace beast { - -//============================================================================== -/** - This class holds a pointer which is automatically deleted when this object goes - out of scope. - - Once a pointer has been passed to a ScopedPointer, it will make sure that the pointer - gets deleted when the ScopedPointer is deleted. Using the ScopedPointer on the stack or - as member variables is a good way to use RAII to avoid accidentally leaking dynamically - created objects. - - A ScopedPointer can be used in pretty much the same way that you'd use a normal pointer - to an object. If you use the assignment operator to assign a different object to a - ScopedPointer, the old one will be automatically deleted. - - Important note: The class is designed to hold a pointer to an object, NOT to an array! - It calls delete on its payload, not delete[], so do not give it an array to hold! For - that kind of purpose, you should be using HeapBlock or Array instead. - - A const ScopedPointer is guaranteed not to lose ownership of its object or change the - object to which it points during its lifetime. This means that making a copy of a const - ScopedPointer is impossible, as that would involve the new copy taking ownership from the - old one. - - If you need to get a pointer out of a ScopedPointer without it being deleted, you - can use the release() method. - - Something to note is the main difference between this class and the std::auto_ptr class, - which is that ScopedPointer provides a cast-to-object operator, wheras std::auto_ptr - requires that you always call get() to retrieve the pointer. The advantages of providing - the cast is that you don't need to call get(), so can use the ScopedPointer in pretty much - exactly the same way as a raw pointer. The disadvantage is that the compiler is free to - use the cast in unexpected and sometimes dangerous ways - in particular, it becomes difficult - to return a ScopedPointer as the result of a function. To avoid this causing errors, - ScopedPointer contains an overloaded constructor that should cause a syntax error in these - circumstances, but it does mean that instead of returning a ScopedPointer from a function, - you'd need to return a raw pointer (or use a std::auto_ptr instead). -*/ -template -class ScopedPointer : public Uncopyable -{ -public: - //============================================================================== - /** Creates a ScopedPointer containing a null pointer. */ - inline ScopedPointer() - : object (nullptr) - { - } - - /** Creates a ScopedPointer that owns the specified object. */ - inline ScopedPointer (ObjectType* const objectToTakePossessionOf) - : object (objectToTakePossessionOf) - { - } - - /** Creates a ScopedPointer that takes its pointer from another ScopedPointer. - - Because a pointer can only belong to one ScopedPointer, this transfers - the pointer from the other object to this one, and the other object is reset to - be a null pointer. - */ - ScopedPointer (ScopedPointer& objectToTransferFrom) - : object (objectToTransferFrom.object) - { - objectToTransferFrom.object = nullptr; - } - - /** Destructor. - This will delete the object that this ScopedPointer currently refers to. - */ - inline ~ScopedPointer() - { - ContainerDeletePolicy ::destroy (object); - } - - /** Changes this ScopedPointer to point to a new object. - - Because a pointer can only belong to one ScopedPointer, this transfers - the pointer from the other object to this one, and the other object is reset to - be a null pointer. - - If this ScopedPointer already points to an object, that object - will first be deleted. - */ - ScopedPointer& operator= (ScopedPointer& objectToTransferFrom) - { - if (this != objectToTransferFrom.getAddress()) - { - // Two ScopedPointers should never be able to refer to the same object - if - // this happens, you must have done something dodgy! - bassert (object == nullptr || object != objectToTransferFrom.object); - - ObjectType* const oldObject = object; - object = objectToTransferFrom.object; - objectToTransferFrom.object = nullptr; - ContainerDeletePolicy ::destroy (oldObject); - } - - return *this; - } - - /** Changes this ScopedPointer to point to a new object. - - If this ScopedPointer already points to an object, that object - will first be deleted. - - The pointer that you pass in may be a nullptr. - */ - ScopedPointer& operator= (ObjectType* const newObjectToTakePossessionOf) - { - if (object != newObjectToTakePossessionOf) - { - ObjectType* const oldObject = object; - object = newObjectToTakePossessionOf; - ContainerDeletePolicy ::destroy (oldObject); - } - - return *this; - } - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - ScopedPointer (ScopedPointer&& other) - : object (other.object) - { - other.object = nullptr; - } - - ScopedPointer& operator= (ScopedPointer&& other) - { - object = other.object; - other.object = nullptr; - return *this; - } - #endif - - //============================================================================== - /** Returns the object that this ScopedPointer refers to. */ - inline operator ObjectType*() const { return object; } - - /** Returns the object that this ScopedPointer refers to. */ - inline ObjectType* get() const { return object; } - - /** Returns the object that this ScopedPointer refers to. */ - inline ObjectType& operator*() const { return *object; } - - /** Lets you access methods and properties of the object that this ScopedPointer refers to. */ - inline ObjectType* operator->() const { return object; } - - //============================================================================== - /** Removes the current object from this ScopedPointer without deleting it. - This will return the current object, and set the ScopedPointer to a null pointer. - */ - ObjectType* release() { ObjectType* const o = object; object = nullptr; return o; } - - void reset (ObjectType* object_) - { - if (object != object_) - { - ContainerDeletePolicy ::destroy (object); - object = object_; - } - } - - //============================================================================== - /** Swaps this object with that of another ScopedPointer. - The two objects simply exchange their pointers. - */ - void swapWith (ScopedPointer & other) - { - // Two ScopedPointers should never be able to refer to the same object - if - // this happens, you must have done something dodgy! - bassert (object != other.object || this == other.getAddress()); - - std::swap (object, other.object); - } - - /** If the pointer is non-null, this will attempt to return a new copy of the object that is pointed to. - If the pointer is null, this will safely return a nullptr. - */ - inline ObjectType* createCopy() const { return createCopyIfNotNull (object); } - -private: - //============================================================================== - ObjectType* object; - - // (Required as an alternative to the overloaded & operator). - const ScopedPointer* getAddress() const { return this; } - - #if ! BEAST_MSVC // (MSVC can't deal with multiple copy constructors) - /* The copy constructors are private to stop people accidentally copying a const ScopedPointer - (the compiler would let you do so by implicitly casting the source to its raw object pointer). - - A side effect of this is that in a compiler that doesn't support C++11, you may hit an - error when you write something like this: - - ScopedPointer m = new MyClass(); // Compile error: copy constructor is private. - - Even though the compiler would normally ignore the assignment here, it can't do so when the - copy constructor is private. It's very easy to fix though - just write it like this: - - ScopedPointer m (new MyClass()); // Compiles OK - - It's probably best to use the latter form when writing your object declarations anyway, as - this is a better representation of the code that you actually want the compiler to produce. - */ - #endif -}; - -//============================================================================== -/** Compares a ScopedPointer with another pointer. - This can be handy for checking whether this is a null pointer. -*/ -template -bool operator== (const ScopedPointer& pointer1, ObjectType* const pointer2) -{ - return static_cast (pointer1) == pointer2; -} - -/** Compares a ScopedPointer with another pointer. - This can be handy for checking whether this is a null pointer. -*/ -template -bool operator!= (const ScopedPointer& pointer1, ObjectType* const pointer2) -{ - return static_cast (pointer1) != pointer2; -} - -//============================================================================== -#ifndef DOXYGEN -// NB: This is just here to prevent any silly attempts to call deleteAndZero() on a ScopedPointer. -template -void deleteAndZero (ScopedPointer&) { static_bassert (sizeof (Type) == 12345); } -#endif - -} - -#endif - diff --git a/beast/smart_ptr/SharedObject.h b/beast/smart_ptr/SharedObject.h index 1ceca91dd..12f21b213 100644 --- a/beast/smart_ptr/SharedObject.h +++ b/beast/smart_ptr/SharedObject.h @@ -77,15 +77,7 @@ public: ++refCount; } - /** Decreases the object's reference count. - - 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. - */ + /** Decreases the object's reference count. */ void decReferenceCount () const { bassert (getReferenceCount() > 0);