Elm  1.0
ELM is a library providing generic data structures, OS-independent interface, plugins and XML.
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
Option.h
1 /*
2  * $Id$
3  * Copyright (c) 2006, IRIT-UPS <casse@irit.fr>.
4  *
5  * elm/util/Option.h -- interface for Option class.
6  */
7 #ifndef ELM_UTIL_OPTION_H
8 #define ELM_UTIL_OPTION_H
9 
10 #include <elm/assert.h>
11 #include <elm/type_info.h>
12 
13 namespace elm {
14 
15 // OptionalNone value
16 class OptionalNone {
17 };
18 extern const OptionalNone none;
19 
20 
21 // Optional value
22 template <class T> class Option {
23 public:
24  inline Option(void): one(false) { }
25  inline Option(const OptionalNone& none): one(false) { }
26  inline Option(T value): one(true) { type_info<T>::put(val, value); }
27  inline Option(const Option<T> &opt): one(opt.one), val(opt.val) { }
28  inline bool isOne(void) const { return one; }
29  inline bool isNone(void) const { return !one; }
30  inline T value(void) const
31  { ASSERTP(one, "no value in option"); return type_info<T>::get(val); }
32 
33  inline operator bool(void) const { return isOne(); }
34  inline T operator*(void) const { return value(); }
35  inline operator T(void) const { return value(); }
36  inline Option<T>& operator=(const Option<T>& opt)
37  { one = opt.one; if(one) val = opt.val; return *this; }
39  { one = true; type_info<T>::put(val, value); return *this; }
40 
41 private:
42  bool one;
43  typename type_info<T>::embed_t val;
44 };
45 
46 
47 // Fast Option building
48 template <class T>
49 inline Option<T> some(T val) { return Option<T>(val); };
50 
51 } // elm
52 
53 #endif /* ELM_UTIL_OPTION_H */
Option< T > some(T val)
Definition: Option.h:49
T embed_t
Definition: type_info.h:43
Option(void)
Definition: Option.h:24
bool isOne(void) const
Definition: Option.h:28
bool isNone(void) const
Definition: Option.h:29
Option(T value)
Definition: Option.h:26
static const T & get(const T &v)
Definition: type_info.h:49
static void put(T &l, const T &v)
Definition: type_info.h:48
Definition: Option.h:22
Definition: Option.h:16
Option< T > & operator=(const Option< T > &opt)
Definition: Option.h:36
Option< T > & operator=(T value)
Definition: Option.h:38
Option(const OptionalNone &none)
Definition: Option.h:25
Option(const Option< T > &opt)
Definition: Option.h:27
const OptionalNone none
Definition: util_Option.cpp:134
T operator*(void) const
Definition: Option.h:34
T value(void) const
Definition: Option.h:30