Code archives/Algorithms/Iterate over any object!
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| Suppose you've got a list of different kinds of collections, and you want to iterate over each of them. You have to cast them to Objects, as you don't know what type they are. But you can't use EachIn on them, because that doesn't work with Objects! This gets round that by using reflection and a couple of custom objectenumerators | |||||
Function iterate:iterator(o:Object)
i:iterator=New iterator
i.o=o
Return i
End Function
Type iterator
Field o:Object
Method objectenumerator:iterenum()
tt:TTypeId=TTypeId.ForObject(o)
If tt.extendstype(ArrayTypeId)
ae:arriterenum=New arriterenum
ae.tt=tt
ae.o=o
ae.length=tt.arraylength(o)
Return ae
Else
oe:objiterenum=New objiterenum
m:TMethod=tt.findmethod("objectenumerator")
If Not m Return
oe.enum:Object=m.invoke(o)
oe.hn:TMethod=TTypeId.ForObject(oe.enum).findmethod("hasnext")
oe.no:TMethod=TTypeId.ForObject(oe.enum).findmethod("nextobject")
Return oe
EndIf
End Method
End Type
Type iterenum
Method hasnext() Abstract
Method nextobject:Object() Abstract
End Type
Type objiterenum Extends iterenum
Field enum:Object
Field hn:TMethod
Field no:TMethod
Method hasnext()
Return Int(String(hn.invoke(enum)))
End Method
Method nextobject:Object()
Return no.invoke(enum)
End Method
End Type
Type arriterenum Extends iterenum
Field o:Object,tt:TTypeId
Field i,length
Method hasnext()
Return i<length
End Method
Method nextobject:Object()
o2:Object=tt.getarrayelement(o,i)
i:+1
Return o2
End Method
End Type
l:TList=New TList
l.addlast "whoah"
l.addlast "bing"
Local ss$[]=["hello","there"]
l2:TList=New TList
l2.addlast l
l2.addlast ss
For o:Object=EachIn l2
For s$=EachIn iterate(o)
Print s
Next
Next |
Comments
None.
Code Archives Forum