blob: a03221c22919d992f4df5389107ce75b4c306980 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004-2008 Akos Horvath, Gergely Varro and Daniel Varro
* 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:
* Akos Horvath, Gergely Varro - initial API and implementation
*******************************************************************************/
package org.eclipse.viatra2.gtasm.patternmatcher.impl.patternmatcher.internal;
import org.eclipse.viatra2.gtasm.patternmatcher.IMatching;
import org.eclipse.viatra2.gtasm.patternmatcher.impl.patternmatcher.internal.callgraph.FlattenedPattern;
import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.asm.definitions.Variable;
/**
* MatchingFrame represents an array that contains the actual
* mappings of variables to constants. A MatchingFrame maintains
* a reference to a corresponding FlattenedPattern.
*
* The following mappings are used by the interpreted engine:
* VariableType => PatternVariable
* ValueType => AnyModelElement
*/
public class MatchingFrame implements Cloneable,IMatching {
/**
* An internal, array-based representation of a matching.
* Arrays are indexed by integers and contain values showing
* the actual values.
*
* If a MatchingFrame represents a matching for a recursive
* FlattenedPattern, then parent points to the
* matching frame which is extended to get this matching.
*/
private MatchingFrame parent;
/**
* The pattern variant for which this MatchingFrame is a
* matching.
*/
private FlattenedPattern pattern;
/**
* The array that physically holds the values.
*/
private Object[] frame;
public MatchingFrame(FlattenedPattern pattern) {
this.parent = null;
this.pattern = pattern;
// this.frame = (IModelElement[]) new Object[pattern.getFrameSize()];
this.frame = new Object[pattern.getFrameSize()];
}
MatchingFrame(FlattenedPattern pattern, MatchingFrame parent) {
this.parent = parent;
this.pattern = pattern;
this.frame = new Object[pattern.getFrameSize()];
}
/**
*
* @param position
* @return
*/
public Object getValue(Integer position) {
// TODO gervarro: return (position < frame.length ? frame[position] : pattern.get);
return frame[position];
}
/**
*
* @param position
* @param value
*/
public void setValue(Integer position, Object value) {
frame[position] = value;
}
public boolean testAndSetValue(Integer position, Object value) {
if (frame[position] == null) {
frame[position] = value;
return true;
} else {
return frame[position].equals(value);
}
}
/**
* @return the parent
*/
public MatchingFrame getParent() {
return parent;
}
/**
* @param parent the parent to set
*/
public void setParent(MatchingFrame parent) {
this.parent = parent;
}
/**
* @return the pattern
*/
public FlattenedPattern getPattern() {
return pattern;
}
/**
* @param pattern the pattern to set
*/
public void setPattern(FlattenedPattern pattern) {
this.pattern = pattern;
}
public Object clone() {
MatchingFrame clone = new MatchingFrame(pattern, parent);
clone.frame = frame.clone();
return clone;
}
public String toString() {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < frame.length; i++) {
buf.append("frame[" + i + "]\t" + frame[i].toString() + "\n");
}
return buf.toString();
}
public Object lookup(Variable variable) {
return null;
}
public Object lookup(int position) {
if (position >= 0 && position < frame.length) {
return frame[position];
} else {
// TODO gervarro: Exception or return null;
return null;
}
}
public int size() {
return frame.length;
}
}