From f2dd438a7d4bd03357f16e3c9fdb011b953d16fc Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Fri, 15 Jul 2016 21:22:11 +0200 Subject: [PATCH] [DEBUG] correct some errors --- ememory/EnableSharedFromThis.h | 2 +- ememory/SharedPtr.h | 17 +++++++++++++++++ ememory/WeakPtr.h | 1 + ememory/details/SharedPtr.hxx | 23 +++++++++++++++++++++++ ememory/details/WeakPtr.hxx | 7 +++++++ ememory/memory.h | 11 ++++++++--- 6 files changed, 57 insertions(+), 4 deletions(-) diff --git a/ememory/EnableSharedFromThis.h b/ememory/EnableSharedFromThis.h index 85274e9..f057ca9 100644 --- a/ememory/EnableSharedFromThis.h +++ b/ememory/EnableSharedFromThis.h @@ -16,7 +16,7 @@ namespace ememory { class EnableSharedFromThis { friend class ememory::SharedPtr; private: - ememory::WeakPtr m_weakThis; + mutable ememory::WeakPtr m_weakThis; protected: EnableSharedFromThis(); virtual ~EnableSharedFromThis() = default; diff --git a/ememory/SharedPtr.h b/ememory/SharedPtr.h index 962b3da..1fdc23e 100644 --- a/ememory/SharedPtr.h +++ b/ememory/SharedPtr.h @@ -33,6 +33,7 @@ namespace ememory { , int>::type = 0> SharedPtr(EMEMORY_TYPE2* _element); public: + SharedPtr(std::nullptr_t); SharedPtr(); ~SharedPtr(); SharedPtr(EMEMORY_TYPE* _obj, ememory::Counter* _counter); @@ -58,9 +59,25 @@ namespace ememory { bool operator!=(const SharedPtr& _obj) const; const EMEMORY_TYPE* get() const; EMEMORY_TYPE* get(); + template::value + && !std::is_same::value + , int>::type = 0> const EMEMORY_TYPE* operator->() const; + template::value + && !std::is_same::value + , int>::type = 0> EMEMORY_TYPE* operator->(); + template::value + && !std::is_same::value + , int>::type = 0> const EMEMORY_TYPE& operator*() const; + template::value + && !std::is_same::value + , int>::type = 0> EMEMORY_TYPE& operator*(); void swap(SharedPtr& _obj); ememory::Counter* getCounter() const { diff --git a/ememory/WeakPtr.h b/ememory/WeakPtr.h index 1d2dc4c..51c6025 100644 --- a/ememory/WeakPtr.h +++ b/ememory/WeakPtr.h @@ -22,6 +22,7 @@ namespace ememory { ememory::Counter* m_counter; public: WeakPtr(); + WeakPtr(std::nullptr_t); private: WeakPtr(EMEMORY_TYPE* _element); // this is only for enable shared from this ... public: diff --git a/ememory/details/SharedPtr.hxx b/ememory/details/SharedPtr.hxx index ae280f9..f47bec9 100644 --- a/ememory/details/SharedPtr.hxx +++ b/ememory/details/SharedPtr.hxx @@ -57,6 +57,13 @@ ememory::SharedPtr::SharedPtr(): EMEMORY_VERBOSE("new shared"); } +template +ememory::SharedPtr::SharedPtr(std::nullptr_t): + m_element(nullptr), + m_counter(nullptr) { + EMEMORY_VERBOSE("new shared"); +} + template ememory::SharedPtr::SharedPtr(EMEMORY_TYPE* _obj, ememory::Counter* _counter): m_element(_obj), @@ -228,21 +235,37 @@ EMEMORY_TYPE* ememory::SharedPtr::get() { } template +template::value + && !std::is_same::value + , int>::type> const EMEMORY_TYPE* ememory::SharedPtr::operator->() const { return m_element; } template +template::value + && !std::is_same::value + , int>::type> EMEMORY_TYPE* ememory::SharedPtr::operator->() { return m_element; } template +template::value + && !std::is_same::value + , int>::type> const EMEMORY_TYPE& ememory::SharedPtr::operator*() const { return *m_element; } template +template::value + && !std::is_same::value + , int>::type> EMEMORY_TYPE& ememory::SharedPtr::operator*() { return *m_element; } diff --git a/ememory/details/WeakPtr.hxx b/ememory/details/WeakPtr.hxx index fab035b..1419249 100644 --- a/ememory/details/WeakPtr.hxx +++ b/ememory/details/WeakPtr.hxx @@ -17,6 +17,13 @@ ememory::WeakPtr::WeakPtr(): } +template +ememory::WeakPtr::WeakPtr(std::nullptr_t): + m_element(nullptr), + m_counter(nullptr) { + +} + template ememory::WeakPtr::WeakPtr(EMEMORY_TYPE* _element): m_element(_element), diff --git a/ememory/memory.h b/ememory/memory.h index 8e4607f..7c822a7 100644 --- a/ememory/memory.h +++ b/ememory/memory.h @@ -24,7 +24,7 @@ namespace ememory { } template inline const ememory::SharedPtr dynamicPointerCast(const ememory::SharedPtr& _obj) { - return ememory::SharedPtr(dynamic_cast(_obj.get()), _obj.getCounter()); + return ememory::SharedPtr(dynamic_cast(const_cast(_obj.get())), _obj.getCounter()); } template @@ -33,7 +33,7 @@ namespace ememory { } template inline const ememory::SharedPtr staticPointerCast(const ememory::SharedPtr& _obj) { - return ememory::SharedPtr(static_cast(_obj.get()), _obj.getCounter()); + return ememory::SharedPtr(static_cast(const_cast(_obj.get())), _obj.getCounter()); } template @@ -42,6 +42,11 @@ namespace ememory { } template inline const ememory::SharedPtr reinterpretPointerCast(const ememory::SharedPtr& _obj) { - return ememory::SharedPtr(reinterpret_cast(_obj.get()), _obj.getCounter()); + return ememory::SharedPtr(reinterpret_cast(const_cast(_obj.get())), _obj.getCounter()); + } + + template + inline ememory::SharedPtr constPointerCast(const ememory::SharedPtr& _obj) { + return ememory::SharedPtr(const_cast(_obj.get()), _obj.getCounter()); } }