[516572] Change models' superclass to MinimalEObjectImpl$Container

As we heavily rely on containment structures in the comparison model and
the tree node model (navigating to containers, etc.), it would be better
to extend MinimalEObjectImpl$Container rather than using
MinimalEObjectImpl as it is now. MinimalEObjectImpl$Container has a
dedicated field to store the container rather than using the storage
array also for the containment feature.

Bug: 516572
Change-Id: I4ea7a18963d4f0785f8ef075394388689c67c107
Signed-off-by: Philip Langer <planger@eclipsesource.com>
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/ConflictNode.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/ConflictNode.java
index 8b305bd..dccb814 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/ConflictNode.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/ConflictNode.java
@@ -13,7 +13,6 @@
 import com.google.common.collect.Iterables;
 
 import org.eclipse.emf.compare.Conflict;
-import org.eclipse.emf.edit.tree.impl.TreeNodeImpl;
 
 /**
  * This class is wrapper for TreeNode used to represent a conflict TreeNode.
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/DiffNode.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/DiffNode.java
index 78b1510..f3b393b 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/DiffNode.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/DiffNode.java
@@ -13,7 +13,6 @@
 import com.google.common.collect.Iterables;
 
 import org.eclipse.emf.compare.Diff;
-import org.eclipse.emf.edit.tree.impl.TreeNodeImpl;
 
 /**
  * This class is wrapper for TreeNode used to represent a diff TreeNode.
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/MatchNode.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/MatchNode.java
index f6b41f9..686aeaa 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/MatchNode.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/MatchNode.java
@@ -13,7 +13,6 @@
 import com.google.common.collect.Iterables;
 
 import org.eclipse.emf.compare.Match;
-import org.eclipse.emf.edit.tree.impl.TreeNodeImpl;
 
 /**
  * This class is wrapper for TreeNode used to represent a match TreeNode.
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/MatchResourceNode.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/MatchResourceNode.java
index 268d308..54d3955 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/MatchResourceNode.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/MatchResourceNode.java
@@ -13,7 +13,6 @@
 import com.google.common.collect.Iterables;
 
 import org.eclipse.emf.compare.MatchResource;
-import org.eclipse.emf.edit.tree.impl.TreeNodeImpl;
 
 /**
  * This class is wrapper for TreeNode used to represent a match resource TreeNode.
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/TreeNodeImpl.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/TreeNodeImpl.java
new file mode 100644
index 0000000..8bc8f23
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/TreeNodeImpl.java
@@ -0,0 +1,327 @@
+/**
+ * Copyright (c) 2002-2006 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors: 
+ *   IBM - Initial API and implementation
+ */
+package org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.nodes;
+
+import java.util.Collection;
+
+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.EObject;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.InternalEList;
+import org.eclipse.emf.edit.tree.TreeNode;
+import org.eclipse.emf.edit.tree.TreePackage;
+
+/**
+ * <!-- begin-user-doc --> An implementation of the model object '<em><b>Node</b></em>'. <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.emf.edit.tree.impl.TreeNodeImpl#getParent <em>Parent</em>}</li>
+ * <li>{@link org.eclipse.emf.edit.tree.impl.TreeNodeImpl#getChildren <em>Children</em>}</li>
+ * <li>{@link org.eclipse.emf.edit.tree.impl.TreeNodeImpl#getData <em>Data</em>}</li>
+ * </ul>
+ * <p>
+ * This class is an exact copy of org.eclipse.emf.edit.tree.impl.TreeNodeImpl, but inherits from
+ * MinimalEObjectImpl.Container instead of from EObjectImpl to improve efficiency in memory consumtion.
+ * </p>
+ *
+ * @generated
+ */
+public class TreeNodeImpl extends MinimalEObjectImpl.Container implements TreeNode {
+	/**
+	 * The cached value of the '{@link #getChildren() <em>Children</em>}' containment reference list. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getChildren()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<TreeNode> children;
+
+	/**
+	 * The cached value of the '{@link #getData() <em>Data</em>}' reference. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @see #getData()
+	 * @generated
+	 * @ordered
+	 */
+	protected EObject data;
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated modifiable
+	 */
+	protected TreeNodeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return TreePackage.Literals.TREE_NODE;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public TreeNode getParent() {
+		if (eContainerFeatureID() != TreePackage.TREE_NODE__PARENT) {
+			return null;
+		}
+		return (TreeNode)eInternalContainer();
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public NotificationChain basicSetParent(TreeNode newParent, NotificationChain msgs) {
+		msgs = eBasicSetContainer((InternalEObject)newParent, TreePackage.TREE_NODE__PARENT, msgs);
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void setParent(TreeNode newParent) {
+		if (newParent != eInternalContainer()
+				|| (eContainerFeatureID() != TreePackage.TREE_NODE__PARENT && newParent != null)) {
+			if (EcoreUtil.isAncestor(this, newParent)) {
+				throw new IllegalArgumentException("Recursive containment not allowed for " + toString());
+			}
+			NotificationChain msgs = null;
+			if (eInternalContainer() != null) {
+				msgs = eBasicRemoveFromContainer(msgs);
+			}
+			if (newParent != null) {
+				msgs = ((InternalEObject)newParent).eInverseAdd(this, TreePackage.TREE_NODE__CHILDREN,
+						TreeNode.class, msgs);
+			}
+			msgs = basicSetParent(newParent, msgs);
+			if (msgs != null) {
+				msgs.dispatch();
+			}
+		} else if (eNotificationRequired()) {
+			eNotify(new ENotificationImpl(this, Notification.SET, TreePackage.TREE_NODE__PARENT, newParent,
+					newParent));
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public EList<TreeNode> getChildren() {
+		if (children == null) {
+			children = new EObjectContainmentWithInverseEList<TreeNode>(TreeNode.class, this,
+					TreePackage.TREE_NODE__CHILDREN, TreePackage.TREE_NODE__PARENT);
+		}
+		return children;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public EObject getData() {
+		if (data != null && data.eIsProxy()) {
+			InternalEObject oldData = (InternalEObject)data;
+			data = eResolveProxy(oldData);
+			if (data != oldData) {
+				if (eNotificationRequired()) {
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, TreePackage.TREE_NODE__DATA,
+							oldData, data));
+				}
+			}
+		}
+		return data;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public EObject basicGetData() {
+		return data;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void setData(EObject newData) {
+		EObject oldData = data;
+		data = newData;
+		if (eNotificationRequired()) {
+			eNotify(new ENotificationImpl(this, Notification.SET, TreePackage.TREE_NODE__DATA, oldData,
+					data));
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case TreePackage.TREE_NODE__PARENT:
+				if (eInternalContainer() != null) {
+					msgs = eBasicRemoveFromContainer(msgs);
+				}
+				return basicSetParent((TreeNode)otherEnd, msgs);
+			case TreePackage.TREE_NODE__CHILDREN:
+				return ((InternalEList<InternalEObject>)(InternalEList<?>)getChildren()).basicAdd(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 TreePackage.TREE_NODE__PARENT:
+				return basicSetParent(null, msgs);
+			case TreePackage.TREE_NODE__CHILDREN:
+				return ((InternalEList<?>)getChildren()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs) {
+		switch (eContainerFeatureID()) {
+			case TreePackage.TREE_NODE__PARENT:
+				return eInternalContainer().eInverseRemove(this, TreePackage.TREE_NODE__CHILDREN,
+						TreeNode.class, msgs);
+		}
+		return super.eBasicRemoveFromContainerFeature(msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case TreePackage.TREE_NODE__PARENT:
+				return getParent();
+			case TreePackage.TREE_NODE__CHILDREN:
+				return getChildren();
+			case TreePackage.TREE_NODE__DATA:
+				if (resolve) {
+					return getData();
+				}
+				return basicGetData();
+		}
+		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 TreePackage.TREE_NODE__PARENT:
+				setParent((TreeNode)newValue);
+				return;
+			case TreePackage.TREE_NODE__CHILDREN:
+				getChildren().clear();
+				getChildren().addAll((Collection<? extends TreeNode>)newValue);
+				return;
+			case TreePackage.TREE_NODE__DATA:
+				setData((EObject)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case TreePackage.TREE_NODE__PARENT:
+				setParent((TreeNode)null);
+				return;
+			case TreePackage.TREE_NODE__CHILDREN:
+				getChildren().clear();
+				return;
+			case TreePackage.TREE_NODE__DATA:
+				setData((EObject)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case TreePackage.TREE_NODE__PARENT:
+				return getParent() != null;
+			case TreePackage.TREE_NODE__CHILDREN:
+				return children != null && !children.isEmpty();
+			case TreePackage.TREE_NODE__DATA:
+				return data != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} // TreeNodeImpl
diff --git a/plugins/org.eclipse.emf.compare/model/compare.genmodel b/plugins/org.eclipse.emf.compare/model/compare.genmodel
index 2c696b9..1c6d52f 100644
--- a/plugins/org.eclipse.emf.compare/model/compare.genmodel
+++ b/plugins/org.eclipse.emf.compare/model/compare.genmodel
@@ -5,7 +5,7 @@
     editorDirectory="/org.eclipse.emf.compare.editor/src-gen" modelPluginID="org.eclipse.emf.compare"
     modelName="Compare" editPluginClass="org.eclipse.emf.compare.provider.EMFCompareEditPlugin"
     editorPluginClass="org.eclipse.emf.compare.presentation.EMFCompareEditorPlugin"
-    nonNLSMarkers="true" rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl"
+    nonNLSMarkers="true" rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container"
     codeFormatting="true" testsDirectory="/org.eclipse.emf.compare.tests/src-gen"
     testSuiteClass="org.eclipse.emf.compare.tests.CompareAllTests" importerID="org.eclipse.emf.importer.ecore"
     complianceLevel="5.0" colorProviders="true" fontProviders="true" runtimeVersion="2.5"
@@ -27,6 +27,7 @@
       <genEnumLiterals ecoreEnumLiteral="compare.ecore#//DifferenceState/UNRESOLVED"/>
       <genEnumLiterals ecoreEnumLiteral="compare.ecore#//DifferenceState/MERGED"/>
       <genEnumLiterals ecoreEnumLiteral="compare.ecore#//DifferenceState/DISCARDED"/>
+      <genEnumLiterals ecoreEnumLiteral="compare.ecore#//DifferenceState/MERGING"/>
     </genEnums>
     <genEnums typeSafeEnumCompatible="false" ecoreEnum="compare.ecore#//ConflictKind">
       <genEnumLiterals ecoreEnumLiteral="compare.ecore#//ConflictKind/REAL"/>
diff --git a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/ComparisonImpl.java b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/ComparisonImpl.java
index 0b181c0f..52f63c3 100644
--- a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/ComparisonImpl.java
+++ b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/ComparisonImpl.java
@@ -51,7 +51,7 @@
  * @generated
  */
 @SuppressWarnings("boxing")
-public class ComparisonImpl extends MinimalEObjectImpl implements Comparison {
+public class ComparisonImpl extends MinimalEObjectImpl.Container implements Comparison {
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
 	 * 
diff --git a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/ConflictImpl.java b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/ConflictImpl.java
index 33145c2..fc8b495 100644
--- a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/ConflictImpl.java
+++ b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/ConflictImpl.java
@@ -45,7 +45,7 @@
  *
  * @generated
  */
-public class ConflictImpl extends MinimalEObjectImpl implements Conflict {
+public class ConflictImpl extends MinimalEObjectImpl.Container implements Conflict {
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
diff --git a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/DiffImpl.java b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/DiffImpl.java
index 11e5754..f4cd400 100644
--- a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/DiffImpl.java
+++ b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/DiffImpl.java
@@ -56,7 +56,7 @@
  */
 // Supressing warnings : generated code
 @SuppressWarnings("all")
-public class DiffImpl extends MinimalEObjectImpl implements Diff {
+public class DiffImpl extends MinimalEObjectImpl.Container implements Diff {
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
 	 * @generated
diff --git a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/EquivalenceImpl.java b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/EquivalenceImpl.java
index beb2970..f5a208e 100644
--- a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/EquivalenceImpl.java
+++ b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/EquivalenceImpl.java
@@ -41,7 +41,7 @@
  *
  * @generated
  */
-public class EquivalenceImpl extends MinimalEObjectImpl implements Equivalence {
+public class EquivalenceImpl extends MinimalEObjectImpl.Container implements Equivalence {
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
diff --git a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/MatchImpl.java b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/MatchImpl.java
index 2e9d4e8..a68d427 100644
--- a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/MatchImpl.java
+++ b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/MatchImpl.java
@@ -50,7 +50,7 @@
  *
  * @generated
  */
-public class MatchImpl extends MinimalEObjectImpl implements Match {
+public class MatchImpl extends MinimalEObjectImpl.Container implements Match {
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
diff --git a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/MatchResourceImpl.java b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/MatchResourceImpl.java
index 0da7327..7e8283d 100644
--- a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/MatchResourceImpl.java
+++ b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/MatchResourceImpl.java
@@ -52,7 +52,7 @@
  */
 //Supressing warnings : generated code
 @SuppressWarnings("all")
-public class MatchResourceImpl extends MinimalEObjectImpl implements MatchResource {
+public class MatchResourceImpl extends MinimalEObjectImpl.Container implements MatchResource {
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->