aboutsummaryrefslogtreecommitdiff
path: root/include/EASTL/scoped_ptr.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/EASTL/scoped_ptr.h')
-rw-r--r--include/EASTL/scoped_ptr.h256
1 files changed, 0 insertions, 256 deletions
diff --git a/include/EASTL/scoped_ptr.h b/include/EASTL/scoped_ptr.h
deleted file mode 100644
index 3ba01da..0000000
--- a/include/EASTL/scoped_ptr.h
+++ /dev/null
@@ -1,256 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////
-// Copyright (c) Electronic Arts Inc. All rights reserved.
-///////////////////////////////////////////////////////////////////////////////
-
-
-///////////////////////////////////////////////////////////////////////////////
-// *** Note ***
-// *** This code is deprecated in favor of the C++11-conforming ***
-// *** eastl::unique_ptr template class found in <EASTL/unique_ptr.h> ***
-///////////////////////////////////////////////////////////////////////////////
-
-
-#ifndef EASTL_SCOPED_PTR_H
-#define EASTL_SCOPED_PTR_H
-
-
-#include <EASTL/internal/config.h>
-#include <EASTL/internal/smart_ptr.h> // Defines smart_ptr_deleter
-#include <stddef.h>
-
-#if defined(EA_PRAGMA_ONCE_SUPPORTED)
- #pragma once // Some compilers (e.g. VC++) benefit significantly from using this. We've measured 3-4% build speed improvements in apps as a result.
-#endif
-
-
-
-namespace eastl
-{
- /// class scoped_ptr
- ///
- /// This class is intended to be the same as the C++11 unique_ptr class,
- /// but was created before there was such a thing.
- ///
- /// This class implements a scoped_ptr template. This is a class which is
- /// similar to the C++ auto_ptr template, except that it prohibits copying
- /// of itself, for safety.
- ///
- /// More specifically, the scoped_ptr class template stores a pointer to a
- /// dynamically allocated object. The object pointed to is automatically
- /// deleted on destructor of scoped_ptr or can be manually deleted via the
- /// scopted_ptr::reset function.
- ///
- /// scoped_ptr cannot be used in C++ Standard Library containers; you'll need
- /// to use the shared_ptr template if you want to do this. The reason you can't
- /// use scoped_ptr is that it prohibits copying. You can't (safely) use auto_ptr
- /// in C++ Standard Library containers because copying of an auto_ptr will
- /// create a situation whereby objects are multiply freed.
- ///
- /// scoped_ptr cannot be used with arrays of objects. The reason for this is
- /// that it calls delete on the owned pointer and not delete[]. The latter
- /// allows for the calling of the destructors for the objects of the owned pointer.
- /// If you want to use scoped_ptr with a dynamically allocated array, use the
- /// scoped_array function instead.
- ///
- template <typename T, typename Deleter = smart_ptr_deleter<T> >
- class scoped_ptr
- {
- protected:
- /// this_type
- /// This is an alias for scoped_ptr<T>, this class.
- typedef scoped_ptr<T> this_type;
-
- /// deleter_type
- typedef Deleter deleter_type;
-
- /// mpValue
- /// The owned pointer.
- T* mpValue;
-
- /// scoped_ptr
- /// This function is private in order to prevent copying, for safety.
- scoped_ptr(const scoped_ptr&);
-
- /// scoped_ptr
- /// This function is private in order to prevent copying, for safety.
- scoped_ptr& operator=(const scoped_ptr&);
-
- /// scoped_ptr
- /// This function is private in order to prevent copying, for safety.
- scoped_ptr& operator=(T* pValue);
-
- public:
- typedef T element_type;
-
- /// scoped_ptr
- /// Construct a scoped_ptr from a pointer allocated via new.
- /// Example usage:
- /// scoped_ptr<int> ptr(new int(3));
- explicit scoped_ptr(T* pValue = NULL)
- : mpValue(pValue) {}
-
- /// ~scoped_ptr
- /// Destroys the owned pointer. The destructor for the object
- /// referred to by the owned pointer will be called.
- ~scoped_ptr()
- {
- Deleter del;
- del(mpValue);
- }
-
- /// reset
- /// Deletes the owned pointer and takes ownership of the
- /// passed in pointer. If the passed in pointer is the same
- /// as the owned pointer, nothing is done.
- /// Example usage:
- /// scoped_ptr<int> ptr(new int(3));
- /// ptr.reset(new int(4)); // deletes int(3)
- /// ptr.reset(NULL); // deletes int(4)
- void reset(T* pValue = NULL)
- {
- if(pValue != mpValue)
- {
- Deleter del;
- del(mpValue);
- mpValue = pValue;
- }
- }
-
- /// detach
- /// This simply forgets the owned pointer. It doesn't
- /// free it but rather assumes that the user does.
- /// Example usage:
- /// scoped_ptr<int> ptr(new int(3));
- /// int* pInt = ptr.detach();
- /// delete pInt;
- T* detach()
- {
- T* const pTemp = mpValue;
- mpValue = NULL;
- return pTemp;
- }
-
- /// swap
- /// Exchanges the owned pointer beween two scoped_ptr objects.
- void swap(this_type& scopedPtr)
- {
- // std::swap(mpValue, scopedPtr.mpValue); // Not used so that we can reduce a dependency.
- T* const pValue = scopedPtr.mpValue;
- scopedPtr.mpValue = mpValue;
- mpValue = pValue;
- }
-
- /// operator*
- /// Returns the owner pointer dereferenced.
- /// Example usage:
- /// scoped_ptr<int> ptr(new int(3));
- /// int x = *ptr;
- typename add_lvalue_reference<T>::type operator*() const
- {
- // assert(mpValue);
- return *mpValue;
- }
-
- /// operator->
- /// Allows access to the owned pointer via operator->()
- /// Example usage:
- /// struct X{ void DoSomething(); };
- /// scoped_ptr<int> ptr(new X);
- /// ptr->DoSomething();
- T* operator->() const
- {
- // assert(mpValue);
- return mpValue;
- }
-
- /// get
- /// Returns the owned pointer. Note that this class does
- /// not provide an operator T() function. This is because such
- /// a thing (automatic conversion) is deemed unsafe.
- /// Example usage:
- /// struct X{ void DoSomething(); };
- /// scoped_ptr<int> ptr(new X);
- /// X* pX = ptr.get();
- /// pX->DoSomething();
- T* get() const
- {
- return mpValue;
- }
-
- /// Implicit operator bool
- /// Allows for using a scoped_ptr as a boolean.
- /// Example usage:
- /// scoped_ptr<int> ptr(new int(3));
- /// if(ptr)
- /// ++*ptr;
- ///
- /// Note that below we do not use operator bool(). The reason for this
- /// is that booleans automatically convert up to short, int, float, etc.
- /// The result is that this: if(scopedPtr == 1) would yield true (bad).
- typedef T* (this_type::*bool_)() const;
- operator bool_() const
- {
- if(mpValue)
- return &this_type::get;
- return NULL;
- }
-
- /// operator!
- /// This returns the opposite of operator bool; it returns true if
- /// the owned pointer is null. Some compilers require this and some don't.
- /// scoped_ptr<int> ptr(new int(3));
- /// if(!ptr)
- /// assert(false);
- bool operator!() const
- {
- return (mpValue == NULL);
- }
-
- }; // class scoped_ptr
-
-
-
- /// get_pointer
- /// returns scoped_ptr::get() via the input scoped_ptr.
- template <typename T, typename D>
- inline T* get_pointer(const scoped_ptr<T, D>& scopedPtr)
- {
- return scopedPtr.get();
- }
-
-
- /// swap
- /// Exchanges the owned pointer beween two scoped_ptr objects.
- /// This non-member version is useful for compatibility of scoped_ptr
- /// objects with the C++ Standard Library and other libraries.
- template <typename T, typename D>
- inline void swap(scoped_ptr<T, D>& scopedPtr1, scoped_ptr<T, D>& scopedPtr2)
- {
- scopedPtr1.swap(scopedPtr2);
- }
-
-
- /// operator<
- /// Returns which scoped_ptr is 'less' than the other. Useful when storing
- /// sorted containers of scoped_ptr objects.
- template <typename T, typename D>
- inline bool operator<(const scoped_ptr<T, D>& scopedPtr1, const scoped_ptr<T, D>& scopedPtr2)
- {
- return (scopedPtr1.get() < scopedPtr2.get()); // Alternatively use: std::less<T*>(scopedPtr1.get(), scopedPtr2.get());
- }
-
-
-} // namespace eastl
-
-
-#endif // Header include guard
-
-
-
-
-
-
-
-
-
-