FRI-OS
unique.hpp
Go to the documentation of this file.
1 
4 #ifndef __FRIOS_UTILS_UNIQUE_HPP__
5 #define __FRIOS_UTILS_UNIQUE_HPP__
6 
7 #include <type_traits>
8 #include <memory>
9 #include <cassert>
10 
11 namespace frios {
12 
13 template <typename T, bool POD>
14 class unique_impl;
15 
16 template <typename T>
17 class unique_impl<T, true>
18 {
19 private:
20  T _value;
21  bool _valid;
22 public:
23  unique_impl(const unique_impl&) = delete;
24 
25  unique_impl(void)
26  : _valid(true)
27  { }
28 
29  template <typename ... P>
30  unique_impl(P&& ... p)
31  : _value(std::forward<P>(p)...)
32  , _valid(true)
33  { }
34 
35  unique_impl(unique_impl&& tmp)
36  : _value(tmp._value)
37  , _valid(tmp._valid)
38  {
39  tmp._valid = false;
40  }
41 
42  bool valid(void) const
43  {
44  return _valid;
45  }
46 
47  T& get(void)
48  {
49  assert(_valid);
50  return _value;
51  }
52 
53  const T& get(void) const
54  {
55  assert(_valid);
56  return _value;
57  }
58 
59  operator T& (void)
60  {
61  return get();
62  }
63 
64  operator const T& (void) const
65  {
66  return get();
67  }
68 
69  T* operator & (void)
70  {
71  return &get();
72  }
73 
74  const T* operator & (void) const
75  {
76  return &get();
77  }
78 };
79 
80 
82 
85 template <typename T>
86 class unique
87  : public unique_impl<T, std::is_pod<T>::value>
88 {
89 private:
90  typedef unique_impl<T, std::is_pod<T>::value> base;
91 public:
93  unique(void)
94  : base()
95  { }
96 
98  template <typename ... P>
99  unique(P&& ... p)
100  : base(std::forward<P>(p)...)
101  { }
102 
104  unique(unique&& tmp)
105  : base(static_cast<base&&>(tmp))
106  { }
107 };
108 
109 } // namespace frios
110 
111 #endif // include guard
unique(unique &&tmp)
unique objects are movable
Definition: unique.hpp:104
unique(P &&...p)
Construction with arbitrary number of parameters.
Definition: unique.hpp:99
unique(void)
Default construction.
Definition: unique.hpp:93
Wrapper ensuring the uniqueness of a value.
Definition: unique.hpp:86