Skip to content

Commit 4003208

Browse files
committed
Updated with a new Version of indirectReference.ahk
And fixed a bug with getSize()
1 parent d82b784 commit 4003208

File tree

2 files changed

+80
-109
lines changed

2 files changed

+80
-109
lines changed

classGDIp.ahk

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ class GDIp
101101

102102
getSize()
103103
{
104-
DllCall( "gdiplus\GdipGetImageWidth", "Ptr", pBitmap, "UInt*", w )
105-
DllCall( "gdiplus\GdipGetImageHeight", "Ptr", pBitmap, "UInt*", h )
104+
DllCall( "gdiplus\GdipGetImageWidth", "Ptr", This.ptr, "UInt*", w )
105+
DllCall( "gdiplus\GdipGetImageHeight", "Ptr", This.ptr, "UInt*", h )
106106
return [ w, h ]
107107
}
108108

indirectReference.ahk

Lines changed: 78 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
class indirectReference
2-
{
3-
4-
/*
1+
/*
52
CLASS indirectReference
63
author: nnnik
74
@@ -14,35 +11,79 @@
1411
newIndirectReference: The indirect reference towards the objects passed to the constructor
1512
1613
object: The object you want to refer to indirectly
17-
*/
14+
15+
modeOrModeStr: Controls how the indirectReference is connected to the object directly
16+
e.g. with a __Call mode all method calls towards the indirectReference will end up calling the same method with the same parameters in the object
17+
*/
18+
19+
class indirectReference
20+
{
21+
22+
static relationStorage := {}
23+
static performanceStorage := {}
24+
static accessStorage := {}
25+
static modeStorage := {}
26+
static baseModes := { __Call:indirectReference.Call, __Set:indirectReference.Set, __Get:indirectReference.Get, __New:indirectReference.New, __Delete:indirectReference.Delete, _NewEnum:"" }
1827

19-
__New( Object, modes = "" )
28+
__New( obj, modeOrModeStr := "__Call" )
2029
{
21-
if !( modes )
30+
if !isObject( obj )
31+
return
32+
if isObject( modeOrModeStr )
2233
{
23-
if !indirectReference.storage.hasKey( &Object )
34+
str := ""
35+
For modeName, val in modeOrModeStr
36+
str .= modeName . "|"
37+
modeOrModeStr := subStr( str, 1, -1 )
38+
}
39+
if !indirectReference.performanceStorage.hasKey( &obj )
40+
{
41+
indirectReference.performanceStorage[ &obj ] := []
42+
indirectReference.accessStorage[ &obj ] := []
43+
obj.base := { __Delete: indirectReference.DeleteObject, base: obj.base }
44+
}
45+
if ( !indirectReference.performanceStorage[ &obj ].hasKey( modeOrModeStr ) | deleteMode := inStr( modeOrModeStr, "__Delete" ) )
46+
{
47+
if !indirectReference.modeStorage.hasKey( modeOrModeStr )
2448
{
25-
This.base := { __Call:indirectReference.connectBase.__Call, __Delete:indirectReference.removeFromStorage , base:{ __Delete: indirectReference.__Delete } }
26-
indirectReference.storage[ &Object ] := This
27-
indirectReference.storage2[ &This ] := &Object
28-
directReference.enter( This, Object )
49+
newMode := {}
50+
for each, mode in strSplit( modeOrModeStr, "|" )
51+
{
52+
newMode[ mode ] := indirectReference.baseModes[ mode ]
53+
indirectReference.baseModes[ mode ]
54+
}
55+
indirectReference.modeStorage[ modeOrModeStr ] := newMode
2956
}
30-
return indirectReference.storage[ &Object ]
57+
newReference := { base: indirectReference.modeStorage[ modeOrModeStr ] }
58+
indirectReference.accessStorage[ &obj ].Push( &newReference )
59+
indirectReference.relationStorage[ &newReference ] := &obj
60+
if !deleteMode
61+
indirectReference.performanceStorage[ &obj, modeOrModeStr ] := newReference
62+
else
63+
return newReference
3164
}
32-
for each, value in modes
33-
modes[ each ] := indirectReference.connectBase[ each ]
34-
modes.base := { __Delete:indirectReference.__Delete }
35-
This.base := modes
36-
directReference.enter( This, Object )
65+
return indirectReference.performanceStorage[ &obj, modeOrModeStr ]
3766
}
3867

39-
static storage := {}
40-
static storage2 := {}
41-
static connectBase := { __Call:indirectReference.Call, __Set:indirectReference.Set, __Get:indirectReference.Get, __New:indirectReference.New, __Delete:indirectReference.Delete, _NewEnum:"" }
68+
DeleteObject()
69+
{
70+
for each, reference in indirectReference.accessStorage[ &This ]
71+
{
72+
indirectReference.relationStorage.delete( reference )
73+
Object( reference ).base := ""
74+
}
75+
indirectReference.accessStorage.Delete( &This )
76+
indirectReference.performanceStorage.Delete( &This )
77+
if ( isFunc( This.base.base.__Delete ) && This.base.base.__Delete.name != indirectReference.DeleteObject.name )
78+
{
79+
This.base := This.base.base
80+
This.__Delete()
81+
}
82+
}
4283

4384
Call( functionName = "", parameters* )
4485
{
45-
if !indirectReference.connectBase.hasKey( functionName )
86+
if !( indirectReference.baseModes.hasKey( functionName ) && !This.base.hasKey( functionName ) )
4687
return ( new directReference( This ) )[ functionName ]( parameters* )
4788
}
4889

@@ -61,102 +102,32 @@
61102
{
62103
newIndirectReference := This.base
63104
This.base := ""
64-
return new ( new directReference( newIndirectReference ) )( parameter* )
105+
__class := new directReference( newIndirectReference )
106+
return new __class( parameters* )
65107
}
66108

67109
Delete()
68110
{
69-
ret := ( new directReference( This ) ).__Delete()
70-
continueChain( This, "__Delete", A_ThisFunc )
71-
return ret
72-
}
73-
74-
__Delete()
75-
{
76-
This.base := ""
77-
}
78-
79-
removeFromStorage()
80-
{
81-
pObj := indirectReference.storage2[ &This ]
82-
indirectReference.storage2.Delete( &This )
83-
indirectReference.storage.Delete( pObj )
84-
continueChain( This, "__Delete", A_ThisFunc )
111+
return ( new directReference( This ) ).__Delete()
85112
}
86113

87114
}
88115

89-
class directReference
90-
{
91-
92-
93-
/*
94-
CLASS directReference
95-
description: creates direct References from indirect ones.
96-
97-
usage: object := new directReference( newIndirectReference )
98-
99-
object: The inderect Reference you want to resolve
100-
*/
101-
102-
static storage := {}
103-
static storage2 := {}
116+
/*
117+
CLASS directReference
118+
description: creates direct References from indirect ones.
104119
105-
__New( newIndirectReference )
106-
{
107-
if directReference.storage.hasKey( &newIndirectReference )
108-
return Object( directReference.storage[ &newIndirectReference ] )
109-
indirectReference.saveRemoveFromStorage.Call( newIndirectReference )
110-
}
120+
usage: object := new directReference( newIndirectReference )
111121
112-
enter( newIndirectReference, Object )
113-
{
114-
if !This.storage.hasKey( &newIndirectReference )
115-
newIndirectReference.base := { __Delete:This.leaveIndirectReference, base:newIndirectReference.base }
116-
if !This.storage2.hasKey( &Object )
117-
Object.base := { __Delete:This.leaveObject, base:Object.base }
118-
This.storage[ &newIndirectReference ] := &Object
119-
This.storage2[ &Object, &newIndirectReference ] := &newIndirectReference
120-
}
122+
newIndirectReference: A indirectReference created by calling new indirectReference( object )
121123
122-
leaveObject()
123-
{
124-
ret := continueChain( This, "__Delete", A_ThisFunc )
125-
storage := directReference.storage2[ &This ]
126-
loop
127-
{
128-
each := ""
129-
for each,val in storage
130-
{
131-
Object( val ).__Delete()
132-
if storage.hasKey( each )
133-
storage.Delete( each )
134-
}
135-
}Until !each
136-
return ret
137-
}
138-
139-
leaveIndirectReference()
140-
{
141-
ret := continueChain( This, "__Delete", A_ThisFunc )
142-
pObj := directReference.storage[ &This ]
143-
directReference.storage.Delete( &This )
144-
directReference.storage2[ pObj ].Delete( &This )
145-
if !directReference.storage2[ pObj ]._newEnum()._Next( each, val )
146-
directReference.storage2.Delete( pObj )
147-
return ret
148-
}
149-
150-
}
124+
object: The object that is refered to by the indirectReference
125+
*/
151126

152-
continueChain( object, methodName, functionName, parameters* )
127+
class directReference
153128
{
154-
obj := object
155-
While ( isObject( obj ) && !( obj.hasKey( methodName ) && obj[ methodName ].name = functionName ) )
156-
obj := obj.base
157-
obj := obj.base
158-
While ( isObject( obj ) && !( obj.hasKey( methodName ) && isFunc( obj[ methodName ] ) ) )
159-
obj := obj.base
160-
if isFunc( obj[ methodName ] )
161-
return obj[ methodName ].Call( object, parameters* )
129+
__New( reference )
130+
{
131+
return Object( indirectReference.relationStorage[ &reference ] )
132+
}
162133
}

0 commit comments

Comments
 (0)