implement ReferenceWrapper + ref/cref + address_of

master
Daniel Kolesa 2015-04-18 19:02:44 +01:00
parent 799c9fed94
commit 1177d94b6e
2 changed files with 51 additions and 0 deletions

View File

@ -6,6 +6,8 @@
#ifndef OCTA_FUNCTIONAL_H
#define OCTA_FUNCTIONAL_H
#include "octa/memory.h"
namespace octa {
#define OCTA_DEFINE_BINARY_OP(name, op, rettype) \
template<typename T> struct name { \
@ -87,6 +89,39 @@ namespace octa {
template<typename T> BinaryNegate<T> not2(const T &fn) {
return BinaryNegate<T>(fn);
}
template<typename T>
struct ReferenceWrapper {
typedef T type;
ReferenceWrapper(T &v): p_ptr(address_of(v)) {}
ReferenceWrapper(const ReferenceWrapper &) = default;
ReferenceWrapper(T &&) = delete;
ReferenceWrapper &operator=(const ReferenceWrapper &) = default;
operator T &() const { return *p_ptr; }
T &get() const { return *p_ptr; }
private:
T *p_ptr;
};
template<typename T> ReferenceWrapper<T> ref(T &v) {
return ReferenceWrapper<T>(v);
}
template<typename T> ReferenceWrapper<T> ref(ReferenceWrapper<T> v) {
return ReferenceWrapper<T>(v);
}
template<typename T> void ref(const T &&) = delete;
template<typename T> ReferenceWrapper<const T> cref(const T &v) {
return ReferenceWrapper<T>(v);
}
template<typename T> ReferenceWrapper<const T> cref(ReferenceWrapper<T> v) {
return ReferenceWrapper<T>(v);
}
template<typename T> void cref(const T &&) = delete;
}
#endif

16
octa/memory.h 100644
View File

@ -0,0 +1,16 @@
/* Memory utilities for OctaSTD.
*
* This file is part of OctaSTD. See COPYING.md for futher information.
*/
#ifndef OCTA_MEMORY_H
#define OCTA_MEMORY_H
namespace octa {
template<typename T> T *address_of(T &v) {
return reinterpret_cast<T *>(&const_cast<char &>
(reinterpret_cast<const volatile char &>(v)));
}
}
#endif