// Copyright (C) 2003, 2008 Fernando Luis Cacciola Carballal. // Copyright (C) 2016 Andrzej Krzemienski. // // Use, modification, and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org/libs/optional for documentation. // // You are welcome to contact the author at: // fernando_cacciola@hotmail.com // akrzemi1@gmail.com #ifndef BOOST_OPTIONAL_OPTIONAL_DETAIL_OPTIONAL_ALIGNED_STORAGE_AJK_12FEB2016_HPP #define BOOST_OPTIONAL_OPTIONAL_DETAIL_OPTIONAL_ALIGNED_STORAGE_AJK_12FEB2016_HPP namespace boost { namespace optional_detail { // This local class is used instead of that in "aligned_storage.hpp" // because I've found the 'official' class to ICE BCB5.5 // when some types are used with optional<> // (due to sizeof() passed down as a non-type template parameter) template class aligned_storage { // Borland ICEs if unnamed unions are used for this! union // This works around GCC warnings about breaking strict aliasing rules when casting storage address to T* #if defined(BOOST_OPTIONAL_DETAIL_USE_ATTRIBUTE_MAY_ALIAS) __attribute__((__may_alias__)) #endif dummy_u { char data[ sizeof(T) ]; BOOST_DEDUCED_TYPENAME type_with_alignment< ::boost::alignment_of::value >::type aligner_; } dummy_ ; public: #if defined(BOOST_OPTIONAL_DETAIL_USE_ATTRIBUTE_MAY_ALIAS) void const* address() const { return &dummy_; } void * address() { return &dummy_; } #else void const* address() const { return dummy_.data; } void * address() { return dummy_.data; } #endif } ; } // namespace optional_detail } // namespace boost #endif // header guard