src.it.unimi.dsi.big.util.AbstractPrefixMap Maven / Gradle / Ivy
package it.unimi.dsi.big.util;
/*
* DSI utilities
*
* Copyright (C) 2007-2017 Sebastiano Vigna
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 3 of the License, or (at your option)
* any later version.
*
* This library 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 Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, see .
*
*/
import it.unimi.dsi.fastutil.objects.AbstractObject2LongFunction;
import it.unimi.dsi.fastutil.objects.AbstractObject2ObjectFunction;
import it.unimi.dsi.fastutil.objects.AbstractObjectBigList;
import it.unimi.dsi.fastutil.objects.Object2ObjectFunction;
import it.unimi.dsi.fastutil.objects.ObjectBigList;
import it.unimi.dsi.lang.MutableString;
import it.unimi.dsi.util.LongInterval;
import it.unimi.dsi.util.LongIntervals;
import java.io.Serializable;
/** An abstract implementation of a prefix map.
*
* This class provides the full services of a {@link PrefixMap} by implementing just
* {@link #getInterval(CharSequence)} and {@link #getTerm(long, MutableString)}
*/
public abstract class AbstractPrefixMap extends AbstractObject2LongFunction implements PrefixMap, Serializable {
private static final long serialVersionUID = 1L;
protected Object2ObjectFunction rangeMap;
protected AbstractObject2ObjectFunction prefixMap;
protected ObjectBigList list;
// We must guarantee that, unless the user says otherwise, the default return value is -1.
{
defaultReturnValue(-1);
}
/** Returns the range of strings having a given prefix.
*
* @param prefix a prefix.
* @return the corresponding range of strings as an interval.
*/
protected abstract LongInterval getInterval(CharSequence prefix);
/** Writes a string specified by index into a {@link MutableString}.
*
* @param left the index of a string.
* @param string a mutable string.
* @return string
.
*/
protected abstract MutableString getTerm(long left, MutableString string);
@Override
public Object2ObjectFunction rangeMap() {
if (rangeMap == null) rangeMap = new AbstractObject2ObjectFunction() {
private static final long serialVersionUID = 1L;
@Override
public boolean containsKey(final Object o) {
return get(o) != LongIntervals.EMPTY_INTERVAL;
}
@Override
public int size() {
return -1;
}
@Override
public LongInterval get(final Object o) {
return getInterval((CharSequence)o);
}
};
return rangeMap;
}
@Override
public Object2ObjectFunction prefixMap() {
if (prefixMap == null) prefixMap = new AbstractObject2ObjectFunction() {
private static final long serialVersionUID = 1L;
@Override
public MutableString get(final Object o) {
final LongInterval interval = (LongInterval)o;
final MutableString prefix = new MutableString();
if (interval == LongIntervals.EMPTY_INTERVAL || interval.left < 0 || interval.right < 0) throw new IllegalArgumentException();
getTerm(interval.left, prefix);
if (interval.length() == 1) return prefix;
final MutableString s = getTerm(interval.right, new MutableString());
final int l = Math.min(prefix.length(), s.length());
int i;
for(i = 0; i < l; i++) if (s.charAt(i) != prefix.charAt(i)) break;
return prefix.length(i);
}
@Override
public boolean containsKey(final Object o) {
LongInterval interval = (LongInterval)o;
return interval != LongIntervals.EMPTY_INTERVAL && interval.left >= 0 && interval.right < AbstractPrefixMap.this.size64();
}
@Override
public int size() {
return -1;
}
};
return prefixMap;
}
@Override
public ObjectBigList list() {
if (list == null) list = new AbstractObjectBigList() {
@Override
public long size64() {
return AbstractPrefixMap.this.size64();
}
@Override
public MutableString get(long index) {
return getTerm(index, new MutableString());
}
};
return list;
}
}