/******************************************************************************* * SAT4J: a SATisfiability library for Java Copyright (C) 2004-2008 Daniel Le Berre * * 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 * * Alternatively, the contents of this file may be used under the terms of * either the GNU Lesser General Public License Version 2.1 or later (the * "LGPL"), in which case the provisions of the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of the LGPL, and not to allow others to use your version of * this file under the terms of the EPL, indicate your decision by deleting * the provisions above and replace them with the notice and other provisions * required by the LGPL. If you do not delete the provisions above, a recipient * may use your version of this file under the terms of the EPL or the LGPL. * * Based on the original MiniSat specification from: * * An extensible SAT solver. Niklas Een and Niklas Sorensson. Proceedings of the * Sixth International Conference on Theory and Applications of Satisfiability * Testing, LNCS 2919, pp 502-518, 2003. * * See www.minisat.se for the original solver in C++. * *******************************************************************************/ package org.sat4j.specs; import java.io.Serializable; import java.util.Comparator; import java.util.Iterator; /** * An abstraction on the type of vector used in the library. * * @author leberre */ public interface IVec<T> extends Serializable { /** * @return the number of elements contained in the vector */ int size(); /** * Remove nofelems from the Vector. It is assumed that the number of * elements to remove is smaller or equals to the current number of elements * in the vector * * @param nofelems * the number of elements to remove. */ void shrink(int nofelems); /** * reduce the Vector to exactly newsize elements * * @param newsize * the new size of the vector. */ void shrinkTo(final int newsize); /** * Pop the last element on the stack. It is assumed that the stack is not * empty! */ void pop(); void growTo(final int newsize, final T pad); void ensure(final int nsize); IVec<T> push(final T elem); /** * To push an element in the vector when you know you have space for it. * * @param elem */ void unsafePush(T elem); /** * Insert an element at the very begining of the vector. The former first * element is appended to the end of the vector in order to have a constant * time operation. * * @param elem * the element to put first in the vector. */ void insertFirst(final T elem); void insertFirstWithShifting(final T elem); void clear(); /** * return the latest element on the stack. It is assumed that the stack is * not empty! * * @return the last (top) element on the stack */ T last(); T get(int i); void set(int i, T o); /** * Enleve un element qui se trouve dans le vecteur!!! * * @param elem * un element du vecteur */ void remove(T elem); /** * Delete the ith element of the vector. The latest element of the vector * replaces the removed element at the ith indexer. * * @param i * the indexer of the element in the vector * @return the former ith element of the vector that is now removed from the * vector */ T delete(int i); /** * Ces operations devraient se faire en temps constant. Ce n'est pas le * cas ici. * * @param copy */ void copyTo(IVec<T> copy); <E> void copyTo(E[] dest); /** * Allow to access the internal representation of the vector as an array. * Note that only the content of index 0 to size() should be taken into * account. USE WITH CAUTION * * @return the internal representation of the Vector as an array. */ T[] toArray(); /** * Move the content of the vector into dest. Note that the vector become * empty. The content of the vector is appended to dest. * * @param dest * the vector where top put the content of this vector */ void moveTo(IVec<T> dest); /** * Move elements inside the vector. The content of the method is equivalent * to: <code>vec[dest] = vec[source]</code> * * @param dest * the index of the destination * @param source * the index of the source */ void moveTo(int dest, int source); /* * @param comparator */ void sort(Comparator<T> comparator); void sortUnique(Comparator<T> comparator); /** * To know if a vector is empty * * @return true iff the vector is empty. * @since 1.6 */ boolean isEmpty(); Iterator<T> iterator(); }