00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
#ifndef UCOLLECTABLE_HPP
00029
#define UCOLLECTABLE_HPP
00030
00031
#include <cstddef>
00032
00033
#include "ufo_global.hpp"
00034
00035
namespace ufo {
00036
00053
00054
00055 class UFO_EXPORT UCollectable {
00056
public:
00057 UCollectable();
00058
virtual ~UCollectable();
00059
00060
void setDynamic(
bool b);
00061
bool isDynamic();
00062
00063
void reference()
const;
00064
void unreference()
const;
00065
00066
unsigned int getReferenceCount()
const;
00067
00068
00069
00070
void * operator new(std::size_t size);
00071
inline void operator delete(
void * p, std::size_t );
00072
private:
00073
mutable unsigned int m_refCount : 31;
00074
unsigned int m_isDynamic : 1;
00075
static bool m_dynamicAlloc;
00076 };
00077
00078
00079
00080
00081
00082
00083
inline void
00084 UCollectable::setDynamic(
bool b) { m_isDynamic = b; }
00085
00086
inline bool
00087 UCollectable::isDynamic() {
return m_isDynamic; }
00088
00089
inline void
00090 UCollectable::reference()
const { m_refCount++; }
00091
00092
inline void
00093 UCollectable::unreference()
const {
00094
if (m_refCount) {
00095 m_refCount--;
00096
if (m_refCount == 0 && m_isDynamic) {
delete this; }
00097 }
00098 }
00099
00100
inline unsigned int
00101 UCollectable::getReferenceCount()
const {
00102
return m_refCount;
00103 }
00104
00105
inline void
00106 UCollectable::operator delete(
void * p, std::size_t ) {
00107 ::operator
delete(p);
00108 }
00109
00110 }
00111
00112
#endif // UCOLLECTABLE_HPP