76 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			76 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								// 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 T>
							 | 
						||
| 
								 | 
							
								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<T>::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
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(BOOST_OPTIONAL_DETAIL_USE_ATTRIBUTE_MAY_ALIAS)
							 | 
						||
| 
								 | 
							
									// This workaround is supposed to silence GCC warnings about broken strict aliasing rules
							 | 
						||
| 
								 | 
							
									T const* ptr_ref() const
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										union { void const* ap_pvoid; T const* as_ptype; } caster = { address() };
							 | 
						||
| 
								 | 
							
										return caster.as_ptype;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									T *      ptr_ref()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										union { void* ap_pvoid; T* as_ptype; } caster = { address() };
							 | 
						||
| 
								 | 
							
										return caster.as_ptype;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
									T const* ptr_ref() const { return static_cast<T const*>(address()); }
							 | 
						||
| 
								 | 
							
									T *      ptr_ref()       { return static_cast<T *>     (address()); }
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									T const& ref() const { return *ptr_ref(); }
							 | 
						||
| 
								 | 
							
									T &      ref()       { return *ptr_ref(); }
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								} ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} // namespace optional_detail
							 | 
						||
| 
								 | 
							
								} // namespace boost
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // header guard
							 |