// SPDX-FileCopyrightText: 2020 Roberto Posenato // // SPDX-License-Identifier: LGPL-3.0-or-later package it.univr.di.labeledvalue; import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectList; import it.univr.di.Debug; import javax.annotation.Nullable; import java.io.Serial; import java.util.Arrays; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Pattern; /** * Abstract class for {@link it.univr.di.labeledvalue.LabeledIntMap} interface. * * @author Roberto Posenato * @version $Rev$ * @see LabeledIntMap */ public abstract class AbstractLabeledIntMap implements LabeledIntMap { /** * Admissible values as regular expression. For now, only integer! */ static final String valueRE = "([+\\-])?(∞|[0-9]+)"; /** * Pattern of valueREString */ static final Pattern valueREPattern = Pattern.compile(valueRE); /** * A labeled value as regular expression. */ static final String labeledValueRE = "(" + Label.LABEL_RE + "\\s*,\\s*" + valueRE + "|" + valueRE + "\\s*,\\s*" + Label.LABEL_RE + ")"; /** * Matcher for a set of labeled values. * WARNING: After some test, I verified that this pattern cannot be used because it is too much * time-consuming.
I maintain it as a check in some tests. */ @SuppressWarnings("StaticMethodOnlyUsedInOneClass") static final Pattern labeledValueSetREPattern = Pattern.compile( Pattern.quote("{\\s*") + "(" + Pattern.quote(Constants.OPEN_PAIR) + labeledValueRE + Pattern.quote(Constants.CLOSE_PAIR) + "\\s*)*" + Pattern.quote("}")); /** * Serial number */ @Serial static final long serialVersionUID = 1L; /** * Pattern for splitting a set of labeled values. */ static final Pattern splitterEntryPattern = Pattern.compile(Pattern.quote("{") + Pattern.quote("}") //empty set + "|" + "(" + Pattern.quote("{") + "\\s*" + Pattern.quote(Constants.OPEN_PAIR) + ")" //first element in the set + "|" + Pattern.quote(Constants.CLOSE_PAIR) + "\\s*[" + Constants.OPEN_PAIR + "}\\s]*"); //successive element or last one /** * */ static final Pattern splitterPair = Pattern.compile(",\\s*"); /** * logger */ static private final Logger LOG = Logger.getLogger(AbstractLabeledIntMap.class.getName()); /** * @param entry (label, value) * * @return string representing the labeled value, i.e., "(value, label)" */ static String entryAsString(final Entry