def visit(self, visitor, *args, **kwargs):
return visitor.visit_polymorphic(self, *args, **kwargs)
+ def iterswitch(self):
+ cases = [['default']]
+ types = [self.default_type]
+
+ for expr, type in self.switch_types:
+ case = 'case %s' % expr
+ try:
+ i = types.index(type)
+ except ValueError:
+ cases.append([case])
+ types.append(type)
+ else:
+ cases[i].append(case)
+
+ return zip(cases, types)
+
class Visitor:
def visit_polymorphic(self, polymorphic, instance):
print ' switch (%s) {' % polymorphic.switch_expr
- for expr, type in polymorphic.switch_types:
- print ' case %s:' % expr
+ for cases, type in polymorphic.iterswitch():
+ for case in cases:
+ print ' %s:' % case
self.visit(type, 'static_cast<%s>(%s)' % (type, instance));
print ' break;'
- print ' default:'
- self.visit(polymorphic.default_type, instance);
- print ' break;'
print ' }'