williamr@2: // Copyright (C) 2002 Brad King (brad.king@kitware.com) williamr@2: // Douglas Gregor (gregod@cs.rpi.edu) williamr@2: // Peter Dimov williamr@2: // williamr@2: // Distributed under the Boost Software License, Version 1.0. (See williamr@2: // accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: williamr@2: // For more information, see http://www.boost.org williamr@2: williamr@2: #ifndef BOOST_UTILITY_ADDRESSOF_HPP williamr@2: # define BOOST_UTILITY_ADDRESSOF_HPP williamr@2: williamr@2: # include williamr@2: # include williamr@2: williamr@2: namespace boost { williamr@2: williamr@2: // Do not make addressof() inline. Breaks MSVC 7. (Peter Dimov) williamr@2: williamr@2: // VC7 strips const from nested classes unless we add indirection here williamr@2: # if BOOST_WORKAROUND(BOOST_MSVC, == 1300) williamr@2: williamr@2: template struct _addp williamr@2: { williamr@2: typedef T * type; williamr@2: }; williamr@2: williamr@2: template typename _addp::type williamr@2: williamr@2: # else williamr@2: template T* williamr@2: # endif williamr@2: addressof(T& v) williamr@2: { williamr@2: return reinterpret_cast( williamr@2: &const_cast(reinterpret_cast(v))); williamr@2: } williamr@2: williamr@2: // Borland doesn't like casting an array reference to a char reference williamr@2: // but these overloads work around the problem. williamr@2: # if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) williamr@2: template williamr@2: T (*addressof(T (&t)[N]))[N] williamr@2: { williamr@2: return reinterpret_cast(&t); williamr@2: } williamr@2: williamr@2: template williamr@2: const T (*addressof(const T (&t)[N]))[N] williamr@2: { williamr@2: return reinterpret_cast(&t); williamr@2: } williamr@2: # endif williamr@2: williamr@2: } williamr@2: williamr@2: #endif // BOOST_UTILITY_ADDRESSOF_HPP