diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2010-06-04 16:33:08 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2010-06-04 16:33:08 +0200 |
commit | 6f0d40508286afc8cdd72a0b5f807d5c2a589cfc (patch) | |
tree | f22a38560560664cae731c37537c2bb04bffdc2a /odb/shared-ptr.hxx | |
parent | e0f3efd9df3e7eefa06777717f23905022d1949e (diff) |
Initial implementation
Diffstat (limited to 'odb/shared-ptr.hxx')
-rw-r--r-- | odb/shared-ptr.hxx | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/odb/shared-ptr.hxx b/odb/shared-ptr.hxx new file mode 100644 index 0000000..ee56792 --- /dev/null +++ b/odb/shared-ptr.hxx @@ -0,0 +1,145 @@ +// file : odb/shared-ptr.hxx +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +// license : GNU GPL v2; see accompanying LICENSE file + +#ifndef ODB_SHARED_PTR_HXX +#define ODB_SHARED_PTR_HXX + +#include <odb/shared-ptr/base.hxx> + +namespace odb +{ + template <typename X> + class shared_ptr: bits::counter_ops<typename bits::counter_type<X>::r, X> + { + typedef bits::counter_ops<typename bits::counter_type<X>::r, X> base; + + public: + ~shared_ptr () + { + if (x_ != 0) + base::dec (x_); + } + + explicit + shared_ptr (X* x = 0) + : base (x), x_ (x) + { + } + + shared_ptr (shared_ptr const& x) + : base (x), x_ (x.x_) + { + if (x_ != 0) + base::inc (x_); + } + + template <typename Y> + shared_ptr (shared_ptr<Y> const& x) + : base (x), x_ (x.x_) + { + if (x_ != 0) + base::inc (x_); + } + + shared_ptr& + operator= (shared_ptr const& x) + { + if (x_ != x.x_) + { + if (x_ != 0) + base::dec (x_); + + static_cast<base&> (*this) = x; + x_ = x.x_; + + if (x_ != 0) + base::inc (x_); + } + + return *this; + } + + template <typename Y> + shared_ptr& + operator= (shared_ptr<Y> const& x) + { + if (x_ != x.x_) + { + if (x_ != 0) + base::dec (x_); + + static_cast<base&> (*this) = x; + x_ = x.x_; + + if (x_ != 0) + base::inc (x_); + } + + return *this; + } + + public: + X* + operator-> () const + { + return x_; + } + + X& + operator* () const + { + return *x_; + } + + // Conversion to bool. + // + typedef void (shared_ptr::*boolean_convertible)(); + void true_value () {}; + + operator boolean_convertible () const + { + return x_ ? &shared_ptr<X>::true_value : 0; + } + + public: + X* + get () const + { + return x_; + } + + X* + release () + { + X* r (x_); + x_ = 0; + return r; + } + + void + reset (X* x) + { + if (x_ != 0) + base::dec (x_); + + base::reset (x); + x_ = x; + } + + std::size_t + count () const + { + return x_ != 0 ? base::count (x_) : 0; + } + + private: + template <typename> + friend class shared_ptr; + + X* x_; + }; +} + +#endif // ODB_SHARED_PTR_HXX |