diff options
Diffstat (limited to 'bundles/org.eclipse.equinox.registry/src/org/eclipse/core/internal/registry/RegistryIndexChildren.java')
-rw-r--r-- | bundles/org.eclipse.equinox.registry/src/org/eclipse/core/internal/registry/RegistryIndexChildren.java | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/bundles/org.eclipse.equinox.registry/src/org/eclipse/core/internal/registry/RegistryIndexChildren.java b/bundles/org.eclipse.equinox.registry/src/org/eclipse/core/internal/registry/RegistryIndexChildren.java new file mode 100644 index 000000000..705c4574a --- /dev/null +++ b/bundles/org.eclipse.equinox.registry/src/org/eclipse/core/internal/registry/RegistryIndexChildren.java @@ -0,0 +1,104 @@ +/******************************************************************************* + * Copyright (c) 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 Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.core.internal.registry; + +public class RegistryIndexChildren { + + static final int[] EMPTY_ARRAY = new int[0]; + + private int[] children; + + public RegistryIndexChildren() { + children = EMPTY_ARRAY; + } + + public RegistryIndexChildren(int[] children) { + this.children = children; + } + + public int[] getChildren() { + return children; + } + + public int findChild(int id) { + for (int i = 0; i < children.length; i++) { + if (children[i] == id) + return i; + } + return -1; + } + + public boolean unlinkChild(int id) { + int index = findChild(id); + if (index == -1) + return false; // there is no such element + + // copy the array except one element at index + int[] result = new int[children.length - 1]; + System.arraycopy(children, 0, result, 0, index); + System.arraycopy(children, index + 1, result, index, children.length - index - 1); + children = result; + return true; + } + + public boolean linkChild(int id) { + if (children.length == 0) { + children = new int[] {id}; + return true; + } + + // add new element at the end + int[] result = new int[children.length + 1]; + System.arraycopy(children, 0, result, 0, children.length); + result[children.length] = id; + children = result; + return true; + } + + public boolean linkChildren(int[] IDs) { + if (children.length == 0) { + children = IDs; + return true; + } + int[] result = new int[children.length + IDs.length]; + System.arraycopy(children, 0, result, 0, children.length); + System.arraycopy(IDs, 0, result, children.length, IDs.length); + children = result; + return true; + } + + public boolean unlinkChildren(int[] IDs) { + if (children.length == 0) + return (IDs.length == 0); + + int size = children.length; + for (int i = 0; i < IDs.length; i++) { + int index = findChild(IDs[i]); + if (index != -1) { + children[i] = -1; + size--; + } + } + if (size == 0) { + children = EMPTY_ARRAY; + return true; + } + int[] result = new int[size]; + int pos = 0; + for (int i = 0; i < children.length; i++) { + if (children[i] == -1) + continue; + result[pos] = children[i]; + pos++; + } + return true; + } +} |