
1 changed files with 85 additions and 0 deletions
@ -0,0 +1,85 @@ |
|||
// This file is under GNU General Public License 3.0
|
|||
// see LICENSE.txt
|
|||
|
|||
#ifndef PEP_DATATYPES_WRAPPER_HH |
|||
#define PEP_DATATYPES_WRAPPER_HH |
|||
|
|||
namespace pEp |
|||
{ |
|||
|
|||
template<class T> |
|||
class Wrapper |
|||
{ |
|||
public: |
|||
template<class... Args> |
|||
Wrapper(Args... args) : value{ _new(args...) } {} |
|||
|
|||
// no implicit copying... (yet?)
|
|||
Wrapper(const Wrapper<T>&) = delete; |
|||
void operator=(const Wrapper<T>&) = delete; |
|||
|
|||
// must be implemented separately for each T
|
|||
Wrapper(Wrapper<T>&& victim); |
|||
Wrapper<T>& operator=(Wrapper<T>&& victim); |
|||
|
|||
~Wrapper(); |
|||
|
|||
Wrapper<T> copy() const; |
|||
|
|||
private: |
|||
// must be defined for each wrapped type:
|
|||
template<class... Args> |
|||
T* _new(Args...); |
|||
|
|||
T value; |
|||
}; |
|||
|
|||
|
|||
// many wrapped datatypes are pointers, we can generalize a lot for them:
|
|||
template<class T> |
|||
class Wrapper<T*> |
|||
{ |
|||
public: |
|||
Wrapper() : value{nullptr} {} |
|||
|
|||
template<class... Args> |
|||
Wrapper(Args... args) : value{ _new(args...) } {} |
|||
|
|||
// no implicit copying... (yet?)
|
|||
Wrapper(const Wrapper<T*>&) = delete; |
|||
void operator=(const Wrapper<T*>&) = delete; |
|||
|
|||
// must be implemented separately for each T
|
|||
Wrapper(Wrapper<T*>&& victim) |
|||
: value{ victim.value} |
|||
{ |
|||
victim.value = nullptr; |
|||
} |
|||
|
|||
Wrapper<T*>&& operator=(Wrapper<T*>&& victim) |
|||
{ |
|||
_free(); |
|||
value = victim.value; |
|||
victim.value = nullptr; |
|||
} |
|||
|
|||
~Wrapper() |
|||
{ |
|||
_free(); |
|||
} |
|||
|
|||
|
|||
private: |
|||
// must be defined for each wrapped type:
|
|||
template<class... Args> |
|||
T* _new(Args...); |
|||
|
|||
void _free(); |
|||
|
|||
T* value; |
|||
}; |
|||
|
|||
|
|||
} // end of namespace pEp
|
|||
|
|||
#endif // PEP_DATATYPES_WRAPPER_HH
|
Loading…
Reference in new issue