open multimethods for c
play

Open Multimethods for C ++ Peter Pirkelbauer Yuriy Solodkyy Bjarne - PowerPoint PPT Presentation

Open Multimethods for C ++ Peter Pirkelbauer Yuriy Solodkyy Bjarne Stroustrup Texas A&M University Generative Programming and Component Engineering Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 1 / 26 Overview


  1. Open Multimethods for C ++ Peter Pirkelbauer Yuriy Solodkyy Bjarne Stroustrup Texas A&M University Generative Programming and Component Engineering Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 1 / 26

  2. Overview Motiviation and problem description Design space Implementation details Results Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 2 / 26

  3. Single Dispatch (virtual function call) Cornerstone of OOP languages Invoked foo depends on the dynamic type of the receiver (a) struct A { virtual void foo() { cout << "Good afternoon"; } }; struct B : A { virtual void foo() { cout << "Guten Tag"; } }; void bar(A& obj) { obj.foo(); } Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 3 / 26

  4. Open Multi Dispatch Invoked foo depends on the dynamic type of both arguments (a,b) struct A { virtual ~A(); }; struct B : A {}; void foo( virtual A& x, virtual A& y) { cout << "AA"; } void foo( virtual B& x, virtual A& y) { cout << "BA"; } void foo( virtual B& x, virtual B& y) { cout << "BB"; } void bar(A& obj1, A& obj2) { foo(obj1, obj2); } Dispatch Behaviour: 1 st \ 2 nd A B A AA AA B BA BB Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 4 / 26

  5. Open Multi Dispatch Invoked foo depends on the dynamic type of both arguments (a,b) struct A { virtual ~A(); }; struct B : A {}; void foo( virtual A& x, virtual A& y) { cout << "AA"; } void foo( virtual B& x, virtual A& y) { cout << "BA"; } void foo( virtual B& x, virtual B& y) { cout << "BB"; } void bar(A& obj1, A& obj2) { foo(obj1, obj2); } Dispatch Behaviour: 1 st \ 2 nd A B A AA AA B BA BB Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 4 / 26

  6. Open Multi Dispatch Invoked foo depends on the dynamic type of both arguments (a,b) struct A { virtual ~A(); }; struct B : A {}; void foo( virtual A& x, virtual A& y) { cout << "AA"; } void foo( virtual B& x, virtual A& y) { cout << "BA"; } void foo( virtual B& x, virtual B& y) { cout << "BB"; } void bar(A& obj1, A& obj2) { foo(obj1, obj2); } Dispatch Behaviour: 1 st \ 2 nd A B A AA AA B BA BB Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 4 / 26

  7. Open Multi Dispatch Invoked foo depends on the dynamic type of both arguments (a,b) struct A { virtual ~A(); }; struct B : A {}; void foo( virtual A& x, virtual A& y) { cout << "AA"; } void foo( virtual B& x, virtual A& y) { cout << "BA"; } void foo( virtual B& x, virtual B& y) { cout << "BB"; } void bar(A& obj1, A& obj2) { foo(obj1, obj2); } Dispatch Behaviour: 1 st \ 2 nd A B A AA AA B BA BB Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 4 / 26

  8. Contributions Integration of runtime dispatch with overload resolution Open Class Extensions ◮ Separates classes from virtual functions Multimethods semantics for the C ++ Object Model Use covariant return type for ambiguity resolution Efficient implementation ◮ EDG based modification of the IA-64 Object Model ◮ Prelinker ◮ Overhead is ~ 12% of a regular virtual function call Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 5 / 26

  9. Application Domains Expression Problem ◮ Image Format Conversions ◮ Algorithm selection according to dynamic properties of objects ◮ Action System Binary Method Problem ◮ Shape intersection ◮ Object comparison ◮ Operations in dynamically typed languages Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 6 / 26

  10. Application Domain: Image Format Conversion Image� RasterImage� VectorImage� CompressedImage� RandomAccessImage� LossyImage� LoslessImage� YUV� RGB� CMYK� PlanarYUV� PackedYUV� TrueColorRGB� PalletizedRGB� Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 7 / 26

  11. Application Domain: Image Format Conversion (2) Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 8 / 26

  12. Double Dispatch/Visitor Pattern struct Shape { virtual bool intersect(Shape&); virtual bool intersect(Circle&); virtual bool accept(Shape& obj2) { return obj2.intersect( ∗ this ); } }; struct Circle : Shape { virtual bool intersect(Shape&); virtual bool intersect(Circle&); virtual bool accept(Shape& obj2) { return obj2.intersect( ∗ this ); } }; bool shape_intersect(Shape& obj1, Shape& obj2) { return obj1.accept(obj2); } Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 9 / 26

  13. Ambiguities for example: struct Shape {}; struct Circle : Shape {}; void intersect( virtual Shape&, virtual Shape&); void intersect( virtual Circle&, virtual Shape&); void intersect( virtual Shape&, virtual Circle&); Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 10 / 26

  14. Types of Ambiguities Resolvable Ambiguities ◮ Detected before progam invocation ◮ Classes are available Late Ambiguities ◮ e.g.: dynamic linking, local classes Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 11 / 26

  15. Ambiguities: Virtual vs overloaded functions Are the calls to foo ambiguous? ◮ Overload resolution ◮ Virtual function call ◮ Open Multimethods void foo(A&); A� A� void foo(B&); void bar(A& a) { foo(a); } B� C� void bar(D& d) { foo(d); } // ok D� Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 12 / 26

  16. Ambiguities: Virtual vs overloaded functions Are the calls to foo ambiguous? ◮ Overload resolution ◮ Virtual function call ◮ Open Multimethods struct A { virtual void foo(); }; A� A� struct B : A { virtual void foo(); }; void bar(A& a) { a.foo(); } B� C� void bar(D& d) { d.foo(); } // compiler error D� Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 12 / 26

  17. Ambiguities: Virtual vs overloaded functions Are the calls to foo ambiguous? ◮ Overload resolution ◮ Virtual function call ◮ Open Multimethods void foo( virtual A&); A� A� void foo( virtual B&); void bar(A& a) { foo(a); } B� C� void bar(D& d) { foo(d); } // compiler error D� Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 12 / 26

  18. Ambiguities: Virtual vs overloaded functions Are the calls to foo ambiguous? ◮ Overload resolution ◮ Virtual function call ◮ Open Multimethods void foo( virtual A&); A� A� void foo( virtual B&); void bar(A& a) { foo(a); } B� C� void bar(D& d) { foo( static_cast <B&>(d)); } D� Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 12 / 26

  19. Ambiguities: Repeated Inheritance A� A� void foo( virtual A&, virtual A&); void foo( virtual B&, virtual C&); void foo( virtual C&, virtual B&); B� C� void foo( virtual B&, virtual D&); D� 1 st \ 2 nd D B D C A B C A AA AA AA AA AA B AA AA BC BD BD CB AA C AA CB AA D B AA BC BD BD AA D C CB AA CB AA AA Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 13 / 26

  20. Ambiguities: Repeated Inheritance A� A� void foo( virtual A&, virtual A&); void foo( virtual B&, virtual C&); void foo( virtual C&, virtual B&); B� C� void foo( virtual B&, virtual D&); D� 1 st \ 2 nd D B D C A B C A AA AA AA AA AA B AA AA BC BD BD CB AA C AA CB AA D B AA BC BD BD AA D C CB AA CB AA AA Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 13 / 26

  21. Ambiguities: Repeated Inheritance A� A� void foo( virtual A&, virtual A&); void foo( virtual B&, virtual C&); void foo( virtual C&, virtual B&); B� C� void foo( virtual B&, virtual D&); D� 1 st \ 2 nd D B D C A B C A AA AA AA AA AA B AA AA BC BD BD CB AA C AA CB AA D B AA BC BD BD AA D C CB AA CB AA AA Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 13 / 26

  22. Ambiguities: Repeated Inheritance A� A� void foo( virtual A&, virtual A&); void foo( virtual B&, virtual C&); void foo( virtual C&, virtual B&); B� C� void foo( virtual B&, virtual D&); D� 1 st \ 2 nd D B D C A B C A AA AA AA AA AA B AA AA BC BD BD CB AA C AA CB AA D B AA BC BD BD AA D C CB AA CB AA AA Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 13 / 26

  23. Ambiguity Resolution: Virtual Inheritance void foo( virtual A&); A� void foo( virtual B&); void foo( virtual C&); B� C� void bar(A& a) { foo(a); } D� bar(d); Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 14 / 26

  24. Ambiguity Resolution: Virtual Inheritance void foo( virtual A&); A� void foo( virtual B&); void foo( virtual C&); B� C� void bar(A& a) { foo(a); } D� bar(d); void foo( virtual D&); Oct 2 nd , 2007 Open Multimethods for C ++ Parasol Lab (Texas A&M) 14 / 26

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend