Program Listing for File references.hpp
↰ Return to documentation for file (/tmp/ws/src/ecl_core/ecl_utilities/include/ecl/utilities/references.hpp
)
/*****************************************************************************
** Ifdefs
*****************************************************************************/
#ifndef ECL_UTILITIES_REFERENCE_WRAPPER_HPP_
#define ECL_UTILITIES_REFERENCE_WRAPPER_HPP_
/*****************************************************************************
** Includes
*****************************************************************************/
#include <ecl/mpl/bool.hpp>
/*****************************************************************************
** Wrappers
*****************************************************************************/
namespace ecl {
template <typename T>
T* addressOf( T & v ) {
return reinterpret_cast<T*>(
&const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
}
template<typename T>
class ReferenceWrapper {
public:
typedef T type;
ReferenceWrapper(T& t): obj_ptr(addressOf(t)) {}
virtual ~ReferenceWrapper() {}
operator T& () const { return *obj_ptr; }
T& reference() const { return *obj_ptr; }
T* pointer() const { return *obj_ptr; }
private:
T* obj_ptr;
};
/*****************************************************************************
** Utility Functions
*****************************************************************************/
template <typename T>
ReferenceWrapper<T> ref(T &wrapped_object) {
return ReferenceWrapper<T>(wrapped_object);
}
template <typename T>
ReferenceWrapper<T const> cref(T const &wrapped_object) {
return ReferenceWrapper<T const>(wrapped_object);
}
template <typename T>
class is_reference_wrapper : public False {};
template <typename T>
class is_reference_wrapper< ReferenceWrapper<T> > : public True {};
} // namespace ecl
#endif /* ECL_UTILITIES_REFERENCE_WRAPPER_HPP_ */