// file : odb/nullable.hxx // author : Boris Kolpackov // copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC // license : GNU GPL v2; see accompanying LICENSE file #ifndef ODB_NULLABLE_HXX #define ODB_NULLABLE_HXX #include namespace odb { template class nullable { public: typedef T value_type; nullable (); nullable (const T&); nullable (const nullable&); template explicit nullable (const nullable&); nullable& operator= (const T&); nullable& operator= (const nullable&); template nullable& operator= (const nullable&); void swap (nullable&); bool null () const; T& get (); const T& get () const; T* operator-> (); const T* operator-> () const; T& operator* (); const T& operator* () const; typedef void (nullable::*bool_convertible) (); operator bool_convertible () const { return null_ ? 0 : &nullable::true_value; } void reset (); private: void true_value () {}; T value_; bool null_; }; namespace core { using odb::nullable; } template inline nullable:: nullable () : null_ (true) { } template inline nullable:: nullable (const T& v) : value_ (v), null_ (false) { } template inline nullable:: nullable (const nullable& y) : value_ (y.value_), null_ (y.null_) { } template template inline nullable:: nullable (const nullable& y) : value_ (y.value_), null_ (y.null_) { } template inline nullable& nullable:: operator= (const T& v) { value_ = v; null_ = false; return *this; } template inline nullable& nullable:: operator= (const nullable& y) { if (this != &y) { if (!y.null_) value_ = y.value_; null_ = y.null_; } return *this; } template template inline nullable& nullable:: operator= (const nullable& y) { if (!y.null_) value_ = y.value_; null_ = y.null_; return *this; } template inline void nullable:: swap (nullable& y) { T v (value_); bool n (null_); value_ = y.value_; null_ = y.null_; y.value_ = v; y.null_ = n; } template inline bool nullable:: null () const { return null_; } template inline T& nullable:: get () { return value_; } template inline const T& nullable:: get () const { return value_; } template inline T* nullable:: operator-> () { return null_ ? 0 : &value_; } template inline const T* nullable:: operator-> () const { return null_ ? 0 : &value_; } template inline T& nullable:: operator* () { return value_; } template inline const T& nullable:: operator* () const { return value_; } template inline void nullable:: reset () { null_ = true; } } #include #endif // ODB_NULLABLE_HXX