diff options
author | Daniel Wilhelm <daniel@wili.li> | 2014-04-18 17:18:53 +0200 |
---|---|---|
committer | Daniel Wilhelm <daniel@wili.li> | 2014-04-18 17:18:53 +0200 |
commit | 32cb97237e7691d31977ab503c6ea4511e8eb3a8 (patch) | |
tree | 4e97b53e9f7b74e8cc5d7548507d9e82ae38e36f /zen/optional.h | |
parent | 4.6 (diff) | |
download | FreeFileSync-32cb97237e7691d31977ab503c6ea4511e8eb3a8.tar.gz FreeFileSync-32cb97237e7691d31977ab503c6ea4511e8eb3a8.tar.bz2 FreeFileSync-32cb97237e7691d31977ab503c6ea4511e8eb3a8.zip |
5.0
Diffstat (limited to 'zen/optional.h')
-rw-r--r-- | zen/optional.h | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/zen/optional.h b/zen/optional.h new file mode 100644 index 00000000..1e04f52c --- /dev/null +++ b/zen/optional.h @@ -0,0 +1,62 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// ************************************************************************** + +#ifndef OPTIONAL_H_2857428578342203589 +#define OPTIONAL_H_2857428578342203589 + +namespace zen +{ +/* +Optional return value with static memory allocation! + -> interface like a pointer, performance like a value + + Usage: + ------ + Opt<MyEnum> someFunction(); +{ + if (allIsWell) + return enumVal; + else + return NoValue(); +} + + Opt<MyEnum> optValue = someFunction(); + if (optValue) + ... use *optValue ... +*/ + +struct NoValue {}; + +template <class T> +class Opt +{ +public: + Opt() : valid(false), value() {} + Opt(NoValue) : valid(false), value() {} + Opt(const T& val) : valid(true ), value(val) {} + +#ifdef _MSC_VER +private: + struct ConversionToBool { int dummy; }; +public: + operator int ConversionToBool::* () const { return valid ? &ConversionToBool::dummy : nullptr; } +#else + explicit operator bool() const { return valid; } //thank you C++11!!! +#endif + + const T& operator*() const { return value; } + /**/ T& operator*() { return value; } + + const T* operator->() const { return &value; } + /**/ T* operator->() { return &value; } +private: + const bool valid; + T value; +}; + +} + +#endif //OPTIONAL_H_2857428578342203589 |