references.hpp
Go to the documentation of this file.
00001 
00011 /*****************************************************************************
00012 ** Ifdefs
00013 *****************************************************************************/
00014 
00015 #ifndef ECL_UTILITIES_REFERENCE_WRAPPER_HPP_
00016 #define ECL_UTILITIES_REFERENCE_WRAPPER_HPP_
00017 
00018 /*****************************************************************************
00019 ** Includes
00020 *****************************************************************************/
00021 
00022 #include <ecl/mpl/bool.hpp>
00023 
00024 /*****************************************************************************
00025 ** Wrappers
00026 *****************************************************************************/
00027 
00028 namespace ecl {
00029 
00038 template <typename T>
00039 T* addressOf( T & v ) {
00040     return reinterpret_cast<T*>(
00041         &const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
00042 }
00084 template<typename T>
00085 class ReferenceWrapper {
00086 
00087 public:
00088     typedef T type; 
00097     ReferenceWrapper(T& t): obj_ptr(addressOf(t)) {}
00098 
00099     virtual ~ReferenceWrapper() {}
00100 
00109     operator T& () const { return *obj_ptr; }
00110 
00118     T& reference() const { return *obj_ptr; }
00119 
00127     T* pointer() const { return *obj_ptr; }
00128 
00129 private:
00130     T* obj_ptr;
00131 };
00132 
00133 /*****************************************************************************
00134 ** Utility Functions
00135 *****************************************************************************/
00136 
00144 template <typename T>
00145 ReferenceWrapper<T> ref(T &wrapped_object) {
00146         return ReferenceWrapper<T>(wrapped_object);
00147 }
00148 
00156 template <typename T>
00157 ReferenceWrapper<T const> cref(T const &wrapped_object) {
00158         return ReferenceWrapper<T const>(wrapped_object);
00159 }
00160 
00169 template <typename T>
00170 class is_reference_wrapper : public False {};
00171 
00179 template <typename T>
00180 class is_reference_wrapper< ReferenceWrapper<T> > : public True {};
00181 
00182 } // namespace ecl
00183 
00184 
00185 #endif /* ECL_UTILITIES_REFERENCE_WRAPPER_HPP_ */


ecl_utilities
Author(s): Daniel Stonier (d.stonier@gmail.com)
autogenerated on Thu Jan 2 2014 11:12:20