| package main |
| |
| import "fmt" |
| import . "swigtests/director_classic" |
| |
| type TargetLangPerson struct{} // From Person |
| func (p *TargetLangPerson) Id() string { |
| return "TargetLangPerson" |
| } |
| |
| type TargetLangChild struct{} // Form Child |
| func (p *TargetLangChild) Id() string { |
| return "TargetLangChild" |
| } |
| |
| type TargetLangGrandChild struct{} // From Grandchild |
| func (p *TargetLangGrandChild) Id() string { |
| return "TargetLangGrandChild" |
| } |
| |
| // Semis - don't override id() in target language |
| |
| type TargetLangSemiPerson struct{} // From Person |
| |
| type TargetLangSemiChild struct{} // From Child |
| |
| type TargetLangSemiGrandChild struct{} // From GrandChild |
| |
| // Orphans - don't override id() in C++ |
| |
| type TargetLangOrphanPerson struct{} // From OrphanPerson |
| func (p *TargetLangOrphanPerson) Id() string { |
| return "TargetLangOrphanPerson" |
| } |
| |
| type TargetLangOrphanChild struct{} // From OrphanChild |
| func (p *TargetLangOrphanChild) Id() string { |
| return "TargetLangOrphanChild" |
| } |
| |
| func check(person Person, expected string) { |
| debug := false |
| |
| // Normal target language polymorphic call |
| ret := person.Id() |
| if debug { |
| fmt.Println(ret) |
| } |
| if ret != expected { |
| panic("Failed. Received: " + ret + " Expected: " + expected) |
| } |
| |
| // Polymorphic call from C++ |
| caller := NewCaller() |
| caller.SetCallback(person) |
| ret = caller.Call() |
| if debug { |
| fmt.Println(ret) |
| } |
| if ret != expected { |
| panic("Failed. Received: " + ret + " Expected: " + expected) |
| } |
| |
| // Polymorphic call of object created in target language and |
| // passed to C++ and back again |
| baseclass := caller.BaseClass() |
| ret = baseclass.Id() |
| if debug { |
| fmt.Println(ret) |
| } |
| if ret != expected { |
| panic("Failed. Received: " + ret + " Expected: " + expected) |
| } |
| |
| caller.ResetCallback() |
| if debug { |
| fmt.Println("----------------------------------------") |
| } |
| } |
| |
| func main() { |
| person := NewPerson() |
| check(person, "Person") |
| DeletePerson(person) |
| |
| person = NewChild() |
| check(person, "Child") |
| DeletePerson(person) |
| |
| person = NewGrandChild() |
| check(person, "GrandChild") |
| DeletePerson(person) |
| |
| person = NewDirectorPerson(&TargetLangPerson{}) |
| check(person, "TargetLangPerson") |
| DeleteDirectorPerson(person) |
| |
| person = NewDirectorChild(&TargetLangChild{}) |
| check(person, "TargetLangChild") |
| DeleteDirectorChild(person.(Child)) |
| |
| person = NewDirectorGrandChild(&TargetLangGrandChild{}) |
| check(person, "TargetLangGrandChild") |
| DeleteDirectorGrandChild(person.(GrandChild)) |
| |
| // Semis - don't override id() in target language |
| person = NewDirectorPerson(&TargetLangSemiPerson{}) |
| check(person, "Person") |
| DeleteDirectorPerson(person) |
| |
| person = NewDirectorChild(&TargetLangSemiChild{}) |
| check(person, "Child") |
| DeleteDirectorChild(person.(Child)) |
| |
| person = NewDirectorGrandChild(&TargetLangSemiGrandChild{}) |
| check(person, "GrandChild") |
| DeleteDirectorGrandChild(person.(GrandChild)) |
| |
| // Orphans - don't override id() in C++ |
| person = NewOrphanPerson() |
| check(person, "Person") |
| DeleteOrphanPerson(person.(OrphanPerson)) |
| |
| person = NewOrphanChild() |
| check(person, "Child") |
| DeleteOrphanChild(person.(OrphanChild)) |
| |
| person = NewDirectorOrphanPerson(&TargetLangOrphanPerson{}) |
| check(person, "TargetLangOrphanPerson") |
| DeleteDirectorOrphanPerson(person.(OrphanPerson)) |
| |
| person = NewDirectorOrphanChild(&TargetLangOrphanChild{}) |
| check(person, "TargetLangOrphanChild") |
| DeleteDirectorOrphanChild(person.(OrphanChild)) |
| } |