2014-01-10 12:09:19 +02:00
|
|
|
#ifndef _library__gc__hpp__included__
|
|
|
|
#define _library__gc__hpp__included__
|
|
|
|
|
|
|
|
#include <cstdlib>
|
|
|
|
|
2014-11-10 16:06:04 +02:00
|
|
|
namespace GC
|
|
|
|
{
|
|
|
|
class item
|
2014-01-10 12:09:19 +02:00
|
|
|
{
|
|
|
|
public:
|
2014-11-10 16:06:04 +02:00
|
|
|
item();
|
|
|
|
virtual ~item();
|
2014-01-10 12:09:19 +02:00
|
|
|
void mark_root();
|
|
|
|
void unmark_root();
|
|
|
|
static void do_gc();
|
|
|
|
protected:
|
|
|
|
virtual void trace() = 0;
|
|
|
|
void mark();
|
|
|
|
private:
|
|
|
|
size_t root_count;
|
|
|
|
bool reachable;
|
|
|
|
};
|
|
|
|
|
2014-11-10 16:06:04 +02:00
|
|
|
struct obj_tag {};
|
|
|
|
template<class T> class pointer
|
2014-01-10 12:09:19 +02:00
|
|
|
{
|
|
|
|
public:
|
2014-11-10 16:06:04 +02:00
|
|
|
pointer()
|
2014-01-10 12:09:19 +02:00
|
|
|
{
|
|
|
|
ptr = NULL;
|
|
|
|
}
|
2014-11-10 16:06:04 +02:00
|
|
|
pointer(T* obj)
|
2014-01-10 12:09:19 +02:00
|
|
|
{
|
|
|
|
ptr = obj;
|
|
|
|
}
|
2014-11-10 16:06:04 +02:00
|
|
|
template<typename... U> pointer(obj_tag tag, U... args)
|
2014-01-10 12:09:19 +02:00
|
|
|
{
|
|
|
|
ptr = new T(args...);
|
|
|
|
}
|
2014-11-10 16:06:04 +02:00
|
|
|
pointer(const pointer& p)
|
2014-01-10 12:09:19 +02:00
|
|
|
{
|
|
|
|
if(p.ptr) p.ptr->mark_root();
|
|
|
|
ptr = p.ptr;
|
|
|
|
}
|
2014-11-10 16:06:04 +02:00
|
|
|
pointer& operator=(const pointer& p)
|
2014-01-10 12:09:19 +02:00
|
|
|
{
|
|
|
|
if(ptr == p.ptr) return *this;
|
|
|
|
if(ptr) ptr->unmark_root();
|
|
|
|
if(p.ptr) p.ptr->mark_root();
|
|
|
|
ptr = p.ptr;
|
|
|
|
return *this;
|
|
|
|
}
|
2014-11-10 16:06:04 +02:00
|
|
|
~pointer()
|
2014-01-10 12:09:19 +02:00
|
|
|
{
|
|
|
|
if(ptr) ptr->unmark_root();
|
|
|
|
}
|
|
|
|
operator bool()
|
|
|
|
{
|
|
|
|
return (ptr != NULL);
|
|
|
|
}
|
|
|
|
T* operator->() { return ptr; }
|
|
|
|
T& operator*() { return *ptr; }
|
|
|
|
T* as_pointer() { return ptr; }
|
|
|
|
private:
|
|
|
|
T* ptr;
|
|
|
|
};
|
2014-11-10 16:06:04 +02:00
|
|
|
}
|
2014-01-10 12:09:19 +02:00
|
|
|
|
|
|
|
#endif
|