blob: fe457a0e19c87c059dde8b67c6bc353d5175b4df [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2013, 2020 Willink Transformations and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* E.D.Willink - Initial API and implementation
*
* </copyright>
*/
package org.eclipse.qvtd.pivot.qvtschedule.impl;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.util.EObjectResolvingEList;
import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.util.InternalEList;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.pivot.internal.NamedElementImpl;
import org.eclipse.ocl.pivot.util.Visitor;
import org.eclipse.qvtd.pivot.qvtschedule.BasicPartition;
import org.eclipse.qvtd.pivot.qvtschedule.Edge;
import org.eclipse.qvtd.pivot.qvtschedule.MappingPartition;
import org.eclipse.qvtd.pivot.qvtschedule.MergedPartition;
import org.eclipse.qvtd.pivot.qvtschedule.Node;
import org.eclipse.qvtd.pivot.qvtschedule.QVTschedulePackage;
import org.eclipse.qvtd.pivot.qvtschedule.Region;
import org.eclipse.qvtd.pivot.qvtschedule.Role;
import org.eclipse.qvtd.pivot.qvtschedule.util.QVTscheduleVisitor;
/**
* <!-- begin-user-doc -->
* An implementation of the model object '<em><b>Basic Partition</b></em>'.
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
* </p>
* <ul>
* <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.BasicPartitionImpl#getConstantEdges <em>Constant Edges</em>}</li>
* <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.BasicPartitionImpl#getConstantNodes <em>Constant Nodes</em>}</li>
* <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.BasicPartitionImpl#getConstantSuccessFalseNodes <em>Constant Success False Nodes</em>}</li>
* <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.BasicPartitionImpl#getConstantSuccessTrueNodes <em>Constant Success True Nodes</em>}</li>
* <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.BasicPartitionImpl#getExplicitPredecessors <em>Explicit Predecessors</em>}</li>
* <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.BasicPartitionImpl#getHeadNodes <em>Head Nodes</em>}</li>
* <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.BasicPartitionImpl#getLoadedEdges <em>Loaded Edges</em>}</li>
* <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.BasicPartitionImpl#getLoadedNodes <em>Loaded Nodes</em>}</li>
* <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.BasicPartitionImpl#getPredicatedEdges <em>Predicated Edges</em>}</li>
* <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.BasicPartitionImpl#getPredicatedNodes <em>Predicated Nodes</em>}</li>
* <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.BasicPartitionImpl#getRealizedEdges <em>Realized Edges</em>}</li>
* <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.BasicPartitionImpl#getRealizedNodes <em>Realized Nodes</em>}</li>
* <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.BasicPartitionImpl#getSpeculatedEdges <em>Speculated Edges</em>}</li>
* <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.BasicPartitionImpl#getSpeculatedNodes <em>Speculated Nodes</em>}</li>
* <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.BasicPartitionImpl#getSpeculationNodes <em>Speculation Nodes</em>}</li>
* <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.BasicPartitionImpl#getOwningMergedPartition <em>Owning Merged Partition</em>}</li>
* </ul>
*
* @generated
*/
public class BasicPartitionImpl extends MappingPartitionImpl implements BasicPartition
{
/**
* The number of structural features of the '<em>Basic Partition</em>' class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
* @ordered
*/
public static final int BASIC_PARTITION_FEATURE_COUNT = MappingPartitionImpl.MAPPING_PARTITION_FEATURE_COUNT + 16;
/**
* The number of operations of the '<em>Basic Partition</em>' class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
* @ordered
*/
public static final int BASIC_PARTITION_OPERATION_COUNT = MappingPartitionImpl.MAPPING_PARTITION_OPERATION_COUNT + 0;
/**
* EdgeList duplicates changes to the lists-of-edges to the 'redundant' edge-to-role map.
*/
@SuppressWarnings("serial")
protected static class EdgeList extends EObjectResolvingEList<@NonNull Edge>
{
protected final @NonNull Role edgeRole;
private final @NonNull Map<@NonNull Edge, @NonNull Role> edge2edgeRole;
protected EdgeList(@NonNull BasicPartitionImpl owner, int featureID, @NonNull Role edgeRole) {
super(Edge.class, owner, featureID);
this.edgeRole = edgeRole;
this.edge2edgeRole = owner.edge2edgeRole;
}
@Override
protected void didAdd(int index, @NonNull Edge newObject) {
edge2edgeRole.put(newObject, edgeRole);
}
@Override
protected void didRemove(int index, @NonNull Edge oldObject) {
edge2edgeRole.remove(oldObject);
}
}
/**
* NodeList duplicates changes to the lists-of-nodes to the 'redundant' node-to-role map.
*/
@SuppressWarnings("serial")
protected static class NodeList extends EObjectResolvingEList<@NonNull Node>
{
private final @NonNull Role nodeRole;
private final @NonNull Map<@NonNull Node, @NonNull Role> node2nodeRole;
protected NodeList(@NonNull BasicPartitionImpl owner, int featureID, @NonNull Role nodeRole) {
super(Node.class, owner, featureID);
this.nodeRole = nodeRole;
this.node2nodeRole = owner.node2nodeRole;
}
@Override
protected void didAdd(int index, @NonNull Node newObject) {
node2nodeRole.put(newObject, nodeRole);
}
@Override
protected void didRemove(int index, @NonNull Node oldObject) {
node2nodeRole.remove(oldObject);
}
}
/**
* The cached value of the '{@link #getConstantEdges() <em>Constant Edges</em>}' reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getConstantEdges()
* @generated
* @ordered
*/
protected EList<Edge> constantEdges;
/**
* The cached value of the '{@link #getConstantNodes() <em>Constant Nodes</em>}' reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getConstantNodes()
* @generated
* @ordered
*/
protected EList<Node> constantNodes;
/**
* The cached value of the '{@link #getConstantSuccessFalseNodes() <em>Constant Success False Nodes</em>}' reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getConstantSuccessFalseNodes()
* @generated
* @ordered
*/
protected EList<Node> constantSuccessFalseNodes;
/**
* The cached value of the '{@link #getConstantSuccessTrueNodes() <em>Constant Success True Nodes</em>}' reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getConstantSuccessTrueNodes()
* @generated
* @ordered
*/
protected EList<Node> constantSuccessTrueNodes;
/**
* The cached value of the '{@link #getExplicitPredecessors() <em>Explicit Predecessors</em>}' reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getExplicitPredecessors()
* @generated
* @ordered
*/
protected EList<MappingPartition> explicitPredecessors;
/**
* The cached value of the '{@link #getHeadNodes() <em>Head Nodes</em>}' reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getHeadNodes()
* @generated
* @ordered
*/
protected EList<Node> headNodes;
/**
* The cached value of the '{@link #getLoadedEdges() <em>Loaded Edges</em>}' reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getLoadedEdges()
* @generated
* @ordered
*/
protected EList<Edge> loadedEdges;
/**
* The cached value of the '{@link #getLoadedNodes() <em>Loaded Nodes</em>}' reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getLoadedNodes()
* @generated
* @ordered
*/
protected EList<Node> loadedNodes;
/**
* The cached value of the '{@link #getPredicatedEdges() <em>Predicated Edges</em>}' reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getPredicatedEdges()
* @generated
* @ordered
*/
protected EList<Edge> predicatedEdges;
/**
* The cached value of the '{@link #getPredicatedNodes() <em>Predicated Nodes</em>}' reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getPredicatedNodes()
* @generated
* @ordered
*/
protected EList<Node> predicatedNodes;
/**
* The cached value of the '{@link #getRealizedEdges() <em>Realized Edges</em>}' reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getRealizedEdges()
* @generated
* @ordered
*/
protected EList<Edge> realizedEdges;
/**
* The cached value of the '{@link #getRealizedNodes() <em>Realized Nodes</em>}' reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getRealizedNodes()
* @generated
* @ordered
*/
protected EList<Node> realizedNodes;
/**
* The cached value of the '{@link #getSpeculatedEdges() <em>Speculated Edges</em>}' reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getSpeculatedEdges()
* @generated
* @ordered
*/
protected EList<Edge> speculatedEdges;
/**
* The cached value of the '{@link #getSpeculatedNodes() <em>Speculated Nodes</em>}' reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getSpeculatedNodes()
* @generated
* @ordered
*/
protected EList<Node> speculatedNodes;
/**
* The cached value of the '{@link #getSpeculationNodes() <em>Speculation Nodes</em>}' reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getSpeculationNodes()
* @generated
* @ordered
*/
protected EList<Node> speculationNodes;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected BasicPartitionImpl() {
super();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected EClass eStaticClass() {
return QVTschedulePackage.Literals.BASIC_PARTITION;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
@Override
public List<Edge> getConstantEdges() {
if (constantEdges == null) {
constantEdges = new EdgeList(this, QVTschedulePackage.Literals.BASIC_PARTITION__CONSTANT_EDGES.getFeatureID(), Role.CONSTANT);
}
return constantEdges;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
@Override
public List<Node> getConstantNodes() {
if (constantNodes == null) {
constantNodes = new NodeList(this, QVTschedulePackage.Literals.BASIC_PARTITION__CONSTANT_NODES.getFeatureID(), Role.CONSTANT);
}
return constantNodes;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
@Override
public List<Node> getConstantSuccessFalseNodes() {
if (constantSuccessFalseNodes == null) {
constantSuccessFalseNodes = new NodeList(this, QVTschedulePackage.Literals.BASIC_PARTITION__CONSTANT_SUCCESS_FALSE_NODES.getFeatureID(), Role.CONSTANT_SUCCESS_FALSE);
}
return constantSuccessFalseNodes;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
@Override
public List<Node> getConstantSuccessTrueNodes() {
if (constantSuccessTrueNodes == null) {
constantSuccessTrueNodes = new NodeList(this, QVTschedulePackage.Literals.BASIC_PARTITION__CONSTANT_SUCCESS_TRUE_NODES.getFeatureID(), Role.CONSTANT_SUCCESS_TRUE);
}
return constantSuccessTrueNodes;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public List<Node> getHeadNodes() {
if (headNodes == null) {
headNodes = new EObjectResolvingEList<Node>(Node.class, this, NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 12);
}
return headNodes;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
@Override
public List<Edge> getLoadedEdges() {
if (loadedEdges == null) {
loadedEdges = new EdgeList(this, QVTschedulePackage.Literals.BASIC_PARTITION__LOADED_EDGES.getFeatureID(), Role.LOADED);
}
return loadedEdges;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
@Override
public List<Node> getLoadedNodes() {
if (loadedNodes == null) {
loadedNodes = new NodeList(this, QVTschedulePackage.Literals.BASIC_PARTITION__LOADED_NODES.getFeatureID(), Role.LOADED);
}
return loadedNodes;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
@Override
public List<Edge> getPredicatedEdges() {
if (predicatedEdges == null) {
predicatedEdges = new EdgeList(this, QVTschedulePackage.Literals.BASIC_PARTITION__PREDICATED_EDGES.getFeatureID(), Role.PREDICATED);
}
return predicatedEdges;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
@Override
public List<Node> getPredicatedNodes() {
if (predicatedNodes == null) {
predicatedNodes = new NodeList(this, QVTschedulePackage.Literals.BASIC_PARTITION__PREDICATED_NODES.getFeatureID(), Role.PREDICATED);
}
return predicatedNodes;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
@Override
public List<Edge> getRealizedEdges() {
if (realizedEdges == null) {
realizedEdges = new EdgeList(this, QVTschedulePackage.Literals.BASIC_PARTITION__REALIZED_EDGES.getFeatureID(), Role.REALIZED);
}
return realizedEdges;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
@Override
public List<Node> getRealizedNodes() {
if (realizedNodes == null) {
realizedNodes = new NodeList(this, QVTschedulePackage.Literals.BASIC_PARTITION__REALIZED_NODES.getFeatureID(), Role.REALIZED);
}
return realizedNodes;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
@Override
public List<Edge> getSpeculatedEdges() {
if (speculatedEdges == null) {
speculatedEdges = new EdgeList(this, QVTschedulePackage.Literals.BASIC_PARTITION__SPECULATED_EDGES.getFeatureID(), Role.SPECULATED);
}
return speculatedEdges;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
@Override
public List<Node> getSpeculatedNodes() {
if (speculatedNodes == null) {
speculatedNodes = new NodeList(this, QVTschedulePackage.Literals.BASIC_PARTITION__SPECULATED_NODES.getFeatureID(), Role.SPECULATED);
}
return speculatedNodes;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
@Override
public List<Node> getSpeculationNodes() {
if (speculationNodes == null) {
speculationNodes = new NodeList(this, QVTschedulePackage.Literals.BASIC_PARTITION__SPECULATION_NODES.getFeatureID(), Role.SPECULATION);
}
return speculationNodes;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public MergedPartition getOwningMergedPartition() {
if (eContainerFeatureID() != (NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 22)) return null;
return (MergedPartition)eInternalContainer();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public NotificationChain basicSetOwningMergedPartition(MergedPartition newOwningMergedPartition, NotificationChain msgs) {
msgs = eBasicSetContainer((InternalEObject)newOwningMergedPartition, NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 22, msgs);
return msgs;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void setOwningMergedPartition(MergedPartition newOwningMergedPartition) {
if (newOwningMergedPartition != eInternalContainer() || (eContainerFeatureID() != (NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 22) && newOwningMergedPartition != null)) {
if (EcoreUtil.isAncestor(this, newOwningMergedPartition))
throw new IllegalArgumentException("Recursive containment not allowed for " + toString());
NotificationChain msgs = null;
if (eInternalContainer() != null)
msgs = eBasicRemoveFromContainer(msgs);
if (newOwningMergedPartition != null)
msgs = ((InternalEObject)newOwningMergedPartition).eInverseAdd(this, NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 23, MergedPartition.class, msgs);
msgs = basicSetOwningMergedPartition(newOwningMergedPartition, msgs);
if (msgs != null) msgs.dispatch();
}
else if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 22, newOwningMergedPartition, newOwningMergedPartition));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@SuppressWarnings("unchecked")
@Override
public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
switch (featureID) {
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 11:
return ((InternalEList<InternalEObject>)(InternalEList<?>)getExplicitPredecessors()).basicAdd(otherEnd, msgs);
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 22:
if (eInternalContainer() != null)
msgs = eBasicRemoveFromContainer(msgs);
return basicSetOwningMergedPartition((MergedPartition)otherEnd, msgs);
}
return super.eInverseAdd(otherEnd, featureID, msgs);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
switch (featureID) {
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 11:
return ((InternalEList<?>)getExplicitPredecessors()).basicRemove(otherEnd, msgs);
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 22:
return basicSetOwningMergedPartition(null, msgs);
}
return super.eInverseRemove(otherEnd, featureID, msgs);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs) {
switch (eContainerFeatureID()) {
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 22:
return eInternalContainer().eInverseRemove(this, NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 23, MergedPartition.class, msgs);
}
return super.eBasicRemoveFromContainerFeature(msgs);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public List<MappingPartition> getExplicitPredecessors() {
if (explicitPredecessors == null) {
explicitPredecessors = new EObjectWithInverseResolvingEList.ManyInverse<MappingPartition>(MappingPartition.class, this, NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 11, NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 6);
}
return explicitPredecessors;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 7:
return getConstantEdges();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 8:
return getConstantNodes();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 9:
return getConstantSuccessFalseNodes();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 10:
return getConstantSuccessTrueNodes();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 11:
return getExplicitPredecessors();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 12:
return getHeadNodes();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 13:
return getLoadedEdges();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 14:
return getLoadedNodes();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 15:
return getPredicatedEdges();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 16:
return getPredicatedNodes();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 17:
return getRealizedEdges();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 18:
return getRealizedNodes();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 19:
return getSpeculatedEdges();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 20:
return getSpeculatedNodes();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 21:
return getSpeculationNodes();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 22:
return getOwningMergedPartition();
}
return super.eGet(featureID, resolve, coreType);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@SuppressWarnings("unchecked")
@Override
public void eSet(int featureID, Object newValue) {
switch (featureID) {
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 7:
getConstantEdges().clear();
getConstantEdges().addAll((Collection<? extends Edge>)newValue);
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 8:
getConstantNodes().clear();
getConstantNodes().addAll((Collection<? extends Node>)newValue);
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 9:
getConstantSuccessFalseNodes().clear();
getConstantSuccessFalseNodes().addAll((Collection<? extends Node>)newValue);
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 10:
getConstantSuccessTrueNodes().clear();
getConstantSuccessTrueNodes().addAll((Collection<? extends Node>)newValue);
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 11:
getExplicitPredecessors().clear();
getExplicitPredecessors().addAll((Collection<? extends MappingPartition>)newValue);
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 12:
getHeadNodes().clear();
getHeadNodes().addAll((Collection<? extends Node>)newValue);
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 13:
getLoadedEdges().clear();
getLoadedEdges().addAll((Collection<? extends Edge>)newValue);
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 14:
getLoadedNodes().clear();
getLoadedNodes().addAll((Collection<? extends Node>)newValue);
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 15:
getPredicatedEdges().clear();
getPredicatedEdges().addAll((Collection<? extends Edge>)newValue);
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 16:
getPredicatedNodes().clear();
getPredicatedNodes().addAll((Collection<? extends Node>)newValue);
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 17:
getRealizedEdges().clear();
getRealizedEdges().addAll((Collection<? extends Edge>)newValue);
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 18:
getRealizedNodes().clear();
getRealizedNodes().addAll((Collection<? extends Node>)newValue);
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 19:
getSpeculatedEdges().clear();
getSpeculatedEdges().addAll((Collection<? extends Edge>)newValue);
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 20:
getSpeculatedNodes().clear();
getSpeculatedNodes().addAll((Collection<? extends Node>)newValue);
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 21:
getSpeculationNodes().clear();
getSpeculationNodes().addAll((Collection<? extends Node>)newValue);
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 22:
setOwningMergedPartition((MergedPartition)newValue);
return;
}
super.eSet(featureID, newValue);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void eUnset(int featureID) {
switch (featureID) {
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 7:
getConstantEdges().clear();
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 8:
getConstantNodes().clear();
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 9:
getConstantSuccessFalseNodes().clear();
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 10:
getConstantSuccessTrueNodes().clear();
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 11:
getExplicitPredecessors().clear();
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 12:
getHeadNodes().clear();
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 13:
getLoadedEdges().clear();
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 14:
getLoadedNodes().clear();
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 15:
getPredicatedEdges().clear();
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 16:
getPredicatedNodes().clear();
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 17:
getRealizedEdges().clear();
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 18:
getRealizedNodes().clear();
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 19:
getSpeculatedEdges().clear();
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 20:
getSpeculatedNodes().clear();
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 21:
getSpeculationNodes().clear();
return;
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 22:
setOwningMergedPartition((MergedPartition)null);
return;
}
super.eUnset(featureID);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public boolean eIsSet(int featureID) {
switch (featureID) {
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 7:
return constantEdges != null && !constantEdges.isEmpty();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 8:
return constantNodes != null && !constantNodes.isEmpty();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 9:
return constantSuccessFalseNodes != null && !constantSuccessFalseNodes.isEmpty();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 10:
return constantSuccessTrueNodes != null && !constantSuccessTrueNodes.isEmpty();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 11:
return explicitPredecessors != null && !explicitPredecessors.isEmpty();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 12:
return headNodes != null && !headNodes.isEmpty();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 13:
return loadedEdges != null && !loadedEdges.isEmpty();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 14:
return loadedNodes != null && !loadedNodes.isEmpty();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 15:
return predicatedEdges != null && !predicatedEdges.isEmpty();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 16:
return predicatedNodes != null && !predicatedNodes.isEmpty();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 17:
return realizedEdges != null && !realizedEdges.isEmpty();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 18:
return realizedNodes != null && !realizedNodes.isEmpty();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 19:
return speculatedEdges != null && !speculatedEdges.isEmpty();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 20:
return speculatedNodes != null && !speculatedNodes.isEmpty();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 21:
return speculationNodes != null && !speculationNodes.isEmpty();
case NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 22:
return getOwningMergedPartition() != null;
}
return super.eIsSet(featureID);
}
/**
* {@inheritDoc}
* @generated
*/
@SuppressWarnings("unchecked")
@Override
public <R> R accept(@NonNull Visitor<R> visitor) {
if (visitor instanceof QVTscheduleVisitor) {
return (R) ((QVTscheduleVisitor<?>)visitor).visitBasicPartition(this);
}
else {
return super.accept(visitor);
}
}
/**
* The nodes of region that are required by the partition and the nodeRole that each node plays in the partition.
*/
private final @NonNull Map<@NonNull Node, @NonNull Role> node2nodeRole = new HashMap<>();
/**
* The edges of region that are required by the partition and the edgeRole that each edge plays in the partition.
*/
private final @NonNull Map<@NonNull Edge, @NonNull Role> edge2edgeRole = new HashMap<>();
@Override
public void addExplicitPredecessor(@NonNull BasicPartition speculationPartition) {
getExplicitPredecessors().add(speculationPartition);
}
@Override
public Region basicGetRegion() {
return getReferedMappingRegion();
}
/**
* Return true of all required predecessor of targetNOde are available for use by this partition.
*
protected boolean allPredecessorsAreAvailable(@NonNull Node targetNode) {
List<@NonNull Node> requiredNodes = new ArrayList<>(nodes);
requiredNodes.add(targetNode);
Map<@NonNull Node, @NonNull Role> requiredNode2nodeRole = new HashMap<>();
for (int i = 0; i < requiredNodes.size(); i++) {
Node node = requiredNodes.get(i);
assert node != null;
Edge traceEdge = partitioner.getTraceEdge(node);
if ((traceEdge == null) || !partitioner.hasRealizedEdge(traceEdge)) {
for (@NonNull Node precedingNode : getPredecessors(node)) {
if (!isAvailable(node)) {
return false;
}
if (!requiredNode2nodeRole.containsKey(precedingNode)) {
requiredNode2nodeRole.put(precedingNode, QVTscheduleUtil.getNodeRole(precedingNode));
requiredNodes.add(precedingNode);
}
}
}
}
/* for (@NonNull Node requiredNode : requiredNodes) {
for (@NonNull Edge edge : QVTscheduleUtil.getIncomingEdges(requiredNode)) {
if (!requiredNode2nodeRole.containsKey(precedingNode)) {
requiredNode2nodeRole.put(precedingNode, QVTscheduleUtil.getNodeRole(precedingNode));
requiredNodes.add(precedingNode);
}
}
} * /
return true;
} */
/**
* Verify that all unconditional nodes in the new region are reachable from its heads.
*
public void check(@NonNull MappingPartitioner partitioner, @NonNull MicroMappingRegion region) {
Set<@NonNull Node> reachableNodes = new HashSet<>();
for (@NonNull Node node : QVTscheduleUtil.getHeadNodes(region)) {
checkGatherReachables(reachableNodes, node);
}
Set<@NonNull Node> allNodes = Sets.newHashSet(QVTscheduleUtil.getOwnedNodes(region));
if (!reachableNodes.equals(allNodes)) {
Set<@NonNull Node> extraNodesSet = Sets.newHashSet(reachableNodes);
CompilerUtil.removeAll(extraNodesSet, allNodes);
for (@NonNull Node node : extraNodesSet) {
partitioner.addProblem(CompilerUtil.createRegionWarning(region, "unexpected " + node));
}
Set<@NonNull Node> missingNodesSet = Sets.newHashSet(allNodes);
missingNodesSet.removeAll(reachableNodes);
for (@NonNull Node node : missingNodesSet) {
if (!node.isConstant() && !node.isUnconditional()) {
node.isUnconditional();
partitioner.addProblem(CompilerUtil.createRegionWarning(region, "unreachable " + node));
}
}
}
}
private void checkGatherReachables(@NonNull Set<@NonNull Node> reachableNodes, @NonNull Node node) {
if (node instanceof OperationNode) {
for (@NonNull Edge edge : QVTscheduleUtil.getIncomingEdges(node)) {
if (edge.isComputation() && !edge.isConstant()) {
if (!reachableNodes.contains(edge.getEdgeSource())) {
return;
}
}
}
}
if (reachableNodes.add(node)) {
for (@NonNull Edge edge : QVTscheduleUtil.getIncomingEdges(node)) {
if (/*edge.isComputation() ||* / edge.isCast() || edge.isNavigation()) { // excludes only recursion
checkGatherReachables(reachableNodes, edge.getEdgeSource());
}
}
for (@NonNull Edge edge : QVTscheduleUtil.getOutgoingEdges(node)) {
if (edge.isComputation() || edge.isCast() || edge.isNavigation()) {
checkGatherReachables(reachableNodes, edge.getEdgeTarget());
}
}
}
} */
@Override
public void destroy() {
setOwningCompositePartition(null);
setReferedMappingRegion(null);
getExplicitPredecessors().clear();
getExplicitSuccessors().clear();
}
@Override
public @NonNull Iterable<@NonNull Edge> getPartialEdges() {
return edge2edgeRole.keySet();
}
@Override
public @NonNull Iterable<@NonNull Node> getPartialNodes() {
return node2nodeRole.keySet();
}
/**
* Return the role that the original region's edge plays in the partition. Null for none.
*/
@Override
public @Nullable Role getRole(@NonNull Edge edge) {
return edge2edgeRole.get(edge);
}
/**
* Return the role that the original region's node plays in the partition. Null for none.
*/
@Override
public @Nullable Role getRole(@NonNull Node node) {
return node2nodeRole.get(node);
}
/**
* Return true if the original region edge contributes to the partition.
*/
@Override
public boolean hasEdge(@NonNull Edge edge) {
return edge2edgeRole.containsKey(edge);
}
/**
* Return true if the original region node contributes to the partition.
*/
@Override
public boolean hasNode(@NonNull Node node) {
return node2nodeRole.containsKey(node);
}
@Override
public @Nullable Role putEdgeRole(@NonNull Edge edge, @NonNull Role newEdgeRole) {
assert node2nodeRole.get(edge.getSourceNode()) != null;
assert node2nodeRole.get(edge.getTargetNode()) != null;
Role oldEdgeRole = edge2edgeRole.get(edge);
switch (newEdgeRole) {
case CONSTANT: getConstantEdges().add(edge); break;
// case CONSTANT_SUCCESS_FALSE: getConstantSuccessFalseEdges().add(edge); break;
// case CONSTANT_SUCCESS_TRUE: getConstantSuccessTrueEdges().add(edge); break;
case LOADED: getLoadedEdges().add(edge); break;
case PREDICATED: getPredicatedEdges().add(edge); break;
case REALIZED: getRealizedEdges().add(edge); break;
case SPECULATED: getSpeculatedEdges().add(edge); break;
// case SPECULATION: getSpeculationEdges().add(edge); break;
default: throw new UnsupportedOperationException(newEdgeRole.toString());
}
return oldEdgeRole;
}
@Override
public @Nullable Role putNodeRole(@NonNull Node node, @NonNull Role newNodeRole) {
Role oldNodeRole = node2nodeRole.get(node);
switch (newNodeRole) {
case CONSTANT: getConstantNodes().add(node); break;
case CONSTANT_SUCCESS_FALSE: getConstantSuccessFalseNodes().add(node); break;
case CONSTANT_SUCCESS_TRUE: getConstantSuccessTrueNodes().add(node); break;
case LOADED: getLoadedNodes().add(node); break;
case PREDICATED: getPredicatedNodes().add(node); break;
case REALIZED: getRealizedNodes().add(node); break;
case SPECULATED: getSpeculatedNodes().add(node); break;
case SPECULATION: getSpeculationNodes().add(node); break;
default: throw new UnsupportedOperationException(newNodeRole.toString());
}
return oldNodeRole;
}
@Override
public @NonNull String toString() {
return getName();
}
} //BasicPartitionImpl