aboutsummaryrefslogtreecommitdiff
path: root/odb/lazy-pointer-traits.hxx
blob: 2a6c8eb3316acb2ba101d4bfda98563b2661ce40 (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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// file      : odb/lazy-pointer-traits.hxx
// license   : GNU GPL v2; see accompanying LICENSE file

#ifndef ODB_LAZY_POINTER_TRAITS_HXX
#define ODB_LAZY_POINTER_TRAITS_HXX

#include <odb/pre.hxx>

#include <odb/pointer-traits.hxx>
#include <odb/lazy-ptr.hxx>
#include <odb/details/config.hxx> // ODB_CXX11

namespace odb
{
  template <typename T>
  class pointer_traits< lazy_ptr<T> >
  {
  public:
    static const pointer_kind kind = pk_raw;
    static const bool lazy = true;

    typedef T element_type;
    typedef lazy_ptr<element_type> pointer_type;
    typedef element_type* eager_pointer_type;

    static bool
    null_ptr (const pointer_type& p)
    {
      return !p;
    }

    template <class O /* = T */>
    static typename object_traits<O>::id_type
    object_id (const pointer_type& p)
    {
      return p.template object_id<O> ();
    }
  };

#ifndef ODB_CXX11
  template <typename T>
  class pointer_traits< lazy_auto_ptr<T> >
  {
  public:
    static const pointer_kind kind = pk_unique;
    static const bool lazy = true;

    typedef T element_type;
    typedef lazy_auto_ptr<element_type> pointer_type;
    typedef std::auto_ptr<element_type> eager_pointer_type;

    static bool
    null_ptr (const pointer_type& p)
    {
      return !p;
    }

    template <class O /* = T */>
    static typename object_traits<O>::id_type
    object_id (const pointer_type& p)
    {
      return p.template object_id<O> ();
    }
  };
#endif

#ifdef ODB_CXX11
  template <typename T, typename D>
  class pointer_traits<lazy_unique_ptr<T, D>>
  {
  public:
    static const pointer_kind kind = pk_unique;
    static const bool lazy = true;

    typedef T element_type;
    typedef lazy_unique_ptr<element_type, D> pointer_type;
    typedef std::unique_ptr<element_type, D> eager_pointer_type;

    static bool
    null_ptr (const pointer_type& p)
    {
      return !p;
    }

    template <class O /* = T */>
    static typename object_traits<O>::id_type
    object_id (const pointer_type& p)
    {
      return p.template object_id<O> ();
    }
  };

  template <typename T>
  class pointer_traits<lazy_shared_ptr<T>>
  {
  public:
    static const pointer_kind kind = pk_shared;
    static const bool lazy = true;

    typedef T element_type;
    typedef lazy_shared_ptr<element_type> pointer_type;
    typedef std::shared_ptr<element_type> eager_pointer_type;

    static bool
    null_ptr (const pointer_type& p)
    {
      return !p;
    }

    template <class O /* = T */>
    static typename object_traits<O>::id_type
    object_id (const pointer_type& p)
    {
      return p.template object_id<O> ();
    }
  };

  template <typename T>
  class pointer_traits<lazy_weak_ptr<T>>
  {
  public:
    static const pointer_kind kind = pk_weak;
    static const bool lazy = true;

    typedef T element_type;
    typedef lazy_weak_ptr<element_type> pointer_type;
    typedef lazy_shared_ptr<element_type> strong_pointer_type;
    typedef std::weak_ptr<element_type> eager_pointer_type;

    static strong_pointer_type
    lock (const pointer_type& p)
    {
      return p.lock ();
    }
  };
#endif // ODB_CXX11
}

#include <odb/post.hxx>

#endif // ODB_LAZY_POINTER_TRAITS_HXX