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
14namespace XrdCl
15{
16 //----------------------------------------------------------------------------
22 //----------------------------------------------------------------------------
23 template<typename T>
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 //------------------------------------------------------------------------
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=(T &&value) const
Definition: XrdClFwd.hh:165
const Fwd & operator=(const T &value) const
Definition: XrdClFwd.hh:152
Fwd()
Definition: XrdClFwd.hh:127
Fwd(Fwd &&fwd)
Move constructor.
Definition: XrdClFwd.hh:141
Fwd(const Fwd &fwd)
Copy constructor.
Definition: XrdClFwd.hh:134
T & operator*() const
Definition: XrdClFwd.hh:178
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(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
FwdStorage & operator=(T &&value)
Definition: XrdClFwd.hh:62
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