blob: a0a6ae254eb79ef72bb6db05bcc9d622dca87acd (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
// file : odb/details/shared-ptr/base.hxx
// copyright : Copyright (c) 2009-2015 Code Synthesis Tools CC
// license : GNU GPL v2; see accompanying LICENSE file
#ifndef ODB_DETAILS_SHARED_PTR_BASE_HXX
#define ODB_DETAILS_SHARED_PTR_BASE_HXX
#include <odb/pre.hxx>
#include <new>
#include <cstddef> // std::size_t
#include <odb/details/config.hxx> // ODB_CXX11, ODB_NOTHROW_NOEXCEPT
#include <odb/details/export.hxx>
#include <odb/details/shared-ptr/counter-type.hxx>
namespace odb
{
namespace details
{
struct share
{
explicit
share (char id);
bool
operator== (share) const;
private:
char id_;
};
extern LIBODB_EXPORT share shared;
extern LIBODB_EXPORT share exclusive;
}
}
#ifdef ODB_CXX11
LIBODB_EXPORT void*
operator new (std::size_t, odb::details::share);
#else
LIBODB_EXPORT void*
operator new (std::size_t, odb::details::share) throw (std::bad_alloc);
#endif
LIBODB_EXPORT void
operator delete (void*, odb::details::share) ODB_NOTHROW_NOEXCEPT;
namespace odb
{
namespace details
{
class LIBODB_EXPORT shared_base
{
public:
shared_base ();
shared_base (const shared_base&);
shared_base&
operator= (const shared_base&);
void
_inc_ref ();
bool
_dec_ref ();
std::size_t
_ref_count () const;
#ifdef ODB_CXX11
void*
operator new (std::size_t);
void*
operator new (std::size_t, share);
#else
void*
operator new (std::size_t) throw (std::bad_alloc);
void*
operator new (std::size_t, share) throw (std::bad_alloc);
#endif
void
operator delete (void*, share) ODB_NOTHROW_NOEXCEPT;
void
operator delete (void*) ODB_NOTHROW_NOEXCEPT;
struct refcount_callback
{
void* arg;
// Return true if the object should be deleted, false otherwise.
//
bool (*zero_counter) (void*);
};
private:
bool
_dec_ref_callback ();
protected:
std::size_t counter_;
refcount_callback* callback_;
};
template <typename X>
inline X*
inc_ref (X*);
template <typename X>
inline void
dec_ref (X*);
template <typename X>
inline std::size_t
ref_count (const X*);
}
}
#include <odb/details/shared-ptr/base.ixx>
#include <odb/details/shared-ptr/base.txx>
#include <odb/post.hxx>
#endif // ODB_DETAILS_SHARED_PTR_BASE_HXX
|