diff options
Diffstat (limited to 'subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/api/GenericPatternMatch.java')
-rw-r--r-- | subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/api/GenericPatternMatch.java | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/api/GenericPatternMatch.java b/subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/api/GenericPatternMatch.java new file mode 100644 index 00000000..b4de2b70 --- /dev/null +++ b/subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/api/GenericPatternMatch.java | |||
@@ -0,0 +1,166 @@ | |||
1 | /******************************************************************************* | ||
2 | * Copyright (c) 2004-2010 Gabor Bergmann and Daniel Varro | ||
3 | * This program and the accompanying materials are made available under the | ||
4 | * terms of the Eclipse Public License v. 2.0 which is available at | ||
5 | * http://www.eclipse.org/legal/epl-v20.html. | ||
6 | * | ||
7 | * SPDX-License-Identifier: EPL-2.0 | ||
8 | *******************************************************************************/ | ||
9 | |||
10 | package tools.refinery.viatra.runtime.api; | ||
11 | |||
12 | import java.util.Arrays; | ||
13 | |||
14 | import tools.refinery.viatra.runtime.api.impl.BasePatternMatch; | ||
15 | |||
16 | /** | ||
17 | * Generic signature object implementation. | ||
18 | * | ||
19 | * See also the generated matcher and signature of the pattern, with pattern-specific API simplifications. | ||
20 | * | ||
21 | * @author Bergmann Gábor | ||
22 | * @since 0.9 | ||
23 | * | ||
24 | */ | ||
25 | public abstract class GenericPatternMatch extends BasePatternMatch { | ||
26 | |||
27 | private final GenericQuerySpecification<? extends GenericPatternMatcher> specification; | ||
28 | private final Object[] array; | ||
29 | |||
30 | private GenericPatternMatch(GenericQuerySpecification<? extends GenericPatternMatcher> specification, Object[] array) { | ||
31 | super(); | ||
32 | this.specification = specification; | ||
33 | this.array = array; | ||
34 | } | ||
35 | |||
36 | @Override | ||
37 | public Object get(String parameterName) { | ||
38 | Integer index = specification.getPositionOfParameter(parameterName); | ||
39 | return index == null ? null : array[index]; | ||
40 | } | ||
41 | |||
42 | @Override | ||
43 | public Object get(int position) { | ||
44 | return array[position]; | ||
45 | } | ||
46 | |||
47 | @Override | ||
48 | public boolean set(String parameterName, Object newValue) { | ||
49 | if (!isMutable()) throw new UnsupportedOperationException(); | ||
50 | Integer index = specification.getPositionOfParameter(parameterName); | ||
51 | if (index == null) | ||
52 | return false; | ||
53 | array[index] = newValue; | ||
54 | return true; | ||
55 | } | ||
56 | |||
57 | @Override | ||
58 | public Object[] toArray() { | ||
59 | return Arrays.copyOf(array, array.length); | ||
60 | } | ||
61 | |||
62 | @Override | ||
63 | public int hashCode() { | ||
64 | final int prime = 31; | ||
65 | int result = 1; | ||
66 | for (int i = 0; i < array.length; ++i) | ||
67 | result = prime * result + ((array[i] == null) ? 0 : array[i].hashCode()); | ||
68 | return result; | ||
69 | } | ||
70 | |||
71 | @Override | ||
72 | public boolean equals(Object obj) { | ||
73 | if (this == obj) | ||
74 | return true; | ||
75 | if (!(obj instanceof GenericPatternMatch)) { // this should be infrequent | ||
76 | if (obj == null) | ||
77 | return false; | ||
78 | if (!(obj instanceof IPatternMatch)) | ||
79 | return false; | ||
80 | IPatternMatch other = (IPatternMatch) obj; | ||
81 | if (!specification().equals(other.specification())) | ||
82 | return false; | ||
83 | return Arrays.deepEquals(array, other.toArray()); | ||
84 | } | ||
85 | final GenericPatternMatch other = (GenericPatternMatch) obj; | ||
86 | return specification().equals(other.specification()) && Arrays.deepEquals(array, other.array); | ||
87 | } | ||
88 | |||
89 | @Override | ||
90 | public String prettyPrint() { | ||
91 | StringBuilder result = new StringBuilder(); | ||
92 | for (int i = 0; i < array.length; ++i) { | ||
93 | if (i != 0) | ||
94 | result.append(", "); | ||
95 | result.append("\"" + parameterNames().get(i) + "\"=" + prettyPrintValue(array[i])); | ||
96 | } | ||
97 | return result.toString(); | ||
98 | } | ||
99 | |||
100 | @Override | ||
101 | public GenericQuerySpecification<? extends GenericPatternMatcher> specification() { | ||
102 | return specification; | ||
103 | } | ||
104 | |||
105 | /** | ||
106 | * Returns an empty, mutable match. | ||
107 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
108 | * | ||
109 | * @return the empty match | ||
110 | */ | ||
111 | public static GenericPatternMatch newEmptyMatch(GenericQuerySpecification<? extends GenericPatternMatcher> specification) { | ||
112 | return new Mutable(specification, new Object[specification.getParameters().size()]); | ||
113 | } | ||
114 | |||
115 | /** | ||
116 | * Returns a mutable (partial) match. | ||
117 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
118 | * | ||
119 | * @param parameters | ||
120 | * the fixed value of pattern parameters, or null if not bound. | ||
121 | * @return the new, mutable (partial) match object. | ||
122 | */ | ||
123 | public static GenericPatternMatch newMutableMatch(GenericQuerySpecification<? extends GenericPatternMatcher> specification, Object... parameters) { | ||
124 | return new Mutable(specification, parameters); | ||
125 | } | ||
126 | |||
127 | /** | ||
128 | * Returns a new (partial) match. | ||
129 | * This can be used e.g. to call the matcher with a partial match. | ||
130 | * | ||
131 | * <p>The returned match will be immutable. Use {@link #newEmptyMatch(GenericQuerySpecification)} to obtain a mutable match object. | ||
132 | * | ||
133 | * @param parameters | ||
134 | * the fixed value of pattern parameters, or null if not bound. | ||
135 | * @return the (partial) match object. | ||
136 | */ | ||
137 | public static GenericPatternMatch newMatch(GenericQuerySpecification<? extends GenericPatternMatcher> specification, Object... parameters) { | ||
138 | return new Immutable(specification, Arrays.copyOf(parameters, parameters.length)); | ||
139 | } | ||
140 | |||
141 | @Override | ||
142 | public IPatternMatch toImmutable() { | ||
143 | return isMutable() ? newMatch(specification, array) : this; | ||
144 | } | ||
145 | |||
146 | static final class Mutable extends GenericPatternMatch { | ||
147 | Mutable(GenericQuerySpecification<? extends GenericPatternMatcher> specification, Object[] array) { | ||
148 | super(specification, array); | ||
149 | } | ||
150 | |||
151 | @Override | ||
152 | public boolean isMutable() { | ||
153 | return true; | ||
154 | } | ||
155 | } | ||
156 | static final class Immutable extends GenericPatternMatch { | ||
157 | Immutable(GenericQuerySpecification<? extends GenericPatternMatcher> specification, Object[] array) { | ||
158 | super(specification, array); | ||
159 | } | ||
160 | |||
161 | @Override | ||
162 | public boolean isMutable() { | ||
163 | return false; | ||
164 | } | ||
165 | } | ||
166 | } | ||