1#ifndef _KNOW_CORE_CONSTEXPLICITLYSHAREDDATAPOINTER_H_
2#define _KNOW_CORE_CONSTEXPLICITLYSHAREDDATAPOINTER_H_
4#include <QSharedDataPointer>
13 class ConstExplicitlySharedDataPointer
19 inline const T& operator*()
const {
return *d; }
20 inline const T* operator->()
const {
return d; }
21 inline operator bool()
const {
return d; }
22 inline const T* data()
const {
return d; }
23 inline const T* constData()
const {
return d; }
25 inline bool operator==(
const ConstExplicitlySharedDataPointer<T>& other)
const
29 inline bool operator!=(
const ConstExplicitlySharedDataPointer<T>& other)
const
34 inline ConstExplicitlySharedDataPointer() { d = 0; }
35 inline ~ConstExplicitlySharedDataPointer()
37 if(d && !d->ref.deref())
43 inline ConstExplicitlySharedDataPointer(
const T* data) : d(const_cast<T*>(data))
50 inline ConstExplicitlySharedDataPointer(
const ConstExplicitlySharedDataPointer& o) : d(o.d)
57 template<
typename _T2_>
58 requires(std::is_convertible_v<_T2_*, T*>)
59 inline ConstExplicitlySharedDataPointer(
const ConstExplicitlySharedDataPointer<_T2_>& o)
60 : d(const_cast<_T2_*>(o.data()))
67 inline ConstExplicitlySharedDataPointer(
const QExplicitlySharedDataPointer<T>& o)
68 : d(const_cast<T*>(o.data()))
75 inline ConstExplicitlySharedDataPointer<T>&
76 operator=(
const ConstExplicitlySharedDataPointer<T>& o)
85 if(d && !d->ref.deref())
95 inline ConstExplicitlySharedDataPointer& operator=(T* o)
104 if(d && !d->ref.deref())
114 template<
typename _T2_>
115 requires(std::is_convertible_v<_T2_*, T*>)
116 inline ConstExplicitlySharedDataPointer<_T2_> d_cast()
const
118 return ConstExplicitlySharedDataPointer<_T2_>(
dynamic_cast<_T2_*
>(d));
120 template<
typename _T2_>
121 requires(std::is_convertible_v<_T2_*, T*>)
122 inline ConstExplicitlySharedDataPointer<_T2_> s_cast()
const
124 return ConstExplicitlySharedDataPointer<_T2_>(
static_cast<_T2_*
>(d));
127 inline bool operator!()
const {
return !d; }
129 inline void swap(ConstExplicitlySharedDataPointer& other) { qSwap(d, other.d); }