lsnes/include/library/gc.hpp

70 lines
1,014 B
C++
Raw Normal View History

2014-01-10 12:09:19 +02:00
#ifndef _library__gc__hpp__included__
#define _library__gc__hpp__included__
#include <cstdlib>
namespace GC
{
class item
2014-01-10 12:09:19 +02:00
{
public:
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;
};
struct obj_tag {};
template<class T> class pointer
2014-01-10 12:09:19 +02:00
{
public:
pointer()
2014-01-10 12:09:19 +02:00
{
ptr = NULL;
}
pointer(T* obj)
2014-01-10 12:09:19 +02:00
{
ptr = obj;
}
template<typename... U> pointer(obj_tag tag, U... args)
2014-01-10 12:09:19 +02:00
{
ptr = new T(args...);
}
pointer(const pointer& p)
2014-01-10 12:09:19 +02:00
{
if(p.ptr) p.ptr->mark_root();
ptr = p.ptr;
}
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;
}
~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-01-10 12:09:19 +02:00
#endif