/*
  Copyright (C) 2004 Martin Voelkle <martin.voelkle@epfl.ch>

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 3 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/

#ifndef GC_H
#define GC_H

#include "container.h"
#include "type.h"
//#include "asm.h"

class GC {
public:
	virtual ~GC() { }
	virtual Object* New(const Type* type, size_t allocSize) = 0;
	virtual void Collect() = 0;
};

class CopyGC {
	Heap heap;
public:
	CopyGC(): heap() {}
	CopyGC(size_t heapPages): heap(heapPages) {}
public:
	Object* New(const Type* type, size_t allocSize);
	void Collect();
private:
	//void Resize(size_t newSize);
	const Value* Scan(const Type* type, const Value* value, Heap& dest);
	const Value* Scan(const Types::Builtin* type, const Values::Builtin* value, Heap& dest);
	const Value* Scan(const Types::Compound* type, const Values::Compound* value, Heap& dest);
	const Value* Scan(const Types::Array* type, const Values::Array* value, Heap& dest);
	const Value* Scan(const Types::VarArray* type, const Values::VarArray* value, Heap& dest);
};

#endif // ndef GC_H
