blob: 97d489af606dbc5fc8b658fa6cfa60c7dde3fc26 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
/** \file maybe.h */ // -*-c++-*-
// Copyright (C) 2009 Daniel Burrows
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program; see the file COPYING. If not, write to
// the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
// Boston, MA 02111-1307, USA.
#ifndef MAYBE_H
#define MAYBE_H
/** \brief Simple generic "maybe it exists, maybe it doesn't" class.
*
* \tparam T The type of value to store. Must have a default
* constructor.
*/
template<typename T>
class maybe
{
bool has_value;
T value;
public:
maybe()
: has_value(false), value()
{
}
maybe(const T &_value)
: has_value(true), value(_value)
{
}
// Default copy constructor and assignment.
bool get_has_value() const { return has_value; }
/** \brief Retrieve the value stored in this "maybe", if there is
* one.
*
* \param out The location in which to store the value.
* \return \b true if this object has a value.
*/
bool extract(T &out) const { if(has_value) out = value; return has_value; }
/** \brief Directly extract the value.
*
* This is efficient but unsafe; it assumes the user has already
* invoked get_has_value().
*/
const T &get_value() const { return value; }
/** \brief Directly extract the value.
*
* This is efficient but unsafe; it assumes the user has already
* invoked get_has_value().
*/
T &get_value() { return value; }
};
#endif // MAYBE_H
|