/**
* <copyright>
* Copyright (c) 2010-2014 Henshin developers. All rights reserved.
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License v1.0 which
* accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
* </copyright>
*/
package org.eclipse.emf.henshin.interpreter;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.ECrossReferenceAdapter;
/**
* Interface for storing {@link EObject} graphs.
*
* @author Christian Krause, Enrico Biermann
*/
public interface EGraph extends Collection<EObject> {
/**
* Adds an {@link EObject} and all its children to this graph.
* @param root The root object of the tree.
* @return <code>true</code> if an object was added.
*/
boolean addTree(EObject root);
/**
* Adds an {@link EObject} and all reachable objects to this graph.
* In contrast to {@link #addTree(EObject)} this method adds all
* referenced objects to the graph, and not just the children of
* the containment tree.
* @param object An arbitrary object.
* @return <code>true</code> if at least one object was added.
*/
boolean addGraph(EObject object);
/**
* Removes an {@link EObject} and all its children from this graph.
* @param root The root object of the tree.
* @return <code>true</code> if any object was removed.
* @see #addTree(EObject)
*/
boolean removeTree(EObject root);
/**
* Removes an {@link EObject} and all reachable objects from this graph.
* @param object An arbitrary object.
* @return <code>true</code> if any object was removed.
* @see #addGraph(EObject)
*/
boolean removeGraph(EObject object);
/**
* Copy this object graph. If the parameter map is <code>null</code>
* the objects in the graph will be copied too. If the map is not
* <code>null</code>, the images of the map will be used as the new
* objects.
* @param copies Map associating object of this graph to copies. Can be <code>null</code>.
* @return The copied version of this {@link EGraph}.
*/
EGraph copy(Map<EObject,EObject> copies);
/**
* Get all {@link EObject}s of this graph which are compatible with the given type.
* This returns a fresh and modifiable list.
* @param type The type of the objects.
* @param strict Whether subtypes are excluded from the result.
* @return A set of {@link EObject}s compatible with the type.
*/
List<EObject> getDomain(EClass type, boolean strict);
/**
* Returns the size of the domain for a type. The returned number
* equals the size of the list returned by {@link #getDomain(EClass, boolean)}.
* This method should be used whenever the actual objects are not needed.
* @param type The type.
* @param strict Whether subtypes are excluded.
* @return The size of the domain.
*/
int getDomainSize(EClass type, boolean strict);
/**
* Get the root objects in this graph. This returns a fresh and modifiable list.
* @return The root objects.
*/
List<EObject> getRoots();
/**
* Get the cross reference adapter of this graph.
* @return The cross reference adapter.
*/
ECrossReferenceAdapter getCrossReferenceAdapter();
}