Chris@102: ////////////////////////////////////////////////////////////////////////////// Chris@102: // Chris@102: // (C) Copyright Ion Gaztanaga 2006-2014. Distributed under the Boost Chris@102: // Software License, Version 1.0. (See accompanying file Chris@102: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@102: // Chris@102: // See http://www.boost.org/libs/move for documentation. Chris@102: // Chris@102: ////////////////////////////////////////////////////////////////////////////// Chris@102: Chris@102: #ifndef BOOST_MOVE_MAKE_UNIQUE_HPP_INCLUDED Chris@102: #define BOOST_MOVE_MAKE_UNIQUE_HPP_INCLUDED Chris@102: Chris@102: #ifndef BOOST_CONFIG_HPP Chris@102: # include Chris@102: #endif Chris@102: # Chris@102: #if defined(BOOST_HAS_PRAGMA_ONCE) Chris@102: # pragma once Chris@102: #endif Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include //for std::size_t Chris@102: #include Chris@102: #ifdef BOOST_NO_CXX11_VARIADIC_TEMPLATES Chris@102: # include Chris@102: #endif Chris@102: Chris@102: //!\file Chris@102: //! Defines "make_unique" functions, which are factories to create instances Chris@102: //! of unique_ptr depending on the passed arguments. Chris@102: //! Chris@102: //! This header can be a bit heavyweight in C++03 compilers due to the use of the Chris@102: //! preprocessor library, that's why it's a a separate header from unique_ptr.hpp Chris@102: Chris@102: #if !defined(BOOST_MOVE_DOXYGEN_INVOKED) Chris@102: Chris@102: namespace std { //no namespace versioning in clang+libc++ Chris@102: Chris@102: struct nothrow_t; Chris@102: Chris@102: } //namespace std { Chris@102: Chris@102: namespace boost{ Chris@102: namespace move_upmu { Chris@102: Chris@102: //Compile time switch between Chris@102: //single element, unknown bound array Chris@102: //and known bound array Chris@102: template Chris@102: struct unique_ptr_if Chris@102: { Chris@102: typedef ::boost::movelib::unique_ptr t_is_not_array; Chris@102: }; Chris@102: Chris@102: template Chris@102: struct unique_ptr_if Chris@102: { Chris@102: typedef ::boost::movelib::unique_ptr t_is_array_of_unknown_bound; Chris@102: }; Chris@102: Chris@102: template Chris@102: struct unique_ptr_if Chris@102: { Chris@102: typedef void t_is_array_of_known_bound; Chris@102: }; Chris@102: Chris@102: template Chris@102: struct nothrow_holder Chris@102: { Chris@102: static std::nothrow_t *pnothrow; Chris@102: }; Chris@102: Chris@102: template Chris@102: std::nothrow_t *nothrow_holder::pnothrow; Chris@102: Chris@102: } //namespace move_upmu { Chris@102: } //namespace boost{ Chris@102: Chris@102: #endif //!defined(BOOST_MOVE_DOXYGEN_INVOKED) Chris@102: Chris@102: namespace boost{ Chris@102: namespace movelib { Chris@102: Chris@102: #if defined(BOOST_MOVE_DOXYGEN_INVOKED) || !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) Chris@102: Chris@102: //! Remarks: This function shall not participate in overload resolution unless T is not an array. Chris@102: //! Chris@102: //! Returns: unique_ptr(new T(std::forward(args)...)). Chris@102: template Chris@102: inline BOOST_MOVE_DOC1ST(unique_ptr, Chris@102: typename ::boost::move_upmu::unique_ptr_if::t_is_not_array) Chris@102: make_unique(BOOST_FWD_REF(Args)... args) Chris@102: { return unique_ptr(new T(::boost::forward(args)...)); } Chris@102: Chris@102: //! Remarks: This function shall not participate in overload resolution unless T is not an array. Chris@102: //! Chris@102: //! Returns: unique_ptr(new T(std::nothrow)(std::forward(args)...)). Chris@102: template Chris@102: inline BOOST_MOVE_DOC1ST(unique_ptr, Chris@102: typename ::boost::move_upmu::unique_ptr_if::t_is_not_array) Chris@102: make_unique_nothrow(BOOST_FWD_REF(Args)... args) Chris@102: { return unique_ptr(new (*boost::move_upmu::nothrow_holder<>::pnothrow)T(::boost::forward(args)...)); } Chris@102: Chris@102: #else Chris@102: #define BOOST_MOVE_MAKE_UNIQUE_CODE(N)\ Chris@102: template\ Chris@102: typename ::boost::move_upmu::unique_ptr_if::t_is_not_array\ Chris@102: make_unique( BOOST_MOVE_UREF##N)\ Chris@102: { return unique_ptr( new T( BOOST_MOVE_FWD##N ) ); }\ Chris@102: \ Chris@102: template\ Chris@102: typename ::boost::move_upmu::unique_ptr_if::t_is_not_array\ Chris@102: make_unique_nothrow( BOOST_MOVE_UREF##N)\ Chris@102: { return unique_ptr( new (*boost::move_upmu::nothrow_holder<>::pnothrow)T ( BOOST_MOVE_FWD##N ) ); }\ Chris@102: // Chris@102: BOOST_MOVE_ITERATE_0TO9(BOOST_MOVE_MAKE_UNIQUE_CODE) Chris@102: #undef BOOST_MOVE_MAKE_UNIQUE_CODE Chris@102: Chris@102: #endif Chris@102: Chris@102: //! Remarks: This function shall not participate in overload resolution unless T is not an array. Chris@102: //! Chris@102: //! Returns: unique_ptr(new T) (default initialization) Chris@102: template Chris@102: inline BOOST_MOVE_DOC1ST(unique_ptr, Chris@102: typename ::boost::move_upmu::unique_ptr_if::t_is_not_array) Chris@102: make_unique_definit() Chris@102: { Chris@102: return unique_ptr(new T); Chris@102: } Chris@102: Chris@102: //! Remarks: This function shall not participate in overload resolution unless T is not an array. Chris@102: //! Chris@102: //! Returns: unique_ptr(new T(std::nothrow) (default initialization) Chris@102: template Chris@102: inline BOOST_MOVE_DOC1ST(unique_ptr, Chris@102: typename ::boost::move_upmu::unique_ptr_if::t_is_not_array) Chris@102: make_unique_nothrow_definit() Chris@102: { Chris@102: return unique_ptr(new (*boost::move_upmu::nothrow_holder<>::pnothrow)T); Chris@102: } Chris@102: Chris@102: //! Remarks: This function shall not participate in overload resolution unless T is an array of Chris@102: //! unknown bound. Chris@102: //! Chris@102: //! Returns: unique_ptr(new remove_extent_t[n]()) (value initialization) Chris@102: template Chris@102: inline BOOST_MOVE_DOC1ST(unique_ptr, Chris@102: typename ::boost::move_upmu::unique_ptr_if::t_is_array_of_unknown_bound) Chris@102: make_unique(std::size_t n) Chris@102: { Chris@102: typedef typename ::boost::move_upmu::remove_extent::type U; Chris@102: return unique_ptr(new U[n]()); Chris@102: } Chris@102: Chris@102: //! Remarks: This function shall not participate in overload resolution unless T is an array of Chris@102: //! unknown bound. Chris@102: //! Chris@102: //! Returns: unique_ptr(new (std::nothrow)remove_extent_t[n]()) (value initialization) Chris@102: template Chris@102: inline BOOST_MOVE_DOC1ST(unique_ptr, Chris@102: typename ::boost::move_upmu::unique_ptr_if::t_is_array_of_unknown_bound) Chris@102: make_unique_nothrow(std::size_t n) Chris@102: { Chris@102: typedef typename ::boost::move_upmu::remove_extent::type U; Chris@102: return unique_ptr(new (*boost::move_upmu::nothrow_holder<>::pnothrow)U[n]()); Chris@102: } Chris@102: Chris@102: //! Remarks: This function shall not participate in overload resolution unless T is an array of Chris@102: //! unknown bound. Chris@102: //! Chris@102: //! Returns: unique_ptr(new remove_extent_t[n]) (default initialization) Chris@102: template Chris@102: inline BOOST_MOVE_DOC1ST(unique_ptr, Chris@102: typename ::boost::move_upmu::unique_ptr_if::t_is_array_of_unknown_bound) Chris@102: make_unique_definit(std::size_t n) Chris@102: { Chris@102: typedef typename ::boost::move_upmu::remove_extent::type U; Chris@102: return unique_ptr(new U[n]); Chris@102: } Chris@102: Chris@102: //! Remarks: This function shall not participate in overload resolution unless T is an array of Chris@102: //! unknown bound. Chris@102: //! Chris@102: //! Returns: unique_ptr(new (std::nothrow)remove_extent_t[n]) (default initialization) Chris@102: template Chris@102: inline BOOST_MOVE_DOC1ST(unique_ptr, Chris@102: typename ::boost::move_upmu::unique_ptr_if::t_is_array_of_unknown_bound) Chris@102: make_unique_nothrow_definit(std::size_t n) Chris@102: { Chris@102: typedef typename ::boost::move_upmu::remove_extent::type U; Chris@102: return unique_ptr(new (*boost::move_upmu::nothrow_holder<>::pnothrow) U[n]); Chris@102: } Chris@102: Chris@102: #if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) Chris@102: Chris@102: //! Remarks: This function shall not participate in overload resolution unless T is Chris@102: //! an array of known bound. Chris@102: template Chris@102: inline BOOST_MOVE_DOC1ST(unspecified, Chris@102: typename ::boost::move_upmu::unique_ptr_if::t_is_array_of_known_bound) Chris@102: make_unique(BOOST_FWD_REF(Args) ...) = delete; Chris@102: Chris@102: //! Remarks: This function shall not participate in overload resolution unless T is Chris@102: //! an array of known bound. Chris@102: template Chris@102: inline BOOST_MOVE_DOC1ST(unspecified, Chris@102: typename ::boost::move_upmu::unique_ptr_if::t_is_array_of_known_bound) Chris@102: make_unique_definit(BOOST_FWD_REF(Args) ...) = delete; Chris@102: Chris@102: //! Remarks: This function shall not participate in overload resolution unless T is Chris@102: //! an array of known bound. Chris@102: template Chris@102: inline BOOST_MOVE_DOC1ST(unspecified, Chris@102: typename ::boost::move_upmu::unique_ptr_if::t_is_array_of_known_bound) Chris@102: make_unique_nothrow(BOOST_FWD_REF(Args) ...) = delete; Chris@102: Chris@102: //! Remarks: This function shall not participate in overload resolution unless T is Chris@102: //! an array of known bound. Chris@102: template Chris@102: inline BOOST_MOVE_DOC1ST(unspecified, Chris@102: typename ::boost::move_upmu::unique_ptr_if::t_is_array_of_known_bound) Chris@102: make_unique_nothrow_definit(BOOST_FWD_REF(Args) ...) = delete; Chris@102: Chris@102: #endif Chris@102: Chris@102: } //namespace movelib { Chris@102: Chris@102: } //namespace boost{ Chris@102: Chris@102: #include Chris@102: Chris@102: #endif //#ifndef BOOST_MOVE_MAKE_UNIQUE_HPP_INCLUDED