-
Notifications
You must be signed in to change notification settings - Fork 49
/
Copy pathAbstractFormula.java
162 lines (138 loc) · 5.03 KB
/
AbstractFormula.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
// This file is part of JavaSMT,
// an API wrapper for a collection of SMT solvers:
// https://github.com/sosy-lab/java-smt
//
// SPDX-FileCopyrightText: 2020 Dirk Beyer <https://www.sosy-lab.org>
//
// SPDX-License-Identifier: Apache-2.0
package org.sosy_lab.java_smt.basicimpl;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.errorprone.annotations.Immutable;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.sosy_lab.java_smt.api.ArrayFormula;
import org.sosy_lab.java_smt.api.BitvectorFormula;
import org.sosy_lab.java_smt.api.BooleanFormula;
import org.sosy_lab.java_smt.api.EnumerationFormula;
import org.sosy_lab.java_smt.api.FloatingPointFormula;
import org.sosy_lab.java_smt.api.FloatingPointRoundingModeFormula;
import org.sosy_lab.java_smt.api.Formula;
import org.sosy_lab.java_smt.api.FormulaType;
import org.sosy_lab.java_smt.api.NumeralFormula.IntegerFormula;
import org.sosy_lab.java_smt.api.NumeralFormula.RationalFormula;
import org.sosy_lab.java_smt.api.RegexFormula;
import org.sosy_lab.java_smt.api.StringFormula;
/**
* A Formula represented as a TFormulaInfo object.
*
* @param <TFormulaInfo> the solver specific type.
*/
@Immutable(containerOf = "TFormulaInfo")
@SuppressWarnings("ClassTypeParameterName")
abstract class AbstractFormula<TFormulaInfo> implements Formula {
private final TFormulaInfo formulaInfo;
private AbstractFormula(TFormulaInfo formulaInfo) {
this.formulaInfo = checkNotNull(formulaInfo);
}
@Override
public final boolean equals(@Nullable Object o) {
if (o == this) {
return true;
}
if (!(o instanceof AbstractFormula)) {
return false;
}
Object otherFormulaInfo = ((AbstractFormula<?>) o).formulaInfo;
return formulaInfo == otherFormulaInfo || formulaInfo.equals(otherFormulaInfo);
}
final TFormulaInfo getFormulaInfo() {
return formulaInfo;
}
@Override
public final int hashCode() {
return formulaInfo.hashCode();
}
@Override
public final String toString() {
return formulaInfo.toString();
}
/** Simple ArrayFormula implementation. */
static final class ArrayFormulaImpl<TI extends Formula, TE extends Formula, TFormulaInfo>
extends AbstractFormula<TFormulaInfo> implements ArrayFormula<TI, TE> {
private final FormulaType<TI> indexType;
private final FormulaType<TE> elementType;
ArrayFormulaImpl(TFormulaInfo info, FormulaType<TI> pIndexType, FormulaType<TE> pElementType) {
super(info);
this.indexType = checkNotNull(pIndexType);
this.elementType = checkNotNull(pElementType);
}
public FormulaType<TI> getIndexType() {
return indexType;
}
public FormulaType<TE> getElementType() {
return elementType;
}
}
/** Simple BooleanFormula implementation. Just tracing the size and the sign-treatment */
static final class BitvectorFormulaImpl<TFormulaInfo> extends AbstractFormula<TFormulaInfo>
implements BitvectorFormula {
BitvectorFormulaImpl(TFormulaInfo info) {
super(info);
}
}
/** Simple FloatingPointFormula implementation. */
static final class FloatingPointFormulaImpl<TFormulaInfo> extends AbstractFormula<TFormulaInfo>
implements FloatingPointFormula {
FloatingPointFormulaImpl(TFormulaInfo info) {
super(info);
}
}
/** Simple FloatingPointRoundingModeFormula implementation. */
static final class FloatingPointRoundingModeFormulaImpl<TFormulaInfo>
extends AbstractFormula<TFormulaInfo> implements FloatingPointRoundingModeFormula {
FloatingPointRoundingModeFormulaImpl(TFormulaInfo info) {
super(info);
}
}
/** Simple BooleanFormula implementation. */
static final class BooleanFormulaImpl<TFormulaInfo> extends AbstractFormula<TFormulaInfo>
implements BooleanFormula {
BooleanFormulaImpl(TFormulaInfo pT) {
super(pT);
}
}
/** Simple IntegerFormula implementation. */
static final class IntegerFormulaImpl<TFormulaInfo> extends AbstractFormula<TFormulaInfo>
implements IntegerFormula {
IntegerFormulaImpl(TFormulaInfo pTerm) {
super(pTerm);
}
}
/** Simple RationalFormula implementation. */
static final class RationalFormulaImpl<TFormulaInfo> extends AbstractFormula<TFormulaInfo>
implements RationalFormula {
RationalFormulaImpl(TFormulaInfo pTerm) {
super(pTerm);
}
}
/** Simple StringFormula implementation. */
static final class StringFormulaImpl<TFormulaInfo> extends AbstractFormula<TFormulaInfo>
implements StringFormula {
StringFormulaImpl(TFormulaInfo pT) {
super(pT);
}
}
/** Simple RegexFormula implementation. */
static final class RegexFormulaImpl<TFormulaInfo> extends AbstractFormula<TFormulaInfo>
implements RegexFormula {
RegexFormulaImpl(TFormulaInfo pT) {
super(pT);
}
}
/** Simple EnumerationFormula implementation. */
static final class EnumerationFormulaImpl<TFormulaInfo> extends AbstractFormula<TFormulaInfo>
implements EnumerationFormula {
EnumerationFormulaImpl(TFormulaInfo pT) {
super(pT);
}
}
}