/*
* Replication Benchmarker
* https://github.com/score-team/replication-benchmarker/
* Copyright (C) 2013 LORIA / Inria / SCORE Team
*
* 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, see <http://www.gnu.org/licenses/>.
*/
package jbenchmarker.logootsplitO;
import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
/**
*
* @author Stephane Martin <stephane@stephanemartin.fr>
*/
public class Identifier implements Comparable, Iterable, Serializable {
List<Integer> base;
Integer last;
/**
* -1 this< t 0 this=t 1 this > t
*
* @param t
* @return
*/
public Identifier(List<Integer> base) {
this.base = base;
}
public Identifier(List<Integer> base, Integer u) {
this.base = base;
this.last = u;
}
@Override
public int compareTo(Object t) {
if (t instanceof Identifier) {
return compareTo(this.iterator(), ((Identifier) t).iterator());
}
throw new UnsupportedOperationException("Not supported yet, identifier is not a " + t.getClass().getName()); //To change body of generated methods, choose Tools | Templates.
}
/**
* -1 this.last< t.i, 0 this.last=t.i 1, this.last > t.i
*
* @param last
* @param t
* @param i
* @return
*/
/* public int compareTo(Integer u, Identifier t,Integer i){
Iterator <Integer> s1=new Iterator_a(this.base.iterator(),u);
Iterator <Integer> s2=new Iterator_a(t.base.iterator(),i);
return compareTo(s1,s2);
}
public int compareTo(Integer u,List<Integer> t,Integer i){
Iterator <Integer> s1=new Iterator_a(this.base.iterator(),u);
Iterator <Integer> s2=new Iterator_a(t.iterator(),i);
return compareTo(s1,s2);
}
public static int compareTo(List <Integer>l1,Integer u1,List <Integer> l2,Integer u2){
Iterator <Integer> s1=new Iterator_a(l1.iterator(),u1);
Iterator <Integer> s2=new Iterator_a(l2.iterator(),u2);
return compareTo(s1,s2);
}
public int compareTo(Identifier t,Integer i){
Iterator <Integer> s1=this.base.iterator();
Iterator <Integer> s2=new Iterator_a(t.base.iterator(),i);
return compareTo(s1,s2);
}*/
/**
* compare S1 and S2
*
* @param s1
* @param s2
* @return -1 if s1<s2 ; 0 if s1==s2 ; 1 if s1>s2
*/
public static int compareTo(Iterator<Integer> s1, Iterator<Integer> s2) {
while (s1.hasNext() && s2.hasNext()) {
int b1 = s1.next();
int b2 = s2.next();
if (b1 < b2) {
return -1;
}
if (b1 > b2) {
return 1;
}
}
/* S1 is longer than s2*/
if (s1.hasNext()) {
return 1;
}
/* S2 is longer than s1*/
if (s2.hasNext()) {
return -1;
}
// Both have same size
return 0;
}
public List<Integer> getBase() {
return base;
}
public Integer getLast() {
return last;
}
@Override
public Iterator iterator() {
return new Iterator_a(base.iterator(), this.last);
}
static class Iterator_a implements Iterator {
public Iterator_a(Iterator it, Object more) {
this.it = it;
this.more = more;
loadNext();
}
Iterator it;
Object more;
Object nexte;
private void loadNext() {
if (it.hasNext()) {
nexte = it.next();
} else {
nexte = more;
more = null;
}
}
@Override
public boolean hasNext() {
return nexte != null;
}
@Override
public Object next() {
Object ret = nexte;
loadNext();
return ret;
}
@Override
public void remove() {
throw new UnsupportedOperationException("Not supported");
}
}
@Override
public String toString() {
return "Identifiant{" + base + "," + last + '}';
}
boolean hasPlaceAfter(Identifier next, int lenght) {
int max = lenght + last;
Iterator<Integer> i = this.base.iterator();
Iterator<Integer> i2 = next.iterator();
while (i.hasNext() && i2.hasNext()) {
if (!i.next().equals(i2.next())) {
return true;
}
}
if (i2.hasNext()) {
return i2.next() >= max;
} else {
return true;
}
}
boolean hasPlaceBefore(Identifier prev, int lenght) {
int min = last - lenght;
Iterator<Integer> i = this.base.iterator();
Iterator<Integer> i2 = prev.iterator();
while (i.hasNext() && i2.hasNext()) {
if (!i.next().equals(i2.next())) {
return true;
}
}
if (i2.hasNext()) {
return i2.next() < min;
} else {
return true;
}
}
int minOffsetAfterPrev(Identifier prev, int min) {
Iterator<Integer> i = this.base.iterator();
Iterator<Integer> i2 = prev.iterator();
while (i.hasNext() && i2.hasNext()) {
if (!i.next().equals(i2.next())) {
return min;
}
}
if (i2.hasNext()) {
return Math.max(i2.next(), min);
} else {
return min;
}
}
/**
*
*
* @param l
* @param l2
* @return
*/
int maxOffsetBeforeNex(Identifier next, int max) {
Iterator<Integer> i = this.base.iterator();
Iterator<Integer> i2 = next.iterator();
while (i.hasNext() && i2.hasNext()) {
if (!i.next().equals(i2.next())) {
return max;
}
}
if (i2.hasNext()) {
return Math.min(i2.next(), max);
} else {
return max;
}
}
}