[DEBUG] correct pb on the 'void& operator*()'

This commit is contained in:
Edouard DUPIN 2016-07-17 18:17:49 +02:00
parent f2dd438a7d
commit 447ae56fd5
2 changed files with 42 additions and 31 deletions

View File

@ -53,36 +53,54 @@ namespace ememory {
public: public:
void reset(); void reset();
int64_t useCount() const; int64_t useCount() const;
bool operator == (std::nullptr_t) const; bool operator==(std::nullptr_t) const;
bool operator==(const SharedPtr<EMEMORY_TYPE>& _obj) const; bool operator==(const SharedPtr<EMEMORY_TYPE>& _obj) const;
bool operator != (std::nullptr_t) const; bool operator!=(std::nullptr_t) const;
bool operator!=(const SharedPtr<EMEMORY_TYPE>& _obj) const; bool operator!=(const SharedPtr<EMEMORY_TYPE>& _obj) const;
const EMEMORY_TYPE* get() const; const EMEMORY_TYPE* get() const;
EMEMORY_TYPE* get(); EMEMORY_TYPE* get();
template<class EMEMORY_TYPE2 = EMEMORY_TYPE,
typename std::enable_if< std::is_same<EMEMORY_TYPE2, EMEMORY_TYPE>::value
&& !std::is_same<EMEMORY_TYPE2, void>::value
, int>::type = 0>
const EMEMORY_TYPE* operator->() const; const EMEMORY_TYPE* operator->() const;
template<class EMEMORY_TYPE2 = EMEMORY_TYPE,
typename std::enable_if< std::is_same<EMEMORY_TYPE2, EMEMORY_TYPE>::value
&& !std::is_same<EMEMORY_TYPE2, void>::value
, int>::type = 0>
EMEMORY_TYPE* operator->(); EMEMORY_TYPE* operator->();
template<class EMEMORY_TYPE2 = EMEMORY_TYPE, #if 0
typename std::enable_if< std::is_same<EMEMORY_TYPE2, EMEMORY_TYPE>::value template<>
&& !std::is_same<EMEMORY_TYPE2, void>::value const typename std::enable_if<!std::is_void<EMEMORY_TYPE>::value, EMEMORY_TYPE>::type& operator*() const {
, int>::type = 0> return *m_element;
const EMEMORY_TYPE& operator*() const; }
template<class EMEMORY_TYPE2 = EMEMORY_TYPE, template<>
typename std::enable_if< std::is_same<EMEMORY_TYPE2, EMEMORY_TYPE>::value typename std::enable_if<!std::is_void<EMEMORY_TYPE>::value, EMEMORY_TYPE&>::type operator*() {
&& !std::is_same<EMEMORY_TYPE2, void>::value return *m_element;
, int>::type = 0> }
EMEMORY_TYPE& operator*(); #else
#if 1
template<class EMEMORY_TYPE2,
typename std::enable_if< !std::is_void<EMEMORY_TYPE>::value
&& !std::is_void<EMEMORY_TYPE2>::value
, int>::type>
const EMEMORY_TYPE2& operator*() const {
return *m_element;
}
template<class EMEMORY_TYPE2,
typename std::enable_if< !std::is_void<EMEMORY_TYPE>::value
&& !std::is_void<EMEMORY_TYPE2>::value
, int>::type>
EMEMORY_TYPE2& operator*() {
return *m_element;
}
#else
const EMEMORY_TYPE& operator*() const {
return *m_element;
}
EMEMORY_TYPE& operator*() {
return *m_element;
}
#endif
#endif
void swap(SharedPtr<EMEMORY_TYPE>& _obj); void swap(SharedPtr<EMEMORY_TYPE>& _obj);
ememory::Counter* getCounter() const { ememory::Counter* getCounter() const {
return m_counter; return m_counter;
} }
// TODO: unique
// TODO: bool
}; };
} }

View File

@ -235,27 +235,19 @@ EMEMORY_TYPE* ememory::SharedPtr<EMEMORY_TYPE>::get() {
} }
template<typename EMEMORY_TYPE> template<typename EMEMORY_TYPE>
template<class EMEMORY_TYPE2,
typename std::enable_if< std::is_same<EMEMORY_TYPE2, EMEMORY_TYPE>::value
&& !std::is_same<EMEMORY_TYPE2, void>::value
, int>::type>
const EMEMORY_TYPE* ememory::SharedPtr<EMEMORY_TYPE>::operator->() const { const EMEMORY_TYPE* ememory::SharedPtr<EMEMORY_TYPE>::operator->() const {
return m_element; return m_element;
} }
template<typename EMEMORY_TYPE> template<typename EMEMORY_TYPE>
template<class EMEMORY_TYPE2,
typename std::enable_if< std::is_same<EMEMORY_TYPE2, EMEMORY_TYPE>::value
&& !std::is_same<EMEMORY_TYPE2, void>::value
, int>::type>
EMEMORY_TYPE* ememory::SharedPtr<EMEMORY_TYPE>::operator->() { EMEMORY_TYPE* ememory::SharedPtr<EMEMORY_TYPE>::operator->() {
return m_element; return m_element;
} }
/*
template<typename EMEMORY_TYPE> template<typename EMEMORY_TYPE>
template<class EMEMORY_TYPE2, template<class EMEMORY_TYPE2,
typename std::enable_if< std::is_same<EMEMORY_TYPE2, EMEMORY_TYPE>::value typename std::enable_if< std::is_same<EMEMORY_TYPE2, EMEMORY_TYPE>::value
&& !std::is_same<EMEMORY_TYPE2, void>::value && !std::is_void<EMEMORY_TYPE2>::value
, int>::type> , int>::type>
const EMEMORY_TYPE& ememory::SharedPtr<EMEMORY_TYPE>::operator*() const { const EMEMORY_TYPE& ememory::SharedPtr<EMEMORY_TYPE>::operator*() const {
return *m_element; return *m_element;
@ -264,11 +256,12 @@ const EMEMORY_TYPE& ememory::SharedPtr<EMEMORY_TYPE>::operator*() const {
template<typename EMEMORY_TYPE> template<typename EMEMORY_TYPE>
template<class EMEMORY_TYPE2, template<class EMEMORY_TYPE2,
typename std::enable_if< std::is_same<EMEMORY_TYPE2, EMEMORY_TYPE>::value typename std::enable_if< std::is_same<EMEMORY_TYPE2, EMEMORY_TYPE>::value
&& !std::is_same<EMEMORY_TYPE2, void>::value && !std::is_void<EMEMORY_TYPE2>::value
, int>::type> , int>::type>
EMEMORY_TYPE& ememory::SharedPtr<EMEMORY_TYPE>::operator*() { EMEMORY_TYPE& ememory::SharedPtr<EMEMORY_TYPE>::operator*() {
return *m_element; return *m_element;
} }
*/
template<typename EMEMORY_TYPE> template<typename EMEMORY_TYPE>
void ememory::SharedPtr<EMEMORY_TYPE>::swap(SharedPtr& _obj) { void ememory::SharedPtr<EMEMORY_TYPE>::swap(SharedPtr& _obj) {