From e46c0b647737b5b398270175ee6d7b0115c42a86 Mon Sep 17 00:00:00 2001 From: roker Date: Fri, 7 May 2021 17:34:33 +0200 Subject: [PATCH] generic wrapper for several C datatypes. --- src/wrapper.hh | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/wrapper.hh diff --git a/src/wrapper.hh b/src/wrapper.hh new file mode 100644 index 0000000..5068797 --- /dev/null +++ b/src/wrapper.hh @@ -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 Wrapper +{ +public: + template + Wrapper(Args... args) : value{ _new(args...) } {} + + // no implicit copying... (yet?) + Wrapper(const Wrapper&) = delete; + void operator=(const Wrapper&) = delete; + + // must be implemented separately for each T + Wrapper(Wrapper&& victim); + Wrapper& operator=(Wrapper&& victim); + + ~Wrapper(); + + Wrapper copy() const; + +private: + // must be defined for each wrapped type: + template + T* _new(Args...); + + T value; +}; + + +// many wrapped datatypes are pointers, we can generalize a lot for them: +template +class Wrapper +{ +public: + Wrapper() : value{nullptr} {} + + template + Wrapper(Args... args) : value{ _new(args...) } {} + + // no implicit copying... (yet?) + Wrapper(const Wrapper&) = delete; + void operator=(const Wrapper&) = delete; + + // must be implemented separately for each T + Wrapper(Wrapper&& victim) + : value{ victim.value} + { + victim.value = nullptr; + } + + Wrapper&& operator=(Wrapper&& victim) + { + _free(); + value = victim.value; + victim.value = nullptr; + } + + ~Wrapper() + { + _free(); + } + + +private: + // must be defined for each wrapped type: + template + T* _new(Args...); + + void _free(); + + T* value; +}; + + +} // end of namespace pEp + +#endif // PEP_DATATYPES_WRAPPER_HH