X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fcontrib%2Flibqxt-2007-10-24%2Fsrc%2Fcore%2Fqxtnullable.h;fp=src%2Fcontrib%2Flibqxt-2007-10-24%2Fsrc%2Fcore%2Fqxtnullable.h;h=ae43147e2261266129a0a274e2a4e69fba096fd5;hb=a634acadbcf6017474f68a3eaf7cb632660e9e49;hp=0000000000000000000000000000000000000000;hpb=cd122ca8e0d2c0ffc5397e0a813c75d791a7e6e3;p=quassel.git diff --git a/src/contrib/libqxt-2007-10-24/src/core/qxtnullable.h b/src/contrib/libqxt-2007-10-24/src/core/qxtnullable.h new file mode 100644 index 00000000..ae43147e --- /dev/null +++ b/src/contrib/libqxt-2007-10-24/src/core/qxtnullable.h @@ -0,0 +1,145 @@ +/**************************************************************************** +** +** Copyright (C) Qxt Foundation. Some rights reserved. +** +** This file is part of the QxtCore module of the Qt eXTension library +** +** This library is free software; you can redistribute it and/or modify it +** under the terms of th Common Public License, version 1.0, as published by +** IBM. +** +** This file is provided "AS IS", without WARRANTIES OR CONDITIONS OF ANY +** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY +** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR +** FITNESS FOR A PARTICULAR PURPOSE. +** +** You should have received a copy of the CPL along with this file. +** See the LICENSE file and the cpl1.0.txt file included with the source +** distribution for more information. If you did not receive a copy of the +** license, contact the Qxt Foundation. +** +** +** +****************************************************************************/ + +/** +\class QxtNullable QxtNullable +\ingroup QxtCore +\brief distinct null value compatible with any data type. + +in general it's a templated abstraction to allow any data type to be +expressed with a null value distinct from any real value. An example +of such a use is for optional arguments. +\n +prepare a function for argument skipping: + +\code +void somefunction( qxtNull(int,a) , qxtNull(int,b) ) +{ + +if (!a.isNull()) + { + int i = a.value(); + //do something with i + } + if (!b.isNull()) + { + int x = b.value(); + //do something with x + } +} +\endcode + +usage: +\code + +somefunction(SKIP,1,2); +somefunction(3,4); +somefunction(3,SKIP,6); +somefunction(1); +\endcode + +*/ + +#ifndef QXTNULLABLE_H +#define QXTNULLABLE_H +#include + +/*! \relates QxtNullable + * defines a skipable argument with type \a t and variable name \a n + */ +#define qxtNull(t,n) QxtNullable n = QxtNullable() + +#include + +template +class /*QXT_CORE_EXPORT*/ QxtNullable +{ +public: + QxtNullable(QxtNull); + QxtNullable(const T& p); + QxtNullable(); + + ///determinates if the Value is set to something meaningfull + bool isNull() const; + + ///delete Value + void nullify(); + + T& value() const; + operator T() const; + void operator=(const T& p); + +private: + T* val; +}; + +template +QxtNullable::QxtNullable(QxtNull) +{ + val = 0; +} + +template +QxtNullable::QxtNullable(const T& p) +{ + val = const_cast(&p); +} + +template +QxtNullable::QxtNullable() +{ + val = 0; +} + +template +QxtNullable::operator T() const +{ + return *val; +} + +template +T& QxtNullable::value() const +{ + return *val; +} + +template +bool QxtNullable::isNull() const +{ + return (val==0); +} + +template +void QxtNullable::nullify() +{ + val=0; +} + +template +void QxtNullable::operator=(const T& p) +{ + val = const_cast(&p); +} + +#endif