//===------------- ctcircular.h - Mvm Garbage Collector -------------------===//
//
//                              Mvm
//
// This file is distributed under the University of Illinois Open Source 
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef _CT_CIRCULAR_H_
#define _CT_CIRCULAR_H_

#include "ctosdep.h"


class CircularBase {
	CircularBase	*_next;
	CircularBase	*_prev;
public:
	inline CircularBase *next() { return _next; }
	inline CircularBase *prev() { return _prev; }

	inline void next(CircularBase *n) { _next = n; }
	inline void prev(CircularBase *p) { _prev = p; }

	inline CircularBase() { alone(); }
	inline explicit CircularBase(CircularBase *p) { append(p); }

	inline void remove() { 
		_prev->_next = _next; 
		_next->_prev = _prev;
		alone();
	}

	inline void append(CircularBase *p) { 
		_prev = p;
		_next = p->_next;
		_next->_prev = this;
		_prev->_next = this;
	}

	inline void alone() { _prev = _next = this; }
};

class Circular : public CircularBase, public TObj {
public:
	inline Circular() : CircularBase() {}
	inline Circular(Circular *p) : CircularBase(p) {}
	inline ~Circular() {
		if(prev() != this) {
			next()->prev(prev());
			delete next();
		}
	}
};

#endif
