-
Notifications
You must be signed in to change notification settings - Fork 68
/
DBStrength.class.st
139 lines (110 loc) · 3.6 KB
/
DBStrength.class.st
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
"
Strengths are used to measure the relative importance of constraints. The hierarchy of available strengths is determined by the class variable StrengthTable (see my class initialization method). Because Strengths are invariant, references to Strength instances are shared (i.e. all references to
""Strength of: #required"" point to a single, shared instance). New strengths may be inserted in the strength hierarchy without disrupting current constraints.
Instance variables:
symbolicValue symbolic strength name (e.g. #required) <Symbol>
arithmeticValue index of the constraint in the hierarchy, used for comparisons <Number>
"
Class {
#name : #DBStrength,
#superclass : #Object,
#instVars : [
'symbolicValue',
'arithmeticValue'
],
#classVars : [
'AbsoluteStrongest',
'AbsoluteWeakest',
'Required',
'StrengthConstants',
'StrengthTable'
],
#category : #'CogBenchmarks-DeltaBlue'
}
{ #category : #constants }
DBStrength class >> absoluteStrongest [
^AbsoluteStrongest
]
{ #category : #constants }
DBStrength class >> absoluteWeakest [
^AbsoluteWeakest
]
{ #category : #initialize }
DBStrength class >> initialize [
"Initialize the symbolic strength table. Fix the internally caches
values of all existing instances."
"Strength initialize"
StrengthTable := Dictionary new.
StrengthTable at: #absoluteStrongest put: -10000.
StrengthTable at: #required put: -800.
StrengthTable at: #strongPreferred put: -600.
StrengthTable at: #preferred put: -400.
StrengthTable at: #strongDefault put: -200.
StrengthTable at: #default put: 0.
StrengthTable at: #weakDefault put: 500.
StrengthTable at: #absoluteWeakest put: 10000.
StrengthConstants := Dictionary new.
StrengthTable keys do:
[: strengthSymbol |
StrengthConstants
at: strengthSymbol
put: ((super new) initializeWith: strengthSymbol)].
AbsoluteStrongest := DBStrength of: #absoluteStrongest.
AbsoluteWeakest := DBStrength of: #absoluteWeakest.
Required := DBStrength of: #required.
]
{ #category : #'instance creation' }
DBStrength class >> of: aSymbol [
"Answer an instance with the specified strength."
^ StrengthConstants at: aSymbol
]
{ #category : #constants }
DBStrength class >> required [
^Required
]
{ #category : #private }
DBStrength >> arithmeticValue [
"Answer my arithmetic value. Used for comparisons. Note that
STRONGER constraints have SMALLER arithmetic values."
^arithmeticValue
]
{ #category : #private }
DBStrength >> initializeWith: symVal [
"Record my symbolic value and reset my arithmetic value."
symbolicValue := symVal.
arithmeticValue := StrengthTable at: symbolicValue.
]
{ #category : #printing }
DBStrength >> printOn: aStream [
"Append a string which represents my strength onto aStream."
aStream nextPutAll: '%', symbolicValue, '%'.
]
{ #category : #comparing }
DBStrength >> sameAs: aStrength [
"Answer true if I am the same strength as the given Strength."
^ arithmeticValue = aStrength arithmeticValue
]
{ #category : #comparing }
DBStrength >> stronger: aStrength [
"Answer true if I am stronger than the given Strength."
^ arithmeticValue < aStrength arithmeticValue
]
{ #category : #'max / min' }
DBStrength >> strongest: aStrength [
"Answer the stronger of myself and aStrength."
^ (aStrength stronger: self)
ifTrue: [aStrength]
ifFalse: [self]
]
{ #category : #comparing }
DBStrength >> weaker: aStrength [
"Answer true if I am weaker than the given Strength."
^ arithmeticValue > aStrength arithmeticValue
]
{ #category : #'max / min' }
DBStrength >> weakest: aStrength [
"Answer the weaker of myself and aStrength."
^ (aStrength weaker: self)
ifTrue: [aStrength]
ifFalse: [self].
]