summaryrefslogtreecommitdiff
path: root/libcult/examples/mm/shptr/shptr.cxx
diff options
context:
space:
mode:
authorJörg Frings-Fürst <jff@merkur>2014-05-18 16:08:14 +0200
committerJörg Frings-Fürst <jff@merkur>2014-05-18 16:08:14 +0200
commita15cf65c44d5c224169c32ef5495b68c758134b7 (patch)
tree3419f58fc8e1b315ba8171910ee044c5d467c162 /libcult/examples/mm/shptr/shptr.cxx
Imported Upstream version 3.3.0.2upstream/3.3.0.2
Diffstat (limited to 'libcult/examples/mm/shptr/shptr.cxx')
-rw-r--r--libcult/examples/mm/shptr/shptr.cxx73
1 files changed, 73 insertions, 0 deletions
diff --git a/libcult/examples/mm/shptr/shptr.cxx b/libcult/examples/mm/shptr/shptr.cxx
new file mode 100644
index 0000000..cb026d4
--- /dev/null
+++ b/libcult/examples/mm/shptr/shptr.cxx
@@ -0,0 +1,73 @@
+// file : examples/mm/shptr/shptr.cxx
+// author : Boris Kolpackov <boris@kolpackov.net>
+// copyright : Copyright (c) 2005-2010 Boris Kolpackov
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <cult/mm/shptr.hxx>
+#include <cult/mm/new.hxx> // MM::locate
+#include <cult/mm/counter.hxx> // MM::inc_ref
+
+#include <iostream>
+
+using std::cerr;
+using std::endl;
+
+using namespace Cult;
+using namespace MM;
+
+struct Foo
+{
+ virtual ~Foo () {}
+ char c;
+};
+
+struct Bar: virtual Foo {char c;};
+
+struct Baz: virtual Foo {char c;};
+
+struct Fox: Bar, Baz {};
+
+
+struct A
+{
+ char c[8];
+};
+
+struct B
+{
+ char c[8];
+};
+
+struct C : A, B
+{
+ char c[8];
+};
+
+int
+main ()
+{
+ {
+ Baz* bp (new Fox);
+ Foo* fp (bp);
+
+ Counter* cp (locate (fp, *counted));
+
+ inc_ref (bp);
+
+ cp->dec_ref ();
+
+ if (cp->dec_ref ()) cerr << "good: destroying" << endl;
+ else cerr << "bad: leaking" << endl;
+
+ delete bp;
+ }
+
+ {
+ Shptr<Fox> pfox (new Fox);
+ Shptr<Bar> pbar (pfox);
+
+ Shptr<Foo> pfoo;
+
+ pfoo = pbar;
+ }
+}