symbian-qemu-0.9.1-12/python-2.6.1/Demo/classes/Rev.py
author Gareth Stockwell <gareth.stockwell@accenture.com>
Wed, 22 Sep 2010 15:40:40 +0100
branchgraphics-phase-3
changeset 111 345f1c88c950
parent 1 2fb8b9db1c86
permissions -rw-r--r--
Fixes to syborg-graphicswrapper.vcproj These changes allow syborg-graphicswrapper to link against the hostthreadadapter and khronosapiwrapper libraries built by the graphics.simulator component. The .vcproj file uses relative paths, which requires that the following three packages are laid out as follows: os/ graphics adapt/ graphics.simulator qemu

'''
A class which presents the reverse of a sequence without duplicating it.
From: "Steven D. Majewski" <sdm7g@elvis.med.virginia.edu>

It works on mutable or inmutable sequences.

>>> chars = list(Rev('Hello World!'))
>>> print ''.join(chars)
!dlroW olleH

The .forw is so you can use anonymous sequences in __init__, and still
keep a reference the forward sequence. )
If you give it a non-anonymous mutable sequence, the reverse sequence
will track the updated values. ( but not reassignment! - another
good reason to use anonymous values in creating the sequence to avoid
confusion. Maybe it should be change to copy input sequence to break
the connection completely ? )

>>> nnn = range(3)
>>> rnn = Rev(nnn)
>>> for n in rnn: print n
...
2
1
0
>>> for n in range(4, 6): nnn.append(n)   # update nnn
...
>>> for n in rnn: print n     # prints reversed updated values
...
5
4
2
1
0
>>> nnn = nnn[1:-1]
>>> nnn
[1, 2, 4]
>>> for n in rnn: print n     # prints reversed values of old nnn
...
5
4
2
1
0

#
>>> WH = Rev('Hello World!')
>>> print WH.forw, WH.back
Hello World! !dlroW olleH
>>> nnn = Rev(range(1, 10))
>>> print nnn.forw
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print nnn.back
[9, 8, 7, 6, 5, 4, 3, 2, 1]

>>> rrr = Rev(nnn)
>>> rrr
<1, 2, 3, 4, 5, 6, 7, 8, 9>

'''

class Rev:
    def __init__(self, seq):
        self.forw = seq
        self.back = self

    def __len__(self):
        return len(self.forw)

    def __getitem__(self, j):
        return self.forw[-(j + 1)]

    def __repr__(self):
        seq = self.forw
        if isinstance(seq, list):
            wrap = '[]'
            sep = ', '
        elif isinstance(seq, tuple):
            wrap = '()'
            sep = ', '
        elif isinstance(seq, str):
            wrap = ''
            sep = ''
        else:
            wrap = '<>'
            sep = ', '
        outstrs = [str(item) for item in self.back]
        return wrap[:1] + sep.join(outstrs) + wrap[-1:]

def _test():
    import doctest, Rev
    return doctest.testmod(Rev)

if __name__ == "__main__":
    _test()