Added implicit conversion to SparsePtr

Former-commit-id: 5116a5e7687706640cd5d2ef99f5c181e00ee841
This commit is contained in:
Lynix 2014-12-07 03:06:12 +01:00
parent a51cbc1e49
commit 15ddc29179
2 changed files with 22 additions and 0 deletions

View File

@ -22,6 +22,7 @@ class NzSparsePtr
NzSparsePtr(); NzSparsePtr();
NzSparsePtr(T* ptr); NzSparsePtr(T* ptr);
NzSparsePtr(VoidPtr ptr, unsigned int stride); NzSparsePtr(VoidPtr ptr, unsigned int stride);
template<typename U> NzSparsePtr(const NzSparsePtr<U>& ptr);
NzSparsePtr(const NzSparsePtr& ptr) = default; NzSparsePtr(const NzSparsePtr& ptr) = default;
~NzSparsePtr() = default; ~NzSparsePtr() = default;
@ -32,6 +33,7 @@ class NzSparsePtr
void Reset(T* ptr); void Reset(T* ptr);
void Reset(VoidPtr ptr, unsigned int stride); void Reset(VoidPtr ptr, unsigned int stride);
void Reset(const NzSparsePtr& ptr); void Reset(const NzSparsePtr& ptr);
template<typename U> void Reset(const NzSparsePtr<U>& ptr);
void SetPtr(VoidPtr ptr); void SetPtr(VoidPtr ptr);
void SetStride(unsigned int stride); void SetStride(unsigned int stride);

View File

@ -22,6 +22,13 @@ NzSparsePtr<T>::NzSparsePtr(VoidPtr ptr, unsigned int stride)
Reset(ptr, stride); Reset(ptr, stride);
} }
template<typename T>
template<typename U>
NzSparsePtr<T>::NzSparsePtr(const NzSparsePtr<U>& ptr)
{
Reset(ptr);
}
template<typename T> template<typename T>
typename NzSparsePtr<T>::VoidPtr NzSparsePtr<T>::GetPtr() const typename NzSparsePtr<T>::VoidPtr NzSparsePtr<T>::GetPtr() const
{ {
@ -62,6 +69,16 @@ void NzSparsePtr<T>::Reset(const NzSparsePtr& ptr)
SetStride(ptr.GetStride()); SetStride(ptr.GetStride());
} }
template<typename T>
template<typename U>
void NzSparsePtr<T>::Reset(const NzSparsePtr<U>& ptr)
{
static_assert(std::is_convertible<U*, T*>::value, "Source type pointer cannot be implicitely converted to target type pointer");
SetPtr(static_cast<T*>(ptr.GetPtr()));
SetStride(ptr.GetStride());
}
template<typename T> template<typename T>
void NzSparsePtr<T>::SetPtr(VoidPtr ptr) void NzSparsePtr<T>::SetPtr(VoidPtr ptr)
{ {
@ -120,6 +137,7 @@ template<typename T>
NzSparsePtr<T>& NzSparsePtr<T>::operator+=(unsigned int count) NzSparsePtr<T>& NzSparsePtr<T>::operator+=(unsigned int count)
{ {
m_ptr += count*m_stride; m_ptr += count*m_stride;
return *this; return *this;
} }
@ -127,6 +145,7 @@ template<typename T>
NzSparsePtr<T>& NzSparsePtr<T>::operator-=(unsigned int count) NzSparsePtr<T>& NzSparsePtr<T>::operator-=(unsigned int count)
{ {
m_ptr -= count*m_stride; m_ptr -= count*m_stride;
return *this; return *this;
} }
@ -134,6 +153,7 @@ template<typename T>
NzSparsePtr<T>& NzSparsePtr<T>::operator++() NzSparsePtr<T>& NzSparsePtr<T>::operator++()
{ {
m_ptr += m_stride; m_ptr += m_stride;
return *this; return *this;
} }