All Downloads are FREE. Search and download functionalities are using the official Maven repository.

src.it.unimi.dsi.big.util.AbstractPrefixMap Maven / Gradle / Ivy

Go to download

The DSI utilities are a mishmash of classes accumulated during the last twenty years in projects developed at the DSI (Dipartimento di Scienze dell'Informazione, i.e., Information Sciences Department), now DI (Dipartimento di Informatica, i.e., Informatics Department), of the Universita` degli Studi di Milano.

There is a newer version: 2.7.3
Show newest version
package it.unimi.dsi.big.util;

/*
 * DSI utilities
 *
 * Copyright (C) 2007-2019 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; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy