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_ */