33#ifndef __SMART_POINTER__
34#define __SMART_POINTER__
52 static void free(
const T* data) {
if(data)
delete data;}
61 static void free(
const T* data) {
if(data)
delete[] data;}
70 static void free(
const T* data) {data->Release;}
105template <
typename T,
template <
class TT>
class FreePolicy>
125 template <
class TPtr>
171 return (this->
get() == sp.
get());
186 template <
class TPtr>
188 return (this->
get() == sp.
get());
191 template <
class TPtr>
209 explicit operator bool() const noexcept {
return m_ptr != NULL; }
215 template <
class TDest>
217 TDest*
p =
dynamic_cast<TDest*
>(
m_ptr);
223 template <
class TDest>
225 TDest*
p =
static_cast<TDest*
>(
m_ptr);
231 template <
class TDest>
233 TDest*
p =
reinterpret_cast<TDest*
>(
m_ptr);
239 template <
class TDest>
242 return dynamic_cast<TDest*
>(
m_ptr) != NULL;
278 FreePolicy<T>::free(
m_ptr);
286 FreePolicy<T>::free(
reinterpret_cast<const T*
>(ptr));
294template <
typename T,
template <
class TT>
class FreePolicy>
312 template <
class TPtr>
320 template <
class TPtr>
385 return (this->
get() == sp.
get());
388 template <
class TPtr>
390 return (this->
get() == sp.
get());
401 template <
class TPtr>
407 return m_ptr != NULL;
418 explicit operator bool() const noexcept {
return m_ptr != NULL; }
424 template <
class TDest>
426 const TDest*
p =
dynamic_cast<const TDest*
>(
m_ptr);
432 template <
class TDest>
434 const TDest*
p =
static_cast<const TDest*
>(
m_ptr);
440 template <
class TDest>
442 const TDest*
p =
reinterpret_cast<const TDest*
>(
m_ptr);
453 template <
class TDest>
456 return dynamic_cast<TDest*
>(
m_ptr) != NULL;
485 FreePolicy<T>::free(
m_ptr);
492 FreePolicy<T>::free(
reinterpret_cast<T*
>(ptr));
504template <
typename T,
template <
class TT>
class FreePolicy>
537 m_refCountPtr(sp.m_refCountPtr),
538 m_freeFunc(sp.m_freeFunc)
540 if(m_refCountPtr) (*m_refCountPtr)++;
543 explicit SmartPtr(
void* ptr,
void (*freeFunc)(
const void*)) :
548 if(ptr) m_refCountPtr =
new int(1);
557 if(m_refCountPtr) (*m_refCountPtr)++;
567 m_refCountPtr = sp.m_refCountPtr;
570 m_freeFunc = sp.m_freeFunc;
600 template <
class T,
template <
class TPtr>
class TFreePolicy>
609 template <
class T,
template <
class TPtr>
class TFreePolicy>
620 explicit operator bool() const noexcept {
return m_ptr != NULL; }
630 int refcount()
const {
if(m_refCountPtr)
return *m_refCountPtr;
return 0;}
637 if((*m_refCountPtr) < 1)
639 delete m_refCountPtr;
647 void (*m_freeFunc)(
const void*);
662 if(ptr) m_refCountPtr =
new int(1);
669 m_refCountPtr(sp.m_refCountPtr),
670 m_freeFunc(sp.m_freeFunc)
672 if(m_refCountPtr) (*m_refCountPtr)++;
677 m_refCountPtr(sp.m_refCountPtr),
678 m_freeFunc(sp.m_freeFunc)
680 if(m_refCountPtr) (*m_refCountPtr)++;
683 template <
class T,
template <
class TPtr>
class TFreePolicy>
689 if(m_refCountPtr) (*m_refCountPtr)++;
692 template <
class T,
template <
class TPtr>
class TFreePolicy>
698 if(m_refCountPtr) (*m_refCountPtr)++;
708 m_refCountPtr = sp.m_refCountPtr;
711 m_freeFunc = sp.m_freeFunc;
720 m_refCountPtr = sp.m_refCountPtr;
723 m_freeFunc = sp.m_freeFunc;
727 template <
class T,
template <
class TPtr>
class TFreePolicy>
740 template <
class T,
template <
class TPtr>
class TFreePolicy>
765 template <
class T,
template <
class TPtr>
class TFreePolicy>
774 template <
class T,
template <
class TPtr>
class TFreePolicy>
785 explicit operator bool() const noexcept {
return m_ptr != NULL; }
794 int refcount()
const {
if(m_refCountPtr)
return *m_refCountPtr;
return 0;}
801 if((*m_refCountPtr) < 1)
803 delete m_refCountPtr;
804 m_freeFunc(
const_cast<void*
>(
m_ptr));
811 void (*m_freeFunc)(
const void*);
818 template <
class T,
template <
class TPtr>
class TFreePolicy>
820#
if (__cplusplus < 201103L)
821 :
public binary_function<SmartPtr<T, TFreePolicy>, SmartPtr<T, TFreePolicy>, bool>
827 return less<T*>()(lhs.
get(), rhs.
get());
838template <
typename T,
template <
class TT>
class FreePolicy>
ConstSmartPtr< T, TFreePolicy > cast_reinterpret() const
Returns a SmartPtr with the specified type and shared reference counting.
Definition smart_pointer.h:766
ConstSmartPtr< void > & operator=(const SmartPtr< T, TFreePolicy > &sp)
Definition smart_pointer.h:728
ConstSmartPtr< void > & operator=(const ConstSmartPtr< void > &sp)
Definition smart_pointer.h:715
ConstSmartPtr(const SmartPtr< void > &sp)
Definition smart_pointer.h:667
ConstSmartPtr()
Definition smart_pointer.h:655
ConstSmartPtr< void > & operator=(NullSmartPtr)
Definition smart_pointer.h:753
void release()
Definition smart_pointer.h:797
const void * m_ptr
Definition smart_pointer.h:809
int * m_refCountPtr
Definition smart_pointer.h:810
ConstSmartPtr(const ConstSmartPtr< void > &sp)
Definition smart_pointer.h:675
const void * get() const
Definition smart_pointer.h:792
ConstSmartPtr(NullSmartPtr)
Definition smart_pointer.h:665
void element_type
Definition smart_pointer.h:654
ConstSmartPtr(const SmartPtr< T, TFreePolicy > &sp)
Definition smart_pointer.h:684
void invalidate()
Definition smart_pointer.h:790
ConstSmartPtr(void *ptr, void(*freeFunc)(const void *))
Definition smart_pointer.h:657
int refcount() const
Definition smart_pointer.h:794
bool invalid() const
returns true if the pointer is invalid, false if not.
Definition smart_pointer.h:788
ConstSmartPtr< void > & operator=(const ConstSmartPtr< T, TFreePolicy > &sp)
Definition smart_pointer.h:741
ConstSmartPtr< void > & operator=(const SmartPtr< void > &sp)
Definition smart_pointer.h:703
~ConstSmartPtr()
Definition smart_pointer.h:701
ConstSmartPtr(const ConstSmartPtr< T, TFreePolicy > &sp)
Definition smart_pointer.h:693
bool valid() const
returns true if the pointer is valid, false if not.
Definition smart_pointer.h:782
void set_impl(const void *ptr)
sets the void* to a different location correspoding to a cast to a new type T
Definition smart_pointer.h:775
Definition smart_pointer.h:296
const T * get() const
Definition smart_pointer.h:410
ConstSmartPtr & operator=(const SmartPtr< T, FreePolicy > &sp)
Definition smart_pointer.h:334
bool operator==(NullSmartPtr) const
Definition smart_pointer.h:393
ConstSmartPtr< TDest, FreePolicy > cast_reinterpret() const
performs a static cast
Definition smart_pointer.h:441
bool valid() const
returns true if the pointer is valid, false if not.
Definition smart_pointer.h:415
ConstSmartPtr(const T *ptr)
Definition smart_pointer.h:302
int * m_refCount
Definition smart_pointer.h:497
bool invalid() const
returns true if the pointer is invalid, false if not.
Definition smart_pointer.h:421
bool is_of_type() const
Definition smart_pointer.h:454
ConstSmartPtr(const ConstSmartPtr< TPtr, FreePolicy > &sp)
Definition smart_pointer.h:321
T element_type
Definition smart_pointer.h:300
ConstSmartPtr< T, FreePolicy > & operator=(const SmartPtr< TIn, FreePolicy > &sp)
Definition smart_pointer.h:345
static void free_void_ptr(void *ptr)
Definition smart_pointer.h:491
ConstSmartPtr< TDest, FreePolicy > cast_static() const
performs a static cast
Definition smart_pointer.h:433
ConstSmartPtr()
Definition smart_pointer.h:301
ConstSmartPtr(const SmartPtr< TPtr, FreePolicy > &sp)
Definition smart_pointer.h:313
const T * operator->() const
Definition smart_pointer.h:330
ConstSmartPtr< TDest, FreePolicy > cast_dynamic() const
preforms a dynamic cast
Definition smart_pointer.h:425
const T * m_ptr
Definition smart_pointer.h:496
ConstSmartPtr(NullSmartPtr)
Definition smart_pointer.h:303
int refcount() const
Definition smart_pointer.h:412
ConstSmartPtr(const T *ptr, int *refCount)
WARNING: this method is DANGEROUS!
Definition smart_pointer.h:462
bool operator!=(const ConstSmartPtr &sp) const
Definition smart_pointer.h:397
bool operator!=(NullSmartPtr) const
Definition smart_pointer.h:406
bool operator==(const SmartPtr< TPtr, FreePolicy > &sp) const
Definition smart_pointer.h:389
~ConstSmartPtr()
Definition smart_pointer.h:328
ConstSmartPtr & operator=(NullSmartPtr)
Definition smart_pointer.h:376
ConstSmartPtr(const ConstSmartPtr &sp)
Definition smart_pointer.h:304
ConstSmartPtr< T, FreePolicy > & operator=(const ConstSmartPtr< TIn, FreePolicy > &sp)
Definition smart_pointer.h:366
ConstSmartPtr & operator=(const ConstSmartPtr &sp)
Definition smart_pointer.h:355
const T & operator*() const
Definition smart_pointer.h:332
SmartPtr< T, FreePolicy > cast_const() const
performs a const cast
Definition smart_pointer.h:448
bool operator==(const ConstSmartPtr &sp) const
Definition smart_pointer.h:384
int * refcount_ptr() const
WARNING: this method is dangerous!
Definition smart_pointer.h:473
void release()
decrements the refCount and frees the encapsulated pointer if required.
Definition smart_pointer.h:477
bool operator!=(const SmartPtr< TPtr, FreePolicy > &sp) const
Definition smart_pointer.h:402
Definition smart_pointer.h:59
static void free(const T *data)
Definition smart_pointer.h:61
Definition smart_pointer.h:50
static void free(const T *data)
Definition smart_pointer.h:52
Definition smart_pointer.h:68
static void free(const T *data)
Definition smart_pointer.h:70
Used to construct empty smart pointers.
Definition smart_pointer.h:83
NullSmartPtr()
Definition smart_pointer.h:85
void release()
Definition smart_pointer.h:633
SmartPtr< void > & operator=(const SmartPtr< void > &sp)
Definition smart_pointer.h:562
void invalidate()
Definition smart_pointer.h:625
~SmartPtr()
Definition smart_pointer.h:560
SmartPtr(NullSmartPtr)
Definition smart_pointer.h:533
SmartPtr< void > & operator=(const SmartPtr< T > &sp)
Definition smart_pointer.h:575
int refcount() const
Definition smart_pointer.h:630
bool invalid() const
returns true if the pointer is invalid, false if not.
Definition smart_pointer.h:623
void set_impl(void *ptr)
sets the void* to a different location correspoding to a cast to a new type T
Definition smart_pointer.h:610
SmartPtr(const SmartPtr< void > &sp)
Definition smart_pointer.h:535
SmartPtr(const SmartPtr< T > &sp)
Definition smart_pointer.h:552
SmartPtr< void > & operator=(NullSmartPtr)
Definition smart_pointer.h:588
SmartPtr< T, TFreePolicy > cast_reinterpret() const
Returns a SmartPtr with the specified type and shared reference counting.
Definition smart_pointer.h:601
SmartPtr(void *ptr, void(*freeFunc)(const void *))
Definition smart_pointer.h:543
SmartPtr()
Definition smart_pointer.h:531
void * get()
Definition smart_pointer.h:627
void * m_ptr
Definition smart_pointer.h:645
void element_type
Definition smart_pointer.h:530
bool valid() const
returns true if the pointer is valid, false if not.
Definition smart_pointer.h:617
const void * get() const
Definition smart_pointer.h:628
int * m_refCountPtr
Definition smart_pointer.h:646
Definition smart_pointer.h:107
SmartPtr & operator=(NullSmartPtr)
Definition smart_pointer.h:141
bool operator!=(NullSmartPtr) const
Definition smart_pointer.h:182
T * get()
returns encapsulated pointer
Definition smart_pointer.h:197
SmartPtr< TDest, FreePolicy > cast_reinterpret() const
performs a reinterpret cast
Definition smart_pointer.h:232
T * m_ptr
Definition smart_pointer.h:290
SmartPtr(NullSmartPtr)
Definition smart_pointer.h:116
T element_type
Definition smart_pointer.h:113
static void free_void_ptr(const void *ptr)
this release method is required by SmartPtr<void>
Definition smart_pointer.h:285
SmartPtr(const SmartPtr &sp)
Definition smart_pointer.h:117
SmartPtr & operator=(const SmartPtr &sp)
Definition smart_pointer.h:149
bool operator==(const ConstSmartPtr< TPtr, FreePolicy > &sp) const
Definition smart_pointer.h:187
const T * operator->() const
Definition smart_pointer.h:136
int * m_refCount
Definition smart_pointer.h:291
const T & operator*() const
Definition smart_pointer.h:139
bool is_of_type() const
Definition smart_pointer.h:240
T * get_nonconst() const
WARNING: this method is DANGEROUS!
Definition smart_pointer.h:265
int * refcount_ptr() const
WARNING: this method is DANGEROUS!
Definition smart_pointer.h:263
bool operator==(NullSmartPtr) const
Definition smart_pointer.h:178
SmartPtr< T, FreePolicy > & operator=(const SmartPtr< TIn, FreePolicy > &sp)
Definition smart_pointer.h:160
bool operator!=(const ConstSmartPtr< TPtr, FreePolicy > &sp) const
Definition smart_pointer.h:192
ConstSmartPtr< T, FreePolicy > cast_const() const
performs a const cast
Definition smart_pointer.h:505
T * operator->()
Definition smart_pointer.h:135
const T * get() const
returns encapsulated pointer
Definition smart_pointer.h:200
T & operator*()
Definition smart_pointer.h:138
SmartPtr()
Definition smart_pointer.h:114
bool valid() const
returns true if the pointer is valid, false if not.
Definition smart_pointer.h:206
SmartPtr(T *ptr, int *refCount)
WARNING: this method is DANGEROUS!
Definition smart_pointer.h:251
SmartPtr< TDest, FreePolicy > cast_dynamic() const
preforms a dynamic cast
Definition smart_pointer.h:216
void release()
decrements the refCount and frees the encapsulated pointer if required.
Definition smart_pointer.h:270
int refcount() const
returns refcount
Definition smart_pointer.h:203
SmartPtr(const SmartPtr< TPtr, FreePolicy > &sp)
Definition smart_pointer.h:126
~SmartPtr()
Definition smart_pointer.h:133
SmartPtr< TDest, FreePolicy > cast_static() const
performs a static cast
Definition smart_pointer.h:224
SmartPtr(T *ptr)
Definition smart_pointer.h:115
bool operator==(const SmartPtr &sp) const
Definition smart_pointer.h:170
bool invalid() const
returns true if the pointer is invalid, false if not.
Definition smart_pointer.h:212
bool operator!=(const SmartPtr &sp) const
Definition smart_pointer.h:174
const NullSmartPtr SPNULL
The equivalent to NULL for smart pointers.
Definition smart_pointer.h:89
if(!(yy_init))
Definition lexer.cpp:997
Definition smart_pointer.h:817
SmartPtr< T, FreePolicy > make_sp(T *inst)
returns a SmartPtr for the passed raw pointer
Definition smart_pointer.h:839
bool operator()(const SmartPtr< T, TFreePolicy > &lhs, const SmartPtr< T, TFreePolicy > &rhs) const
Definition smart_pointer.h:824