xrootd
XrdClFwd.hh
Go to the documentation of this file.
1 /*
2  * XrdClFwd.hh
3  *
4  * Created on: Oct 19, 2018
5  * Author: simonm
6  */
7 
8 #ifndef SRC_XRDCL_XRDCLFWD_HH_
9 #define SRC_XRDCL_XRDCLFWD_HH_
10 
11 #include <memory>
12 #include <stdexcept>
13 
14 namespace XrdCl
15 {
16  //----------------------------------------------------------------------------
22  //----------------------------------------------------------------------------
23  template<typename T>
24  struct FwdStorage
25  {
26  //--------------------------------------------------------------------------
28  //--------------------------------------------------------------------------
29  FwdStorage() : ptr( nullptr ) { }
30 
31  //--------------------------------------------------------------------------
34  //--------------------------------------------------------------------------
35  FwdStorage( const T &value ) : ptr( new( &storage.memory ) T( value ) )
36  {
37  }
38 
39  //--------------------------------------------------------------------------
42  //--------------------------------------------------------------------------
43  FwdStorage& operator=( const T &value )
44  {
45  if( ptr ) throw std::logic_error( "XrdCl::Fwd already contains value." );
46  ptr = new( &storage.memory ) T( value );
47  return *this;
48  }
49 
50  //--------------------------------------------------------------------------
53  //--------------------------------------------------------------------------
54  FwdStorage( T && value ) : ptr( new( &storage.memory ) T( std::move( value ) ) )
55  {
56  }
57 
58  //--------------------------------------------------------------------------
61  //--------------------------------------------------------------------------
62  FwdStorage& operator=( T && value )
63  {
64  if( ptr ) throw std::logic_error( "XrdCl::Fwd already contains value." );
65  ptr = new( &storage.memory ) T( std::move( value ) );
66  return *this;
67  }
68 
69  //--------------------------------------------------------------------------
71  //--------------------------------------------------------------------------
73  {
74  if( ptr ) ptr->~T();
75  }
76 
77  //--------------------------------------------------------------------------
79  //--------------------------------------------------------------------------
80  union Memory
81  {
82  //------------------------------------------------------------------------
84  //------------------------------------------------------------------------
85  Memory() { }
86 
87  //------------------------------------------------------------------------
89  //------------------------------------------------------------------------
90  ~Memory() { }
91 
92  //------------------------------------------------------------------------
94  //------------------------------------------------------------------------
95  T memory;
96  };
97 
98  //--------------------------------------------------------------------------
100  //--------------------------------------------------------------------------
102 
103  //--------------------------------------------------------------------------
105  //--------------------------------------------------------------------------
106  T *ptr;
107  };
108 
109  //----------------------------------------------------------------------------
115  //----------------------------------------------------------------------------
116  template<typename T>
117  class Fwd : protected std::shared_ptr<FwdStorage<T>>
118  {
119  public:
120 
121  //------------------------------------------------------------------------
126  //------------------------------------------------------------------------
127  Fwd() : std::shared_ptr<FwdStorage<T>>( new FwdStorage<T>() )
128  {
129  }
130 
131  //------------------------------------------------------------------------
133  //------------------------------------------------------------------------
134  Fwd( const Fwd &fwd ) : std::shared_ptr<FwdStorage<T>>( fwd )
135  {
136  }
137 
138  //------------------------------------------------------------------------
140  //------------------------------------------------------------------------
141  Fwd( Fwd && fwd ) : std::shared_ptr<FwdStorage<T>>( std::move( fwd ) )
142  {
143  }
144 
145  //------------------------------------------------------------------------
151  //------------------------------------------------------------------------
152  const Fwd& operator=( const T &value ) const
153  {
154  *this->get() = value;
155  return *this;
156  }
157 
158  //------------------------------------------------------------------------
164  //------------------------------------------------------------------------
165  const Fwd& operator=( T && value ) const
166  {
167  *this->get() = std::move( value );
168  return *this;
169  }
170 
171  //------------------------------------------------------------------------
177  //------------------------------------------------------------------------
178  T& operator*() const
179  {
180  if( !bool( this->get()->ptr ) ) throw std::logic_error( "XrdCl::Fwd contains no value!" );
181  return *this->get()->ptr;
182  }
183 
184  //------------------------------------------------------------------------
190  //------------------------------------------------------------------------
191  T* operator->() const
192  {
193  if( !bool( this->get()->ptr ) ) throw std::logic_error( "XrdCl::Fwd contains no value!" );
194  return this->get()->ptr;
195  }
196 
197  };
198 }
199 
200 
201 #endif /* SRC_XRDCL_XRDCLFWD_HH_ */
Definition: XrdClFwd.hh:118
const Fwd & operator=(const T &value) const
Definition: XrdClFwd.hh:152
const Fwd & operator=(T &&value) const
Definition: XrdClFwd.hh:165
Fwd()
Definition: XrdClFwd.hh:127
Fwd(Fwd &&fwd)
Move constructor.
Definition: XrdClFwd.hh:141
T & operator*() const
Definition: XrdClFwd.hh:178
Fwd(const Fwd &fwd)
Copy constructor.
Definition: XrdClFwd.hh:134
T * operator->() const
Definition: XrdClFwd.hh:191
Definition: XrdClAnyObject.hh:26
Definition: XrdClFwd.hh:25
FwdStorage & operator=(const T &value)
Definition: XrdClFwd.hh:43
Memory storage
The memory for storying forwarded value.
Definition: XrdClFwd.hh:101
~FwdStorage()
Destructor.
Definition: XrdClFwd.hh:72
FwdStorage & operator=(T &&value)
Definition: XrdClFwd.hh:62
FwdStorage(const T &value)
Definition: XrdClFwd.hh:35
FwdStorage(T &&value)
Definition: XrdClFwd.hh:54
FwdStorage()
Default constructor.
Definition: XrdClFwd.hh:29
T * ptr
Pointer to the forwarded value.
Definition: XrdClFwd.hh:106
Memory for the value.
Definition: XrdClFwd.hh:81
~Memory()
Make sure the destrutor of T wont be called.
Definition: XrdClFwd.hh:90
T memory
The memory for storing forwarded value.
Definition: XrdClFwd.hh:95
Memory()
Make sure the default constructor of T wont be called.
Definition: XrdClFwd.hh:85