| #!/usr/bin/env python |
| from __future__ import print_function |
| import sys |
| sys.path.append('.') |
| |
| from example import ExampleVirt, runExampleVirt, runExampleVirtVirtual, runExampleVirtBool |
| from example import A_Repeat, B_Repeat, C_Repeat, D_Repeat, A_Tpl, B_Tpl, C_Tpl, D_Tpl |
| from example import NCVirt, NonCopyable, Movable |
| |
| |
| class ExtendedExampleVirt(ExampleVirt): |
| def __init__(self, state): |
| super(ExtendedExampleVirt, self).__init__(state + 1) |
| self.data = "Hello world" |
| |
| def run(self, value): |
| print('ExtendedExampleVirt::run(%i), calling parent..' % value) |
| return super(ExtendedExampleVirt, self).run(value + 1) |
| |
| def run_bool(self): |
| print('ExtendedExampleVirt::run_bool()') |
| return False |
| |
| def pure_virtual(self): |
| print('ExtendedExampleVirt::pure_virtual(): %s' % self.data) |
| |
| |
| ex12 = ExampleVirt(10) |
| print(runExampleVirt(ex12, 20)) |
| try: |
| runExampleVirtVirtual(ex12) |
| except Exception as e: |
| print("Caught expected exception: " + str(e)) |
| |
| ex12p = ExtendedExampleVirt(10) |
| print(runExampleVirt(ex12p, 20)) |
| print(runExampleVirtBool(ex12p)) |
| runExampleVirtVirtual(ex12p) |
| |
| class VI_AR(A_Repeat): |
| def unlucky_number(self): |
| return 99 |
| class VI_AT(A_Tpl): |
| def unlucky_number(self): |
| return 999 |
| |
| class VI_CR(C_Repeat): |
| def lucky_number(self): |
| return C_Repeat.lucky_number(self) + 1.25 |
| class VI_CT(C_Tpl): |
| pass |
| class VI_CCR(VI_CR): |
| def lucky_number(self): |
| return VI_CR.lucky_number(self) * 10 |
| class VI_CCT(VI_CT): |
| def lucky_number(self): |
| return VI_CT.lucky_number(self) * 1000 |
| |
| |
| class VI_DR(D_Repeat): |
| def unlucky_number(self): |
| return 123 |
| def lucky_number(self): |
| return 42.0 |
| class VI_DT(D_Tpl): |
| def say_something(self, times): |
| print("VI_DT says:" + (' quack' * times)) |
| def unlucky_number(self): |
| return 1234 |
| def lucky_number(self): |
| return -4.25 |
| |
| classes = [ |
| # A_Repeat, A_Tpl, # abstract (they have a pure virtual unlucky_number) |
| VI_AR, VI_AT, |
| B_Repeat, B_Tpl, |
| C_Repeat, C_Tpl, |
| VI_CR, VI_CT, VI_CCR, VI_CCT, |
| D_Repeat, D_Tpl, VI_DR, VI_DT |
| ] |
| |
| for cl in classes: |
| print("\n%s:" % cl.__name__) |
| obj = cl() |
| obj.say_something(3) |
| print("Unlucky = %d" % obj.unlucky_number()) |
| if hasattr(obj, "lucky_number"): |
| print("Lucky = %.2f" % obj.lucky_number()) |
| |
| class NCVirtExt(NCVirt): |
| def get_noncopyable(self, a, b): |
| # Constructs and returns a new instance: |
| nc = NonCopyable(a*a, b*b) |
| return nc |
| def get_movable(self, a, b): |
| # Return a referenced copy |
| self.movable = Movable(a, b) |
| return self.movable |
| |
| class NCVirtExt2(NCVirt): |
| def get_noncopyable(self, a, b): |
| # Keep a reference: this is going to throw an exception |
| self.nc = NonCopyable(a, b) |
| return self.nc |
| def get_movable(self, a, b): |
| # Return a new instance without storing it |
| return Movable(a, b) |
| |
| ncv1 = NCVirtExt() |
| print("2^2 * 3^2 =") |
| ncv1.print_nc(2, 3) |
| print("4 + 5 =") |
| ncv1.print_movable(4, 5) |
| ncv2 = NCVirtExt2() |
| print("7 + 7 =") |
| ncv2.print_movable(7, 7) |
| try: |
| ncv2.print_nc(9, 9) |
| print("Something's wrong: exception not raised!") |
| except RuntimeError as e: |
| # Don't print the exception message here because it differs under debug/non-debug mode |
| print("Caught expected exception") |
| |
| from example import ConstructorStats |
| del ex12 |
| del ex12p |
| del obj |
| del ncv1 |
| del ncv2 |
| cstats = [ConstructorStats.get(ExampleVirt), ConstructorStats.get(NonCopyable), ConstructorStats.get(Movable)] |
| print("Instances not destroyed:", [x.alive() for x in cstats]) |
| print("Constructor values:", [x.values() for x in cstats]) |
| print("Copy constructions:", [x.copy_constructions for x in cstats]) |
| print("Move constructions:", [cstats[i].move_constructions >= 1 for i in range(1, len(cstats))]) |
| |