Common ODB Runtime Library
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
nullable.hxx
Go to the documentation of this file.
1 // file : odb/nullable.hxx
2 // copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC
3 // license : GNU GPL v2; see accompanying LICENSE file
4 
5 #ifndef ODB_NULLABLE_HXX
6 #define ODB_NULLABLE_HXX
7 
8 #include <odb/pre.hxx>
9 
10 #include <odb/forward.hxx> // odb::core
11 
12 namespace odb
13 {
14  template <typename T>
15  class nullable
16  {
17  public:
18  typedef T value_type;
19 
20  nullable ();
21  nullable (const T&);
22  nullable (const nullable&);
23  template <typename Y> explicit nullable (const nullable<Y>&);
24 
25  nullable& operator= (const T&);
26  nullable& operator= (const nullable&);
27  template <typename Y> nullable& operator= (const nullable<Y>&);
28 
29  void swap (nullable&);
30 
31  bool null () const;
32 
33  T& get ();
34  const T& get () const;
35 
36  T* operator-> ();
37  const T* operator-> () const;
38 
39  T& operator* ();
40  const T& operator* () const;
41 
42  typedef void (nullable::*bool_convertible) ();
43  operator bool_convertible () const
44  {
45  return null_ ? 0 : &nullable<T>::true_value;
46  }
47 
48  void reset ();
49 
50  private:
51  void true_value () {};
52 
53  T value_;
54  bool null_;
55  };
56 
57  namespace common
58  {
59  using odb::nullable;
60  }
61 
62  template <typename T>
63  inline nullable<T>::
65  : null_ (true)
66  {
67  }
68 
69  template <typename T>
70  inline nullable<T>::
71  nullable (const T& v)
72  : value_ (v), null_ (false)
73  {
74  }
75 
76  template <typename T>
77  inline nullable<T>::
78  nullable (const nullable& y)
79  : value_ (y.value_), null_ (y.null_)
80  {
81  }
82 
83  template <typename T>
84  template <typename Y>
85  inline nullable<T>::
87  : value_ (y.value_), null_ (y.null_)
88  {
89  }
90 
91  template <typename T>
93  operator= (const T& v)
94  {
95  value_ = v;
96  null_ = false;
97  return *this;
98  }
99 
100  template <typename T>
101  inline nullable<T>& nullable<T>::
103  {
104  if (this != &y)
105  {
106  value_ = y.value_;
107  null_ = y.null_;
108  }
109 
110  return *this;
111  }
112 
113  template <typename T>
114  template <typename Y>
115  inline nullable<T>& nullable<T>::
117  {
118  value_ = y.value_;
119  null_ = y.null_;
120  return *this;
121  }
122 
123  template <typename T>
124  inline void nullable<T>::
126  {
127  T v (value_);
128  bool n (null_);
129 
130  value_ = y.value_;
131  null_ = y.null_;
132 
133  y.value_ = v;
134  y.null_ = n;
135  }
136 
137  template <typename T>
138  inline bool nullable<T>::
139  null () const
140  {
141  return null_;
142  }
143 
144  template <typename T>
145  inline T& nullable<T>::
147  {
148  return value_;
149  }
150 
151  template <typename T>
152  inline const T& nullable<T>::
153  get () const
154  {
155  return value_;
156  }
157 
158  template <typename T>
159  inline T* nullable<T>::
161  {
162  return null_ ? 0 : &value_;
163  }
164 
165  template <typename T>
166  inline const T* nullable<T>::
168  {
169  return null_ ? 0 : &value_;
170  }
171 
172  template <typename T>
173  inline T& nullable<T>::
175  {
176  return value_;
177  }
178 
179  template <typename T>
180  inline const T& nullable<T>::
181  operator* () const
182  {
183  return value_;
184  }
185 
186  template <typename T>
187  inline void nullable<T>::
189  {
190  value_ = T ();
191  null_ = true;
192  }
193 }
194 
195 #include <odb/post.hxx>
196 
197 #endif // ODB_NULLABLE_HXX
bool null() const
Definition: nullable.hxx:139
T * operator->()
Definition: nullable.hxx:160
void(nullable::* bool_convertible)()
Definition: nullable.hxx:42
T & operator*()
Definition: nullable.hxx:174
T & get()
Definition: nullable.hxx:146
T value_type
Definition: nullable.hxx:18
void swap(nullable &)
Definition: nullable.hxx:125
Definition: nullable.hxx:15
nullable & operator=(const T &)
Definition: nullable.hxx:93
void reset()
Definition: nullable.hxx:188
nullable()
Definition: nullable.hxx:64