aboutsummaryrefslogtreecommitdiff
path: root/tests/compiler
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2009-09-06 12:52:53 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2009-09-06 12:52:53 +0200
commitcb9ea47e7825b5073d4d645afb94f6326cb7cf4d (patch)
tree201c215b08df918924153a60520046c294438a6b /tests/compiler
Start the libcutl repository
Diffstat (limited to 'tests/compiler')
-rw-r--r--tests/compiler/makefile18
-rw-r--r--tests/compiler/traversal/driver.cxx135
-rw-r--r--tests/compiler/traversal/makefile71
-rw-r--r--tests/compiler/traversal/output.std16
4 files changed, 240 insertions, 0 deletions
diff --git a/tests/compiler/makefile b/tests/compiler/makefile
new file mode 100644
index 0000000..5a63fc8
--- /dev/null
+++ b/tests/compiler/makefile
@@ -0,0 +1,18 @@
+# file : tests/compiler/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2009 Code Synthesis Tools CC
+# license : MIT; see accompanying LICENSE file
+
+include $(dir $(lastword $(MAKEFILE_LIST)))../../build/bootstrap.make
+
+tests := traversal
+
+default := $(out_base)/
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+$(default): $(addprefix $(out_base)/,$(addsuffix /,$(tests)))
+$(test): $(addprefix $(out_base)/,$(addsuffix /.test,$(tests)))
+$(clean): $(addprefix $(out_base)/,$(addsuffix /.clean,$(tests)))
+
+$(foreach t,$(tests),$(call import,$(src_base)/$t/makefile))
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 <boris@codesynthesis.com>
+// copyright : Copyright (c) 2009 Code Synthesis Tools CC
+// license : MIT; see accompanying LICENSE file
+
+#include <vector>
+#include <iostream>
+
+#include <cutl/shared-ptr.hxx>
+
+#include <cutl/compiler/type-info.hxx>
+#include <cutl/compiler/traversal.hxx>
+
+using namespace std;
+using namespace cutl;
+
+// Data types.
+//
+struct base
+{
+ virtual ~base () {}
+};
+
+struct derived1: base {};
+struct derived2: base {};
+
+typedef vector<shared_ptr<base> > 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 <typename X>
+struct traverser: compiler::traverser_impl<X, base>,
+ virtual compiler::dispatcher<base>
+{
+};
+
+typedef traverser<base> base_trav;
+typedef traverser<derived1> derived1_trav;
+typedef traverser<derived2> 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<base> (new (shared) base));
+ o.push_back (shared_ptr<base> (new (shared) derived1));
+ o.push_back (shared_ptr<base> (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);
+}
diff --git a/tests/compiler/traversal/makefile b/tests/compiler/traversal/makefile
new file mode 100644
index 0000000..bb5513a
--- /dev/null
+++ b/tests/compiler/traversal/makefile
@@ -0,0 +1,71 @@
+# file : tests/compiler/traversal/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2009 Code Synthesis Tools CC
+# license : MIT; see accompanying LICENSE file
+
+include $(dir $(lastword $(MAKEFILE_LIST)))../../../build/bootstrap.make
+
+cxx_tun := driver.cxx
+
+#
+#
+cxx_obj := $(addprefix $(out_base)/,$(cxx_tun:.cxx=.o))
+cxx_od := $(cxx_obj:.o=.o.d)
+
+cutl.l := $(out_root)/cutl/cutl.l
+cutl.l.cpp-options := $(out_root)/cutl/cutl.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+# Build.
+#
+$(driver): $(cxx_obj) $(cutl.l)
+$(cxx_obj) $(cxx_od): $(cutl.l.cpp-options)
+
+
+$(call include-dep,$(cxx_od))
+
+
+# Alias for default target.
+#
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output.std
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output.std -,$(driver))
+
+
+# Clean.
+#
+$(clean): \
+ $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(cxx_obj)) \
+ $(addsuffix .cxx.clean,$(cxx_od))
+
+
+# Generated .gitignore.
+#
+ifeq ($(out_base),$(src_base))
+$(driver): | $(out_base)/.gitignore
+
+$(out_base)/.gitignore: files := driver
+$(clean): $(out_base)/.gitignore.clean
+
+$(call include,$(bld_root)/git/gitignore.make)
+endif
+
+
+# How to.
+#
+$(call include,$(bld_root)/cxx/o-e.make)
+$(call include,$(bld_root)/cxx/cxx-o.make)
+$(call include,$(bld_root)/cxx/cxx-d.make)
+
+# Dependencies.
+#
+$(call import,$(src_root)/cutl/makefile)
diff --git a/tests/compiler/traversal/output.std b/tests/compiler/traversal/output.std
new file mode 100644
index 0000000..095739c
--- /dev/null
+++ b/tests/compiler/traversal/output.std
@@ -0,0 +1,16 @@
+base_impl: base
+base_impl: base
+base_impl: base
+
+derived1_impl: derived1
+
+combined_impl: derived1
+combined_impl: derived2
+
+base_impl: base
+derived1_impl: derived1
+base_impl: base
+
+derived1_impl: derived1
+combined_impl: derived1
+combined_impl: derived2