123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323 |
- //
- // Nullable.h
- //
- // Library: Foundation
- // Package: Core
- // Module: Nullable
- //
- // Definition of the Nullable template class.
- //
- // Copyright (c) 2010, Applied Informatics Software Engineering GmbH.
- // and Contributors.
- //
- // SPDX-License-Identifier: BSL-1.0
- //
- #ifndef Foundation_Nullable_INCLUDED
- #define Foundation_Nullable_INCLUDED
- #include "Poco/Foundation.h"
- #include "Poco/Exception.h"
- #include <algorithm>
- #include <iostream>
- namespace Poco {
- enum NullType
- {
- NULL_GENERIC = 0
- };
- template <typename C>
- class Nullable
- /// Nullable is a simple wrapper class for value types
- /// that allows objects or native type variables
- /// to have "null" value.
- ///
- /// The class is useful for passing parameters to functions
- /// when parameters are optional and no default values
- /// should be used or when a non-assigned state is needed,
- /// such as in e.g. fetching null values from database.
- ///
- /// A Nullable can be default constructed. In this case,
- /// the Nullable will have a Null value and isNull() will
- /// return true. Calling value() (without default value) on
- /// a Null object will throw a NullValueException.
- ///
- /// A Nullable can also be constructed from a value.
- /// It is possible to assign a value to a Nullable, and
- /// to reset a Nullable to contain a Null value by calling
- /// clear().
- ///
- /// For use with Nullable, the value type should support
- /// default construction.
- {
- public:
- Nullable():
- /// Creates an empty Nullable.
- _value(),
- _isNull(true),
- _null()
- {
- }
- Nullable(const NullType&):
- /// Creates an empty Nullable.
- _value(),
- _isNull(true),
- _null()
- {
- }
- Nullable(const C& value):
- /// Creates a Nullable with the given value.
- _value(value),
- _isNull(false),
- _null()
- {
- }
-
- Nullable(const Nullable& other):
- /// Creates a Nullable by copying another one.
- _value(other._value),
- _isNull(other._isNull),
- _null()
- {
- }
- ~Nullable()
- /// Destroys the Nullable.
- {
- }
- Nullable& assign(const C& value)
- /// Assigns a value to the Nullable.
- {
- _value = value;
- _isNull = false;
- return *this;
- }
-
- Nullable& assign(const Nullable& other)
- /// Assigns another Nullable.
- {
- Nullable tmp(other);
- swap(tmp);
- return *this;
- }
-
- Nullable& assign(NullType)
- /// Sets value to null.
- {
- _isNull = true;
- return *this;
- }
-
- Nullable& operator = (const C& value)
- /// Assigns a value to the Nullable.
- {
- return assign(value);
- }
- Nullable& operator = (const Nullable& other)
- /// Assigns another Nullable.
- {
- return assign(other);
- }
- Nullable& operator = (NullType)
- /// Assigns another Nullable.
- {
- _isNull = true;
- return *this;
- }
- void swap(Nullable& other)
- /// Swaps this Nullable with other.
- {
- std::swap(_value, other._value);
- std::swap(_isNull, other._isNull);
- }
- bool operator == (const Nullable<C>& other) const
- /// Compares two Nullables for equality
- {
- return (_isNull && other._isNull) || (_isNull == other._isNull && _value == other._value);
- }
- bool operator == (const C& value) const
- /// Compares Nullable with value for equality
- {
- return (!_isNull && _value == value);
- }
- bool operator == (const NullType&) const
- /// Compares Nullable with NullData for equality
- {
- return _isNull;
- }
- bool operator != (const C& value) const
- /// Compares Nullable with value for non equality
- {
- return !(*this == value);
- }
- bool operator != (const Nullable<C>& other) const
- /// Compares two Nullables for non equality
- {
- return !(*this == other);
- }
- bool operator != (const NullType&) const
- /// Compares with NullData for non equality
- {
- return !_isNull;
- }
- bool operator < (const Nullable<C>& other) const
- /// Compares two Nullable objects. Return true if this object's
- /// value is smaler than the other object's value.
- /// Null value is smaller than a non-null value.
- {
- if (_isNull && other._isNull) return false;
- if (!_isNull && !other._isNull)
- return (_value < other._value);
- if (_isNull && !other._isNull) return true;
- return false;
- }
- bool operator > (const Nullable<C>& other) const
- /// Compares two Nullable objects. Return true if this object's
- /// value is greater than the other object's value.
- /// A non-null value is greater than a null value.
- {
- return !(*this == other) && !(*this < other);
- }
- C& value()
- /// Returns the Nullable's value.
- ///
- /// Throws a NullValueException if the Nullable is empty.
- {
- if (!_isNull)
- return _value;
- else
- throw NullValueException();
- }
- const C& value() const
- /// Returns the Nullable's value.
- ///
- /// Throws a NullValueException if the Nullable is empty.
- {
- if (!_isNull)
- return _value;
- else
- throw NullValueException();
- }
- const C& value(const C& deflt) const
- /// Returns the Nullable's value, or the
- /// given default value if the Nullable is empty.
- {
- return _isNull ? deflt : _value;
- }
- operator C& ()
- /// Get reference to the value
- {
- return value();
- }
- operator const C& () const
- /// Get const reference to the value
- {
- return value();
- }
- operator NullType& ()
- /// Get reference to the value
- {
- return _null;
- }
- bool isNull() const
- /// Returns true if the Nullable is empty.
- {
- return _isNull;
- }
-
- void clear()
- /// Clears the Nullable.
- {
- _isNull = true;
- }
- private:
- C _value;
- bool _isNull;
- NullType _null;
- };
- template <typename C>
- inline void swap(Nullable<C>& n1, Nullable<C>& n2)
- {
- n1.swap(n2);
- }
- template <typename C>
- std::ostream& operator<<(std::ostream& out, const Nullable<C>& obj)
- {
- if (!obj.isNull()) out << obj.value();
- return out;
- }
- template <typename C>
- bool operator == (const NullType&, const Nullable<C>& n)
- /// Returns true if this Nullable is null.
- {
- return n.isNull();
- }
- template <typename C>
- bool operator != (const C& c, const Nullable<C>& n)
- /// Compares Nullable with value for non equality
- {
- return !(n == c);
- }
- template <typename C>
- bool operator == (const C& c, const Nullable<C>& n)
- /// Compares Nullable with NullData for equality
- {
- return (n == c);
- }
- template <typename C>
- bool operator != (const NullType&, const Nullable<C>& n)
- /// Returns true if this Nullable is not null.
- {
- return !n.isNull();
- }
- } // namespace Poco
- #endif // Foundation_Nullable_INCLUDED
|