1#ifndef _KNOW_CORE_CONSTEXPLICITLYSHAREDDATAPOINTER_H_
2#define _KNOW_CORE_CONSTEXPLICITLYSHAREDDATAPOINTER_H_
4#include <QSharedDataPointer>
13 class ConstExplicitlySharedDataPointer
19 inline const T& operator*()
const
23 inline const T* operator->()
const
27 inline operator bool()
const
31 inline const T* data()
const
35 inline const T* constData()
const
40 inline bool operator==(
const ConstExplicitlySharedDataPointer<T>& other)
const
44 inline bool operator!=(
const ConstExplicitlySharedDataPointer<T>& other)
const
49 inline ConstExplicitlySharedDataPointer()
53 inline ~ConstExplicitlySharedDataPointer()
55 if(d && !d->ref.deref())
61 inline ConstExplicitlySharedDataPointer(
const T* data) : d(const_cast<T*>(data))
68 inline ConstExplicitlySharedDataPointer(
const ConstExplicitlySharedDataPointer& o) : d(o.d)
75 template<
typename _T2_, std::enable_if_t<std::is_convertible_v<_T2_*, T*>,
int> = 0>
76 inline ConstExplicitlySharedDataPointer(
const ConstExplicitlySharedDataPointer<_T2_>& o) : d(const_cast<_T2_*>(o.data()))
83 inline ConstExplicitlySharedDataPointer(
const QExplicitlySharedDataPointer<T>& o) : d(const_cast<T*>(o.data()))
90 inline ConstExplicitlySharedDataPointer<T>& operator=(
const ConstExplicitlySharedDataPointer<T>& o)
99 if(d && !d->ref.deref())
109 inline ConstExplicitlySharedDataPointer& operator=(T* o)
118 if(d && !d->ref.deref())
128 template<
typename _T2_>
129 inline std::enable_if_t<std::is_convertible_v<_T2_*, T*>, ConstExplicitlySharedDataPointer<_T2_>> d_cast()
const
131 return ConstExplicitlySharedDataPointer<_T2_>(
dynamic_cast<_T2_*
>(d));
133 template<
typename _T2_>
134 inline std::enable_if_t<std::is_convertible_v<_T2_*, T*>, ConstExplicitlySharedDataPointer<_T2_>> s_cast()
const
136 return ConstExplicitlySharedDataPointer<_T2_>(
static_cast<_T2_*
>(d));
139 inline bool operator!()
const
144 inline void swap(ConstExplicitlySharedDataPointer& other)