/*
 * Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 Yokogawa Electric Corporation,
 * YDC Corporation, IPA (Information-technology Promotion Agency, Japan).
 * All rights reserved.
 * 
 * Redistribution and use of this software in source and binary forms, with 
 * or without modification, are permitted provided that the following 
 * conditions and disclaimer are agreed and accepted by the user:
 * 
 * 1. Redistributions of source code must retain the above copyright 
 * notice, this list of conditions and the following disclaimer.
 * 
 * 2. Redistributions in binary form must reproduce the above copyright 
 * notice, this list of conditions and the following disclaimer in the 
 * documentation and/or other materials provided with the distribution.
 * 
 * 3. Neither the names of the copyrighters, the name of the project which 
 * is related to this software (hereinafter referred to as "project") nor 
 * the names of the contributors may be used to endorse or promote products 
 * derived from this software without specific prior written permission.
 * 
 * 4. No merchantable use may be permitted without prior written 
 * notification to the copyrighters. However, using this software for the 
 * purpose of testing or evaluating any products including merchantable 
 * products may be permitted without any notification to the copyrighters.
 * 
 * 
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHTERS, THE PROJECT AND 
 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING 
 * BUT NOT LIMITED THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
 * FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.  IN NO EVENT SHALL THE 
 * COPYRIGHTERS, THE PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 * CONTRACT,STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
 * THE POSSIBILITY OF SUCH DAMAGE.
 *
 * $TAHI: v6eval/lib/Cm/BtList.cc,v 1.5 2001/10/12 04:56:13 tanaka Exp $
 */
#include "BtList.h"
//IMPLEMENTATION
u_long BtList::noOfElements() const {return noOfElements_;}
u_long BtList::size() const {return noOfElements();}
BtList& BtList::operator=(const BtList& l) {
	return (BtList&)BtArray::operator=(l);}

void BtList::removeArray() {
	BtArray::removeArray();
	noOfElements_=0,free_=0;}

ELEMENTS BtList::add(ELEMENTS elm) {return append(elm);}

BtList::BtList(const u_long s):BtArray(s),noOfElements_(0),free_(0) {}

BtList::BtList(const BtList &a):BtArray(a.capacity()),noOfElements_(0),free_(0) {
	*this=a;}

BtList::BtList(ELEMENTS elm,...):BtArray(defaultArraySize),noOfElements_(0),free_(0) {
	addElementsFrom(elm);}

u_long BtList::position(const u_long n) const {
	if(n>=noOfElements()) {rangeError(n);}
	return n<free_?leftPosition(n):rightPosition(n);}

void BtList::leftToRight(const u_long n) {
	ELEMENTS* array=elements();
	u_long r=rightPosition(n), l=leftPosition(n);
	array[r]=array[l]; array[l]=0;}
void BtList::leftToRight(const u_long s,const u_long e) {
	long i,i9=e;
	for(i=s;i>=i9;--i) {leftToRight(i);}}

void BtList::rightToLeft(const u_long n) {
	ELEMENTS* array=elements();
	u_long r=rightPosition(n), l=leftPosition(n);
	array[l]=array[r]; array[r]=0;}
void BtList::rightToLeft(const u_long s,const u_long e) {
	u_long i;
	for(i=s;i<e;++i) {rightToLeft(i);}}

ELEMENTS* BtList::array(const u_long s,const u_long count) {
	ELEMENTS* array=elements();
	if(s>=free_) {return array+rightPosition(s);}
	rightToLeft(free_,s+count);
	free_=s+count;
	return array+s;}

ELEMENTS BtList::insert(const u_long at,ELEMENTS o) {
	u_long n=noOfElements();
	if(at>n) {rangeError(at);}
	if(n>=capacity()) {expand();}
	ELEMENTS* array=elements();
	/**/ if(at<free_) {leftToRight(free_-1,at);}
	else if(at>free_) {rightToLeft(free_,at);}
	free_=at+1; noOfElements_+=1;
	return array[at]=o;}

ELEMENTS BtList::removeAt(const u_long at) {
	ELEMENTS* array=elements(), old=0;
	u_long pos=position(at);
	old=array[pos]; array[pos]=0;
	if(noOfElements()<capacity()) {
		/**/ if(at<free_) {leftToRight(free_-1,at+1);}
		else if(at>free_) {rightToLeft(free_,at);}}
	free_=at; noOfElements_-=1;
	return old;}

ELEMENTS* BtList::emptyYourself() {
	noOfElements_=0; free_=0;
	return BtArray::emptyYourself();}

BtList::~BtList() {
	removeArray();}


syntax highlighted by Code2HTML, v. 0.9.1