Cytnx v0.9.4
Loading...
Searching...
No Matches
intrusive_ptr_base.hpp
Go to the documentation of this file.
1#ifndef _H_intrusive_ptr_base_
2#define _H_intrusive_ptr_base_
3
4#include <ostream>
5#include <cassert>
6#include <boost/smart_ptr/intrusive_ptr.hpp>
7#include <boost/checked_delete.hpp>
8#include <boost/detail/atomic_count.hpp>
9
10namespace cytnx {
12 template <class T>
13 class intrusive_ptr_base {
14 public:
16 intrusive_ptr_base()
17 : ref_count(0){
18 // pass
19 };
20
22 intrusive_ptr_base(intrusive_ptr_base<T> const &) : ref_count(0) {
23 // pass
24 }
25
26 // copy assignment
27 intrusive_ptr_base &operator=(intrusive_ptr_base const &rhs) {
28 // not allowed.
29 return *this;
30 }
31
32 // hook boost::intrusive_ptr add
33 friend void intrusive_ptr_add_ref(intrusive_ptr_base<T> const *s) {
34 // add ref
35 // std::cout << "add" << std::endl;
36 assert(s->ref_count >= 0);
37 assert(s != 0);
38 ++s->ref_count;
39 }
40
41 // hook boost::intrusive_ptr release
42 friend void intrusive_ptr_release(intrusive_ptr_base<T> const *s) {
43 // release ref
44 // std::cout << "release" << std::endl;
45 assert(s->ref_count > 0);
46 assert(s != 0);
47 if (--s->ref_count == 0) boost::checked_delete(static_cast<T const *>(s));
48 }
49
50 boost::intrusive_ptr<T> self() { return boost::intrusive_ptr<T>((T *)this); }
51
52 boost::intrusive_ptr<const T> self() const {
53 return boost::intrusive_ptr<const T>((T const *)this);
54 }
55
56 int refcount() const { return ref_count; }
57
58 private:
59 // should be modifiable within the class.
60 mutable boost::detail::atomic_count ref_count;
61 };
63} // namespace cytnx
64
65#endif
Helper function to print vector with ODT:
Definition Accessor.hpp:12