/*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */
package org.apache.tools.ant.types;

import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.stream.Stream;

import org.apache.tools.ant.BuildException;

EnumeratedAttribute for quantifier comparisons. Evaluates a boolean[] or raw true and false counts. Accepts the following values:
"all"
none false
"each"
none false
"every"
none false
"any"
at least one true
"some"
at least one true
"one"
exactly one true
"majority"
more true than false
"most"
more true than false
"none"
none true
Since:Ant 1.7
/** * EnumeratedAttribute for quantifier comparisons. Evaluates a * <code>boolean[]</code> or raw <code>true</code> and <code>false</code> * counts. Accepts the following values:<dl> * <dt>"all"</dt><dd>none <code>false</code></dd> * <dt>"each"</dt><dd>none <code>false</code></dd> * <dt>"every"</dt><dd>none <code>false</code></dd> * <dt>"any"</dt><dd>at least one <code>true</code></dd> * <dt>"some"</dt><dd>at least one <code>true</code></dd> * <dt>"one"</dt><dd>exactly one <code>true</code></dd> * <dt>"majority"</dt><dd>more <code>true</code> than <code>false</code></dd> * <dt>"most"</dt><dd>more <code>true</code> than <code>false</code></dd> * <dt>"none"</dt><dd>none <code>true</code></dd> * </dl> * @since Ant 1.7 */
public class Quantifier extends EnumeratedAttribute { private static final String[] VALUES = Stream.of(Predicate.values()).map(Predicate::getNames) .flatMap(Collection::stream).toArray(String[]::new);
ALL instance
/** ALL instance */
public static final Quantifier ALL = new Quantifier(Predicate.ALL);
ANY instance
/** ANY instance */
public static final Quantifier ANY = new Quantifier(Predicate.ANY);
ONE instance
/** ONE instance */
public static final Quantifier ONE = new Quantifier(Predicate.ONE);
MAJORITY instance
/** MAJORITY instance */
public static final Quantifier MAJORITY = new Quantifier(Predicate.MAJORITY);
NONE instance
/** NONE instance */
public static final Quantifier NONE = new Quantifier(Predicate.NONE); private enum Predicate { ALL("all", "each", "every") { @Override boolean eval(int t, int f) { return f == 0; } }, ANY("any", "some") { @Override boolean eval(int t, int f) { return t > 0; } }, ONE("one") { @Override boolean eval(int t, int f) { return t == 1; } }, MAJORITY("majority", "most") { @Override boolean eval(int t, int f) { return t > f; } }, NONE("none") { @Override boolean eval(int t, int f) { return t == 0; } }; static Predicate get(String name) { return Stream.of(values()).filter(p -> p.names.contains(name)) .findFirst() .orElseThrow(() -> new IllegalArgumentException(name)); } final Set<String> names; Predicate(String primaryName, String... additionalNames) { Set<String> names = new LinkedHashSet<>(); names.add(primaryName); Collections.addAll(names, additionalNames); this.names = Collections.unmodifiableSet(names); } Set<String> getNames() { return names; } abstract boolean eval(int t, int f); }
Default constructor.
/** * Default constructor. */
public Quantifier() { }
Construct a new Quantifier with the specified value.
Params:
  • value – the EnumeratedAttribute value.
/** * Construct a new Quantifier with the specified value. * @param value the EnumeratedAttribute value. */
public Quantifier(String value) { setValue(value); } private Quantifier(Predicate impl) { setValue(impl.getNames().iterator().next()); }
Return the possible values.
Returns:String[] of EnumeratedAttribute values.
/** * Return the possible values. * @return String[] of EnumeratedAttribute values. */
@Override public String[] getValues() { return VALUES; }
Evaluate a boolean array.
Params:
  • b – the boolean[] to evaluate.
Returns:true if the argument fell within the parameters of this Quantifier.
/** * Evaluate a <code>boolean</code> array. * @param b the <code>boolean[]</code> to evaluate. * @return true if the argument fell within the parameters of this Quantifier. */
public boolean evaluate(boolean[] b) { int t = 0; for (boolean bn : b) { if (bn) { t++; } } return evaluate(t, b.length - t); }
Evaluate integer true vs. false counts.
Params:
  • t – the number of true values.
  • f – the number of false values.
Returns:true if the arguments fell within the parameters of this Quantifier.
/** * Evaluate integer <code>true</code> vs. <code>false</code> counts. * @param t the number of <code>true</code> values. * @param f the number of <code>false</code> values. * @return true if the arguments fell within the parameters of this Quantifier. */
public boolean evaluate(int t, int f) { int index = getIndex(); if (index == -1) { throw new BuildException("Quantifier value not set."); } return Predicate.get(VALUES[index]).eval(t, f); } }