00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026 package cast.architecture;
00027
00028 import java.util.Arrays;
00029 import java.util.Comparator;
00030
00031 import cast.cdl.FilterRestriction;
00032 import cast.cdl.WorkingMemoryChange;
00033 import cast.cdl.WorkingMemoryChangeFilter;
00034 import cast.cdl.WorkingMemoryOperation;
00035
00036 public class WorkingMemoryChangeFilterComparator implements
00037 Comparator<WorkingMemoryChangeFilter> {
00038
00039 private static WorkingMemoryChangeFilterComparator comparator;
00040
00041 public static WorkingMemoryChangeFilterComparator getComparator() {
00042 if (comparator == null) {
00043 comparator = new WorkingMemoryChangeFilterComparator();
00044 }
00045 return comparator;
00046 }
00047
00051 private WorkingMemoryChangeFilterComparator() {
00052
00053 }
00054
00055
00056
00057
00058
00059
00060 public int compare(WorkingMemoryChangeFilter _f1,
00061 WorkingMemoryChangeFilter _f2) {
00062
00063
00064
00065
00066
00067
00068 final int BEFORE = -1;
00069 final int EQUAL = 0;
00070 final int AFTER = 1;
00071
00072
00073 if (_f1 == _f2) {
00074 return EQUAL;
00075 }
00076
00077
00078 int comparison = _f1.address.id.compareTo(_f2.address.id);
00079 if (comparison != EQUAL) {
00080 return comparison;
00081 }
00082
00083
00084 comparison = _f1.address.subarchitecture
00085 .compareTo(_f2.address.subarchitecture);
00086 if (comparison != EQUAL) {
00087 return comparison;
00088 }
00089
00090
00091 comparison = _f1.type.compareTo(_f2.type);
00092 if (comparison != EQUAL) {
00093 return comparison;
00094 }
00095
00096
00097
00098
00099
00100
00101 if (_f1.operation.ordinal() < _f2.operation.ordinal()) {
00102 return BEFORE;
00103 }
00104 if (_f1.operation.ordinal() > _f2.operation.ordinal()) {
00105 return AFTER;
00106 }
00107
00108
00109 if ((_f1.restriction != FilterRestriction.LOCALSA)
00110 && (_f2.restriction == FilterRestriction.LOCALSA)) {
00111 return BEFORE;
00112 }
00113 if ((_f1.restriction == FilterRestriction.LOCALSA)
00114 && (_f2.restriction != FilterRestriction.LOCALSA)) {
00115 return AFTER;
00116 }
00117
00118
00119 comparison = _f1.src.compareTo(_f2.src);
00120 if (comparison != EQUAL) {
00121 return comparison;
00122 }
00123
00124
00125 comparison = _f1.origin.compareTo(_f2.origin);
00126 if (comparison != EQUAL) {
00127 return comparison;
00128 }
00129
00130
00131
00132
00133
00134
00135
00136 return EQUAL;
00137 }
00138
00139 public static final boolean allowsChange(WorkingMemoryChangeFilter _filter,
00140 WorkingMemoryChange _change) {
00141
00142
00143
00144
00145
00146
00147
00148 if (_filter.address.id.length() > 0) {
00149
00150 if (!_filter.address.id.equals(_change.address.id)) {
00151
00152 return false;
00153 }
00154
00155 }
00156
00157
00158
00159
00160 if (_filter.address.subarchitecture.length() > 0) {
00161
00162 if (!_filter.address.subarchitecture
00163 .equals(_change.address.subarchitecture)) {
00164
00165 return false;
00166 }
00167 } else {
00168
00169 }
00170
00171
00172
00173
00174 if (_filter.type.length() > 0) {
00175
00176
00177
00178
00179
00180 if (!_filter.type.equals(_change.type)) {
00181
00182 int resultIndex = Arrays.binarySearch(_change.superTypes,
00183 _filter.type);
00184
00185 if (resultIndex < 0) {
00186 return false;
00187 }
00188 }
00189 }
00190
00191
00192 if (_filter.operation != WorkingMemoryOperation.WILDCARD) {
00193 if (_filter.operation != _change.operation) {
00194
00195 return false;
00196 }
00197 }
00198
00199
00200
00201
00202 if (_filter.src.length() > 0) {
00203
00204 if (!_filter.src.equals(_change.src)) {
00205
00206 return false;
00207 }
00208
00209 }
00210
00211
00212
00213 return true;
00214 }
00215
00216 }