/******************************************************************************* * Copyright (c) 2009 Centrum Wiskunde en Informatica (CWI) * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Arnold Lankamp - interfaces and implementation *******************************************************************************/ package org.rascalmpl.value.impl.util.collections; import java.util.Iterator; import org.rascalmpl.value.IValue; import org.rascalmpl.value.util.ShareableList; /** * A specialized version of the ShareableList, specifically meant for storing values. * * @author Arnold Lankamp */ public class ShareableValuesList extends ShareableList<IValue>{ public ShareableValuesList(){ super(); } public ShareableValuesList(ShareableValuesList shareableValuesList){ super(shareableValuesList); } public ShareableValuesList(ShareableValuesList shareableValuesList, int offset, int length){ super(shareableValuesList, offset, length); } public boolean isEqual(ShareableValuesList otherShareableValuesList){ if(otherShareableValuesList == null) return false; if(otherShareableValuesList.size() != size()) return false; if(otherShareableValuesList.isEmpty()) return true; Iterator<IValue> thisListIterator = iterator(); Iterator<IValue> otherListIterator = otherShareableValuesList.iterator(); while(thisListIterator.hasNext()){ IValue thisValue = thisListIterator.next(); IValue otherValue = otherListIterator.next(); if(!thisValue.isEqual(otherValue)){ return false; } } return true; } public boolean contains(IValue value){ Iterator<IValue> valuesIterator = iterator(); while(valuesIterator.hasNext()){ IValue next = valuesIterator.next(); if(next.isEqual(value)) return true; } return false; } public boolean remove(IValue value){ int index = 0; Iterator<IValue> valuesIterator = iterator(); while(valuesIterator.hasNext()){ IValue next = valuesIterator.next(); if(next.isEqual(value)) break; index++; } if(index < size()){ remove(index); return true; } return false; } public ShareableValuesList subList(int offset, int length){ if(offset < 0) throw new IndexOutOfBoundsException("Offset may not be smaller than 0."); if(length < 0) throw new IndexOutOfBoundsException("Length may not be smaller than 0."); if((offset + length) > size()) throw new IndexOutOfBoundsException("'offset + length' may not be larger than 'list.size()'"); return new ShareableValuesList(this, offset, length); } }