/******************************************************************************* * Copyright (c) 2012, 2014 Willink Transformations 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: * E.D.Willink - initial API and implementation *******************************************************************************/ package org.eclipse.ocl.pivot.internal.ids; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.ocl.pivot.ids.IdManager; import org.eclipse.ocl.pivot.ids.IdVisitor; import org.eclipse.ocl.pivot.ids.TuplePartId; import org.eclipse.ocl.pivot.ids.TupleTypeId; public class GeneralizedTupleTypeIdImpl extends AbstractTypeId implements TupleTypeId, WeakHashMapOfListOfWeakReference3.MatchableId<String, @NonNull TuplePartId @NonNull []> { protected final @NonNull Integer hashCode; protected final @NonNull String name; protected final @NonNull TuplePartId @NonNull [] partIds; public GeneralizedTupleTypeIdImpl(@NonNull IdManager idManager, @NonNull Integer hashCode, @NonNull String name, @NonNull TuplePartId @NonNull [] orderedPartIds) { this.hashCode = hashCode; this.name = name; this.partIds = orderedPartIds; assert partsAreOrdered(); } @Override public <R> R accept(@NonNull IdVisitor<R> visitor) { return visitor.visitTupleTypeId(this); } @Override public @NonNull String getDisplayName() { StringBuilder s = new StringBuilder(); s.append(name); s.append("{"); boolean isFirst = true; for (TuplePartId partId : partIds) { if (!isFirst) { s.append(", "); } s.append(partId.getDisplayName()); isFirst = false; } s.append("}"); return s.toString(); } public @NonNull TupleTypeId getGeneralizedId() { return this; } @Override public @NonNull String getMetaTypeName() { return TUPLE_TYPE_NAME; } @Override public @NonNull String getName() { return name; } @Override public @Nullable TuplePartId getPartId(@NonNull String name) { for (TuplePartId partId : partIds) { if (name.equals(partId.getName())) { return partId; } } return null; } @Override public @NonNull TuplePartId @NonNull [] getPartIds() { return partIds; } @Override public final int hashCode() { return hashCode; } @Override public boolean matches(@NonNull String thatName, @NonNull TuplePartId @NonNull [] thoseOrderedParts) { for (int i = 0; i < partIds.length; i++) { if (partIds[i] != thoseOrderedParts[i]) { return false; } } if (!this.name.equals(thatName)) { return false; } return true; } private boolean partsAreOrdered() { for (int i = 0; i < partIds.length-1; i++) { TuplePartId earlierPartId = partIds[i]; TuplePartId laterPartId = partIds[i+1]; if (earlierPartId.compareTo(laterPartId) >= 0) { return false; } } return true; } }