blob: 401473f98b996f8ee3c526750146b76039ab2ce3 [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2018 The University of York.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.epsilon.ecl.execute.operations.concurrent;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.concurrent.Callable;
import org.eclipse.epsilon.ecl.execute.context.IEclContext;
import org.eclipse.epsilon.ecl.execute.context.concurrent.EclContextParallel;
import org.eclipse.epsilon.ecl.execute.context.concurrent.IEclContextParallel;
import org.eclipse.epsilon.ecl.execute.operations.MatchesOperation;
import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
public class ParallelMatchesOperation extends MatchesOperation {
@Override
protected boolean matchCollectionOrdered(Collection<?> leftColFlat, Collection<?> rightColFlat, IEclContext context_) throws EolRuntimeException {
IEclContextParallel context = EclContextParallel.convertToParallel(context_);
ArrayList<Runnable> jobs = new ArrayList<>(leftColFlat.size());
for (Iterator<?> lit = leftColFlat.iterator(), rit = rightColFlat.iterator(); lit.hasNext();) {
final Object left = lit.next(), right = rit.next();
jobs.add(() -> {
try {
if (!matchInstances(left, right, context, false)) {
context.completeShortCircuit(context.getModule(), Boolean.FALSE);
}
}
catch (EolRuntimeException ex) {
context.handleException(ex);
}
});
}
return context.shortCircuit(context.getModule(), jobs) == null;
}
@Override
protected boolean matchCollectionUnordered(Collection<?> leftColFlat, Collection<?> rightColFlat, IEclContext context_) throws EolRuntimeException {
IEclContextParallel context = EclContextParallel.convertToParallel(context_);
for (Object outer : leftColFlat) {
Collection<Callable<Boolean>> jobs = new ArrayList<>(rightColFlat.size());
jobs.add(() -> {
for (Object inner : rightColFlat) {
if (matchInstances(outer, inner, context, forcedMatch)) {
return true;
}
}
return false;
});
if (context.executeParallelTyped(context.getModule(), jobs).contains(Boolean.FALSE)) {
return false;
}
}
return true;
}
}