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