diff options
Diffstat (limited to 'include/EASTL/internal/enable_shared.h')
-rw-r--r-- | include/EASTL/internal/enable_shared.h | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/include/EASTL/internal/enable_shared.h b/include/EASTL/internal/enable_shared.h new file mode 100644 index 0000000..ac5f072 --- /dev/null +++ b/include/EASTL/internal/enable_shared.h @@ -0,0 +1,83 @@ +///////////////////////////////////////////////////////////////////////////// +// Copyright (c) Electronic Arts Inc. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + + +#ifndef EASTL_INTERNAL_ENABLE_SHARED_H +#define EASTL_INTERNAL_ENABLE_SHARED_H + + +#include <EABase/eabase.h> +#if defined(EA_PRAGMA_ONCE_SUPPORTED) + #pragma once +#endif + +namespace eastl +{ + + /// enable_shared_from_this + /// + /// This is a helper mixin class that allows you to make any class + /// export a shared_ptr instance that is associated with the class + /// instance. Any class that inherits from this class gets two functions: + /// shared_ptr<T> shared_from_this(); + /// shared_ptr<T> shared_from_this() const; + /// If you call shared_from_this, you get back a shared_ptr that + /// refers to the class. A second call to shared_from_this returns + /// another shared_ptr that is shared with the first one. + /// + /// The trick that happens which is not so obvious here (and which is + /// not mentioned at all in the Boost documentation of their version + /// of this) is that the shared_ptr constructor detects that the + /// class has an enable_shared_from_this mixin and sets up this system + /// automatically for the user. This is done with template tricks. + /// + /// For some additional explanation, see the Boost documentation for + /// their description of their version of enable_shared_from_this. + /// + template <typename T> + class enable_shared_from_this + { + public: + shared_ptr<T> shared_from_this() + { return shared_ptr<T>(mWeakPtr); } + + shared_ptr<const T> shared_from_this() const + { return shared_ptr<const T>(mWeakPtr); } + + weak_ptr<T> weak_from_this() + { return mWeakPtr; } + + weak_ptr<const T> weak_from_this() const + { return mWeakPtr; } + + public: // This is public because the alternative fails on some compilers that we need to support. + mutable weak_ptr<T> mWeakPtr; + + protected: + template <typename U> friend class shared_ptr; + + EA_CONSTEXPR enable_shared_from_this() EA_NOEXCEPT + { } + + enable_shared_from_this(const enable_shared_from_this&) EA_NOEXCEPT + { } + + enable_shared_from_this& operator=(const enable_shared_from_this&) EA_NOEXCEPT + { return *this; } + + ~enable_shared_from_this() + { } + + }; // enable_shared_from_this + +} // namespace eastl + + +#endif // Header include guard + + + + + + |