116 lines
3.3 KiB
Smalltalk
116 lines
3.3 KiB
Smalltalk
Class {
|
|
#name : 'PPCContextMemento',
|
|
#superclass : 'Object',
|
|
#instVars : [
|
|
'position',
|
|
'properties'
|
|
],
|
|
#category : 'PetitCompiler-Context'
|
|
}
|
|
|
|
{ #category : 'comparing' }
|
|
PPCContextMemento >> = anObject [
|
|
|
|
(self == anObject) ifTrue: [ ^ true ].
|
|
(anObject class = PPCContextMemento) ifFalse: [ ^ false ].
|
|
|
|
(anObject position = position) ifFalse: [ ^ false ].
|
|
|
|
(self propertiesSize = anObject propertiesSize) ifFalse: [ ^ false ].
|
|
|
|
self keysAndValuesDo: [ :key :value |
|
|
(anObject hasProperty: key) ifFalse: [ ^ false ].
|
|
((anObject propertyAt: key) = value) ifFalse: [ ^ false ].
|
|
].
|
|
|
|
^ true.
|
|
]
|
|
|
|
{ #category : 'accessing - properties' }
|
|
PPCContextMemento >> hasProperty: aKey [
|
|
"Test if the property aKey is present."
|
|
|
|
^ properties notNil and: [ properties includesKey: aKey ]
|
|
]
|
|
|
|
{ #category : 'comparing' }
|
|
PPCContextMemento >> hash [
|
|
^ position hash bitXor: properties hash.
|
|
]
|
|
|
|
{ #category : 'accessing - properties' }
|
|
PPCContextMemento >> keysAndValuesDo: aBlock [
|
|
properties ifNil: [ ^ self ].
|
|
properties keysAndValuesDo: [ :key :value | aBlock value: key value: value copy ]
|
|
]
|
|
|
|
{ #category : 'accessing' }
|
|
PPCContextMemento >> position [
|
|
^ position
|
|
]
|
|
|
|
{ #category : 'accessing' }
|
|
PPCContextMemento >> position: anInteger [
|
|
position := anInteger
|
|
]
|
|
|
|
{ #category : 'accessing - properties' }
|
|
PPCContextMemento >> propertiesSize [
|
|
properties ifNil: [ ^ 0 ].
|
|
^ properties size.
|
|
]
|
|
|
|
{ #category : 'accessing - properties' }
|
|
PPCContextMemento >> propertyAt: aKey [
|
|
"Answer the property value associated with aKey."
|
|
|
|
^ self propertyAt: aKey ifAbsent: [ self error: 'Property not found' ]
|
|
]
|
|
|
|
{ #category : 'accessing - properties' }
|
|
PPCContextMemento >> propertyAt: aKey ifAbsent: aBlock [
|
|
"Answer the property value associated with aKey or, if aKey isn't found, answer the result of evaluating aBlock."
|
|
|
|
properties isNil ifFalse: [
|
|
(properties includesKey: aKey) ifTrue: [
|
|
^ (properties at: aKey) copy
|
|
].
|
|
].
|
|
^ aBlock value
|
|
|
|
"Modified: / 15-04-2015 / 11:19:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
|
|
]
|
|
|
|
{ #category : 'accessing - properties' }
|
|
PPCContextMemento >> propertyAt: aKey ifAbsentPut: aBlock [
|
|
"Answer the property associated with aKey or, if aKey isn't found store the result of evaluating aBlock as new value."
|
|
|
|
^ self propertyAt: aKey ifAbsent: [ self propertyAt: aKey put: aBlock value ]
|
|
]
|
|
|
|
{ #category : 'accessing - properties' }
|
|
PPCContextMemento >> propertyAt: aKey put: anObject [
|
|
"Set the property at aKey to be anObject. If aKey is not found, create a new entry for aKey and set is value to anObject. Answer anObject."
|
|
|
|
^ (properties ifNil: [ properties := Dictionary new: 1 ])
|
|
at: aKey put: (anObject copy)
|
|
]
|
|
|
|
{ #category : 'accessing - properties' }
|
|
PPCContextMemento >> removeProperty: aKey [
|
|
"Remove the property with aKey. Answer the property or raise an error if aKey isn't found."
|
|
|
|
^ self removeProperty: aKey ifAbsent: [ self error: 'Property not found' ]
|
|
]
|
|
|
|
{ #category : 'accessing - properties' }
|
|
PPCContextMemento >> removeProperty: aKey ifAbsent: aBlock [
|
|
"Remove the property with aKey. Answer the value or, if aKey isn't found, answer the result of evaluating aBlock."
|
|
|
|
| answer |
|
|
properties isNil ifTrue: [ ^ aBlock value ].
|
|
answer := properties removeKey: aKey ifAbsent: aBlock.
|
|
properties isEmpty ifTrue: [ properties := nil ].
|
|
^ answer
|
|
]
|