From cb9ea47e7825b5073d4d645afb94f6326cb7cf4d Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Sun, 6 Sep 2009 12:52:53 +0200 Subject: Start the libcutl repository --- tests/compiler/traversal/driver.cxx | 135 ++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 tests/compiler/traversal/driver.cxx (limited to 'tests/compiler/traversal/driver.cxx') diff --git a/tests/compiler/traversal/driver.cxx b/tests/compiler/traversal/driver.cxx new file mode 100644 index 0000000..8d49b6f --- /dev/null +++ b/tests/compiler/traversal/driver.cxx @@ -0,0 +1,135 @@ +// file : tests/compiler/traversal/driver.cxx +// author : Boris Kolpackov +// copyright : Copyright (c) 2009 Code Synthesis Tools CC +// license : MIT; see accompanying LICENSE file + +#include +#include + +#include + +#include +#include + +using namespace std; +using namespace cutl; + +// Data types. +// +struct base +{ + virtual ~base () {} +}; + +struct derived1: base {}; +struct derived2: base {}; + +typedef vector > objects; + +struct init +{ + init () + { + using compiler::type_info; + + { + type_info ti (typeid (base)); + insert (ti); + } + + { + type_info ti (typeid (derived1)); + ti.add_base (typeid (base)); + insert (ti); + } + + { + type_info ti (typeid (derived2)); + ti.add_base (typeid (base)); + insert (ti); + } + } +} init_; + +// Traversers. +// +template +struct traverser: compiler::traverser_impl, + virtual compiler::dispatcher +{ +}; + +typedef traverser base_trav; +typedef traverser derived1_trav; +typedef traverser derived2_trav; + +struct base_impl: base_trav +{ + virtual void + traverse (type&) + { + cout << "base_impl: base" << endl; + } +}; + +struct derived1_impl: derived1_trav +{ + virtual void + traverse (type&) + { + cout << "derived1_impl: derived1" << endl; + } +}; + +struct combined_impl: derived1_trav, derived2_trav +{ + virtual void + traverse (derived1&) + { + cout << "combined_impl: derived1" << endl; + } + + virtual void + traverse (derived2&) + { + cout << "combined_impl: derived2" << endl; + } +}; + +int +main () +{ + objects o; + o.push_back (shared_ptr (new (shared) base)); + o.push_back (shared_ptr (new (shared) derived1)); + o.push_back (shared_ptr (new (shared) derived2)); + + base_impl base; + derived1_impl derived1; + combined_impl combined; + + for (objects::iterator i (o.begin ()); i != o.end (); ++i) + base.dispatch (**i); + + cout << endl; + + for (objects::iterator i (o.begin ()); i != o.end (); ++i) + derived1.dispatch (**i); + + cout << endl; + + for (objects::iterator i (o.begin ()); i != o.end (); ++i) + combined.dispatch (**i); + + cout << endl; + + base.traverser (derived1); + for (objects::iterator i (o.begin ()); i != o.end (); ++i) + base.dispatch (**i); + + cout << endl; + + derived1.traverser (combined); + for (objects::iterator i (o.begin ()); i != o.end (); ++i) + derived1.dispatch (**i); +} -- cgit v1.1