Compare commits

...

168 Commits

Author SHA1 Message Date
Glen Fernandes
0085752a56 Merge branch 'develop' 2017-03-13 19:19:40 -04:00
Peter Dimov
d7ad42724d Revert Appveyor changes. 2017-03-13 19:42:39 +02:00
Peter Dimov
83d3f07b0d Fourth try to obtain bootstrap.log from Appveyor 2017-03-13 19:02:57 +02:00
Peter Dimov
994f39f9b0 Third try to obtain bootstrap.log from Appveyor 2017-03-13 18:47:38 +02:00
Peter Dimov
f45dd4d955 Second try to obtain bootstrap.log from Appveyor 2017-03-13 18:36:52 +02:00
Peter Dimov
b4abcdb016 Try to obtain bootstrap.log from Appveyor 2017-03-13 18:29:04 +02:00
Glen Fernandes
25cf644f60 Merge pull request #37 from glenfe/develop
Add examples back to documentation
2017-03-13 11:22:06 -04:00
Glen Fernandes
71ef7850ab Add examples back to documentation 2017-03-13 10:59:58 -04:00
Glen Fernandes
40c0ddcbd6 Merge pull request #36 from boostorg/develop
Merge documentation changes
2017-03-10 13:32:44 -05:00
Glen Fernandes
687d31b7c8 Update documentation in make_unique.html 2017-03-10 11:55:06 -05:00
Glen Fernandes
fac6fbe3cf Update documentation in make_shared_array.html 2017-03-10 10:21:21 -05:00
Glen Fernandes
d3b9ee7d24 Merge branch 'develop' 2017-03-06 08:59:03 -05:00
Glen Fernandes
650537da60 Update unit tests for make_unique 2017-03-06 08:36:57 -05:00
Glen Fernandes
324347b9ec Update unit tests for shared array functions 2017-03-06 01:18:16 -05:00
Glen Fernandes
79e675c727 Merge branch 'develop' 2017-03-05 22:09:34 -05:00
Glen Fernandes
6ef791c715 Rename identifiers in allocate and deallocate 2017-03-05 22:07:58 -05:00
Glen Fernandes
15ed558a29 Further simplify alignment logic in allocate 2017-03-05 21:39:22 -05:00
Glen Fernandes
106ada7770 Remove unnecessary helper function 2017-03-05 19:13:26 -05:00
Glen Fernandes
9f70f6619f Do not rely on size of type_with_alignment 2017-03-05 19:10:56 -05:00
Glen Fernandes
494c0cd2c0 Merge branch 'develop' 2017-03-04 23:43:49 -05:00
Glen Fernandes
8c058dfeee Use BOOST_NOEXCEPT_OR_NOTHROW over BOOST_NOEXCEPT 2017-03-04 23:36:24 -05:00
Glen Fernandes
0807efa91a Merge branch 'develop' 2017-03-04 01:09:35 -05:00
Glen Fernandes
bea0fc4a37 Update make_shared_array documentation 2017-03-04 01:07:43 -05:00
Glen Fernandes
3f21bac34f Merge pull request #35 from boostorg/develop
Merge develop
2017-03-03 13:23:35 -05:00
Peter Dimov
7beb91fd0e Merge branch 'glenfe-allocate_shared' into develop 2017-03-02 06:06:35 +02:00
Glen Fernandes
d1bb87d34e Remove the now unnecessary allocate hint parameter 2017-03-01 13:15:23 -05:00
Glen Fernandes
7570340d70 Add test for allocator construct usage 2017-03-01 13:03:14 -05:00
Glen Fernandes
b42acf77b3 Only use allocator construct/destroy for value_type, not shared_count 2017-03-01 06:18:06 -05:00
Peter Dimov
1f9c63c34f Fix MSVC parsing problem in allocate_shared_array 2017-03-01 12:08:17 +02:00
Peter Dimov
f8524c42a8 Add test for a MSVC parsing problem in make_shared 2017-03-01 12:02:30 +02:00
Glen Fernandes
52fbf70879 Special case aligning up sizes and change integral constant style 2017-02-28 19:23:02 -05:00
Glen Fernandes
fb59cd574e Copy rebind allocator before impl destruct 2017-02-28 07:21:49 -05:00
Glen Fernandes
c749052162 Merge pull request #33 from glenfe/allocate_shared_array
Revise make_shared and allocate_shared for arrays
2017-02-28 04:26:20 -05:00
Glen Fernandes
970e88897c Revise make_shared and allocate_shared for arrays 2017-02-28 03:47:09 -05:00
Peter Dimov
609de5d711 Merge branch 'develop' 2017-02-25 19:30:08 +02:00
Peter Dimov
d641b9c436 Merge pull request #32 from pgroke-dt/z_OS_XL_C++_support
don't define BOOST_SP_HAS_SYNC for z/OS XL C/C++ compiler
2017-02-25 13:38:33 +02:00
Paul Groke
3bb4e4d2df don't define BOOST_SP_HAS_SYNC for z/OS XL C/C++ compiler 2017-02-25 05:44:04 +01:00
Peter Dimov
5ab9a77d50 Merge branch 'develop'
Conflicts:
	.travis.yml
2017-02-16 15:37:26 +02:00
Peter Dimov
b80ffbeb3d Remove tools/inspect from appveyor.yml 2017-02-16 15:35:53 +02:00
Peter Dimov
5f8c2a7ee0 Remove tools/inspect from .travis.yml 2017-02-16 15:34:51 +02:00
Peter Dimov
94634cb853 Only install necessary packages in .travis.yml to speed it up 2017-02-07 01:50:59 +02:00
Peter Dimov
17a07a228e Add platform matrix to .travis.yml 2017-02-06 21:32:51 +02:00
Peter Dimov
d4bc4c9733 Add platform matrix to .travis.yml 2017-02-06 16:51:33 +02:00
Peter Dimov
1d7f6b9bfd Merge pull request #31 from gongminmin/ClangC2
Fix compiling problems under ClangC2.
2017-02-06 15:26:24 +02:00
Minmin Gong
d718d21d6b Fix compiling problems under ClangC2. 2017-02-05 15:51:42 -08:00
Peter Dimov
39b14fa0d6 Merge branch 'develop' 2017-01-01 04:10:26 +02:00
Peter Dimov
19147212a9 Merge pull request #29 from cdglove/rvalue_casts
Add rvalue versions of static_pointer_cast, const_pointer_cast, dynamic_pointer_cast, reinterpret_pointer_cast.
2016-12-12 05:45:17 +02:00
Peter Dimov
53928bcc12 Merge pull request #30 from cdglove/reinterpret_pointer_cast_test
Add explicit tests for reinterpret_pointer_cast
2016-12-12 05:42:29 +02:00
Chris Glover
9e568dad6e Add explicit tests for reinterpret_pointer_cast. Based on existing pointer_cast tests in shared_ptr_test.cpp 2016-12-11 22:18:57 -05:00
Chris Glover
ebd1788f2c Add test for rvalue reinterpret_pointer_cast. 2016-12-11 21:18:18 -05:00
Chris Glover
3e2ac10e94 Add rvalue versions of static_pointer_cast, const_pointer_cast, dynamic_pointer_cast, reinterpret_pointer_cast.
Aligns with proposed addition to std:: here: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0390r0.htm
2016-12-11 15:38:34 -05:00
Peter Dimov
61075bb9df Move extra files to extras/ as the src/ and test/ directories are scanned for dependencies 2016-11-10 15:04:21 +02:00
Peter Dimov
3e61a63f60 Use throw() in place of noexcept on msvc-11.0,12.0 for the standard nothrow traits 2016-11-08 18:42:51 +02:00
Peter Dimov
a7fbb0a841 Do not use components removed in C++17 (auto_ptr, binary_function) 2016-11-06 15:35:46 +02:00
Peter Dimov
1e9e2ed6aa Merge branch 'develop' 2016-09-30 16:06:15 +03:00
Peter Dimov
bdc19dee01 Merge branch 'feature/unique_ptr_casts' into develop 2016-09-10 21:09:05 +03:00
Peter Dimov
3aa720714d Update documentation. 2016-09-10 20:57:35 +03:00
Peter Dimov
94a04e57fb Merge branch 'develop' into feature/unique_ptr_casts 2016-09-10 20:28:14 +03:00
Peter Dimov
776b33ec09 Merge pull request #26 from muggenhor/make_shared-constructor-forwarding
Add test for make_shared's move-emulation support
2016-09-10 20:27:12 +03:00
Peter Dimov
5595622c3e Relax dynamic_cast check; rephrase const_cast test to be more MSVC-friendly. 2016-09-10 20:18:37 +03:00
Peter Dimov
2ae3e4ba44 Remove static_pointer_cast restriction; test dynamic cross cast. 2016-09-10 20:07:47 +03:00
Giel van Schijndel
b5498d944e Add test for make_shared's move-emulation support
This tests the functionality added with PR boostorg/smart_ptr#24.

Specifically this tests that passing moveable-only types to
constructors is possible through make_shared. Note that real rvalue's
still cannot be passed that way on C++03 unfortunately because there's
no generic way of accomplishing that with current move emulation.
2016-09-10 18:38:37 +02:00
Peter Dimov
8fac3c9f2f Add one more dynamic_cast test, fold back _test3 into test2. 2016-09-10 19:15:47 +03:00
Peter Dimov
a14515a364 Add negative pointer cast tests. 2016-09-10 18:43:22 +03:00
Peter Dimov
190c06e25d Add tests for unique_ptr casts. 2016-09-10 17:55:14 +03:00
Peter Dimov
62a8a9d6cc Merge branch 'karo/unique_ptr_casts' of https://github.com/koraa/smart_ptr into feature/unique_ptr_casts 2016-09-10 14:48:26 +03:00
Peter Dimov
48401806f4 Merge branch 'make_shared-constructor-forwarding' of https://github.com/muggenhor/boost-smart_ptr into develop 2016-09-10 14:24:52 +03:00
Peter Dimov
02de302774 Merge branch 'suppress-weak-vtables-warning' of https://github.com/Kojoley/smart_ptr into develop 2016-09-10 13:55:20 +03:00
Peter Dimov
80597b379e Copy repo instead of doing a checkout, for pull requests. 2016-09-10 13:47:05 +03:00
Peter Dimov
840e9fc96e Apply MIPS16 patch from ticket #12418 2016-09-02 20:13:15 +03:00
Nikita Kniazev
70367e848e Suppress weak vtables warnings 2016-08-31 17:32:09 +03:00
Peter Dimov
e8daeaee1c Enable Travis notifications on success 2016-08-28 22:37:10 +03:00
Peter Dimov
3b9ae9fd5f Switch from msvc-12.0 to msvc-14.0 on Appveyor 2016-08-28 22:01:59 +03:00
Peter Dimov
20fedcff2c Use <atomic> by default when BOOST_NO_CXX11_HDR_ATOMIC is not defined 2016-08-28 21:28:21 +03:00
Giel van Schijndel
de38a735ea boost::make_shared: use Constructor Forwarding on C++03
Use Boost.Move's move emulation and documented Constructor Forwarding
technique to provide (partial) constructor forwarding on compilers that
don't support r-value references.

This allows constructing types taking movable-but-not-copyable types as
constructor arguments. Additionally it's generally more efficient for
movable-and-copyable types, but that's just a nice-to-have.
2016-07-25 15:02:57 +02:00
Karolin Varner
ce52fb1045 pointer_casts with move semantics for unique_ptr 2016-06-06 16:08:26 +02:00
Karolin Varner
6b787f1cec Add overloads for std::shared_ptr to pointer casts 2016-06-06 14:51:44 +02:00
Karolin Varner
2185c4f005 Fix a documentation typo 2016-06-05 23:32:45 +02:00
Karolin Varner
6d5f554baa Reuse code for plain and shared in ptr cast tests 2016-06-05 23:32:45 +02:00
Peter Dimov
f3279d24b4 Merge branch 'develop' 2016-05-21 22:45:34 +03:00
Peter Dimov
c87b6e8af8 Add .travis.yml 2016-05-21 22:07:23 +03:00
Peter Dimov
aaded4f85c Merge branch 'develop' 2016-05-21 20:48:54 +03:00
Peter Dimov
eb1a002e34 Create README.md 2016-05-21 19:34:15 +03:00
Peter Dimov
3304a56101 Merge branch 'develop' 2016-05-21 18:55:46 +03:00
Peter Dimov
181f38682f Add appveyor.yml. 2016-05-21 18:23:41 +03:00
Peter Dimov
5b1a8412c3 Merge branch 'develop' 2016-05-21 01:11:22 +03:00
Peter Dimov
e52905cf3c Add intrusive_ptr converting move assignment. 2016-05-17 18:43:41 +03:00
Peter Dimov
b7f99ceba6 Update intrusive_ptr_move_test with converting move construction. 2016-05-17 18:36:50 +03:00
Peter Dimov
a7ade6f062 Remove unnecessary #ifdef 2016-05-17 18:34:18 +03:00
Peter Dimov
097d2e9bf9 Merge branch 'intrusive_ptr_move' of https://github.com/jtwang83/smart_ptr into develop 2016-05-17 18:29:29 +03:00
Peter Dimov
d44a78d671 Merge branch 'develop' 2016-05-17 18:10:45 +03:00
Peter Dimov
582eb63cb3 Merge pull request #18 from joachim-faulhaber/smart_ptr_patches_1_59_0
Warning fixes: Conversion and unused parameter warnings
2016-05-17 18:07:32 +03:00
Peter Dimov
181b449a57 Merge branch 'develop' 2016-05-17 18:01:36 +03:00
Peter Dimov
da8de3e95b Merge pull request #19 from Lastique/patch-4
Make the default  intrusive_ptr constructor constexpr
2016-05-17 17:59:10 +03:00
Peter Dimov
6c27833099 Merge branch 'develop' 2016-05-17 17:46:15 +03:00
Glen Fernandes
83e6e00456 Merge branch 'develop' 2016-04-13 08:01:21 -04:00
Peter Dimov
522f6c1869 Add more aliasing move test cases, add alias move reset 2016-04-13 14:31:43 +03:00
Peter Dimov
cd8de9d4a6 Merge branch 'move-alias' of https://github.com/uecasm/smart_ptr into develop 2016-04-13 13:29:50 +03:00
Glen Fernandes
e26542272d Use remove_reference in make_unique implementation 2016-02-19 08:14:02 -05:00
Glen Fernandes
e13beef5df Fix formatting in headers and tests 2016-02-19 08:13:54 -05:00
Glen Fernandes
8298952a12 Update unit tests for make_shared/allocate_shared for arrays
Before pending refactor of make_shared and allocate_shared for arrays.
2016-02-19 08:13:41 -05:00
Glen Fernandes
821925c536 Refactor make_unique implementations
Before the pending refactor of make_shared/allocate_shared for arrays.
2016-02-19 08:13:27 -05:00
Glen Fernandes
427124543b Use remove_reference in make_unique implementation 2016-02-19 08:09:25 -05:00
Peter Dimov
46f00ea993 Fix hash support for shared_ptr<T[]>, <T[N]> 2016-02-08 20:47:52 +02:00
Peter Dimov
4473bf8ec2 Fix hash support for shared_ptr<T[]>, <T[N]> 2015-12-15 19:13:20 +02:00
Glen Fernandes
7a7ac4512e Fix formatting in headers and tests 2015-11-11 01:26:15 -05:00
Glen Fernandes
38b6334e36 Update unit tests for make_shared/allocate_shared for arrays
Before pending refactor of make_shared and allocate_shared for arrays.
2015-11-09 22:35:34 -05:00
Glen Fernandes
7af503d3bb Refactor make_unique implementations
Before the pending refactor of make_shared/allocate_shared for arrays.
2015-11-08 11:02:06 -05:00
Peter Dimov
4db7219c32 Merge branch 'develop' 2015-10-27 20:12:16 +02:00
Ion Gaztañaga
3f17244225 Removed the intrin.h-related part
Removed the commented part as the comment clearly says that VC9 has problems when intrin.h is included.
2015-10-18 19:44:17 +02:00
Ion Gaztañaga
ca93749614 Support MSVC-7.1/ intrin.h available >= MSVC-8.0
-> MSVC 7.1 has no intrin.h and needs to use "#pragma intrinsic".
-> intrin.h available since Visual 2005
2015-10-18 12:51:13 +02:00
Gavin Lambert
05d5a4e9a0 Added shared_ptr aliasing move constructor.
Signed-off-by: Gavin Lambert <github@mirality.co.nz>
2015-10-12 18:19:22 +13:00
Andrey Semashev
970a179ac2 Make the default constructor constexpr 2015-10-05 18:24:52 +03:00
Peter Dimov
a06123eb87 Merge branch 'develop' 2015-09-28 15:51:01 +03:00
Joachim Faulhaber
fd543d3292 Warning fixes: Conversion and unused parameter warnings 2015-09-24 14:53:40 +02:00
Peter Dimov
df90496583 Disable deprecation warnings on g++/clang 2015-09-10 23:45:47 +03:00
Peter Dimov
20ead68473 Merge branch 'develop' 2015-08-18 21:09:05 +03:00
Peter Dimov
79cde147c9 Merge pull request #17 from jzmaddock/patch-1
Disable explicit operator bool on Oracle C++
2015-08-18 20:54:50 +03:00
jzmaddock
abbe975e8f Disable explicit operator bool on Oracle C++
Although Oracle supports this syntax, advanced usage such as:

if(my_shared_ptr && x)

Fail.  Attempts to wokaround by adding additional operator overloads have so far failed.
2015-08-18 18:14:50 +01:00
Peter Dimov
8ba0730686 Merge pull request #16 from eldiener/sleep_fix_2
Change to Sleep declaration for clang on Windows to match Windows imp…
2015-07-23 01:52:03 +03:00
Edward Diener
686efe100b Updated Sleep declaration only includes _mingw.h when needed. 2015-07-22 18:23:43 -04:00
Edward Diener
acb880d8c2 Change to Sleep declaration for clang on Windows to match Windows implementation being used 2015-07-22 06:51:49 -04:00
Edward Diener
1712b87cb6 Added __declspec(dllimport) for Sleep using clang on Windows. 2015-07-21 15:41:35 -04:00
Peter Dimov
f8943703f8 Merge branch 'develop' 2015-06-06 01:40:42 +03:00
Peter Dimov
a42dda0af4 Apply fix for errata 754327 for ARM Cortex-A9 suggested in ticket #11362 2015-06-06 01:40:01 +03:00
Peter Dimov
9b9b6d3ca6 Merge branch 'develop' 2015-05-12 20:13:50 +03:00
Peter Dimov
d875a68ceb Add constructor/assignment taking boost::movelib::unique_ptr 2015-05-04 01:06:42 +03:00
Peter Dimov
8cb2c56556 Merge branch 'develop' 2015-03-20 15:04:59 +02:00
Peter Dimov
290fe82a43 Merge pull request #14 from Bjoe/changes
Fix bug ticket 11131
2015-03-20 03:02:09 +02:00
Jörg Böhme
94824c807f Add missing std:: namespace 2015-03-20 00:23:58 +01:00
Jonathan Wang
334654de06 intrusive_ptr: add converting ctor for intrusive_ptr<U> with move semantics. Analagous to
template <class U> intrusive_ptr(intrusive_ptr<U> const&)
2015-03-15 20:17:55 -04:00
Peter Dimov
0ab0e6eecc Merge branch 'develop' 2015-03-02 16:11:06 +02:00
Peter Dimov
effc9f73d6 Merge pull request #12 from Theodor/size_t_fix_11066
Add <cstddef> include. fixes #11066
2015-03-02 15:53:36 +02:00
Fedor Sergeev
99762e7dde Add <cstddef> include. fixes #11066 2015-03-01 23:14:28 +04:00
Peter Dimov
add539142b Merge branch 'develop' 2015-01-28 13:03:43 +02:00
Peter Dimov
e067fd2cfd Fix comment. 2015-01-28 13:03:23 +02:00
Peter Dimov
212528860a Merge branch 'develop' 2015-01-28 12:52:40 +02:00
Peter Dimov
711c36958a Add an additional weak_from_raw test. 2015-01-28 12:52:10 +02:00
Peter Dimov
7104e7dc7e Add weak_from_this. 2015-01-25 20:10:57 +02:00
Peter Dimov
254bda34b7 Merge branch 'develop' 2015-01-25 18:26:07 +02:00
Peter Dimov
3fd53ced83 Make shared_from_raw and weak_from_raw return consistent values in a constructor, regardless of order, as suggested by Gavin Lambert in #8. 2015-01-22 20:47:01 +02:00
Peter Dimov
75de3dbcf1 Add clang-specific sp_counted_base. 2015-01-22 05:13:27 +02:00
Peter Dimov
7faec4265b Fix conflicts with the I macro in <complex.h>. 2015-01-21 19:55:42 +02:00
Peter Dimov
c81d0806e4 Merge branch 'develop' 2015-01-16 20:53:48 +02:00
Peter Dimov
a74329794c Fix ambiguous 'detail' errors under msvc-8.0. 2015-01-16 20:53:27 +02:00
Peter Dimov
71756350d9 Merge branch 'develop' 2015-01-15 22:00:17 +02:00
Peter Dimov
f65c57d9d2 Fix explicit instantiation regression 2014-11-12 19:04:29 +02:00
Peter Dimov
b1fc261fe6 Merge branch 'develop' 2014-08-21 23:48:32 +03:00
Peter Dimov
aedcf3ccda Merge pull request #11 from danieljames/metadata
Create metadata file.
2014-08-21 13:21:23 +03:00
Daniel James
a1a5999a38 Add metadata file. 2014-08-18 15:10:40 +01:00
Peter Dimov
8afd3bee69 Merge branch 'develop' 2014-08-10 21:24:41 +03:00
Peter Dimov
2a56c73924 Add weak_from_raw_test2.cpp. 2014-08-09 13:50:38 +03:00
Peter Dimov
720ce12a25 Add shared_from_raw_test6.cpp. 2014-08-09 13:42:51 +03:00
Peter Dimov
2be09db523 Merge branch 'develop' 2014-08-09 13:16:34 +03:00
Peter Dimov
de10be8560 Fix sp_nullptr_test for compilers that don't define std::nullptr_t. 2014-08-09 12:28:28 +03:00
Peter Dimov
7b71068b52 Extend nullptr_t workaround to Intel C++. 2014-08-09 00:26:00 +03:00
Peter Dimov
6b562cb5b1 Rename enable_shared_from_raw_test.cpp to weak_from_raw_test.cpp. 2014-08-08 21:28:15 +03:00
Peter Dimov
3d2c230623 Rename esft_constructor_test.cpp to shared_from_raw_test5.cpp. 2014-08-08 21:24:20 +03:00
Axel Ismirlian
553c7994ba Avoid potential conflict between AIX's and Lambda's var.
In ../boost/lambda/detail/lambda_functor_base.hpp there is variable called var that conflicts with an AIX system variable. The entire file (sched.h) does not need to be included only the one function it uses (sched_yield).
2014-08-08 16:03:40 +03:00
Andrey Semashev
280aadfcdb Fix compilation problems with clang
Apparently, clang presents itself as gcc 4.2 even though it supports the final version of rvalue references. Restrict the workaround to gcc only.
2014-08-08 16:03:13 +03:00
Peter Dimov
59ac922a1c Revert "Revert "Fix warnings on gcc 4.4""
This reverts commit d28b0d07fc.
2014-08-08 16:02:08 +03:00
Peter Dimov
8de3e84021 Fix shared_from_raw_test4 failures. 2014-08-06 21:28:03 +03:00
Peter Dimov
bd4f9c239a Add shared_from_raw tests. 2014-08-06 21:07:52 +03:00
Peter Dimov
528195233b Merge branch 'aix_fix' of https://github.com/ibmsoe/smart_ptr into develop 2014-07-30 17:51:32 +03:00
Axel Ismirlian
8c49f5a637 Avoid potential conflict between AIX's and Lambda's var.
In ../boost/lambda/detail/lambda_functor_base.hpp there is variable called var that conflicts with an AIX system variable. The entire file (sched.h) does not need to be included only the one function it uses (sched_yield).
2014-07-30 09:23:21 -05:00
Glen Fernandes
88f0a98d71 Rename member because _CRTDBG_MAP_ALLOC in VS does not allow it
_CRTDBG_MAP_ALLOC has issues with member functions named "free".
2014-07-25 20:33:29 -07:00
Peter Dimov
96d82e0275 Merge pull request #6 from Lastique/patch-3
Fix compilation problems with clang
2014-07-16 16:31:22 +03:00
Andrey Semashev
40387ef654 Fix compilation problems with clang
Apparently, clang presents itself as gcc 4.2 even though it supports the final version of rvalue references. Restrict the workaround to gcc only.
2014-07-16 16:43:35 +04:00
126 changed files with 7341 additions and 3491 deletions

274
.travis.yml Normal file
View File

@@ -0,0 +1,274 @@
# Copyright 2016 Peter Dimov
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
language: cpp
sudo: false
os:
- linux
- osx
branches:
only:
- master
- develop
env:
matrix:
- BOGUS_JOB=true
matrix:
exclude:
- env: BOGUS_JOB=true
include:
- os: linux
env: TOOLSET=gcc COMPILER=g++ CXXSTD=c++03
- os: linux
env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=c++03
addons:
apt:
packages:
- g++-4.7
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=c++11
addons:
apt:
packages:
- g++-4.7
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=c++03
addons:
apt:
packages:
- g++-4.8
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=c++11
addons:
apt:
packages:
- g++-4.8
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=c++03
addons:
apt:
packages:
- g++-4.9
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=c++11
addons:
apt:
packages:
- g++-4.9
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++03
addons:
apt:
packages:
- g++-5
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++11
addons:
apt:
packages:
- g++-5
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++14
addons:
apt:
packages:
- g++-5
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++03
addons:
apt:
packages:
- g++-6
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++11
addons:
apt:
packages:
- g++-6
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++14
addons:
apt:
packages:
- g++-6
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++1z
addons:
apt:
packages:
- g++-6
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++03
- os: linux
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++11
- os: linux
env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=c++03
addons:
apt:
packages:
- clang-3.6
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.6
- os: linux
env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=c++11
addons:
apt:
packages:
- clang-3.6
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.6
- os: linux
env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=c++03
addons:
apt:
packages:
- clang-3.7
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.7
- os: linux
env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=c++11
addons:
apt:
packages:
- clang-3.7
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.7
- os: linux
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++03
addons:
apt:
packages:
- clang-3.8
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.8
- os: linux
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++11
addons:
apt:
packages:
- clang-3.8
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.8
- os: linux
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++14
addons:
apt:
packages:
- clang-3.8
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.8
- os: linux
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++1z
addons:
apt:
packages:
- clang-3.8
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.8
- os: osx
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++03
- os: osx
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++11
- os: osx
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++14
install:
- cd ..
- git clone -b $TRAVIS_BRANCH https://github.com/boostorg/boost.git boost-root
- cd boost-root
- git submodule init libs/align
- git submodule init libs/assert
- git submodule init libs/atomic
- git submodule init libs/config
- git submodule init libs/core
- git submodule init libs/detail
- git submodule init libs/functional
- git submodule init libs/integer
- git submodule init libs/move
- git submodule init libs/predef
- git submodule init libs/preprocessor
- git submodule init libs/static_assert
- git submodule init libs/throw_exception
- git submodule init libs/type_traits
- git submodule init tools/build
- git submodule update
- cp -r $TRAVIS_BUILD_DIR/* libs/smart_ptr
- ./bootstrap.sh
- ./b2 headers
script:
- |-
echo "using $TOOLSET : : $COMPILER : <cxxflags>-std=$CXXSTD ;" > ~/user-config.jam
- ./b2 libs/smart_ptr/test toolset=$TOOLSET
notifications:
email:
on_success: always

6
README.md Normal file
View File

@@ -0,0 +1,6 @@
# Boost.SmartPtr
Branch | Travis | Appveyor
---------|--------|---------
Develop | [![Build Status](https://travis-ci.org/boostorg/smart_ptr.svg?branch=develop)](https://travis-ci.org/boostorg/smart_ptr) | [![Build Status](https://ci.appveyor.com/api/projects/status/github/boostorg/smart_ptr?branch=develop&svg=true)](https://ci.appveyor.com/project/pdimov/smart_ptr)
Master | [![Build Status](https://travis-ci.org/boostorg/smart_ptr.svg?branch=master)](https://travis-ci.org/boostorg/smart_ptr) | [![Build Status](https://ci.appveyor.com/api/projects/status/github/boostorg/smart_ptr?branch=master&svg=true)](https://ci.appveyor.com/project/pdimov/smart_ptr)

41
appveyor.yml Normal file
View File

@@ -0,0 +1,41 @@
# Copyright 2016 Peter Dimov
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
version: 1.0.{build}-{branch}
shallow_clone: true
branches:
only:
- master
- develop
install:
- cd ..
- git clone -b %APPVEYOR_REPO_BRANCH% https://github.com/boostorg/boost.git boost-root
- cd boost-root
- git submodule init libs/align
- git submodule init libs/assert
- git submodule init libs/atomic
- git submodule init libs/config
- git submodule init libs/core
- git submodule init libs/detail
- git submodule init libs/functional
- git submodule init libs/integer
- git submodule init libs/move
- git submodule init libs/predef
- git submodule init libs/preprocessor
- git submodule init libs/static_assert
- git submodule init libs/throw_exception
- git submodule init libs/type_traits
- git submodule init tools/build
- git submodule update
- xcopy /s /e /q %APPVEYOR_BUILD_FOLDER% libs\smart_ptr
- bootstrap
- b2 headers
build: off
test_script:
- b2 libs/smart_ptr/test toolset=msvc-9.0,msvc-10.0,msvc-11.0,msvc-14.0

View File

@@ -2,21 +2,25 @@
<html> <html>
<head> <head>
<title>enable_shared_from_this</title> <title>enable_shared_from_this</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head> </head>
<body text="#000000" bgcolor="#ffffff" link="#0000ff" vlink="#0000ff"> <body text="#000000" bgcolor="#ffffff" link="#0000ff" vlink="#0000ff">
<h1><img height="86" alt="boost.png (6897 bytes)" src="../../boost.png" <h1><img height="86" alt="boost.png (6897 bytes)" src="../../boost.png"
width="277" align="middle" border="0">enable_shared_from_this</h1> width="277" align="middle" border="0" />enable_shared_from_this</h1>
<h2><a name="Purpose">Purpose</a></h2> <h2><a name="Purpose">Purpose</a></h2>
<p> <p>
The header <STRONG>&lt;boost/enable_shared_from_this.hpp&gt;</STRONG> defines The header <code>&lt;boost/enable_shared_from_this.hpp&gt;</code> defines
the class template <STRONG>enable_shared_from_this</STRONG>. It is used as a the class template <code>enable_shared_from_this</code>. It is used as a
base class that allows a <A href="shared_ptr.htm">shared_ptr</A> to the current base class that allows a <a href="shared_ptr.htm">shared_ptr</a> or
object to be obtained from within a member function. a <a href="weak_ptr.htm">weak_ptr</a> to the current object to be obtained
from within a member function.
</p>
<p><code>enable_shared_from_this&lt;T&gt;</code> defines two member functions
called <code>shared_from_this</code> that return a <code>shared_ptr&lt;T&gt;</code>
and <code>shared_ptr&lt;T const&gt;</code>, depending on constness, to <code>this</code>.
It also defines two member functions called <code>weak_from_this</code> that return
a corresponding <code>weak_ptr</code>.
</p> </p>
<P><STRONG>enable_shared_from_this&lt;T&gt;</STRONG> defines two member functions
called <STRONG>shared_from_this</STRONG> that return a <STRONG>shared_ptr&lt;T&gt;</STRONG>
and <STRONG>shared_ptr&lt;T const&gt;</STRONG>, depending on constness, to <STRONG>this</STRONG>.</P>
<h2><a name="Example">Example</a></h2> <h2><a name="Example">Example</a></h2>
<pre> <pre>
#include &lt;boost/enable_shared_from_this.hpp&gt; #include &lt;boost/enable_shared_from_this.hpp&gt;
@@ -41,7 +45,7 @@ int main()
assert(!(p &lt; q || q &lt; p)); // p and q must share ownership assert(!(p &lt; q || q &lt; p)); // p and q must share ownership
} }
</pre> </pre>
<h3><a name="Synopsis">Synopsis</a></h3> <h2><a name="Synopsis">Synopsis</a></h2>
<pre> <pre>
namespace boost namespace boost
{ {
@@ -52,34 +56,55 @@ public:
shared_ptr&lt;T&gt; shared_from_this(); shared_ptr&lt;T&gt; shared_from_this();
shared_ptr&lt;T const&gt; shared_from_this() const; shared_ptr&lt;T const&gt; shared_from_this() const;
weak_ptr&lt;T&gt; weak_from_this() noexcept;
weak_ptr&lt;T const&gt; weak_from_this() const noexcept;
} }
} }
</pre> </pre>
<h4>template&lt;class T&gt; shared_ptr&lt;T&gt; <h4><code>template&lt;class T&gt; shared_ptr&lt;T&gt;
enable_shared_from_this&lt;T&gt;::shared_from_this();</h4> enable_shared_from_this&lt;T&gt;::shared_from_this();</code></h4>
<h4>template&lt;class T&gt; shared_ptr&lt;T const&gt; <h4><code>template&lt;class T&gt; shared_ptr&lt;T const&gt;
enable_shared_from_this&lt;T&gt;::shared_from_this() const;</h4> enable_shared_from_this&lt;T&gt;::shared_from_this() const;</code></h4>
<blockquote> <blockquote>
<p> <p>
<b>Requires:</b> <STRONG>enable_shared_from_this&lt;T&gt;</STRONG> must be an <b>Requires:</b> <code>enable_shared_from_this&lt;T&gt;</code> must be an
accessible base class of <b>T</b>. <STRONG>*this</STRONG> must be a subobject accessible base class of <code>T</code>. <code>*this</code> must be a subobject
of an instance <STRONG>t</STRONG> of type <STRONG>T</STRONG> . There must exist of an instance <code>t</code> of type <code>T</code>.
at least one <STRONG>shared_ptr</STRONG> instance <STRONG>p</STRONG> that <EM>owns</EM>
<STRONG>t</STRONG>.
</p> </p>
<p> <p>
<b>Returns:</b> A <b>shared_ptr&lt;T&gt;</b> instance <b>r</b> that shares <b>Returns:</b> If a <code>shared_ptr</code> instance <code>p</code> that <em>owns</em>
ownership with <b>p</b>. <code>t</code> exists, a <code>shared_ptr&lt;T&gt;</code> instance <code>r</code> that shares
ownership with <code>p</code>.
</p> </p>
<p> <p>
<b>Postconditions:</b> <tt>r.get() == this</tt>. <b>Postconditions:</b> <code>r.get() == this</code>.
</p>
<p>
<b>Throws:</b> <code>bad_weak_ptr</code> when no <code>shared_ptr</code> <em>owns</em> <code>*this</code>.
</p> </p>
</blockquote> </blockquote>
<p>$Date$</p> <h4><code>template&lt;class T&gt; weak_ptr&lt;T&gt;
enable_shared_from_this&lt;T&gt;::weak_from_this() noexcept;</code></h4>
<h4><code>template&lt;class T&gt; weak_ptr&lt;T const&gt;
enable_shared_from_this&lt;T&gt;::weak_from_this() const noexcept;</code></h4>
<blockquote>
<p>
<b>Requires:</b> <code>enable_shared_from_this&lt;T&gt;</code> must be an
accessible base class of <code>T</code>. <code>*this</code> must be a subobject
of an instance <code>t</code> of type <code>T</code>.
</p>
<p>
<b>Returns:</b> If a <code>shared_ptr</code> instance <code>p</code> that <em>owns</em>
<code>t</code> exists or has existed in the past, a <code>weak_ptr&lt;T&gt;</code> instance
<code>r</code> that shares ownership with <code>p</code>. Otherwise, an empty <code>weak_ptr</code>.
</p>
</blockquote>
<hr />
<p> <p>
<small>Copyright &copy; 2002, 2003 by Peter Dimov. Distributed under the Boost Software License, Version <small>Copyright &copy; 2002, 2003, 2015 by Peter Dimov. Distributed under the Boost Software License, Version
1.0. See accompanying file <A href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</A> or 1.0. See accompanying file <a href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or
copy at <A href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</A>.</small></p> copy at <a href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</a>.</small></p>
</body> </body>
</html> </html>

View File

@@ -1,11 +1,10 @@
/* /*
* Copyright (c) 2014 Glen Joseph Fernandes Copyright 2014 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License, Distributed under the Boost Software License, Version 1.0.
* Version 1.0. (See accompanying file LICENSE_1_0.txt (http://www.boost.org/LICENSE_1_0.txt)
* or copy at http://boost.org/LICENSE_1_0.txt) */
*/
#ifndef BOOST_MAKE_UNIQUE_HPP_INCLUDED #ifndef BOOST_MAKE_UNIQUE_HPP_INCLUDED
#define BOOST_MAKE_UNIQUE_HPP_INCLUDED #define BOOST_MAKE_UNIQUE_HPP_INCLUDED

View File

@@ -10,6 +10,8 @@
#ifndef BOOST_POINTER_CAST_HPP #ifndef BOOST_POINTER_CAST_HPP
#define BOOST_POINTER_CAST_HPP #define BOOST_POINTER_CAST_HPP
#include <boost/config.hpp>
namespace boost { namespace boost {
//static_pointer_cast overload for raw pointers //static_pointer_cast overload for raw pointers
@@ -42,4 +44,78 @@ inline T* reinterpret_pointer_cast(U *ptr)
} // namespace boost } // namespace boost
#if !defined( BOOST_NO_CXX11_SMART_PTR )
#include <boost/type_traits/has_virtual_destructor.hpp>
#include <boost/static_assert.hpp>
#include <memory>
namespace boost {
//static_pointer_cast overload for std::shared_ptr
using std::static_pointer_cast;
//dynamic_pointer_cast overload for std::shared_ptr
using std::dynamic_pointer_cast;
//const_pointer_cast overload for std::shared_ptr
using std::const_pointer_cast;
//reinterpret_pointer_cast overload for std::shared_ptr
template<class T, class U> std::shared_ptr<T> reinterpret_pointer_cast(const std::shared_ptr<U> & r ) BOOST_NOEXCEPT
{
(void) reinterpret_cast< T* >( static_cast< U* >( 0 ) );
typedef typename std::shared_ptr<T>::element_type E;
E * p = reinterpret_cast< E* >( r.get() );
return std::shared_ptr<T>( r, p );
}
//static_pointer_cast overload for std::unique_ptr
template<class T, class U> std::unique_ptr<T> static_pointer_cast( std::unique_ptr<U> && r ) BOOST_NOEXCEPT
{
(void) static_cast< T* >( static_cast< U* >( 0 ) );
typedef typename std::unique_ptr<T>::element_type E;
return std::unique_ptr<T>( static_cast<E*>( r.release() ) );
}
//dynamic_pointer_cast overload for std::unique_ptr
template<class T, class U> std::unique_ptr<T> dynamic_pointer_cast( std::unique_ptr<U> && r ) BOOST_NOEXCEPT
{
(void) dynamic_cast< T* >( static_cast< U* >( 0 ) );
BOOST_STATIC_ASSERT_MSG( boost::has_virtual_destructor<T>::value, "The target of dynamic_pointer_cast must have a virtual destructor." );
T * p = dynamic_cast<T*>( r.get() );
if( p ) r.release();
return std::unique_ptr<T>( p );
}
//const_pointer_cast overload for std::unique_ptr
template<class T, class U> std::unique_ptr<T> const_pointer_cast( std::unique_ptr<U> && r ) BOOST_NOEXCEPT
{
(void) const_cast< T* >( static_cast< U* >( 0 ) );
typedef typename std::unique_ptr<T>::element_type E;
return std::unique_ptr<T>( const_cast<E*>( r.release() ) );
}
//reinterpret_pointer_cast overload for std::unique_ptr
template<class T, class U> std::unique_ptr<T> reinterpret_pointer_cast( std::unique_ptr<U> && r ) BOOST_NOEXCEPT
{
(void) reinterpret_cast< T* >( static_cast< U* >( 0 ) );
typedef typename std::unique_ptr<T>::element_type E;
return std::unique_ptr<T>( reinterpret_cast<E*>( r.release() ) );
}
} // namespace boost
#endif // #if !defined( BOOST_NO_CXX11_SMART_PTR )
#endif //BOOST_POINTER_CAST_HPP #endif //BOOST_POINTER_CAST_HPP

File diff suppressed because it is too large Load Diff

View File

@@ -36,6 +36,11 @@ namespace boost
# pragma option push -pc # pragma option push -pc
#endif #endif
#if defined(__clang__)
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Wweak-vtables"
#endif
class bad_weak_ptr: public std::exception class bad_weak_ptr: public std::exception
{ {
public: public:
@@ -46,6 +51,10 @@ public:
} }
}; };
#if defined(__clang__)
# pragma clang diagnostic pop
#endif
#if defined(__BORLANDC__) && __BORLANDC__ <= 0x564 #if defined(__BORLANDC__) && __BORLANDC__ <= 0x564
# pragma option pop # pragma option pop
#endif #endif

View File

@@ -1,318 +0,0 @@
/*
* Copyright (c) 2012-2014 Glen Joseph Fernandes
* glenfe at live dot com
*
* Distributed under the Boost Software License,
* Version 1.0. (See accompanying file LICENSE_1_0.txt
* or copy at http://boost.org/LICENSE_1_0.txt)
*/
#ifndef BOOST_SMART_PTR_DETAIL_ARRAY_ALLOCATOR_HPP
#define BOOST_SMART_PTR_DETAIL_ARRAY_ALLOCATOR_HPP
#include <boost/align/align.hpp>
#include <boost/smart_ptr/detail/array_traits.hpp>
#include <boost/smart_ptr/detail/array_utility.hpp>
#include <boost/type_traits/alignment_of.hpp>
namespace boost {
namespace detail {
struct ms_init_tag { };
struct ms_noinit_tag { };
template<class T>
struct ms_allocator_state;
template<class T>
struct ms_allocator_state<T[]> {
typedef typename array_base<T>::type type;
ms_allocator_state(std::size_t size_,
type** result_)
: size(size_ * array_total<T>::size),
result(result_) {
}
std::size_t size;
union {
type** result;
type* object;
};
};
template<class T, std::size_t N>
struct ms_allocator_state<T[N]> {
typedef typename array_base<T>::type type;
ms_allocator_state(type** result_)
: result(result_) {
}
enum {
size = array_total<T[N]>::size
};
union {
type** result;
type* object;
};
};
template<class A, class T, class R>
class as_allocator
: public A {
template<class A_, class T_, class R_>
friend class as_allocator;
#if !defined(BOOST_NO_CXX11_ALLOCATOR)
typedef std::allocator_traits<A> AT;
typedef typename AT::template rebind_alloc<char> CA;
typedef typename AT::template rebind_traits<char> CT;
#else
typedef typename A::template rebind<char>::other CA;
#endif
public:
typedef A allocator_type;
#if !defined(BOOST_NO_CXX11_ALLOCATOR)
typedef typename AT::value_type value_type;
typedef typename AT::pointer pointer;
typedef typename AT::const_pointer const_pointer;
typedef typename AT::void_pointer void_pointer;
typedef typename AT::const_void_pointer const_void_pointer;
typedef typename AT::size_type size_type;
typedef typename AT::difference_type difference_type;
#else
typedef typename A::value_type value_type;
typedef typename A::pointer pointer;
typedef typename A::const_pointer const_pointer;
typedef typename A::size_type size_type;
typedef typename A::difference_type difference_type;
typedef typename A::reference reference;
typedef typename A::const_reference const_reference;
typedef void* void_pointer;
typedef const void* const_void_pointer;
#endif
template<class U>
struct rebind {
#if !defined(BOOST_NO_CXX11_ALLOCATOR)
typedef as_allocator<typename AT::
template rebind_alloc<U>, T, R> other;
#else
typedef as_allocator<typename A::
template rebind<U>::other, T, R> other;
#endif
};
typedef typename array_base<T>::type type;
as_allocator(const A& allocator_, type** result)
: A(allocator_),
data(result) {
}
as_allocator(const A& allocator_, std::size_t size,
type** result)
: A(allocator_),
data(size, result) {
}
template<class U>
as_allocator(const as_allocator<U, T, R>& other)
: A(other.allocator()),
data(other.data) {
}
pointer allocate(size_type count, const_void_pointer = 0) {
enum {
M = boost::alignment_of<type>::value
};
std::size_t n1 = count * sizeof(value_type);
std::size_t n2 = data.size * sizeof(type);
std::size_t n3 = n2 + M;
CA ca(allocator());
void* p1 = ca.allocate(n1 + n3);
void* p2 = static_cast<char*>(p1) + n1;
(void)boost::alignment::align(M, n2, p2, n3);
*data.result = static_cast<type*>(p2);
return static_cast<value_type*>(p1);
}
void deallocate(pointer memory, size_type count) {
enum {
M = boost::alignment_of<type>::value
};
std::size_t n1 = count * sizeof(value_type);
std::size_t n2 = data.size * sizeof(type) + M;
char* p1 = reinterpret_cast<char*>(memory);
CA ca(allocator());
ca.deallocate(p1, n1 + n2);
}
const A& allocator() const {
return static_cast<const A&>(*this);
}
A& allocator() {
return static_cast<A&>(*this);
}
void set(type* memory) {
data.object = memory;
}
void operator()() {
if (data.object) {
R tag;
release(tag);
}
}
private:
void release(ms_init_tag) {
#if !defined(BOOST_NO_CXX11_ALLOCATOR)
as_destroy(allocator(), data.object, data.size);
#else
ms_destroy(data.object, data.size);
#endif
}
void release(ms_noinit_tag) {
ms_destroy(data.object, data.size);
}
ms_allocator_state<T> data;
};
template<class A1, class A2, class T, class R>
bool operator==(const as_allocator<A1, T, R>& a1,
const as_allocator<A2, T, R>& a2) {
return a1.allocator() == a2.allocator();
}
template<class A1, class A2, class T, class R>
bool operator!=(const as_allocator<A1, T, R>& a1,
const as_allocator<A2, T, R>& a2) {
return a1.allocator() != a2.allocator();
}
template<class T, class Y = char>
class ms_allocator;
template<class T, class Y>
class ms_allocator {
template<class T_, class Y_>
friend class ms_allocator;
public:
typedef typename array_base<T>::type type;
typedef Y value_type;
typedef Y* pointer;
typedef const Y* const_pointer;
typedef std::size_t size_type;
typedef ptrdiff_t difference_type;
typedef Y& reference;
typedef const Y& const_reference;
template<class U>
struct rebind {
typedef ms_allocator<T, U> other;
};
ms_allocator(type** result)
: data(result) {
}
ms_allocator(std::size_t size, type** result)
: data(size, result) {
}
template<class U>
ms_allocator(const ms_allocator<T, U>& other)
: data(other.data) {
}
pointer allocate(size_type count, const void* = 0) {
enum {
M = boost::alignment_of<type>::value
};
std::size_t n1 = count * sizeof(Y);
std::size_t n2 = data.size * sizeof(type);
std::size_t n3 = n2 + M;
void* p1 = ::operator new(n1 + n3);
void* p2 = static_cast<char*>(p1) + n1;
(void)boost::alignment::align(M, n2, p2, n3);
*data.result = static_cast<type*>(p2);
return static_cast<Y*>(p1);
}
void deallocate(pointer memory, size_type) {
void* p1 = memory;
::operator delete(p1);
}
#if defined(BOOST_NO_CXX11_ALLOCATOR)
pointer address(reference value) const {
return &value;
}
const_pointer address(const_reference value) const {
return &value;
}
size_type max_size() const {
enum {
N = static_cast<std::size_t>(-1) / sizeof(Y)
};
return N;
}
void construct(pointer memory, const_reference value) {
void* p1 = memory;
::new(p1) Y(value);
}
void destroy(pointer memory) {
(void)memory;
memory->~Y();
}
#endif
void set(type* memory) {
data.object = memory;
}
void operator()() {
if (data.object) {
ms_destroy(data.object, data.size);
}
}
private:
ms_allocator_state<T> data;
};
template<class T, class Y1, class Y2>
bool operator==(const ms_allocator<T, Y1>&,
const ms_allocator<T, Y2>&) {
return true;
}
template<class T, class Y1, class Y2>
bool operator!=(const ms_allocator<T, Y1>&,
const ms_allocator<T, Y2>&) {
return false;
}
class ms_in_allocator_tag {
public:
void operator()(const void*) {
}
};
}
}
#endif

View File

@@ -1,67 +0,0 @@
/*
* Copyright (c) 2014 Glen Joseph Fernandes
* glenfe at live dot com
*
* Distributed under the Boost Software License,
* Version 1.0. (See accompanying file LICENSE_1_0.txt
* or copy at http://boost.org/LICENSE_1_0.txt)
*/
#ifndef BOOST_SMART_PTR_DETAIL_ARRAY_COUNT_IMPL_HPP
#define BOOST_SMART_PTR_DETAIL_ARRAY_COUNT_IMPL_HPP
#include <boost/smart_ptr/detail/array_allocator.hpp>
#include <boost/smart_ptr/detail/sp_counted_impl.hpp>
namespace boost {
namespace detail {
template<class P, class A>
class sp_counted_impl_pda<P, ms_in_allocator_tag, A>
: public sp_counted_base {
typedef ms_in_allocator_tag D;
typedef sp_counted_impl_pda<P, D, A> Y;
public:
sp_counted_impl_pda(P, D, const A& allocator_)
: allocator(allocator_) {
}
virtual void dispose() {
allocator();
}
virtual void destroy() {
#if !defined(BOOST_NO_CXX11_ALLOCATOR)
typedef typename std::allocator_traits<A>::
template rebind_alloc<Y> YA;
typedef typename std::allocator_traits<A>::
template rebind_traits<Y> YT;
#else
typedef typename A::template rebind<Y>::other YA;
#endif
YA a1(allocator);
#if !defined(BOOST_NO_CXX11_ALLOCATOR)
YT::destroy(a1, this);
YT::deallocate(a1, this, 1);
#else
this->~Y();
a1.deallocate(this, 1);
#endif
}
virtual void* get_deleter(const sp_typeinfo&) {
return &reinterpret_cast<char&>(allocator);
}
virtual void* get_untyped_deleter() {
return &reinterpret_cast<char&>(allocator);
}
private:
sp_counted_impl_pda(const sp_counted_impl_pda&);
sp_counted_impl_pda& operator=(const sp_counted_impl_pda&);
A allocator;
};
}
}
#endif

View File

@@ -1,60 +0,0 @@
/*
* Copyright (c) 2012-2014 Glen Joseph Fernandes
* glenfe at live dot com
*
* Distributed under the Boost Software License,
* Version 1.0. (See accompanying file LICENSE_1_0.txt
* or copy at http://boost.org/LICENSE_1_0.txt)
*/
#ifndef BOOST_SMART_PTR_DETAIL_ARRAY_TRAITS_HPP
#define BOOST_SMART_PTR_DETAIL_ARRAY_TRAITS_HPP
#include <boost/type_traits/remove_cv.hpp>
namespace boost {
namespace detail {
template<class T>
struct array_base {
typedef typename boost::remove_cv<T>::type type;
};
template<class T>
struct array_base<T[]> {
typedef typename array_base<T>::type type;
};
template<class T, std::size_t N>
struct array_base<T[N]> {
typedef typename array_base<T>::type type;
};
template<class T>
struct array_total {
enum {
size = 1
};
};
template<class T, std::size_t N>
struct array_total<T[N]> {
enum {
size = N * array_total<T>::size
};
};
template<class T>
struct array_inner;
template<class T>
struct array_inner<T[]> {
typedef T type;
};
template<class T, std::size_t N>
struct array_inner<T[N]> {
typedef T type;
};
}
}
#endif

View File

@@ -1,214 +0,0 @@
/*
* Copyright (c) 2012-2014 Glen Joseph Fernandes
* glenfe at live dot com
*
* Distributed under the Boost Software License,
* Version 1.0. (See accompanying file LICENSE_1_0.txt
* or copy at http://boost.org/LICENSE_1_0.txt)
*/
#ifndef BOOST_SMART_PTR_DETAIL_ARRAY_UTILITY_HPP
#define BOOST_SMART_PTR_DETAIL_ARRAY_UTILITY_HPP
#include <boost/config.hpp>
#include <boost/type_traits/has_trivial_constructor.hpp>
#include <boost/type_traits/has_trivial_destructor.hpp>
#if !defined(BOOST_NO_CXX11_ALLOCATOR)
#include <memory>
#endif
namespace boost {
namespace detail {
typedef boost::true_type ms_is_trivial;
typedef boost::false_type ms_no_trivial;
template<class T>
inline void ms_destroy(T*, std::size_t, ms_is_trivial) {
}
template<class T>
inline void ms_destroy(T* memory, std::size_t size, ms_no_trivial) {
for (std::size_t i = size; i > 0;) {
memory[--i].~T();
}
}
template<class T>
inline void ms_destroy(T* memory, std::size_t size) {
boost::has_trivial_destructor<T> trivial;
ms_destroy(memory, size, trivial);
}
template<class T>
inline void ms_init(T* memory, std::size_t size, ms_is_trivial) {
for (std::size_t i = 0; i < size; i++) {
void* p1 = memory + i;
::new(p1) T();
}
}
template<class T>
inline void ms_init(T* memory, std::size_t size, ms_no_trivial) {
#if !defined(BOOST_NO_EXCEPTIONS)
std::size_t i = 0;
try {
for (; i < size; i++) {
void* p1 = memory + i;
::new(p1) T();
}
} catch (...) {
ms_destroy(memory, i);
throw;
}
#else
for (std::size_t i = 0; i < size; i++) {
void* p1 = memory + i;
::new(p1) T();
}
#endif
}
template<class T>
inline void ms_init(T* memory, std::size_t size) {
boost::has_trivial_default_constructor<T> trivial;
ms_init(memory, size, trivial);
}
template<class T, std::size_t N>
inline void ms_init(T* memory, std::size_t size, const T* list) {
#if !defined(BOOST_NO_EXCEPTIONS)
std::size_t i = 0;
try {
for (; i < size; i++) {
void* p1 = memory + i;
::new(p1) T(list[i % N]);
}
} catch (...) {
ms_destroy(memory, i);
throw;
}
#else
for (std::size_t i = 0; i < size; i++) {
void* p1 = memory + i;
::new(p1) T(list[i % N]);
}
#endif
}
#if !defined(BOOST_NO_CXX11_ALLOCATOR)
template<class T, class A>
inline void as_destroy(const A& allocator, T* memory,
std::size_t size) {
typedef typename std::allocator_traits<A>::
template rebind_alloc<T> TA;
typedef typename std::allocator_traits<A>::
template rebind_traits<T> TT;
TA a2(allocator);
for (std::size_t i = size; i > 0;) {
TT::destroy(a2, &memory[--i]);
}
}
template<class T, class A>
inline void as_init(const A& allocator, T* memory, std::size_t size,
ms_is_trivial) {
typedef typename std::allocator_traits<A>::
template rebind_alloc<T> TA;
typedef typename std::allocator_traits<A>::
template rebind_traits<T> TT;
TA a2(allocator);
for (std::size_t i = 0; i < size; i++) {
TT::construct(a2, memory + i);
}
}
template<class T, class A>
inline void as_init(const A& allocator, T* memory, std::size_t size,
ms_no_trivial) {
typedef typename std::allocator_traits<A>::
template rebind_alloc<T> TA;
typedef typename std::allocator_traits<A>::
template rebind_traits<T> TT;
TA a2(allocator);
#if !defined(BOOST_NO_EXCEPTIONS)
std::size_t i = 0;
try {
for (; i < size; i++) {
TT::construct(a2, memory + i);
}
} catch (...) {
as_destroy(a2, memory, i);
throw;
}
#else
for (std::size_t i = 0; i < size; i++) {
TT::construct(a2, memory + i);
}
#endif
}
template<class T, class A>
inline void as_init(const A& allocator, T* memory, std::size_t size) {
boost::has_trivial_default_constructor<T> trivial;
as_init(allocator, memory, size, trivial);
}
template<class T, class A, std::size_t N>
inline void as_init(const A& allocator, T* memory, std::size_t size,
const T* list) {
typedef typename std::allocator_traits<A>::
template rebind_alloc<T> TA;
typedef typename std::allocator_traits<A>::
template rebind_traits<T> TT;
TA a2(allocator);
#if !defined(BOOST_NO_EXCEPTIONS)
std::size_t i = 0;
try {
for (; i < size; i++) {
TT::construct(a2, memory + i, list[i % N]);
}
} catch (...) {
as_destroy(a2, memory, i);
throw;
}
#else
for (std::size_t i = 0; i < size; i++) {
TT::construct(a2, memory + i, list[i % N]);
}
#endif
}
#endif
template<class T>
inline void ms_noinit(T*, std::size_t, ms_is_trivial) {
}
template<class T>
inline void ms_noinit(T* memory, std::size_t size, ms_no_trivial) {
#if !defined(BOOST_NO_EXCEPTIONS)
std::size_t i = 0;
try {
for (; i < size; i++) {
void* p1 = memory + i;
::new(p1) T;
}
} catch (...) {
ms_destroy(memory, i);
throw;
}
#else
for (std::size_t i = 0; i < size; i++) {
void* p1 = memory + i;
::new(p1) T;
}
#endif
}
template<class T>
inline void ms_noinit(T* memory, std::size_t size) {
boost::has_trivial_default_constructor<T> trivial;
ms_noinit(memory, size, trivial);
}
}
}
#endif

View File

@@ -73,6 +73,9 @@
#elif defined( BOOST_DISABLE_THREADS ) && !defined( BOOST_SP_ENABLE_THREADS ) && !defined( BOOST_DISABLE_WIN32 ) #elif defined( BOOST_DISABLE_THREADS ) && !defined( BOOST_SP_ENABLE_THREADS ) && !defined( BOOST_DISABLE_WIN32 )
# include <boost/smart_ptr/detail/atomic_count_nt.hpp> # include <boost/smart_ptr/detail/atomic_count_nt.hpp>
#elif !defined( BOOST_NO_CXX11_HDR_ATOMIC )
# include <boost/smart_ptr/detail/atomic_count_std_atomic.hpp>
#elif defined( __GNUC__ ) && ( defined( __i386__ ) || defined( __x86_64__ ) ) && !defined( __PATHSCALE__ ) #elif defined( __GNUC__ ) && ( defined( __i386__ ) || defined( __x86_64__ ) ) && !defined( __PATHSCALE__ )
# include <boost/smart_ptr/detail/atomic_count_gcc_x86.hpp> # include <boost/smart_ptr/detail/atomic_count_gcc_x86.hpp>

View File

@@ -6,7 +6,8 @@
// See accompanying file LICENSE_1_0.txt or copy at // See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt // http://www.boost.org/LICENSE_1_0.txt
#if !defined( BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS ) && !defined( BOOST_NO_CXX11_NULLPTR ) #if !defined( BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS ) && !defined( BOOST_NO_CXX11_NULLPTR )\
&& !(defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x5130))
explicit operator bool () const BOOST_NOEXCEPT explicit operator bool () const BOOST_NOEXCEPT
{ {

View File

@@ -28,6 +28,7 @@
#include <boost/smart_ptr/bad_weak_ptr.hpp> #include <boost/smart_ptr/bad_weak_ptr.hpp>
#include <boost/smart_ptr/detail/sp_counted_base.hpp> #include <boost/smart_ptr/detail/sp_counted_base.hpp>
#include <boost/smart_ptr/detail/sp_counted_impl.hpp> #include <boost/smart_ptr/detail/sp_counted_impl.hpp>
#include <boost/smart_ptr/detail/sp_disable_deprecated.hpp>
#include <boost/detail/workaround.hpp> #include <boost/detail/workaround.hpp>
// In order to avoid circular dependencies with Boost.TR1 // In order to avoid circular dependencies with Boost.TR1
// we make sure that our include of <memory> doesn't try to // we make sure that our include of <memory> doesn't try to
@@ -40,13 +41,23 @@
# include <new> // std::bad_alloc # include <new> // std::bad_alloc
#endif #endif
#if !defined( BOOST_NO_CXX11_SMART_PTR ) #include <boost/core/addressof.hpp>
# include <boost/utility/addressof.hpp>
#if defined( BOOST_SP_DISABLE_DEPRECATED )
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif #endif
namespace boost namespace boost
{ {
namespace movelib
{
template< class T, class D > class unique_ptr;
} // namespace movelib
namespace detail namespace detail
{ {
@@ -63,8 +74,6 @@ template< class D > struct sp_inplace_tag
{ {
}; };
#if !defined( BOOST_NO_CXX11_SMART_PTR )
template< class T > class sp_reference_wrapper template< class T > class sp_reference_wrapper
{ {
public: public:
@@ -93,8 +102,6 @@ template< class D > struct sp_convert_reference< D& >
typedef sp_reference_wrapper< D > type; typedef sp_reference_wrapper< D > type;
}; };
#endif
class weak_count; class weak_count;
class shared_count class shared_count
@@ -242,18 +249,8 @@ public:
try try
{ {
#if !defined( BOOST_NO_CXX11_ALLOCATOR ) pi_ = a2.allocate( 1 );
impl_type * pi = std::allocator_traits<A2>::allocate( a2, 1 );
pi_ = pi;
std::allocator_traits<A2>::construct( a2, pi, p, d, a );
#else
pi_ = a2.allocate( 1, static_cast< impl_type* >( 0 ) );
::new( static_cast< void* >( pi_ ) ) impl_type( p, d, a ); ::new( static_cast< void* >( pi_ ) ) impl_type( p, d, a );
#endif
} }
catch(...) catch(...)
{ {
@@ -269,28 +266,11 @@ public:
#else #else
#if !defined( BOOST_NO_CXX11_ALLOCATOR ) pi_ = a2.allocate( 1 );
impl_type * pi = std::allocator_traits<A2>::allocate( a2, 1 );
pi_ = pi;
#else
pi_ = a2.allocate( 1, static_cast< impl_type* >( 0 ) );
#endif
if( pi_ != 0 ) if( pi_ != 0 )
{ {
#if !defined( BOOST_NO_CXX11_ALLOCATOR )
std::allocator_traits<A2>::construct( a2, pi, p, d, a );
#else
::new( static_cast< void* >( pi_ ) ) impl_type( p, d, a ); ::new( static_cast< void* >( pi_ ) ) impl_type( p, d, a );
#endif
} }
else else
{ {
@@ -326,18 +306,8 @@ public:
try try
{ {
#if !defined( BOOST_NO_CXX11_ALLOCATOR ) pi_ = a2.allocate( 1 );
impl_type * pi = std::allocator_traits<A2>::allocate( a2, 1 );
pi_ = pi;
std::allocator_traits<A2>::construct( a2, pi, p, a );
#else
pi_ = a2.allocate( 1, static_cast< impl_type* >( 0 ) );
::new( static_cast< void* >( pi_ ) ) impl_type( p, a ); ::new( static_cast< void* >( pi_ ) ) impl_type( p, a );
#endif
} }
catch(...) catch(...)
{ {
@@ -353,28 +323,11 @@ public:
#else #else
#if !defined( BOOST_NO_CXX11_ALLOCATOR ) pi_ = a2.allocate( 1 );
impl_type * pi = std::allocator_traits<A2>::allocate( a2, 1 );
pi_ = pi;
#else
pi_ = a2.allocate( 1, static_cast< impl_type* >( 0 ) );
#endif
if( pi_ != 0 ) if( pi_ != 0 )
{ {
#if !defined( BOOST_NO_CXX11_ALLOCATOR )
std::allocator_traits<A2>::construct( a2, pi, p, a );
#else
::new( static_cast< void* >( pi_ ) ) impl_type( p, a ); ::new( static_cast< void* >( pi_ ) ) impl_type( p, a );
#endif
} }
else else
{ {
@@ -438,6 +391,29 @@ public:
#endif #endif
template<class Y, class D>
explicit shared_count( boost::movelib::unique_ptr<Y, D> & r ): pi_( 0 )
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
, id_(shared_count_id)
#endif
{
typedef typename sp_convert_reference<D>::type D2;
D2 d2( r.get_deleter() );
pi_ = new sp_counted_impl_pd< typename boost::movelib::unique_ptr<Y, D>::pointer, D2 >( r.get(), d2 );
#ifdef BOOST_NO_EXCEPTIONS
if( pi_ == 0 )
{
boost::throw_exception( std::bad_alloc() );
}
#endif
r.release();
}
~shared_count() // nothrow ~shared_count() // nothrow
{ {
if( pi_ != 0 ) pi_->release(); if( pi_ != 0 ) pi_->release();
@@ -668,6 +644,10 @@ inline shared_count::shared_count( weak_count const & r, sp_nothrow_tag ): pi_(
} // namespace boost } // namespace boost
#if defined( BOOST_SP_DISABLE_DEPRECATED )
#pragma GCC diagnostic pop
#endif
#ifdef __BORLANDC__ #ifdef __BORLANDC__
# pragma warn .8027 // Functions containing try are not expanded inline # pragma warn .8027 // Functions containing try are not expanded inline
#endif #endif

View File

@@ -16,6 +16,7 @@
// http://www.boost.org/LICENSE_1_0.txt // http://www.boost.org/LICENSE_1_0.txt
#include <boost/config.hpp> #include <boost/config.hpp>
#include <cstddef>
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( BOOST_NO_SFINAE ) #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( BOOST_NO_SFINAE )
# define BOOST_SP_NO_SP_CONVERTIBLE # define BOOST_SP_NO_SP_CONVERTIBLE

View File

@@ -20,6 +20,12 @@
#include <boost/config.hpp> #include <boost/config.hpp>
#include <boost/smart_ptr/detail/sp_has_sync.hpp> #include <boost/smart_ptr/detail/sp_has_sync.hpp>
#if !defined( __c2__ ) && defined( __clang__ ) && defined( __has_extension )
# if __has_extension( __c_atomic__ )
# define BOOST_SP_HAS_CLANG_C11_ATOMICS
# endif
#endif
#if defined( BOOST_SP_DISABLE_THREADS ) #if defined( BOOST_SP_DISABLE_THREADS )
# include <boost/smart_ptr/detail/sp_counted_base_nt.hpp> # include <boost/smart_ptr/detail/sp_counted_base_nt.hpp>
@@ -35,6 +41,12 @@
#elif defined( BOOST_DISABLE_THREADS ) && !defined( BOOST_SP_ENABLE_THREADS ) && !defined( BOOST_DISABLE_WIN32 ) #elif defined( BOOST_DISABLE_THREADS ) && !defined( BOOST_SP_ENABLE_THREADS ) && !defined( BOOST_DISABLE_WIN32 )
# include <boost/smart_ptr/detail/sp_counted_base_nt.hpp> # include <boost/smart_ptr/detail/sp_counted_base_nt.hpp>
#elif defined( BOOST_SP_HAS_CLANG_C11_ATOMICS )
# include <boost/smart_ptr/detail/sp_counted_base_clang.hpp>
#elif !defined( BOOST_NO_CXX11_HDR_ATOMIC )
# include <boost/smart_ptr/detail/sp_counted_base_std_atomic.hpp>
#elif defined( __SNC__ ) #elif defined( __SNC__ )
# include <boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp> # include <boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp>
@@ -56,7 +68,7 @@
#elif defined( __GNUC__ ) && ( defined( __powerpc__ ) || defined( __ppc__ ) || defined( __ppc ) ) && !defined(__PATHSCALE__) && !defined( _AIX ) #elif defined( __GNUC__ ) && ( defined( __powerpc__ ) || defined( __ppc__ ) || defined( __ppc ) ) && !defined(__PATHSCALE__) && !defined( _AIX )
# include <boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp> # include <boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp>
#elif defined( __GNUC__ ) && ( defined( __mips__ ) || defined( _mips ) ) && !defined(__PATHSCALE__) #elif defined( __GNUC__ ) && ( defined( __mips__ ) || defined( _mips ) ) && !defined(__PATHSCALE__) && !defined( __mips16 )
# include <boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp> # include <boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp>
#elif defined( BOOST_SP_HAS_SYNC ) #elif defined( BOOST_SP_HAS_SYNC )
@@ -79,4 +91,6 @@
#endif #endif
#undef BOOST_SP_HAS_CLANG_C11_ATOMICS
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_HPP_INCLUDED #endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_HPP_INCLUDED

View File

@@ -0,0 +1,149 @@
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CLANG_HPP_INCLUDED
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CLANG_HPP_INCLUDED
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif
// detail/sp_counted_base_clang.hpp - __c11 clang intrinsics
//
// Copyright (c) 2007, 2013, 2015 Peter Dimov
//
// Distributed under 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
#include <boost/detail/sp_typeinfo.hpp>
#include <boost/cstdint.hpp>
namespace boost
{
namespace detail
{
typedef _Atomic( boost::int_least32_t ) atomic_int_least32_t;
inline void atomic_increment( atomic_int_least32_t * pw )
{
__c11_atomic_fetch_add( pw, 1, __ATOMIC_RELAXED );
}
inline boost::int_least32_t atomic_decrement( atomic_int_least32_t * pw )
{
return __c11_atomic_fetch_sub( pw, 1, __ATOMIC_ACQ_REL );
}
inline boost::int_least32_t atomic_conditional_increment( atomic_int_least32_t * pw )
{
// long r = *pw;
// if( r != 0 ) ++*pw;
// return r;
boost::int_least32_t r = __c11_atomic_load( pw, __ATOMIC_RELAXED );
for( ;; )
{
if( r == 0 )
{
return r;
}
if( __c11_atomic_compare_exchange_weak( pw, &r, r + 1, __ATOMIC_RELAXED, __ATOMIC_RELAXED ) )
{
return r;
}
}
}
#if defined(__clang__)
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Wweak-vtables"
#endif
class sp_counted_base
{
private:
sp_counted_base( sp_counted_base const & );
sp_counted_base & operator= ( sp_counted_base const & );
atomic_int_least32_t use_count_; // #shared
atomic_int_least32_t weak_count_; // #weak + (#shared != 0)
public:
sp_counted_base()
{
__c11_atomic_init( &use_count_, 1 );
__c11_atomic_init( &weak_count_, 1 );
}
virtual ~sp_counted_base() // nothrow
{
}
// dispose() is called when use_count_ drops to zero, to release
// the resources managed by *this.
virtual void dispose() = 0; // nothrow
// destroy() is called when weak_count_ drops to zero.
virtual void destroy() // nothrow
{
delete this;
}
virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
virtual void * get_untyped_deleter() = 0;
void add_ref_copy()
{
atomic_increment( &use_count_ );
}
bool add_ref_lock() // true on success
{
return atomic_conditional_increment( &use_count_ ) != 0;
}
void release() // nothrow
{
if( atomic_decrement( &use_count_ ) == 1 )
{
dispose();
weak_release();
}
}
void weak_add_ref() // nothrow
{
atomic_increment( &weak_count_ );
}
void weak_release() // nothrow
{
if( atomic_decrement( &weak_count_ ) == 1 )
{
destroy();
}
}
long use_count() const // nothrow
{
return __c11_atomic_load( const_cast< atomic_int_least32_t* >( &use_count_ ), __ATOMIC_ACQUIRE );
}
};
#if defined(__clang__)
# pragma clang diagnostic pop
#endif
} // namespace detail
} // namespace boost
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CLANG_HPP_INCLUDED

View File

@@ -78,7 +78,7 @@ public:
boost::checked_delete( px_ ); boost::checked_delete( px_ );
} }
virtual void * get_deleter( detail::sp_typeinfo const & ) virtual void * get_deleter( sp_typeinfo const & )
{ {
return 0; return 0;
} }
@@ -153,7 +153,7 @@ public:
del( ptr ); del( ptr );
} }
virtual void * get_deleter( detail::sp_typeinfo const & ti ) virtual void * get_deleter( sp_typeinfo const & ti )
{ {
return ti == BOOST_SP_TYPEID(D)? &reinterpret_cast<char&>( del ): 0; return ti == BOOST_SP_TYPEID(D)? &reinterpret_cast<char&>( del ): 0;
} }
@@ -236,20 +236,12 @@ public:
A2 a2( a_ ); A2 a2( a_ );
#if !defined( BOOST_NO_CXX11_ALLOCATOR )
std::allocator_traits<A2>::destroy( a2, this );
#else
this->~this_type(); this->~this_type();
#endif
a2.deallocate( this, 1 ); a2.deallocate( this, 1 );
} }
virtual void * get_deleter( detail::sp_typeinfo const & ti ) virtual void * get_deleter( sp_typeinfo const & ti )
{ {
return ti == BOOST_SP_TYPEID( D )? &reinterpret_cast<char&>( d_ ): 0; return ti == BOOST_SP_TYPEID( D )? &reinterpret_cast<char&>( d_ ): 0;
} }

View File

@@ -0,0 +1,40 @@
#ifndef BOOST_SMART_PTR_DETAIL_SP_DISABLE_DEPRECATED_HPP_INCLUDED
#define BOOST_SMART_PTR_DETAIL_SP_DISABLE_DEPRECATED_HPP_INCLUDED
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif
//
// boost/smart_ptr/detail/sp_disable_deprecated.hpp
//
// Copyright 2015 Peter Dimov
//
// Distributed under 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)
//
#include <boost/config.hpp>
#if defined( __GNUC__ ) && ( defined( __GXX_EXPERIMENTAL_CXX0X__ ) || ( __cplusplus >= 201103L ) )
# if defined( BOOST_GCC )
# if BOOST_GCC >= 40600
# define BOOST_SP_DISABLE_DEPRECATED
# endif
# elif defined( __clang__ ) && defined( __has_warning )
# if __has_warning( "-Wdeprecated-declarations" )
# define BOOST_SP_DISABLE_DEPRECATED
# endif
# endif
#endif
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_DISABLE_DEPRECATED_HPP_INCLUDED

View File

@@ -25,6 +25,17 @@ namespace detail
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
#if defined( BOOST_GCC ) && __GNUC__ * 100 + __GNUC_MINOR__ <= 404
// GCC 4.4 supports an outdated version of rvalue references and creates a copy of the forwarded object.
// This results in warnings 'returning reference to temporary'. Therefore we use a special version similar to std::forward.
template< class T > T&& sp_forward( T && t ) BOOST_NOEXCEPT
{
return t;
}
#else
template< class T > T&& sp_forward( T & t ) BOOST_NOEXCEPT template< class T > T&& sp_forward( T & t ) BOOST_NOEXCEPT
{ {
return static_cast< T&& >( t ); return static_cast< T&& >( t );
@@ -32,6 +43,8 @@ template< class T > T&& sp_forward( T & t ) BOOST_NOEXCEPT
#endif #endif
#endif
} // namespace detail } // namespace detail
} // namespace boost } // namespace boost

View File

@@ -22,15 +22,15 @@
#ifndef BOOST_SP_NO_SYNC #ifndef BOOST_SP_NO_SYNC
#if defined( __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 ) #if !defined( __c2__ ) && defined( __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 )
# define BOOST_SP_HAS_SYNC # define BOOST_SP_HAS_SYNC
#elif defined( __IBMCPP__ ) && ( __IBMCPP__ >= 1210 ) #elif defined( __IBMCPP__ ) && ( __IBMCPP__ >= 1210 ) && !defined( __COMPILER_VER__ )
# define BOOST_SP_HAS_SYNC # define BOOST_SP_HAS_SYNC
#elif defined( __GNUC__ ) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 401 ) #elif !defined( __c2__ ) && defined( __GNUC__ ) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 401 )
#define BOOST_SP_HAS_SYNC #define BOOST_SP_HAS_SYNC

View File

@@ -1,34 +0,0 @@
/*
* Copyright (c) 2012-2014 Glen Joseph Fernandes
* glenfe at live dot com
*
* Distributed under the Boost Software License,
* Version 1.0. (See accompanying file LICENSE_1_0.txt
* or copy at http://boost.org/LICENSE_1_0.txt)
*/
#ifndef BOOST_SMART_PTR_DETAIL_SP_IF_ARRAY_HPP
#define BOOST_SMART_PTR_DETAIL_SP_IF_ARRAY_HPP
#include <boost/smart_ptr/shared_ptr.hpp>
namespace boost {
namespace detail {
template<class T>
struct sp_if_array;
template<class T>
struct sp_if_array<T[]> {
typedef boost::shared_ptr<T[]> type;
};
template<class T>
struct sp_if_size_array;
template<class T, std::size_t N>
struct sp_if_size_array<T[N]> {
typedef boost::shared_ptr<T[N]> type;
};
}
}
#endif

View File

@@ -111,6 +111,17 @@ extern "C" long __cdecl _InterlockedCompareExchange( long volatile *, long, long
extern "C" long __cdecl _InterlockedExchange( long volatile *, long ); extern "C" long __cdecl _InterlockedExchange( long volatile *, long );
extern "C" long __cdecl _InterlockedExchangeAdd( long volatile *, long ); extern "C" long __cdecl _InterlockedExchangeAdd( long volatile *, long );
# if defined( BOOST_MSVC ) && BOOST_MSVC == 1310
//From MSDN, Visual Studio .NET 2003 spedific: To declare one of the interlocked functions
//for use as an intrinsic, the function must be declared with the leading underscore and
//the new function must appear in a #pragma intrinsic statement.
# pragma intrinsic( _InterlockedIncrement )
# pragma intrinsic( _InterlockedDecrement )
# pragma intrinsic( _InterlockedCompareExchange )
# pragma intrinsic( _InterlockedExchange )
# pragma intrinsic( _InterlockedExchangeAdd )
# endif
#endif #endif
# define BOOST_SP_INTERLOCKED_INCREMENT _InterlockedIncrement # define BOOST_SP_INTERLOCKED_INCREMENT _InterlockedIncrement

View File

@@ -0,0 +1,30 @@
#ifndef BOOST_SMART_PTR_DETAIL_SP_NOEXCEPT_HPP_INCLUDED
#define BOOST_SMART_PTR_DETAIL_SP_NOEXCEPT_HPP_INCLUDED
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif
// detail/sp_noexcept.hpp
//
// Copyright 2016 Peter Dimov
//
// Distributed under 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
#include <boost/config.hpp>
#if defined( BOOST_MSVC ) && BOOST_MSVC >= 1700 && BOOST_MSVC < 1900
#define BOOST_SP_NOEXCEPT BOOST_NOEXCEPT_OR_NOTHROW
#else
#define BOOST_SP_NOEXCEPT BOOST_NOEXCEPT
#endif
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_NOEXCEPT_HPP_INCLUDED

View File

@@ -26,7 +26,7 @@ namespace boost
namespace detail namespace detail
{ {
#if defined( __clang__ ) && !defined( _LIBCPP_VERSION ) && !defined( BOOST_NO_CXX11_DECLTYPE ) #if !defined( BOOST_NO_CXX11_DECLTYPE ) && ( ( defined( __clang__ ) && !defined( _LIBCPP_VERSION ) ) || defined( __INTEL_COMPILER ) )
typedef decltype(nullptr) sp_nullptr_t; typedef decltype(nullptr) sp_nullptr_t;

View File

@@ -43,6 +43,9 @@
#elif defined( BOOST_SP_USE_PTHREADS ) #elif defined( BOOST_SP_USE_PTHREADS )
# include <boost/smart_ptr/detail/spinlock_pt.hpp> # include <boost/smart_ptr/detail/spinlock_pt.hpp>
#elif !defined( BOOST_NO_CXX11_HDR_ATOMIC )
# include <boost/smart_ptr/detail/spinlock_std_atomic.hpp>
#elif defined(__GNUC__) && defined( __arm__ ) && !defined( __thumb__ ) #elif defined(__GNUC__) && defined( __arm__ ) && !defined( __thumb__ )
# include <boost/smart_ptr/detail/spinlock_gcc_arm.hpp> # include <boost/smart_ptr/detail/spinlock_gcc_arm.hpp>

View File

@@ -82,6 +82,7 @@ public:
{ {
__asm__ __volatile__( BOOST_SP_ARM_BARRIER ::: "memory" ); __asm__ __volatile__( BOOST_SP_ARM_BARRIER ::: "memory" );
*const_cast< int volatile* >( &v_ ) = 0; *const_cast< int volatile* >( &v_ ) = 0;
__asm__ __volatile__( BOOST_SP_ARM_BARRIER ::: "memory" );
} }
public: public:

View File

@@ -31,7 +31,7 @@ namespace boost
namespace detail namespace detail
{ {
template< int I > class spinlock_pool template< int M > class spinlock_pool
{ {
private: private:
@@ -72,7 +72,7 @@ public:
}; };
}; };
template< int I > spinlock spinlock_pool< I >::pool_[ 41 ] = template< int M > spinlock spinlock_pool< M >::pool_[ 41 ] =
{ {
BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT,
BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT,

View File

@@ -1,26 +0,0 @@
/*
* Copyright (c) 2014 Glen Joseph Fernandes
* glenfe at live dot com
*
* Distributed under the Boost Software License,
* Version 1.0. (See accompanying file LICENSE_1_0.txt
* or copy at http://boost.org/LICENSE_1_0.txt)
*/
#ifndef BOOST_SMART_PTR_DETAIL_UP_IF_ARRAY_HPP
#define BOOST_SMART_PTR_DETAIL_UP_IF_ARRAY_HPP
#include <memory>
namespace boost {
namespace detail {
template<class T>
struct up_if_array;
template<class T>
struct up_if_array<T[]> {
typedef std::unique_ptr<T[]> type;
};
}
}
#endif

View File

@@ -1,31 +0,0 @@
/*
* Copyright (c) 2014 Glen Joseph Fernandes
* glenfe at live dot com
*
* Distributed under the Boost Software License,
* Version 1.0. (See accompanying file LICENSE_1_0.txt
* or copy at http://boost.org/LICENSE_1_0.txt)
*/
#ifndef BOOST_SMART_PTR_DETAIL_UP_IF_NOT_ARRAY_HPP
#define BOOST_SMART_PTR_DETAIL_UP_IF_NOT_ARRAY_HPP
#include <memory>
namespace boost {
namespace detail {
template<class T>
struct up_if_not_array {
typedef std::unique_ptr<T> type;
};
template<class T>
struct up_if_not_array<T[]> {
};
template<class T, std::size_t N>
struct up_if_not_array<T[N]> {
};
}
}
#endif

View File

@@ -60,7 +60,16 @@ namespace detail
{ {
#if !defined( BOOST_USE_WINDOWS_H ) && !BOOST_PLAT_WINDOWS_RUNTIME #if !defined( BOOST_USE_WINDOWS_H ) && !BOOST_PLAT_WINDOWS_RUNTIME
#if !BOOST_COMP_CLANG || !defined __MINGW32__
extern "C" void __stdcall Sleep( unsigned long ms ); extern "C" void __stdcall Sleep( unsigned long ms );
#else
#include <_mingw.h>
#if !defined __MINGW64_VERSION_MAJOR
extern "C" void __stdcall Sleep( unsigned long ms );
#else
extern "C" __declspec(dllimport) void __stdcall Sleep( unsigned long ms );
#endif
#endif
#endif #endif
inline void yield( unsigned k ) inline void yield( unsigned k )
@@ -98,7 +107,13 @@ inline void yield( unsigned k )
#elif defined( BOOST_HAS_PTHREADS ) #elif defined( BOOST_HAS_PTHREADS )
#ifndef _AIX
#include <sched.h> #include <sched.h>
#else
// AIX's sched.h defines ::var which sometimes conflicts with Lambda's var
extern "C" int sched_yield(void);
#endif
#include <time.h> #include <time.h>
namespace boost namespace boost

View File

@@ -4,7 +4,7 @@
// //
// enable_shared_from_raw.hpp // enable_shared_from_raw.hpp
// //
// Copyright 2002, 2009 Peter Dimov // Copyright 2002, 2009, 2014 Peter Dimov
// Copyright 2008-2009 Frank Mori Hess // Copyright 2008-2009 Frank Mori Hess
// //
// Distributed under the Boost Software License, Version 1.0. // Distributed under the Boost Software License, Version 1.0.
@@ -53,7 +53,7 @@ protected:
private: private:
void init_weak_once() const void init_if_expired() const
{ {
if( weak_this_.expired() ) if( weak_this_.expired() )
{ {
@@ -62,6 +62,15 @@ private:
} }
} }
void init_if_empty() const
{
if( weak_this_._empty() )
{
shared_this_.reset( static_cast<void*>(0), detail::esft2_deleter_wrapper() );
weak_this_ = shared_this_;
}
}
#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS #ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
public: public:
#else #else
@@ -72,20 +81,30 @@ private:
template< class X, class Y > friend inline void detail::sp_enable_shared_from_this( boost::shared_ptr<X> * ppx, Y const * py, boost::enable_shared_from_raw const * pe ); template< class X, class Y > friend inline void detail::sp_enable_shared_from_this( boost::shared_ptr<X> * ppx, Y const * py, boost::enable_shared_from_raw const * pe );
#endif #endif
shared_ptr<void> shared_from_this() shared_ptr<void const volatile> shared_from_this() const
{ {
init_weak_once(); init_if_expired();
return shared_ptr<void>( weak_this_ ); return shared_ptr<void const volatile>( weak_this_ );
} }
shared_ptr<const void> shared_from_this() const shared_ptr<void const volatile> shared_from_this() const volatile
{ {
init_weak_once(); return const_cast< enable_shared_from_raw const * >( this )->shared_from_this();
return shared_ptr<const void>( weak_this_ ); }
weak_ptr<void const volatile> weak_from_this() const
{
init_if_empty();
return weak_this_;
}
weak_ptr<void const volatile> weak_from_this() const volatile
{
return const_cast< enable_shared_from_raw const * >( this )->weak_from_this();
} }
// Note: invoked automatically by shared_ptr; do not call // Note: invoked automatically by shared_ptr; do not call
template<class X, class Y> void _internal_accept_owner( shared_ptr<X> * ppx, Y * py ) const template<class X, class Y> void _internal_accept_owner( shared_ptr<X> * ppx, Y * ) const
{ {
BOOST_ASSERT( ppx != 0 ); BOOST_ASSERT( ppx != 0 );
@@ -107,9 +126,11 @@ private:
} }
} }
mutable weak_ptr<void> weak_this_; mutable weak_ptr<void const volatile> weak_this_;
private: private:
mutable shared_ptr<void> shared_this_;
mutable shared_ptr<void const volatile> shared_this_;
}; };
template<typename T> template<typename T>
@@ -124,7 +145,7 @@ boost::weak_ptr<T> weak_from_raw(T *p)
{ {
BOOST_ASSERT(p != 0); BOOST_ASSERT(p != 0);
boost::weak_ptr<T> result; boost::weak_ptr<T> result;
result._internal_aliasing_assign(p->enable_shared_from_raw::weak_this_, p); result._internal_aliasing_assign(p->enable_shared_from_raw::weak_from_this(), p);
return result; return result;
} }

View File

@@ -15,6 +15,7 @@
#include <boost/smart_ptr/weak_ptr.hpp> #include <boost/smart_ptr/weak_ptr.hpp>
#include <boost/smart_ptr/shared_ptr.hpp> #include <boost/smart_ptr/shared_ptr.hpp>
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
#include <boost/assert.hpp> #include <boost/assert.hpp>
#include <boost/config.hpp> #include <boost/config.hpp>
@@ -25,20 +26,20 @@ template<class T> class enable_shared_from_this
{ {
protected: protected:
enable_shared_from_this() BOOST_NOEXCEPT enable_shared_from_this() BOOST_SP_NOEXCEPT
{ {
} }
enable_shared_from_this(enable_shared_from_this const &) BOOST_NOEXCEPT enable_shared_from_this(enable_shared_from_this const &) BOOST_SP_NOEXCEPT
{ {
} }
enable_shared_from_this & operator=(enable_shared_from_this const &) BOOST_NOEXCEPT enable_shared_from_this & operator=(enable_shared_from_this const &) BOOST_SP_NOEXCEPT
{ {
return *this; return *this;
} }
~enable_shared_from_this() BOOST_NOEXCEPT // ~weak_ptr<T> newer throws, so this call also must not throw ~enable_shared_from_this() BOOST_SP_NOEXCEPT // ~weak_ptr<T> newer throws, so this call also must not throw
{ {
} }
@@ -58,6 +59,16 @@ public:
return p; return p;
} }
weak_ptr<T> weak_from_this() BOOST_NOEXCEPT
{
return weak_this_;
}
weak_ptr<T const> weak_from_this() const BOOST_NOEXCEPT
{
return weak_this_;
}
public: // actually private, but avoids compiler template friendship issues public: // actually private, but avoids compiler template friendship issues
// Note: invoked automatically by shared_ptr; do not call // Note: invoked automatically by shared_ptr; do not call

View File

@@ -19,6 +19,7 @@
#include <boost/detail/workaround.hpp> #include <boost/detail/workaround.hpp>
#include <boost/smart_ptr/detail/sp_convertible.hpp> #include <boost/smart_ptr/detail/sp_convertible.hpp>
#include <boost/smart_ptr/detail/sp_nullptr_t.hpp> #include <boost/smart_ptr/detail/sp_nullptr_t.hpp>
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
#include <boost/config/no_tr1/functional.hpp> // for std::less #include <boost/config/no_tr1/functional.hpp> // for std::less
@@ -59,7 +60,7 @@ public:
typedef T element_type; typedef T element_type;
intrusive_ptr() BOOST_NOEXCEPT : px( 0 ) BOOST_CONSTEXPR intrusive_ptr() BOOST_SP_NOEXCEPT : px( 0 )
{ {
} }
@@ -111,17 +112,41 @@ public:
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
intrusive_ptr(intrusive_ptr && rhs) BOOST_NOEXCEPT : px( rhs.px ) intrusive_ptr(intrusive_ptr && rhs) BOOST_SP_NOEXCEPT : px( rhs.px )
{ {
rhs.px = 0; rhs.px = 0;
} }
intrusive_ptr & operator=(intrusive_ptr && rhs) BOOST_NOEXCEPT intrusive_ptr & operator=(intrusive_ptr && rhs) BOOST_SP_NOEXCEPT
{ {
this_type( static_cast< intrusive_ptr && >( rhs ) ).swap(*this); this_type( static_cast< intrusive_ptr && >( rhs ) ).swap(*this);
return *this; return *this;
} }
template<class U> friend class intrusive_ptr;
template<class U>
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
intrusive_ptr(intrusive_ptr<U> && rhs, typename boost::detail::sp_enable_if_convertible<U,T>::type = boost::detail::sp_empty())
#else
intrusive_ptr(intrusive_ptr<U> && rhs)
#endif
: px( rhs.px )
{
rhs.px = 0;
}
template<class U>
intrusive_ptr & operator=(intrusive_ptr<U> && rhs) BOOST_NOEXCEPT
{
this_type( static_cast< intrusive_ptr<U> && >( rhs ) ).swap(*this);
return *this;
}
#endif #endif
intrusive_ptr & operator=(intrusive_ptr const & rhs) intrusive_ptr & operator=(intrusive_ptr const & rhs)

View File

@@ -83,7 +83,7 @@ struct thread_safe_counter
static unsigned int decrement(boost::detail::atomic_count& counter) BOOST_NOEXCEPT static unsigned int decrement(boost::detail::atomic_count& counter) BOOST_NOEXCEPT
{ {
return --counter; return static_cast< unsigned int >(--counter);
} }
}; };

View File

@@ -1,158 +1,66 @@
/* /*
* Copyright (c) 2012-2014 Glen Joseph Fernandes Copyright 2012-2017 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License, Distributed under the Boost Software License, Version 1.0.
* Version 1.0. (See accompanying file LICENSE_1_0.txt (http://www.boost.org/LICENSE_1_0.txt)
* or copy at http://boost.org/LICENSE_1_0.txt) */
*/
#ifndef BOOST_SMART_PTR_MAKE_SHARED_ARRAY_HPP #ifndef BOOST_SMART_PTR_MAKE_SHARED_ARRAY_HPP
#define BOOST_SMART_PTR_MAKE_SHARED_ARRAY_HPP #define BOOST_SMART_PTR_MAKE_SHARED_ARRAY_HPP
#include <boost/smart_ptr/detail/array_count_impl.hpp> #include <boost/smart_ptr/allocate_shared_array.hpp>
#include <boost/smart_ptr/detail/sp_if_array.hpp>
namespace boost { namespace boost {
template<class T>
inline typename boost::detail::sp_if_array<T>::type
make_shared(std::size_t size) {
typedef typename boost::detail::array_inner<T>::type T1;
typedef typename boost::detail::array_base<T1>::type T2;
typedef boost::detail::ms_allocator<T> A1;
typedef boost::detail::ms_in_allocator_tag D1;
std::size_t n1 = size * boost::detail::array_total<T1>::size;
T1* p1 = 0;
T2* p2 = 0;
D1 d1;
A1 a1(size, &p2);
shared_ptr<T> s1(p1, d1, a1);
A1* a2 = static_cast<A1*>(s1._internal_get_untyped_deleter());
a2->set(0);
boost::detail::ms_init(p2, n1);
a2->set(p2);
p1 = reinterpret_cast<T1*>(p2);
return shared_ptr<T>(s1, p1);
}
template<class T> template<class T>
inline typename boost::detail::sp_if_size_array<T>::type inline typename detail::sp_if_size_array<T>::type
make_shared() { make_shared()
typedef typename boost::detail::array_inner<T>::type T1; {
typedef typename boost::detail::array_base<T1>::type T2; return boost::allocate_shared<T>(std::allocator<typename
typedef boost::detail::ms_allocator<T> A1; detail::sp_array_scalar<T>::type>());
typedef boost::detail::ms_in_allocator_tag D1;
enum {
N = boost::detail::array_total<T>::size
};
T1* p1 = 0;
T2* p2 = 0;
D1 d1;
A1 a1(&p2);
shared_ptr<T> s1(p1, d1, a1);
A1* a2 = static_cast<A1*>(s1._internal_get_untyped_deleter());
a2->set(0);
boost::detail::ms_init(p2, N);
a2->set(p2);
p1 = reinterpret_cast<T1*>(p2);
return shared_ptr<T>(s1, p1);
}
template<class T>
inline typename boost::detail::sp_if_array<T>::type
make_shared(std::size_t size,
const typename boost::detail::array_inner<T>::type& value) {
typedef typename boost::detail::array_inner<T>::type T1;
typedef typename boost::detail::array_base<T1>::type T2;
typedef const T2 T3;
typedef boost::detail::ms_allocator<T> A1;
typedef boost::detail::ms_in_allocator_tag D1;
enum {
M = boost::detail::array_total<T1>::size
};
std::size_t n1 = M * size;
T1* p1 = 0;
T2* p2 = 0;
T3* p3 = reinterpret_cast<T3*>(&value);
D1 d1;
A1 a1(size, &p2);
shared_ptr<T> s1(p1, d1, a1);
A1* a2 = static_cast<A1*>(s1._internal_get_untyped_deleter());
a2->set(0);
boost::detail::ms_init<T2, M>(p2, n1, p3);
a2->set(p2);
p1 = reinterpret_cast<T1*>(p2);
return shared_ptr<T>(s1, p1);
}
template<class T>
inline typename boost::detail::sp_if_size_array<T>::type
make_shared(const typename boost::detail::array_inner<T>::type& value) {
typedef typename boost::detail::array_inner<T>::type T1;
typedef typename boost::detail::array_base<T1>::type T2;
typedef const T2 T3;
typedef boost::detail::ms_allocator<T> A1;
typedef boost::detail::ms_in_allocator_tag D1;
enum {
M = boost::detail::array_total<T1>::size,
N = boost::detail::array_total<T>::size
};
T1* p1 = 0;
T2* p2 = 0;
T3* p3 = reinterpret_cast<T3*>(&value);
D1 d1;
A1 a1(&p2);
shared_ptr<T> s1(p1, d1, a1);
A1* a2 = static_cast<A1*>(s1._internal_get_untyped_deleter());
a2->set(0);
boost::detail::ms_init<T2, M>(p2, N, p3);
a2->set(p2);
p1 = reinterpret_cast<T1*>(p2);
return shared_ptr<T>(s1, p1);
}
template<class T>
inline typename boost::detail::sp_if_array<T>::type
make_shared_noinit(std::size_t size) {
typedef typename boost::detail::array_inner<T>::type T1;
typedef typename boost::detail::array_base<T1>::type T2;
typedef boost::detail::ms_allocator<T> A1;
typedef boost::detail::ms_in_allocator_tag D1;
std::size_t n1 = size * boost::detail::array_total<T1>::size;
T1* p1 = 0;
T2* p2 = 0;
D1 d1;
A1 a1(size, &p2);
shared_ptr<T> s1(p1, d1, a1);
A1* a2 = static_cast<A1*>(s1._internal_get_untyped_deleter());
a2->set(0);
boost::detail::ms_noinit(p2, n1);
a2->set(p2);
p1 = reinterpret_cast<T1*>(p2);
return shared_ptr<T>(s1, p1);
}
template<class T>
inline typename boost::detail::sp_if_size_array<T>::type
make_shared_noinit() {
typedef typename boost::detail::array_inner<T>::type T1;
typedef typename boost::detail::array_base<T1>::type T2;
typedef boost::detail::ms_allocator<T> A1;
typedef boost::detail::ms_in_allocator_tag D1;
enum {
N = boost::detail::array_total<T>::size
};
T1* p1 = 0;
T2* p2 = 0;
D1 d1;
A1 a1(&p2);
shared_ptr<T> s1(p1, d1, a1);
A1* a2 = static_cast<A1*>(s1._internal_get_untyped_deleter());
a2->set(0);
boost::detail::ms_noinit(p2, N);
a2->set(p2);
p1 = reinterpret_cast<T1*>(p2);
return shared_ptr<T>(s1, p1);
}
} }
template<class T>
inline typename detail::sp_if_size_array<T>::type
make_shared(const typename detail::sp_array_element<T>::type& value)
{
return boost::allocate_shared<T>(std::allocator<typename
detail::sp_array_scalar<T>::type>(), value);
}
template<class T>
inline typename detail::sp_if_array<T>::type
make_shared(std::size_t size)
{
return boost::allocate_shared<T>(std::allocator<typename
detail::sp_array_scalar<T>::type>(), size);
}
template<class T>
inline typename detail::sp_if_array<T>::type
make_shared(std::size_t size,
const typename detail::sp_array_element<T>::type& value)
{
return boost::allocate_shared<T>(std::allocator<typename
detail::sp_array_scalar<T>::type>(), size, value);
}
template<class T>
inline typename detail::sp_if_size_array<T>::type
make_shared_noinit()
{
return allocate_shared_noinit<T>(std::allocator<typename
detail::sp_array_scalar<T>::type>());
}
template<class T>
inline typename detail::sp_if_array<T>::type
make_shared_noinit(std::size_t size)
{
return allocate_shared_noinit<T>(std::allocator<typename
detail::sp_array_scalar<T>::type>(), size);
}
} /* boost */
#endif #endif

View File

@@ -13,6 +13,8 @@
// for documentation. // for documentation.
#include <boost/config.hpp> #include <boost/config.hpp>
#include <boost/move/core.hpp>
#include <boost/move/utility_core.hpp>
#include <boost/smart_ptr/shared_ptr.hpp> #include <boost/smart_ptr/shared_ptr.hpp>
#include <boost/smart_ptr/detail/sp_forward.hpp> #include <boost/smart_ptr/detail/sp_forward.hpp>
#include <boost/type_traits/type_with_alignment.hpp> #include <boost/type_traits/type_with_alignment.hpp>
@@ -338,466 +340,10 @@ template< class T, class A > typename boost::detail::sp_if_not_array< T >::type
return boost::shared_ptr< T >( pt, pt2 ); return boost::shared_ptr< T >( pt, pt2 );
} }
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
// For example MSVC 10.0
template< class T, class A1 >
typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1 )
{
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
void * pv = pd->address();
::new( pv ) T(
boost::detail::sp_forward<A1>( a1 )
);
pd->set_initialized();
T * pt2 = static_cast< T* >( pv );
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
return boost::shared_ptr< T >( pt, pt2 );
}
template< class T, class A, class A1 >
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1 )
{
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
void * pv = pd->address();
::new( pv ) T(
boost::detail::sp_forward<A1>( a1 )
);
pd->set_initialized();
T * pt2 = static_cast< T* >( pv );
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
return boost::shared_ptr< T >( pt, pt2 );
}
template< class T, class A1, class A2 >
typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2 )
{
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
void * pv = pd->address();
::new( pv ) T(
boost::detail::sp_forward<A1>( a1 ),
boost::detail::sp_forward<A2>( a2 )
);
pd->set_initialized();
T * pt2 = static_cast< T* >( pv );
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
return boost::shared_ptr< T >( pt, pt2 );
}
template< class T, class A, class A1, class A2 >
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2 )
{
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
void * pv = pd->address();
::new( pv ) T(
boost::detail::sp_forward<A1>( a1 ),
boost::detail::sp_forward<A2>( a2 )
);
pd->set_initialized();
T * pt2 = static_cast< T* >( pv );
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
return boost::shared_ptr< T >( pt, pt2 );
}
template< class T, class A1, class A2, class A3 >
typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3 )
{
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
void * pv = pd->address();
::new( pv ) T(
boost::detail::sp_forward<A1>( a1 ),
boost::detail::sp_forward<A2>( a2 ),
boost::detail::sp_forward<A3>( a3 )
);
pd->set_initialized();
T * pt2 = static_cast< T* >( pv );
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
return boost::shared_ptr< T >( pt, pt2 );
}
template< class T, class A, class A1, class A2, class A3 >
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3 )
{
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
void * pv = pd->address();
::new( pv ) T(
boost::detail::sp_forward<A1>( a1 ),
boost::detail::sp_forward<A2>( a2 ),
boost::detail::sp_forward<A3>( a3 )
);
pd->set_initialized();
T * pt2 = static_cast< T* >( pv );
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
return boost::shared_ptr< T >( pt, pt2 );
}
template< class T, class A1, class A2, class A3, class A4 >
typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4 )
{
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
void * pv = pd->address();
::new( pv ) T(
boost::detail::sp_forward<A1>( a1 ),
boost::detail::sp_forward<A2>( a2 ),
boost::detail::sp_forward<A3>( a3 ),
boost::detail::sp_forward<A4>( a4 )
);
pd->set_initialized();
T * pt2 = static_cast< T* >( pv );
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
return boost::shared_ptr< T >( pt, pt2 );
}
template< class T, class A, class A1, class A2, class A3, class A4 >
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4 )
{
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
void * pv = pd->address();
::new( pv ) T(
boost::detail::sp_forward<A1>( a1 ),
boost::detail::sp_forward<A2>( a2 ),
boost::detail::sp_forward<A3>( a3 ),
boost::detail::sp_forward<A4>( a4 )
);
pd->set_initialized();
T * pt2 = static_cast< T* >( pv );
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
return boost::shared_ptr< T >( pt, pt2 );
}
template< class T, class A1, class A2, class A3, class A4, class A5 >
typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 )
{
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
void * pv = pd->address();
::new( pv ) T(
boost::detail::sp_forward<A1>( a1 ),
boost::detail::sp_forward<A2>( a2 ),
boost::detail::sp_forward<A3>( a3 ),
boost::detail::sp_forward<A4>( a4 ),
boost::detail::sp_forward<A5>( a5 )
);
pd->set_initialized();
T * pt2 = static_cast< T* >( pv );
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
return boost::shared_ptr< T >( pt, pt2 );
}
template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 )
{
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
void * pv = pd->address();
::new( pv ) T(
boost::detail::sp_forward<A1>( a1 ),
boost::detail::sp_forward<A2>( a2 ),
boost::detail::sp_forward<A3>( a3 ),
boost::detail::sp_forward<A4>( a4 ),
boost::detail::sp_forward<A5>( a5 )
);
pd->set_initialized();
T * pt2 = static_cast< T* >( pv );
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
return boost::shared_ptr< T >( pt, pt2 );
}
template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 )
{
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
void * pv = pd->address();
::new( pv ) T(
boost::detail::sp_forward<A1>( a1 ),
boost::detail::sp_forward<A2>( a2 ),
boost::detail::sp_forward<A3>( a3 ),
boost::detail::sp_forward<A4>( a4 ),
boost::detail::sp_forward<A5>( a5 ),
boost::detail::sp_forward<A6>( a6 )
);
pd->set_initialized();
T * pt2 = static_cast< T* >( pv );
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
return boost::shared_ptr< T >( pt, pt2 );
}
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 )
{
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
void * pv = pd->address();
::new( pv ) T(
boost::detail::sp_forward<A1>( a1 ),
boost::detail::sp_forward<A2>( a2 ),
boost::detail::sp_forward<A3>( a3 ),
boost::detail::sp_forward<A4>( a4 ),
boost::detail::sp_forward<A5>( a5 ),
boost::detail::sp_forward<A6>( a6 )
);
pd->set_initialized();
T * pt2 = static_cast< T* >( pv );
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
return boost::shared_ptr< T >( pt, pt2 );
}
template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 )
{
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
void * pv = pd->address();
::new( pv ) T(
boost::detail::sp_forward<A1>( a1 ),
boost::detail::sp_forward<A2>( a2 ),
boost::detail::sp_forward<A3>( a3 ),
boost::detail::sp_forward<A4>( a4 ),
boost::detail::sp_forward<A5>( a5 ),
boost::detail::sp_forward<A6>( a6 ),
boost::detail::sp_forward<A7>( a7 )
);
pd->set_initialized();
T * pt2 = static_cast< T* >( pv );
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
return boost::shared_ptr< T >( pt, pt2 );
}
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 )
{
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
void * pv = pd->address();
::new( pv ) T(
boost::detail::sp_forward<A1>( a1 ),
boost::detail::sp_forward<A2>( a2 ),
boost::detail::sp_forward<A3>( a3 ),
boost::detail::sp_forward<A4>( a4 ),
boost::detail::sp_forward<A5>( a5 ),
boost::detail::sp_forward<A6>( a6 ),
boost::detail::sp_forward<A7>( a7 )
);
pd->set_initialized();
T * pt2 = static_cast< T* >( pv );
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
return boost::shared_ptr< T >( pt, pt2 );
}
template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 )
{
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
void * pv = pd->address();
::new( pv ) T(
boost::detail::sp_forward<A1>( a1 ),
boost::detail::sp_forward<A2>( a2 ),
boost::detail::sp_forward<A3>( a3 ),
boost::detail::sp_forward<A4>( a4 ),
boost::detail::sp_forward<A5>( a5 ),
boost::detail::sp_forward<A6>( a6 ),
boost::detail::sp_forward<A7>( a7 ),
boost::detail::sp_forward<A8>( a8 )
);
pd->set_initialized();
T * pt2 = static_cast< T* >( pv );
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
return boost::shared_ptr< T >( pt, pt2 );
}
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 )
{
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
void * pv = pd->address();
::new( pv ) T(
boost::detail::sp_forward<A1>( a1 ),
boost::detail::sp_forward<A2>( a2 ),
boost::detail::sp_forward<A3>( a3 ),
boost::detail::sp_forward<A4>( a4 ),
boost::detail::sp_forward<A5>( a5 ),
boost::detail::sp_forward<A6>( a6 ),
boost::detail::sp_forward<A7>( a7 ),
boost::detail::sp_forward<A8>( a8 )
);
pd->set_initialized();
T * pt2 = static_cast< T* >( pv );
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
return boost::shared_ptr< T >( pt, pt2 );
}
template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 )
{
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
void * pv = pd->address();
::new( pv ) T(
boost::detail::sp_forward<A1>( a1 ),
boost::detail::sp_forward<A2>( a2 ),
boost::detail::sp_forward<A3>( a3 ),
boost::detail::sp_forward<A4>( a4 ),
boost::detail::sp_forward<A5>( a5 ),
boost::detail::sp_forward<A6>( a6 ),
boost::detail::sp_forward<A7>( a7 ),
boost::detail::sp_forward<A8>( a8 ),
boost::detail::sp_forward<A9>( a9 )
);
pd->set_initialized();
T * pt2 = static_cast< T* >( pv );
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
return boost::shared_ptr< T >( pt, pt2 );
}
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 )
{
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
void * pv = pd->address();
::new( pv ) T(
boost::detail::sp_forward<A1>( a1 ),
boost::detail::sp_forward<A2>( a2 ),
boost::detail::sp_forward<A3>( a3 ),
boost::detail::sp_forward<A4>( a4 ),
boost::detail::sp_forward<A5>( a5 ),
boost::detail::sp_forward<A6>( a6 ),
boost::detail::sp_forward<A7>( a7 ),
boost::detail::sp_forward<A8>( a8 ),
boost::detail::sp_forward<A9>( a9 )
);
pd->set_initialized();
T * pt2 = static_cast< T* >( pv );
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
return boost::shared_ptr< T >( pt, pt2 );
}
#else // !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
// C++03 version // C++03 version
template< class T, class A1 > template< class T, class A1 >
typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1 ) typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1 )
{ {
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
@@ -805,7 +351,10 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1 )
void * pv = pd->address(); void * pv = pd->address();
::new( pv ) T( a1 ); ::new( pv ) T(
boost::forward<A1>( a1 )
);
pd->set_initialized(); pd->set_initialized();
T * pt2 = static_cast< T* >( pv ); T * pt2 = static_cast< T* >( pv );
@@ -815,7 +364,7 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1 )
} }
template< class T, class A, class A1 > template< class T, class A, class A1 >
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1 ) typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1 )
{ {
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
@@ -823,7 +372,10 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,
void * pv = pd->address(); void * pv = pd->address();
::new( pv ) T( a1 ); ::new( pv ) T(
boost::forward<A1>( a1 )
);
pd->set_initialized(); pd->set_initialized();
T * pt2 = static_cast< T* >( pv ); T * pt2 = static_cast< T* >( pv );
@@ -833,7 +385,7 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,
} }
template< class T, class A1, class A2 > template< class T, class A1, class A2 >
typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2 ) typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2 )
{ {
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
@@ -841,7 +393,11 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A
void * pv = pd->address(); void * pv = pd->address();
::new( pv ) T( a1, a2 ); ::new( pv ) T(
boost::forward<A1>( a1 ),
boost::forward<A2>( a2 )
);
pd->set_initialized(); pd->set_initialized();
T * pt2 = static_cast< T* >( pv ); T * pt2 = static_cast< T* >( pv );
@@ -851,7 +407,7 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A
} }
template< class T, class A, class A1, class A2 > template< class T, class A, class A1, class A2 >
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2 ) typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2 )
{ {
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
@@ -859,7 +415,11 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,
void * pv = pd->address(); void * pv = pd->address();
::new( pv ) T( a1, a2 ); ::new( pv ) T(
boost::forward<A1>( a1 ),
boost::forward<A2>( a2 )
);
pd->set_initialized(); pd->set_initialized();
T * pt2 = static_cast< T* >( pv ); T * pt2 = static_cast< T* >( pv );
@@ -869,7 +429,7 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,
} }
template< class T, class A1, class A2, class A3 > template< class T, class A1, class A2, class A3 >
typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3 ) typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3 )
{ {
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
@@ -877,7 +437,12 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A
void * pv = pd->address(); void * pv = pd->address();
::new( pv ) T( a1, a2, a3 ); ::new( pv ) T(
boost::forward<A1>( a1 ),
boost::forward<A2>( a2 ),
boost::forward<A3>( a3 )
);
pd->set_initialized(); pd->set_initialized();
T * pt2 = static_cast< T* >( pv ); T * pt2 = static_cast< T* >( pv );
@@ -887,7 +452,7 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A
} }
template< class T, class A, class A1, class A2, class A3 > template< class T, class A, class A1, class A2, class A3 >
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3 ) typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3 )
{ {
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
@@ -895,7 +460,12 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,
void * pv = pd->address(); void * pv = pd->address();
::new( pv ) T( a1, a2, a3 ); ::new( pv ) T(
boost::forward<A1>( a1 ),
boost::forward<A2>( a2 ),
boost::forward<A3>( a3 )
);
pd->set_initialized(); pd->set_initialized();
T * pt2 = static_cast< T* >( pv ); T * pt2 = static_cast< T* >( pv );
@@ -905,7 +475,7 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,
} }
template< class T, class A1, class A2, class A3, class A4 > template< class T, class A1, class A2, class A3, class A4 >
typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 ) typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4 )
{ {
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
@@ -913,7 +483,13 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A
void * pv = pd->address(); void * pv = pd->address();
::new( pv ) T( a1, a2, a3, a4 ); ::new( pv ) T(
boost::forward<A1>( a1 ),
boost::forward<A2>( a2 ),
boost::forward<A3>( a3 ),
boost::forward<A4>( a4 )
);
pd->set_initialized(); pd->set_initialized();
T * pt2 = static_cast< T* >( pv ); T * pt2 = static_cast< T* >( pv );
@@ -923,7 +499,7 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A
} }
template< class T, class A, class A1, class A2, class A3, class A4 > template< class T, class A, class A1, class A2, class A3, class A4 >
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 ) typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4 )
{ {
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
@@ -931,7 +507,13 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,
void * pv = pd->address(); void * pv = pd->address();
::new( pv ) T( a1, a2, a3, a4 ); ::new( pv ) T(
boost::forward<A1>( a1 ),
boost::forward<A2>( a2 ),
boost::forward<A3>( a3 ),
boost::forward<A4>( a4 )
);
pd->set_initialized(); pd->set_initialized();
T * pt2 = static_cast< T* >( pv ); T * pt2 = static_cast< T* >( pv );
@@ -941,7 +523,7 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,
} }
template< class T, class A1, class A2, class A3, class A4, class A5 > template< class T, class A1, class A2, class A3, class A4, class A5 >
typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 ) typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5 )
{ {
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
@@ -949,7 +531,14 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A
void * pv = pd->address(); void * pv = pd->address();
::new( pv ) T( a1, a2, a3, a4, a5 ); ::new( pv ) T(
boost::forward<A1>( a1 ),
boost::forward<A2>( a2 ),
boost::forward<A3>( a3 ),
boost::forward<A4>( a4 ),
boost::forward<A5>( a5 )
);
pd->set_initialized(); pd->set_initialized();
T * pt2 = static_cast< T* >( pv ); T * pt2 = static_cast< T* >( pv );
@@ -959,7 +548,7 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A
} }
template< class T, class A, class A1, class A2, class A3, class A4, class A5 > template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 ) typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5 )
{ {
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
@@ -967,7 +556,14 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,
void * pv = pd->address(); void * pv = pd->address();
::new( pv ) T( a1, a2, a3, a4, a5 ); ::new( pv ) T(
boost::forward<A1>( a1 ),
boost::forward<A2>( a2 ),
boost::forward<A3>( a3 ),
boost::forward<A4>( a4 ),
boost::forward<A5>( a5 )
);
pd->set_initialized(); pd->set_initialized();
T * pt2 = static_cast< T* >( pv ); T * pt2 = static_cast< T* >( pv );
@@ -977,7 +573,7 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,
} }
template< class T, class A1, class A2, class A3, class A4, class A5, class A6 > template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 ) typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6 )
{ {
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
@@ -985,7 +581,15 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A
void * pv = pd->address(); void * pv = pd->address();
::new( pv ) T( a1, a2, a3, a4, a5, a6 ); ::new( pv ) T(
boost::forward<A1>( a1 ),
boost::forward<A2>( a2 ),
boost::forward<A3>( a3 ),
boost::forward<A4>( a4 ),
boost::forward<A5>( a5 ),
boost::forward<A6>( a6 )
);
pd->set_initialized(); pd->set_initialized();
T * pt2 = static_cast< T* >( pv ); T * pt2 = static_cast< T* >( pv );
@@ -995,7 +599,7 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A
} }
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 > template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 ) typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6 )
{ {
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
@@ -1003,7 +607,15 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,
void * pv = pd->address(); void * pv = pd->address();
::new( pv ) T( a1, a2, a3, a4, a5, a6 ); ::new( pv ) T(
boost::forward<A1>( a1 ),
boost::forward<A2>( a2 ),
boost::forward<A3>( a3 ),
boost::forward<A4>( a4 ),
boost::forward<A5>( a5 ),
boost::forward<A6>( a6 )
);
pd->set_initialized(); pd->set_initialized();
T * pt2 = static_cast< T* >( pv ); T * pt2 = static_cast< T* >( pv );
@@ -1013,7 +625,7 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,
} }
template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 > template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 ) typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7 )
{ {
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
@@ -1021,7 +633,16 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A
void * pv = pd->address(); void * pv = pd->address();
::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 ); ::new( pv ) T(
boost::forward<A1>( a1 ),
boost::forward<A2>( a2 ),
boost::forward<A3>( a3 ),
boost::forward<A4>( a4 ),
boost::forward<A5>( a5 ),
boost::forward<A6>( a6 ),
boost::forward<A7>( a7 )
);
pd->set_initialized(); pd->set_initialized();
T * pt2 = static_cast< T* >( pv ); T * pt2 = static_cast< T* >( pv );
@@ -1031,7 +652,7 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A
} }
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 > template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 ) typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7 )
{ {
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
@@ -1039,7 +660,16 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,
void * pv = pd->address(); void * pv = pd->address();
::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 ); ::new( pv ) T(
boost::forward<A1>( a1 ),
boost::forward<A2>( a2 ),
boost::forward<A3>( a3 ),
boost::forward<A4>( a4 ),
boost::forward<A5>( a5 ),
boost::forward<A6>( a6 ),
boost::forward<A7>( a7 )
);
pd->set_initialized(); pd->set_initialized();
T * pt2 = static_cast< T* >( pv ); T * pt2 = static_cast< T* >( pv );
@@ -1049,7 +679,7 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,
} }
template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8 ) typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8 )
{ {
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
@@ -1057,7 +687,17 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A
void * pv = pd->address(); void * pv = pd->address();
::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 ); ::new( pv ) T(
boost::forward<A1>( a1 ),
boost::forward<A2>( a2 ),
boost::forward<A3>( a3 ),
boost::forward<A4>( a4 ),
boost::forward<A5>( a5 ),
boost::forward<A6>( a6 ),
boost::forward<A7>( a7 ),
boost::forward<A8>( a8 )
);
pd->set_initialized(); pd->set_initialized();
T * pt2 = static_cast< T* >( pv ); T * pt2 = static_cast< T* >( pv );
@@ -1067,7 +707,7 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A
} }
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8 ) typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8 )
{ {
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
@@ -1075,7 +715,17 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,
void * pv = pd->address(); void * pv = pd->address();
::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 ); ::new( pv ) T(
boost::forward<A1>( a1 ),
boost::forward<A2>( a2 ),
boost::forward<A3>( a3 ),
boost::forward<A4>( a4 ),
boost::forward<A5>( a5 ),
boost::forward<A6>( a6 ),
boost::forward<A7>( a7 ),
boost::forward<A8>( a8 )
);
pd->set_initialized(); pd->set_initialized();
T * pt2 = static_cast< T* >( pv ); T * pt2 = static_cast< T* >( pv );
@@ -1085,7 +735,7 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,
} }
template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 > template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9 ) typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8, BOOST_FWD_REF(A9) a9 )
{ {
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
@@ -1093,7 +743,18 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A
void * pv = pd->address(); void * pv = pd->address();
::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 ); ::new( pv ) T(
boost::forward<A1>( a1 ),
boost::forward<A2>( a2 ),
boost::forward<A3>( a3 ),
boost::forward<A4>( a4 ),
boost::forward<A5>( a5 ),
boost::forward<A6>( a6 ),
boost::forward<A7>( a7 ),
boost::forward<A8>( a8 ),
boost::forward<A9>( a9 )
);
pd->set_initialized(); pd->set_initialized();
T * pt2 = static_cast< T* >( pv ); T * pt2 = static_cast< T* >( pv );
@@ -1103,7 +764,7 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A
} }
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 > template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9 ) typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8, BOOST_FWD_REF(A9) a9 )
{ {
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
@@ -1111,7 +772,18 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,
void * pv = pd->address(); void * pv = pd->address();
::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 ); ::new( pv ) T(
boost::forward<A1>( a1 ),
boost::forward<A2>( a2 ),
boost::forward<A3>( a3 ),
boost::forward<A4>( a4 ),
boost::forward<A5>( a5 ),
boost::forward<A6>( a6 ),
boost::forward<A7>( a7 ),
boost::forward<A8>( a8 ),
boost::forward<A9>( a9 )
);
pd->set_initialized(); pd->set_initialized();
T * pt2 = static_cast< T* >( pv ); T * pt2 = static_cast< T* >( pv );
@@ -1120,8 +792,6 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,
return boost::shared_ptr< T >( pt, pt2 ); return boost::shared_ptr< T >( pt, pt2 );
} }
#endif // !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
#endif // !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) #endif // !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
#undef BOOST_SP_MSD #undef BOOST_SP_MSD

View File

@@ -1,15 +1,110 @@
/* /*
* Copyright (c) 2014 Glen Joseph Fernandes Copyright 2012-2015 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License, Distributed under the Boost Software License, Version 1.0.
* Version 1.0. (See accompanying file LICENSE_1_0.txt (http://www.boost.org/LICENSE_1_0.txt)
* or copy at http://boost.org/LICENSE_1_0.txt) */
*/
#ifndef BOOST_SMART_PTR_MAKE_UNIQUE_HPP #ifndef BOOST_SMART_PTR_MAKE_UNIQUE_HPP
#define BOOST_SMART_PTR_MAKE_UNIQUE_HPP #define BOOST_SMART_PTR_MAKE_UNIQUE_HPP
#include <boost/smart_ptr/make_unique_array.hpp> #include <boost/config.hpp>
#include <boost/smart_ptr/make_unique_object.hpp> #include <memory>
#include <utility>
namespace boost {
namespace detail {
template<class T>
struct up_if_object {
typedef std::unique_ptr<T> type;
};
template<class T>
struct up_if_object<T[]> { };
template<class T, std::size_t N>
struct up_if_object<T[N]> { };
template<class T>
struct up_if_array { };
template<class T>
struct up_if_array<T[]> {
typedef std::unique_ptr<T[]> type;
};
template<class T>
struct up_remove_reference {
typedef T type;
};
template<class T>
struct up_remove_reference<T&> {
typedef T type;
};
template<class T>
struct up_remove_reference<T&&> {
typedef T type;
};
template<class T>
struct up_element { };
template<class T>
struct up_element<T[]> {
typedef T type;
};
} /* detail */
template<class T>
inline typename detail::up_if_object<T>::type
make_unique()
{
return std::unique_ptr<T>(new T());
}
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
template<class T, class... Args>
inline typename detail::up_if_object<T>::type
make_unique(Args&&... args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
#endif
template<class T>
inline typename detail::up_if_object<T>::type
make_unique(typename detail::up_remove_reference<T>::type&& value)
{
return std::unique_ptr<T>(new T(std::move(value)));
}
template<class T>
inline typename detail::up_if_object<T>::type
make_unique_noinit()
{
return std::unique_ptr<T>(new T);
}
template<class T>
inline typename detail::up_if_array<T>::type
make_unique(std::size_t size)
{
return std::unique_ptr<T>(new typename
detail::up_element<T>::type[size]());
}
template<class T>
inline typename detail::up_if_array<T>::type
make_unique_noinit(std::size_t size)
{
return std::unique_ptr<T>(new typename
detail::up_element<T>::type[size]);
}
} /* boost */
#endif #endif

View File

@@ -1,31 +0,0 @@
/*
* Copyright (c) 2014 Glen Joseph Fernandes
* glenfe at live dot com
*
* Distributed under the Boost Software License,
* Version 1.0. (See accompanying file LICENSE_1_0.txt
* or copy at http://boost.org/LICENSE_1_0.txt)
*/
#ifndef BOOST_SMART_PTR_MAKE_UNIQUE_ARRAY_HPP
#define BOOST_SMART_PTR_MAKE_UNIQUE_ARRAY_HPP
#include <boost/smart_ptr/detail/up_if_array.hpp>
#include <boost/smart_ptr/detail/array_traits.hpp>
namespace boost {
template<class T>
inline typename boost::detail::up_if_array<T>::type
make_unique(std::size_t size) {
typedef typename boost::detail::array_inner<T>::type U;
return std::unique_ptr<T>(new U[size]());
}
template<class T>
inline typename boost::detail::up_if_array<T>::type
make_unique_noinit(std::size_t size) {
typedef typename boost::detail::array_inner<T>::type U;
return std::unique_ptr<T>(new U[size]);
}
}
#endif

View File

@@ -1,45 +0,0 @@
/*
* Copyright (c) 2014 Glen Joseph Fernandes
* glenfe at live dot com
*
* Distributed under the Boost Software License,
* Version 1.0. (See accompanying file LICENSE_1_0.txt
* or copy at http://boost.org/LICENSE_1_0.txt)
*/
#ifndef BOOST_SMART_PTR_MAKE_UNIQUE_OBJECT_HPP
#define BOOST_SMART_PTR_MAKE_UNIQUE_OBJECT_HPP
#include <boost/config.hpp>
#include <boost/smart_ptr/detail/up_if_not_array.hpp>
#include <boost/type_traits/add_rvalue_reference.hpp>
#include <utility>
namespace boost {
template<class T>
inline typename boost::detail::up_if_not_array<T>::type
make_unique() {
return std::unique_ptr<T>(new T());
}
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
template<class T, class... Args>
inline typename boost::detail::up_if_not_array<T>::type
make_unique(Args&&... args) {
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
#endif
template<class T>
inline typename boost::detail::up_if_not_array<T>::type
make_unique(typename add_rvalue_reference<T>::type value) {
return std::unique_ptr<T>(new T(std::move(value)));
}
template<class T>
inline typename boost::detail::up_if_not_array<T>::type
make_unique_noinit() {
return std::unique_ptr<T>(new T);
}
}
#endif

View File

@@ -5,6 +5,7 @@
// owner_less.hpp // owner_less.hpp
// //
// Copyright (c) 2008 Frank Mori Hess // Copyright (c) 2008 Frank Mori Hess
// Copyright (c) 2016 Peter Dimov
// //
// Distributed under the Boost Software License, Version 1.0. (See // Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at // accompanying file LICENSE_1_0.txt or copy at
@@ -13,44 +14,20 @@
// See http://www.boost.org/libs/smart_ptr/smart_ptr.htm for documentation. // See http://www.boost.org/libs/smart_ptr/smart_ptr.htm for documentation.
// //
#include <functional>
namespace boost namespace boost
{ {
template<typename T> class shared_ptr;
template<typename T> class weak_ptr;
namespace detail template<class T = void> struct owner_less
{ {
template<typename T, typename U> typedef bool result_type;
struct generic_owner_less : public std::binary_function<T, T, bool> typedef T first_argument_type;
typedef T second_argument_type;
template<class U, class V> bool operator()( U const & u, V const & v ) const
{ {
bool operator()(const T &lhs, const T &rhs) const return u.owner_before( v );
{ }
return lhs.owner_before(rhs); };
}
bool operator()(const T &lhs, const U &rhs) const
{
return lhs.owner_before(rhs);
}
bool operator()(const U &lhs, const T &rhs) const
{
return lhs.owner_before(rhs);
}
};
} // namespace detail
template<typename T> struct owner_less;
template<typename T>
struct owner_less<shared_ptr<T> >:
public detail::generic_owner_less<shared_ptr<T>, weak_ptr<T> >
{};
template<typename T>
struct owner_less<weak_ptr<T> >:
public detail::generic_owner_less<weak_ptr<T>, shared_ptr<T> >
{};
} // namespace boost } // namespace boost

View File

@@ -15,6 +15,7 @@
#include <boost/assert.hpp> #include <boost/assert.hpp>
#include <boost/checked_delete.hpp> #include <boost/checked_delete.hpp>
#include <boost/smart_ptr/detail/sp_nullptr_t.hpp> #include <boost/smart_ptr/detail/sp_nullptr_t.hpp>
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
#include <boost/detail/workaround.hpp> #include <boost/detail/workaround.hpp>
@@ -54,7 +55,7 @@ public:
typedef T element_type; typedef T element_type;
explicit scoped_array( T * p = 0 ) BOOST_NOEXCEPT : px( p ) explicit scoped_array( T * p = 0 ) BOOST_SP_NOEXCEPT : px( p )
{ {
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
boost::sp_array_constructor_hook( px ); boost::sp_array_constructor_hook( px );

View File

@@ -15,12 +15,19 @@
#include <boost/assert.hpp> #include <boost/assert.hpp>
#include <boost/checked_delete.hpp> #include <boost/checked_delete.hpp>
#include <boost/smart_ptr/detail/sp_nullptr_t.hpp> #include <boost/smart_ptr/detail/sp_nullptr_t.hpp>
#include <boost/smart_ptr/detail/sp_disable_deprecated.hpp>
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
#include <boost/detail/workaround.hpp> #include <boost/detail/workaround.hpp>
#ifndef BOOST_NO_AUTO_PTR #ifndef BOOST_NO_AUTO_PTR
# include <memory> // for std::auto_ptr # include <memory> // for std::auto_ptr
#endif #endif
#if defined( BOOST_SP_DISABLE_DEPRECATED )
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
namespace boost namespace boost
{ {
@@ -56,7 +63,7 @@ public:
typedef T element_type; typedef T element_type;
explicit scoped_ptr( T * p = 0 ): px( p ) // never throws explicit scoped_ptr( T * p = 0 ) BOOST_SP_NOEXCEPT : px( p ) // never throws
{ {
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
boost::sp_scalar_constructor_hook( px ); boost::sp_scalar_constructor_hook( px );
@@ -154,4 +161,8 @@ template<class T> inline T * get_pointer(scoped_ptr<T> const & p) BOOST_NOEXCEPT
} // namespace boost } // namespace boost
#if defined( BOOST_SP_DISABLE_DEPRECATED )
#pragma GCC diagnostic pop
#endif
#endif // #ifndef BOOST_SMART_PTR_SCOPED_PTR_HPP_INCLUDED #endif // #ifndef BOOST_SMART_PTR_SCOPED_PTR_HPP_INCLUDED

View File

@@ -24,6 +24,7 @@
#include <boost/smart_ptr/shared_ptr.hpp> #include <boost/smart_ptr/shared_ptr.hpp>
#include <boost/smart_ptr/detail/shared_count.hpp> #include <boost/smart_ptr/detail/shared_count.hpp>
#include <boost/smart_ptr/detail/sp_nullptr_t.hpp> #include <boost/smart_ptr/detail/sp_nullptr_t.hpp>
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
#include <boost/detail/workaround.hpp> #include <boost/detail/workaround.hpp>
#include <cstddef> // for std::ptrdiff_t #include <cstddef> // for std::ptrdiff_t
@@ -53,13 +54,13 @@ public:
typedef T element_type; typedef T element_type;
shared_array() BOOST_NOEXCEPT : px( 0 ), pn() shared_array() BOOST_SP_NOEXCEPT : px( 0 ), pn()
{ {
} }
#if !defined( BOOST_NO_CXX11_NULLPTR ) #if !defined( BOOST_NO_CXX11_NULLPTR )
shared_array( boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT : px( 0 ), pn() shared_array( boost::detail::sp_nullptr_t ) BOOST_SP_NOEXCEPT : px( 0 ), pn()
{ {
} }
@@ -95,11 +96,11 @@ public:
// ... except in C++0x, move disables the implicit copy // ... except in C++0x, move disables the implicit copy
shared_array( shared_array const & r ) BOOST_NOEXCEPT : px( r.px ), pn( r.pn ) shared_array( shared_array const & r ) BOOST_SP_NOEXCEPT : px( r.px ), pn( r.pn )
{ {
} }
shared_array( shared_array && r ) BOOST_NOEXCEPT : px( r.px ), pn() shared_array( shared_array && r ) BOOST_SP_NOEXCEPT : px( r.px ), pn()
{ {
pn.swap( r.pn ); pn.swap( r.pn );
r.px = 0; r.px = 0;
@@ -133,7 +134,7 @@ public:
// assignment // assignment
shared_array & operator=( shared_array const & r ) BOOST_NOEXCEPT shared_array & operator=( shared_array const & r ) BOOST_SP_NOEXCEPT
{ {
this_type( r ).swap( *this ); this_type( r ).swap( *this );
return *this; return *this;
@@ -152,7 +153,7 @@ public:
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
shared_array & operator=( shared_array && r ) BOOST_NOEXCEPT shared_array & operator=( shared_array && r ) BOOST_SP_NOEXCEPT
{ {
this_type( static_cast< shared_array && >( r ) ).swap( *this ); this_type( static_cast< shared_array && >( r ) ).swap( *this );
return *this; return *this;

View File

@@ -29,6 +29,8 @@
#include <boost/detail/workaround.hpp> #include <boost/detail/workaround.hpp>
#include <boost/smart_ptr/detail/sp_convertible.hpp> #include <boost/smart_ptr/detail/sp_convertible.hpp>
#include <boost/smart_ptr/detail/sp_nullptr_t.hpp> #include <boost/smart_ptr/detail/sp_nullptr_t.hpp>
#include <boost/smart_ptr/detail/sp_disable_deprecated.hpp>
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
#if !defined(BOOST_SP_NO_ATOMIC_ACCESS) #if !defined(BOOST_SP_NO_ATOMIC_ACCESS)
#include <boost/smart_ptr/detail/spinlock_pool.hpp> #include <boost/smart_ptr/detail/spinlock_pool.hpp>
@@ -47,6 +49,11 @@
#endif #endif
#endif #endif
#if defined( BOOST_SP_DISABLE_DEPRECATED )
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
namespace boost namespace boost
{ {
@@ -55,6 +62,13 @@ template<class T> class weak_ptr;
template<class T> class enable_shared_from_this; template<class T> class enable_shared_from_this;
class enable_shared_from_raw; class enable_shared_from_raw;
namespace movelib
{
template< class T, class D > class unique_ptr;
} // namespace movelib
namespace detail namespace detail
{ {
@@ -331,13 +345,13 @@ public:
typedef typename boost::detail::sp_element< T >::type element_type; typedef typename boost::detail::sp_element< T >::type element_type;
shared_ptr() BOOST_NOEXCEPT : px( 0 ), pn() // never throws in 1.30+ shared_ptr() BOOST_SP_NOEXCEPT : px( 0 ), pn() // never throws in 1.30+
{ {
} }
#if !defined( BOOST_NO_CXX11_NULLPTR ) #if !defined( BOOST_NO_CXX11_NULLPTR )
shared_ptr( boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT : px( 0 ), pn() // never throws shared_ptr( boost::detail::sp_nullptr_t ) BOOST_SP_NOEXCEPT : px( 0 ), pn() // never throws
{ {
} }
@@ -389,7 +403,7 @@ public:
// ... except in C++0x, move disables the implicit copy // ... except in C++0x, move disables the implicit copy
shared_ptr( shared_ptr const & r ) BOOST_NOEXCEPT : px( r.px ), pn( r.pn ) shared_ptr( shared_ptr const & r ) BOOST_SP_NOEXCEPT : px( r.px ), pn( r.pn )
{ {
} }
@@ -495,9 +509,20 @@ public:
#endif #endif
template< class Y, class D >
shared_ptr( boost::movelib::unique_ptr< Y, D > r ): px( r.get() ), pn()
{
boost::detail::sp_assert_convertible< Y, T >();
typename boost::movelib::unique_ptr< Y, D >::pointer tmp = r.get();
pn = boost::detail::shared_count( r );
boost::detail::sp_deleter_construct( this, tmp );
}
// assignment // assignment
shared_ptr & operator=( shared_ptr const & r ) BOOST_NOEXCEPT shared_ptr & operator=( shared_ptr const & r ) BOOST_SP_NOEXCEPT
{ {
this_type(r).swap(*this); this_type(r).swap(*this);
return *this; return *this;
@@ -556,11 +581,32 @@ public:
#endif #endif
template<class Y, class D>
shared_ptr & operator=( boost::movelib::unique_ptr<Y, D> r )
{
// this_type( static_cast< unique_ptr<Y, D> && >( r ) ).swap( *this );
boost::detail::sp_assert_convertible< Y, T >();
typename boost::movelib::unique_ptr< Y, D >::pointer p = r.get();
shared_ptr tmp;
tmp.px = p;
tmp.pn = boost::detail::shared_count( r );
boost::detail::sp_deleter_construct( &tmp, p );
tmp.swap( *this );
return *this;
}
// Move support // Move support
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
shared_ptr( shared_ptr && r ) BOOST_NOEXCEPT : px( r.px ), pn() shared_ptr( shared_ptr && r ) BOOST_SP_NOEXCEPT : px( r.px ), pn()
{ {
pn.swap( r.pn ); pn.swap( r.pn );
r.px = 0; r.px = 0;
@@ -584,7 +630,7 @@ public:
r.px = 0; r.px = 0;
} }
shared_ptr & operator=( shared_ptr && r ) BOOST_NOEXCEPT shared_ptr & operator=( shared_ptr && r ) BOOST_SP_NOEXCEPT
{ {
this_type( static_cast< shared_ptr && >( r ) ).swap( *this ); this_type( static_cast< shared_ptr && >( r ) ).swap( *this );
return *this; return *this;
@@ -597,6 +643,14 @@ public:
return *this; return *this;
} }
// aliasing move
template<class Y>
shared_ptr( shared_ptr<Y> && r, element_type * p ) BOOST_NOEXCEPT : px( p ), pn()
{
pn.swap( r.pn );
r.px = 0;
}
#endif #endif
#if !defined( BOOST_NO_CXX11_NULLPTR ) #if !defined( BOOST_NO_CXX11_NULLPTR )
@@ -634,7 +688,16 @@ public:
{ {
this_type( r, p ).swap( *this ); this_type( r, p ).swap( *this );
} }
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
template<class Y> void reset( shared_ptr<Y> && r, element_type * p )
{
this_type( static_cast< shared_ptr<Y> && >( r ), p ).swap( *this );
}
#endif
// never throws (but has a BOOST_ASSERT in it, so not marked with BOOST_NOEXCEPT) // never throws (but has a BOOST_ASSERT in it, so not marked with BOOST_NOEXCEPT)
typename boost::detail::sp_dereference< T >::type operator* () const typename boost::detail::sp_dereference< T >::type operator* () const
{ {
@@ -655,7 +718,7 @@ public:
BOOST_ASSERT( px != 0 ); BOOST_ASSERT( px != 0 );
BOOST_ASSERT( i >= 0 && ( i < boost::detail::sp_extent< T >::value || boost::detail::sp_extent< T >::value == 0 ) ); BOOST_ASSERT( i >= 0 && ( i < boost::detail::sp_extent< T >::value || boost::detail::sp_extent< T >::value == 0 ) );
return px[ i ]; return static_cast< typename boost::detail::sp_array_access< T >::type >( px[ i ] );
} }
element_type * get() const BOOST_NOEXCEPT element_type * get() const BOOST_NOEXCEPT
@@ -820,6 +883,50 @@ template<class T, class U> shared_ptr<T> reinterpret_pointer_cast( shared_ptr<U>
return shared_ptr<T>( r, p ); return shared_ptr<T>( r, p );
} }
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
template<class T, class U> shared_ptr<T> static_pointer_cast( shared_ptr<U> && r ) BOOST_NOEXCEPT
{
(void) static_cast< T* >( static_cast< U* >( 0 ) );
typedef typename shared_ptr<T>::element_type E;
E * p = static_cast< E* >( r.get() );
return shared_ptr<T>( std::move(r), p );
}
template<class T, class U> shared_ptr<T> const_pointer_cast( shared_ptr<U> && r ) BOOST_NOEXCEPT
{
(void) const_cast< T* >( static_cast< U* >( 0 ) );
typedef typename shared_ptr<T>::element_type E;
E * p = const_cast< E* >( r.get() );
return shared_ptr<T>( std::move(r), p );
}
template<class T, class U> shared_ptr<T> dynamic_pointer_cast( shared_ptr<U> && r ) BOOST_NOEXCEPT
{
(void) dynamic_cast< T* >( static_cast< U* >( 0 ) );
typedef typename shared_ptr<T>::element_type E;
E * p = dynamic_cast< E* >( r.get() );
return p? shared_ptr<T>( std::move(r), p ): shared_ptr<T>();
}
template<class T, class U> shared_ptr<T> reinterpret_pointer_cast( shared_ptr<U> && r ) BOOST_NOEXCEPT
{
(void) reinterpret_cast< T* >( static_cast< U* >( 0 ) );
typedef typename shared_ptr<T>::element_type E;
E * p = reinterpret_cast< E* >( r.get() );
return shared_ptr<T>( std::move(r), p );
}
#endif // !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
// get_pointer() enables boost::mem_fn to recognize shared_ptr // get_pointer() enables boost::mem_fn to recognize shared_ptr
template<class T> inline typename shared_ptr<T>::element_type * get_pointer(shared_ptr<T> const & p) BOOST_NOEXCEPT template<class T> inline typename shared_ptr<T>::element_type * get_pointer(shared_ptr<T> const & p) BOOST_NOEXCEPT
@@ -893,7 +1000,7 @@ class esft2_deleter_wrapper
{ {
private: private:
shared_ptr<void> deleter_; shared_ptr<void const volatile> deleter_;
public: public:
@@ -1020,9 +1127,13 @@ template< class T > struct hash;
template< class T > std::size_t hash_value( boost::shared_ptr<T> const & p ) BOOST_NOEXCEPT template< class T > std::size_t hash_value( boost::shared_ptr<T> const & p ) BOOST_NOEXCEPT
{ {
return boost::hash< T* >()( p.get() ); return boost::hash< typename boost::shared_ptr<T>::element_type* >()( p.get() );
} }
} // namespace boost } // namespace boost
#if defined( BOOST_SP_DISABLE_DEPRECATED )
#pragma GCC diagnostic pop
#endif
#endif // #ifndef BOOST_SMART_PTR_SHARED_PTR_HPP_INCLUDED #endif // #ifndef BOOST_SMART_PTR_SHARED_PTR_HPP_INCLUDED

View File

@@ -16,6 +16,7 @@
#include <memory> // boost.TR1 include order fix #include <memory> // boost.TR1 include order fix
#include <boost/smart_ptr/detail/shared_count.hpp> #include <boost/smart_ptr/detail/shared_count.hpp>
#include <boost/smart_ptr/shared_ptr.hpp> #include <boost/smart_ptr/shared_ptr.hpp>
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
namespace boost namespace boost
{ {
@@ -31,7 +32,7 @@ public:
typedef typename boost::detail::sp_element< T >::type element_type; typedef typename boost::detail::sp_element< T >::type element_type;
weak_ptr() BOOST_NOEXCEPT : px(0), pn() // never throws in 1.30+ weak_ptr() BOOST_SP_NOEXCEPT : px(0), pn() // never throws in 1.30+
{ {
} }
@@ -41,11 +42,11 @@ public:
// ... except in C++0x, move disables the implicit copy // ... except in C++0x, move disables the implicit copy
weak_ptr( weak_ptr const & r ) BOOST_NOEXCEPT : px( r.px ), pn( r.pn ) weak_ptr( weak_ptr const & r ) BOOST_SP_NOEXCEPT : px( r.px ), pn( r.pn )
{ {
} }
weak_ptr & operator=( weak_ptr const & r ) BOOST_NOEXCEPT weak_ptr & operator=( weak_ptr const & r ) BOOST_SP_NOEXCEPT
{ {
px = r.px; px = r.px;
pn = r.pn; pn = r.pn;
@@ -106,13 +107,13 @@ public:
// for better efficiency in the T == Y case // for better efficiency in the T == Y case
weak_ptr( weak_ptr && r ) weak_ptr( weak_ptr && r )
BOOST_NOEXCEPT : px( r.px ), pn( static_cast< boost::detail::weak_count && >( r.pn ) ) BOOST_SP_NOEXCEPT : px( r.px ), pn( static_cast< boost::detail::weak_count && >( r.pn ) )
{ {
r.px = 0; r.px = 0;
} }
// for better efficiency in the T == Y case // for better efficiency in the T == Y case
weak_ptr & operator=( weak_ptr && r ) BOOST_NOEXCEPT weak_ptr & operator=( weak_ptr && r ) BOOST_SP_NOEXCEPT
{ {
this_type( static_cast< weak_ptr && >( r ) ).swap( *this ); this_type( static_cast< weak_ptr && >( r ) ).swap( *this );
return *this; return *this;

View File

@@ -1,273 +1,393 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <!DOCTYPE html>
<html> <html lang="en">
<head> <head>
<title>make_shared and allocate_shared for arrays</title> <meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>allocate_shared and make_shared for arrays</title>
</head> </head>
<body text="#000000" bgcolor="#ffffff" link="#0000ff" vlink="#0000ff"> <body>
<h1><img height="86" alt="boost.png (6897 bytes)" src="../../boost.png" <h1>allocate_shared and make_shared for arrays</h1>
width="277" align="middle" border="0">make_shared and allocate_shared <div id="navigation">
for arrays</h1> <ul>
<p><a href="#introduction">Introduction</a><br> <li><a href="#introduction">Introduction</a></li>
<a href="#synopsis">Synopsis</a><br> <li><a href="#synopsis">Synopsis</a></li>
<a href="#common">Common Requirements</a><br> <li><a href="#requirements">Common Requirements</a></li>
<a href="#functions">Free Functions</a><br> <li><a href="#functions">Free Functions</a></li>
<a href="#history">History</a><br> <li><a href="#history">History</a></li>
<a href="#references">References</a></p> <li><a href="#references">References</a></li>
<h2><a name="introduction">Introduction</a></h2> </ul>
<p>Originally the Boost function templates <code>make_shared</code> and </div>
<code>allocate_shared</code> were for efficient allocation of shared <div id="introduction">
objects only. There was a need to have efficient allocation of <h2>Introduction</h2>
shared arrays. One criticism of class template <code>shared_array</code> <p>
was always the lack of a <a href="make_shared.html">make_shared</a> Originally the Boost function templates <code>allocate_shared</code> and
utility which ensures only a single allocation.</p> <code>make_shared</code> were for efficient allocation of shared scalar
<p>The header files &lt;boost/smart_ptr/make_shared_array.hpp&gt; and objects only. There was a need to have efficient allocation of shared
&lt;boost/smart_ptr/allocate_shared_array.hpp&gt; provide function arrays. One criticism of class template <code>shared_array</code>
templates, overloads of <code>make_shared</code> and was always the lack of a utility like <code>make_shared</code> that
<code>allocate_shared</code> for array types, to address this need. uses only a single allocation.
<code>make_shared</code> uses the global operator <code>new</code> to </p>
allocate memory, whereas <code>allocate_shared</code> uses an <p>
user-supplied allocator, allowing finer control.</p> The header files &lt;boost/smart_ptr/allocate_shared_array.hpp&gt; and
<h2><a name="synopsis">Synopsis</a></h2> &lt;boost/smart_ptr/make_shared_array.hpp&gt; provide function
<pre>namespace boost { templates, overloads of <code>allocate_shared</code> and
template&lt;class U&gt; // U is T[] <code>make_shared</code> for array types, to address this need.
shared_ptr&lt;U&gt; <a href="#functions">make_shared</a>(size_t size); <code>allocate_shared</code> uses a user-supplied allocator for
allocation, while <code>make_shared</code> uses
template&lt;class U, class A&gt; // U is T[] <code>allocate_shared</code> with the Default Allocator.
shared_ptr&lt;U&gt; <a href="#functions">allocate_shared</a>(const A&amp; allocator, size_t size); </p>
</div>
template&lt;class U&gt; // U is T[N] <div id="synopsis">
shared_ptr&lt;U&gt; <a href="#functions">make_shared</a>(); <h2>Synopsis</h2>
<div>
template&lt;class U, class A&gt; // U is T[N] <h3>Header &lt;boost/smart_ptr/allocate_shared_array.hpp&gt;</h3>
shared_ptr&lt;U&gt; <a href="#functions">allocate_shared</a>(const A&amp; allocator); <code>namespace boost {</code>
<blockquote>
template&lt;class U&gt; // U is T[] <code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
shared_ptr&lt;U&gt; <a href="#functions">make_shared</a>(size_t size, const T&amp; value); <a href="#functions">allocate_shared</a>(const A&amp; a,
std::size_t n);</code>
template&lt;class U, class A&gt; // U is T[] </blockquote>
shared_ptr&lt;U&gt; <a href="#functions">allocate_shared</a>(const A&amp; allocator, size_t size, const T&amp; value); <blockquote>
<code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
template&lt;class U&gt; // U is T[N] <a href="#functions">allocate_shared</a>(const A&amp; a);</code>
shared_ptr&lt;U&gt; <a href="#functions">make_shared</a>(const T&amp; value); </blockquote>
<blockquote>
template&lt;class U, class A&gt; // U is T[N] <code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
shared_ptr&lt;U&gt; <a href="#functions">allocate_shared</a>(const A&amp; allocator, const T&amp; value); <a href="#functions">allocate_shared</a>(const A&amp; a, std::size_t n,
const <em>E</em>&amp; v);</code>
template&lt;class U&gt; // U is T[] </blockquote>
shared_ptr&lt;U&gt; <a href="#functions">make_shared_noinit</a>(size_t size); <blockquote>
<code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
template&lt;class U, class A&gt; // U is T[] <a href="#functions">allocate_shared</a>(const A&amp; a,
shared_ptr&lt;U&gt; <a href="#functions">allocate_shared_noinit</a>(const A&amp; allocator, size_t size); const <em>E</em>&amp; v);</code>
</blockquote>
template&lt;class U&gt; // U is T[N] <blockquote>
shared_ptr&lt;U&gt; <a href="#functions">make_shared_noinit</a>(); <code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
<a href="#functions">allocate_shared_noinit</a>(const A&amp; a,
template&lt;class U, class A&gt; // U is T[N] std::size_t n);</code>
shared_ptr&lt;U&gt; <a href="#functions">allocate_shared_noinit</a>(const A&amp; allocator); </blockquote>
}</pre> <blockquote>
<h2><a name="common">Common Requirements</a></h2> <code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
<pre>template&lt;class U&gt; <a href="#functions">allocate_shared_noinit</a>(const A&amp; a);</code>
shared_ptr&lt;U&gt; make_shared(<em>args</em>); </blockquote>
template&lt;class U, class A&gt; <code>}</code>
shared_ptr&lt;U&gt; allocate_shared(const A&amp; allocator, <em>args</em>); </div>
template&lt;class U&gt; <div>
shared_ptr&lt;U&gt; make_shared_noinit(<em>args</em>); <h3>Header &lt;boost/smart_ptr/make_shared_array.hpp&gt;</h3>
template&lt;class U, class A&gt; <code>namespace boost {</code>
shared_ptr&lt;U&gt; allocate_shared_noinit(const A&amp; allocator, <em>args</em>);</pre> <blockquote>
<blockquote> <code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
<p><b>Requires:</b> <code>U</code> is of the form <code>T[]</code> or <a href="#functions">make_shared</a>(std::size_t n);</code>
<code>T[N]</code>. <code>A</code> shall be an <em>Allocator</em>, as </blockquote>
described in section 17.6.3.5 [<strong>Allocator <blockquote>
requirements</strong>] of the C++ Standard. The copy constructor and <code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
destructor of <code>A</code> shall not throw exceptions.</p> <a href="#functions">make_shared</a>();</code>
<p><b>Effects:</b> Allocates memory for an object of type <code>U</code> </blockquote>
(or <code>T[size]</code> when <code>U</code> is <code>T[]</code>, <blockquote>
where <code>size</code> is determined from <code><em>args</em></code> <code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
as specified by the concrete overload). The object is initialized as <a href="#functions">make_shared</a>(std::size_t n,
specified by the concrete overload. The templates const <em>E</em>&amp; v);</code>
<code>allocate_shared</code> and <code>allocate_shared_noinit</code> </blockquote>
use a copy of <code>allocator</code> to allocate memory. If an <blockquote>
exception is thrown, the functions have no effect.</p> <code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
<p><b>Returns:</b> A <code>shared_ptr</code> instance that stores and <a href="#functions">make_shared</a>(const <em>E</em>&amp; v);</code>
owns the address of the newly constructed object.</p> </blockquote>
<p><b>Postconditions:</b> <code>r.get() != 0 &amp;&amp; <blockquote>
r.use_count() == 1</code>, where <code>r</code> is the return <code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
value.</p> <a href="#functions">make_shared_noinit</a>(std::size_t n);</code>
<p><b>Throws:</b> <code>bad_alloc</code>, an exception thrown from </blockquote>
<code>A::allocate</code>, or from the initialization of the <blockquote>
object.</p> <code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
<p><b>Remarks:</b></p> <a href="#functions">make_shared_noinit</a>();</code>
<blockquote> </blockquote>
<p>This implementation performs no more than one memory <code>}</code>
allocation. This provides efficiency to equivalent to an intrusive </div>
smart pointer.</p> </div>
<p>When an object of an array type <code>T</code> is specified to be <div id="requirements">
initialized to a value of the same type <code>value</code>, this <h2>Common Requirements</h2>
shall be interpreted to mean that each array element of the object <h3><code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
is initialized to the corresponding element from allocate_shared(const A&amp; a, <em>args</em>);</code></h3>
<code>value</code>.</p> <dl>
<p>When an object of an array type is specified to be <dt><strong>Requires:</strong></dt>
value-initialized, this shall be interpreted to mean that each <dd><code>T</code> is of the form <code>E[N]</code> or
array element of the object is value-initialized.</p> <code>E[]</code>. <code>A</code> shall be an <em>Allocator</em>, as
<p>Array elements are initialized in ascending order of their described in section 17.6.3.5 [Allocator requirements] of the C++
addresses.</p> Standard. The copy constructor and destructor of <code>A</code> shall
<p>When a subobject of a non-array type <code>T</code> is specified to not throw exceptions.</dd>
be initialized to a value <code>value</code>, <dt><strong>Effects:</strong></dt>
<code>make_shared</code> shall perform this initialization via the <dd>Allocates storage for an object of type <code>E</code> (or
expression <code>::new(ptr) T(value)</code>, where <code>ptr</code> <code>E[size]</code> when <code>T</code> is <code>E[]</code>, where
has type <code>void*</code> and points to storage suitable to hold <code>size</code> is determined from <code>args</code> as specified by
an object of type <code>T</code>.</p> the concrete overload). A copy of the allocator is used to allocate
<p>When a subobject of non-array type <code>T</code> is specified to storage. The storage is initialized as specified by the concrete
be initialized to a value <code>value</code>, overload. If an exception is thrown, the functions have no effect.</dd>
<code>allocate_shared</code> shall perform this initialization via <dt><strong>Returns:</strong></dt>
the expression <code>allocator_traits&lt;A2&gt;::construct(a2, ptr, <dd>A <code>shared_ptr</code> instance that stores and owns the address
value)</code>, where <code>ptr</code> points to storage suitable to of the newly allocated and constructed object.</dd>
hold an object of type <code>T</code> and <code>a2</code> of type A2 <dt><strong>Postconditions:</strong></dt>
is a rebound copy of the allocator <code>allocator</code> passed to <dd><code>r.get() != 0</code> and <code>r.use_count() == 1</code>,
<code>allocate_shared</code> such that its <code>value_type</code> where <code>r</code> is the return value.</dd>
is <code>T</code>.</p> <dt><strong>Throws:</strong></dt>
<p>When a subobject of non-array type <code>T</code> is specified to <dd>An exception thrown from <code>A::allocate()</code>, or from the
be value-initialized, <code>make_shared</code> shall perform this initialization of the object.</dd>
initialization via the expression <code>::new(ptr) T()</code>, where <dt><strong>Remarks:</strong></dt>
<code>ptr</code> has type <code>void*</code> and points to storage <dd>
suitable to hold an object of type <code>T</code>.</p> <ul>
<p>When a subobject of non-array type <code>T</code> is specified to <li>This implementation performs no more than one memory allocation.
be value-initialized, <code>allocate_shared</code> shall perform This provides efficiency to equivalent to an intrusive smart
this initialization via the expression pointer.</li>
<code>allocator_traits&lt;A2&gt;::construct(a2, ptr)</code>, where <li>When an object of an array type <code>T</code> is specified to be
<code>ptr</code> points to storage suitable to hold an object initialized to a value of the same type <code>v</code>, this shall be
of type <code>T</code> and <code>a2</code> of type A2 is a rebound interpreted to mean that each array element of the object is initialized
copy of the allocator <code>allocator</code> passed to to the corresponding element from <code>v</code>.</li>
<code>allocate_shared</code> such that its <code>value_type</code> <li>When an object of an array type <code>T</code> is specified to be
is <code>T</code>.</p> value-initialized, this shall be interpreted to mean that each array
<p>When a subobject of non-array type <code>T</code> is specified to element of the object is value-initialized.</li>
be default-initialized, <code>make_shared_noinit</code> and <li>Array elements are initialized in ascending order of their
<code>allocate_shared_noinit</code> shall perform this addresses.</li>
initialization via the expression <code>::new(ptr) T</code>, where <li>When a subobject of a scalar type <code>S</code> is specified to
<code>ptr</code> has type <code>void*</code> and points to storage be initialized to a value <code>v</code>, <code>allocate_shared</code>
suitable to hold an object of type <code>T</code>.</p> shall perform this initialization via the expression
<p>When the lifetime of the object managed by the return value ends, <code>std::allocator_traits&lt;A&gt;::construct(b, p, v)</code>, where
or when the initialization of an array element throws an exception, <code>p</code> points to storage suitable to hold an object of type
the initialized elements should be destroyed in the reverse order <code>S</code> and <code>b</code> of is a copy of the allocator
of their construction.</p> <code>a</code> passed to <code>allocate_shared</code> such that its
</blockquote> <code>value_type</code> is <code>S</code>.</li>
<p><b>Notes:</b> These functions will typically allocate more memory <li>When a subobject of scalar type <code>S</code> is specified to be
than <code>sizeof(U)</code> to allow for internal bookkeeping value-initialized, <code>allocate_shared</code> shall perform this
structures such as the reference counts.</p> initialization via the expression
</blockquote> <code>std::allocator_traits&lt;A&gt;::construct(b, p)</code>, where
<h2><a name="functions">Free Functions</a></h2> <code>p</code> points to storage suitable to hold an object
<pre>template&lt;class U&gt; of type <code>S</code> and <code>b</code> is a copy of the allocator
shared_ptr&lt;U&gt; make_shared(size_t size); <code>a</code> passed to <code>allocate_shared</code> such that its
template&lt;class U, class A&gt; <code>value_type</code> is <code>S</code>.</li>
shared_ptr&lt;U&gt; allocate_shared(const A&amp; allocator, size_t size);</pre> <li>When a subobject of scalar type <code>S</code> is specified to be
<blockquote> default-initialized, <code>allocate_shared_noinit</code> shall perform
<p><b>Returns:</b> A <code>shared_ptr</code> to a value-initialized this initialization via the expression <code>::new(p) S</code>, where
object of type <code>T[size]</code>.</p> <code>p</code> has type <code>void*</code> and points to storage
<p><b>Remarks:</b> These overloads shall only participate in overload suitable to hold an object of type <code>S</code>.</li>
resolution when <code>U</code> is of the form <code>T[]</code>.</p> <li>When the lifetime of the object managed by the return value ends,
<p><b>Examples:</b></p> or when the initialization of an array element throws an exception,
<blockquote> the initialized elements should be destroyed in the reverse order
<pre>boost::shared_ptr&lt;int[]&gt; a1 = boost::make_shared&lt;int[]&gt;(size); of their construction.</li>
boost::shared_ptr&lt;int[][2]&gt; a2 = boost::make_shared&lt;int[][2]&gt;(size);</pre> </ul>
</blockquote> </dd>
</blockquote> <dt><strong>Notes:</strong></dt>
<pre>template&lt;class U&gt; <dd>These functions will typically allocate more memory than the size of
shared_ptr&lt;U&gt; make_shared(); <code>sizeof(E)</code> to allow for internal bookkeeping structures such
template&lt;class U, class A&gt; as the reference counts.</dd>
shared_ptr&lt;U&gt; allocate_shared(const A&amp; allocator);</pre> </dl>
<blockquote> </div>
<p><b>Returns:</b> A <code>shared_ptr</code> to a value-initialized <div id="functions">
object of type <code>T[N]</code>.</p> <h2>Free Functions</h2>
<p><b>Remarks:</b> These overloads shall only participate in overload <div>
resolution when <code>U</code> is of the form <code>T[N]</code>.</p> <h3><code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
<p><b>Examples:</b></p> allocate_shared(const A&amp; a, std::size_t n);</code></h3>
<blockquote> <dl>
<pre>boost::shared_ptr&lt;int[8]&gt; a1 = boost::make_shared&lt;int[8]&gt;(); <dt><strong>Returns:</strong></dt>
boost::shared_ptr&lt;int[4][2]&gt; a2 = boost::make_shared&lt;int[4][2]&gt;();</pre> <dd>A <code>shared_ptr</code> to a value-initialized object of type
</blockquote> <code>E[size]</code>.</dd>
</blockquote> <dt><strong>Remarks:</strong></dt>
<pre>template&lt;class U&gt; <dd>This overload shall only participate in overload resolution when
shared_ptr&lt;U&gt; make_shared(size_t size, const T&amp; value); <code>T</code> is of the form <code>E[]</code>.</dd>
template&lt;class U, class A&gt; <dt><strong>Example:</strong></dt>
shared_ptr&lt;U&gt; allocate_shared(const A&amp; allocator, size_t size, const T&amp; value);</pre> <dd><code>boost::allocate_shared&lt;int[]<!--
<blockquote> -->&gt;(std::allocator&lt;int&gt;(), 8);</code></dd>
<p><b>Returns:</b> A <code>shared_ptr</code> to an object of type </dl>
<code>T[size]</code>, where each array element of type <code>T</code> </div>
is initialized to <code>value</code>.</p> <div>
<p><b>Remarks:</b> These overloads shall only participate in overload <h3><code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
resolution when <code>U</code> is of the form <code>T[]</code>.</p> allocate_shared(const A&amp; a);</code></h3>
<p><b>Examples:</b></p> <dl>
<blockquote> <dt><strong>Returns:</strong></dt>
<pre>boost::shared_ptr&lt;int[]&gt; a1 = boost::make_shared&lt;int[]&gt;(size, 1); <dd>A <code>shared_ptr</code> to a value-initialized object of type
boost::shared_ptr&lt;int[][2]&gt; a2 = boost::make_shared&lt;int[][2]&gt;(size, {1, 2});</pre> <code>E[N]</code>.</dd>
</blockquote> <dt><strong>Remarks:</strong></dt>
</blockquote> <dd>This overload shall only participate in overload resolution when
<pre>template&lt;class U&gt; <code>T</code> is of the form <code>E[N]</code>.</dd>
shared_ptr&lt;U&gt; make_shared(const T&amp; value); <dt><strong>Example:</strong></dt>
template&lt;class U, class A&gt; <dd><code>boost::allocate_shared&lt;int[8]<!--
shared_ptr&lt;U&gt; allocate_shared(const A&amp; allocator, const T&amp; value);</pre> -->&gt;(std::allocator&lt;int&gt;());</code></dd>
<blockquote> </dl>
<p><b>Returns:</b> A <code>shared_ptr</code> to an object of type </div>
<code>T[N]</code>, where each array element of type <code>T</code> is <div>
initialized to <code>value</code>.</p> <h3><code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
<p><b>Remarks:</b> These overloads shall only participate in overload allocate_shared(const A&amp; a, std::size_t n,
resolution when <code>U</code> is of the form <code>T[N]</code>.</p> const <em>E</em>&amp; v);</code></h3>
<p><b>Examples:</b></p> <dl>
<blockquote> <dt><strong>Returns:</strong></dt>
<pre>boost::shared_ptr&lt;int[8]&gt; a1 = boost::make_shared&lt;int[8]&gt;(1); <dd>A <code>shared_ptr</code> to an object of type
boost::shared_ptr&lt;int[4][2]&gt; a2 = boost::make_shared&lt;int[4][2]&gt;({1, 2});</pre> <code>E[size]</code>, where each array element of type <code>E</code> is
</blockquote> initialized to <code>v</code>.</dd>
</blockquote> <dt><strong>Remarks:</strong></dt>
<pre>template&lt;class U&gt; <dd>This overload shall only participate in overload resolution when
shared_ptr&lt;U&gt; make_shared_noinit(size_t size); <code>T</code> is of the form <code>E[]</code>.</dd>
template&lt;class U, class A&gt; <dt><strong>Example:</strong></dt>
shared_ptr&lt;U&gt; allocate_shared_noinit(const A&amp; allocator, size_t size);</pre> <dd><code>boost::allocate_shared&lt;double[]<!--
<blockquote> -->&gt;(std::allocator&lt;double&gt;(), 8, 1.0);</code></dd>
<p><b>Returns:</b> A <code>shared_ptr</code> to a default-initialized </dl>
object of type <code>T[size]</code>.</p> </div>
<p><b>Remarks:</b> These overloads shall only participate in overload <div>
resolution when <code>U</code> is of the form <code>T[]</code>.</p> <h3><code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
<p><b>Examples:</b></p> allocate_shared(const A&amp; a, const <em>E</em>&amp; v);</code></h3>
<blockquote> <dl>
<pre>boost::shared_ptr&lt;int[]&gt; a1 = boost::make_shared_noinit&lt;int[]&gt;(size); <dt><strong>Returns:</strong></dt>
boost::shared_ptr&lt;int[][2]&gt; a2 = boost::make_shared_noinit&lt;int[][2]&gt;(size);</pre> <dd>A <code>shared_ptr</code> to an object of type <code>E[N]</code>,
</blockquote> where each array element of type <code>E</code> is initialized to
</blockquote> <code>v</code>.</dd>
<pre>template&lt;class U&gt; <dt><strong>Remarks:</strong></dt>
shared_ptr&lt;U&gt; make_shared_noinit(); <dd>This overload shall only participate in overload resolution when
template&lt;class U, class A&gt; <code>T</code> is of the form <code>E[N]</code>.</dd>
shared_ptr&lt;U&gt; allocate_shared_noinit(const A&amp; allocator);</pre> <dt><strong>Example:</strong></dt>
<blockquote> <dd><code>boost::allocate_shared&lt;double[8]<!--
<p><b>Returns:</b> A <code>shared_ptr</code> to a default-initialized -->&gt;(std::allocator&lt;double&gt;(), 1.0);</code></dd>
object of type <code>T[N]</code>.</p> </dl>
<p><b>Remarks:</b> These overloads shall only participate in overload </div>
resolution when <code>U</code> is of the form <code>T[N]</code>.</p> <div>
<p><b>Examples:</b></p> <h3><code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
<blockquote> allocate_shared_noinit(const A&amp; a, std::size_t n);</code></h3>
<pre>boost::shared_ptr&lt;int[8]&gt; a1 = boost::make_shared_noinit&lt;int[8]&gt;(); <dl>
boost::shared_ptr&lt;int[4][2]&gt; a2 = boost::make_shared_noinit&lt;int[4][2]&gt;();</pre> <dt><strong>Returns:</strong></dt>
</blockquote> <dd>A <code>shared_ptr</code> to a default-initialized object of type
</blockquote> <code>E[size]</code>.</dd>
<h2><a name="history">History</a></h2> <dt><strong>Remarks:</strong></dt>
<p>February 2014. Glen Fernandes updated overloads of make_shared and <dd>This overload shall only participate in overload resolution when
allocate_shared to conform to the specification in C++ standard paper <code>T</code> is of the form <code>E[]</code>.</dd>
<a href="#N3870">N3870</a>, including resolving C++ standard library <dt><strong>Example:</strong></dt>
defect report 2070, and reduced the spatial overhead of the internal <dd><code>boost::allocate_shared_noinit&lt;int[]<!--
bookkeeping structures.</p> -->&gt;(std::allocator&lt;int&gt;(), 8);</code></dd>
<p>November 2012. Glen Fernandes contributed implementations of </dl>
make_shared and allocate_shared for arrays.</p> </div>
<h2><a name="references">References</a></h2> <div>
<p><a name="N3870">N3870</a>, <h3><code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3870.html"> allocate_shared_noinit(const A&amp; a);</code></h3>
Extending make_shared to Support Arrays, Revision 1</a>, Peter Dimov <dl>
&amp; Glen Fernandes, January, 2014.</p> <dt><strong>Returns:</strong></dt>
<hr> <dd>A <code>shared_ptr</code> to a default-initialized object of type
<p>$Date$</p> <code>E[N]</code>.</dd>
<p><small>Copyright 2012-2014 Glen Fernandes. Distributed under the <dt><strong>Remarks:</strong></dt>
Boost Software License, Version 1.0. See accompanying file <dd>This overload shall only participate in overload resolution when
<a href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or copy at <code>T</code> is of the form <code>E[N]</code>.</dd>
<a href="http://www.boost.org/LICENSE_1_0.txt"> <dt><strong>Example:</strong></dt>
http://www.boost.org/LICENSE_1_0.txt</a>.</small></p> <dd><code>boost::allocate_shared_noinit&lt;int[8]<!--
</body> -->&gt;(std::allocator&lt;int&gt;());</code></dd>
</dl>
</div>
<div>
<h3><code>template&lt;class T&gt;<br>shared_ptr&lt;T&gt;
make_shared(std::size_t n);</code></h3>
<dl>
<dt><strong>Returns:</strong></dt>
<dd><code>allocate_shared&lt;T&gt;(std::allocator&lt;<em>S<!--
--></em>&gt;(), n);</code></dd>
<dt><strong>Remarks:</strong></dt>
<dd>This overload shall only participate in overload resolution when
<code>T</code> is of the form <code>E[]</code>.</dd>
<dt><strong>Example:</strong></dt>
<dd><code>boost::make_shared&lt;int[]&gt;(8);</code></dd>
</dl>
</div>
<div>
<h3><code>template&lt;class T&gt;<br>shared_ptr&lt;T&gt;
make_shared();</code></h3>
<dl>
<dt><strong>Returns:</strong></dt>
<dd><code>allocate_shared&lt;T&gt;(std::allocator&lt;<em>S<!--
--></em>&gt;());</code></dd>
<dt><strong>Remarks:</strong></dt>
<dd>This overload shall only participate in overload resolution when
<code>T</code> is of the form <code>E[N]</code>.</dd>
<dt><strong>Example:</strong></dt>
<dd><code>boost::make_shared&lt;int[8]&gt;();</code></dd>
</dl>
</div>
<div>
<h3><code>template&lt;class T&gt;<br>shared_ptr&lt;T&gt;
make_shared(std::size_t n, const <em>E</em>&amp; v);</code></h3>
<dl>
<dt><strong>Returns:</strong></dt>
<dd><code>allocate_shared&lt;T&gt;(std::allocator&lt;<em>S<!--
--></em>&gt;(), n, v);</code></dd>
<dt><strong>Remarks:</strong></dt>
<dd>This overload shall only participate in overload resolution when
<code>T</code> is of the form <code>E[]</code>.</dd>
<dt><strong>Example:</strong></dt>
<dd><code>boost::make_shared&lt;double[]&gt;(8, 1.0);</code></dd>
</dl>
</div>
<div>
<h3><code>template&lt;class T&gt;<br>shared_ptr&lt;T&gt;
make_shared(const <em>E</em>&amp; v);</code></h3>
<dl>
<dt><strong>Returns:</strong></dt>
<dd><code>allocate_shared&lt;T&gt;(std::allocator&lt;<em>S<!--
--></em>&gt;(), v);</code></dd>
<dt><strong>Remarks:</strong></dt>
<dd>This overload shall only participate in overload resolution when
<code>T</code> is of the form <code>E[N].</code></dd>
<dt><strong>Example:</strong></dt>
<dd><code>boost::make_shared&lt;double[8]&gt;(1.0);</code></dd></dl>
</div>
<div>
<h3><code>template&lt;class T&gt;<br>shared_ptr&lt;T&gt;
make_shared_noinit(std::size_t n);</code></h3>
<dl>
<dt><strong>Returns:</strong></dt>
<dd><code>allocate_shared_noinit&lt;T&gt;(std::allocator&lt;<em>S<!--
--></em>&gt;(), n);</code></dd>
<dt><strong>Remarks:</strong></dt>
<dd>This overload shall only participate in overload resolution when
<code>T</code> is of the form <code>E[]</code>.</dd>
<dt><strong>Example:</strong></dt>
<dd><code>boost::make_shared_noinit&lt;int[]&gt;(8);</code></dd>
</dl>
</div>
<div>
<h3><code>template&lt;class T&gt;<br>shared_ptr&lt;T&gt;
make_shared_noinit();</code></h3>
<dl>
<dt><strong>Returns:</strong></dt>
<dd><code>allocate_shared_noinit&lt;T&gt;(std::allocator&lt;<em>S<!--
--></em>&gt;());</code></dd>
<dt><strong>Remarks:</strong></dt>
<dd>This overload shall only participate in overload resolution when
<code>T</code> is of the form <code>E[N]</code>.</dd>
<dt><strong>Example:</strong></dt>
<dd><code>boost::make_shared_noinit&lt;int[8]&gt;();</code></dd>
</dl>
</div>
</div>
<div id="history">
<h2>History</h2>
<dl>
<dt><strong>Boost 1.64</strong></dt>
<dd>Glen Fernandes rewrote allocate_shared and make_shared for a more
optimal and more maintainable implementation.</dd>
<dt><strong>Boost 1.56</strong></dt>
<dd>Glen Fernandes updated overloads of make_shared and allocate_shared
to conform to the specification in C++ standard paper
<a href="#N3870">N3870</a>, including resolving C++ standard library
defect report <a href="#dr2070">DR 2070</a>.</dd>
<dt><strong>Boost 1.53</strong></dt>
<dd>Glen Fernandes contributed implementations of make_shared and
allocate_shared for arrays.</dd>
</dl>
</div>
<div id="references">
<h2>References</h2>
<ol>
<li id="N3870"><strong>N3870</strong>, <a href=
"http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3870.html">
Extending make_shared to Support Arrays, Revision 1</a>, Peter Dimov
&amp; Glen Fernandes, January, 2014.</li>
<li id="dr2070"><strong>DR 2070</strong>,
<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html">
allocate_shared should use allocator_traits&lt;A&gt;::construct</a>,
Jonathan Wakely, July, 2011.</li>
</ol>
</div>
<hr>
Copyright 2012-2017 Glen Fernandes. Distributed under the
<a href="http://www.boost.org/LICENSE_1_0.txt">Boost Software License,
Version 1.0</a>.
</body>
</html> </html>

View File

@@ -1,152 +1,184 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <!DOCTYPE html>
<html> <html lang="en">
<head> <head>
<title>make_unique</title> <meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>make_unique</title>
</head> </head>
<body text="#000000" bgcolor="#ffffff" link="#0000ff" vlink="#0000ff"> <body>
<h1><img height="86" alt="boost.png (6897 bytes)" src="../../boost.png" <h1>make_unique</h1>
width="277" align="middle" border="0">make_unique</h1> <div id="navigation">
<p><a href="#introduction">Introduction</a><br> <ul>
<a href="#synopsis">Synopsis</a><br> <li><a href="#introduction">Introduction</a></li>
<a href="#common">Common Requirements</a><br> <li><a href="#synopsis">Synopsis</a></li>
<a href="#functions">Free Functions</a><br> <li><a href="#requirements">Common Requirements</a></li>
<a href="#history">History</a></p> <li><a href="#functions">Free Functions</a></li>
<h2><a name="introduction">Introduction</a></h2> <li><a href="#history">History</a></li>
<p>The header file &lt;boost/make_unique.hpp&gt; provides overloaded </ul>
function template <code>make_unique</code> for convenient creation of </div>
<code>unique_ptr</code> objects.</p> <div id="introduction">
<h2><a name="synopsis">Synopsis</a></h2> <h2>Introduction</h2>
<pre>namespace boost { <p>
template&lt;class U&gt; // U is not array The header file &lt;boost/make_unique.hpp&gt; provides overloads of
unique_ptr&lt;U&gt; <a href="#functions">make_unique</a>(); function template <code>make_unique</code> for convenient creation of
<code>std::unique_ptr</code> objects.
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) </p>
template&lt;class U, class... Args&gt; // U is not array </div>
unique_ptr&lt;U&gt; <a href="#functions">make_unique</a>(Args&amp;&amp;... args); <div id="synopsis">
#endif <h2>Synopsis</h2>
<div>
template&lt;class U&gt; // U is not array <h3>Header &lt;boost/smart_ptr/make_unique.hpp&gt;</h3>
unique_ptr&lt;U&gt; <a href="#functions">make_unique</a>(U&amp;&amp; value); <code>namespace boost {</code>
<blockquote>
template&lt;class U&gt; // U is T[] <code>template&lt;class T&gt;<br>std::unique_ptr&lt;T&gt;
unique_ptr&lt;U&gt; <a href="#functions">make_unique</a>(size_t size); <a href="#functions">make_unique</a>();</code>
</blockquote>
template&lt;class U&gt; // U is not array <blockquote>
unique_ptr&lt;U&gt; <a href="#functions">make_unique_noinit</a>(); <code>template&lt;class T, class... Args&gt;<br>std::unique_ptr&lt;T&gt;
<a href="#functions">make_unique</a>(Args&amp;&amp;... args);</code>
template&lt;class U&gt; // U is T[] </blockquote>
unique_ptr&lt;U&gt; <a href="#functions">make_unique_noinit</a>(size_t size); <blockquote>
}</pre> <code>template&lt;class T&gt;<br>std::unique_ptr&lt;T&gt;
<h2><a name="common">Common Requirements</a></h2> <a href="#functions">make_unique</a>(<em>T</em>&amp;&amp; value);</code>
<pre>template&lt;class U&gt; </blockquote>
unique_ptr&lt;U&gt; make_unique(<em>args</em>); <blockquote>
template&lt;class U&gt; <code>template&lt;class T&gt;<br>std::unique_ptr&lt;T&gt;
unique_ptr&lt;U&gt; make_unique_noinit(<em>args</em>);</pre> <a href="#functions">make_unique</a>(std::size_t size);</code>
<blockquote> </blockquote>
<p><b>Effects:</b> Allocates memory for an object of type <code>U</code> <blockquote>
(or <code>T[size]</code> when <code>U</code> is <code>T[]</code>, <code>template&lt;class T&gt;<br>std::unique_ptr&lt;T&gt;
where <code>size</code> is determined from <code>args</code> as <a href="#functions">make_unique_noinit</a>();</code>
specified by the concrete overload). The object is initialized from </blockquote>
<code>args</code> as specified by the concrete overload. If an <blockquote>
exception is thrown, the functions have no effect.</p> <code>template&lt;class T&gt;<br>std::unique_ptr&lt;T&gt;
<p><b>Returns:</b> A <code>unique_ptr</code> instance that stores and <a href="#functions">make_unique_noinit</a>(std::size_t size);</code>
owns the address of the newly constructed object.</p> </blockquote>
<p><b>Postconditions:</b> <code>r.get() != 0</code>, where <code>}</code>
<code>r</code> is the return value.</p> </div>
<p><b>Throws:</b> <code>bad_alloc</code>, or an exception thrown from </div>
the initialization of the object.</p> <div id="requirements">
<p><b>Remarks:</b></p> <h2>Common Requirements</h2>
<blockquote> <h3><code>template&lt;class T, <em>Args</em>&gt;<br>
<p>When an object of a non-array type <code>T</code> is specified to std::unique_ptr&lt;T&gt; make_unique(<em>args</em>);</code></h3>
be initialized to a value <code>value</code>, or to <dl>
<code>T(list...)</code>, where <code>list...</code> is a list of <dt><strong>Effects:</strong></dt>
constructor arguments, <code>make_unique</code> shall perform this <dd>Allocates storage for an object of type <code>T</code> (or
initialization via the expression <code>new T(value)</code> or <code>E[size]</code> when <code>T</code> is <code>E[]</code>, where
<code>new T(list...)</code> respectively.</p> <code>size</code> is determined from <code>args</code> as specified by
<p>When an object of type <code>T</code> is specified to be the concrete overload). The storage is initialized from
value-initialized, <code>make_unique</code> shall perform this <code>args</code> as specified by the concrete overload. If an exception
initialization via the expression <code>new T()</code>.</p> is thrown, the functions have no effect.</dd>
<p>When an object of type <code>T</code> is specified to be <dt><strong>Returns:</strong></dt>
default-initialized, <code>make_unique_noinit</code> shall perform <dd>A <code>std::unique_ptr</code> instance that stores and owns the
this initialization via the expression <code>new T</code>.</p> address of the newly allocated and constructed object.</dd>
</blockquote> <dt><strong>Postconditions:</strong></dt>
</blockquote> <dd><code>r.get() != 0</code>, where <code>r</code> is the return
<h2><a name="functions">Free Functions</a></h2> value.</dd>
<pre>template&lt;class U, class... Args&gt; <dt><strong>Throws:</strong></dt>
unique_ptr&lt;U&gt; make_unique(Args&amp;&amp;... args);</pre> <dd><code>std::bad_alloc</code>, or an exception thrown from the
<blockquote> initialization of the object.</dd>
<p><b>Returns:</b> A unique_ptr to an object of type <code>U</code>, <dt><strong>Remarks:</strong></dt>
initialized to <code>U(forward&lt;Args&gt;(args)...)</code>.</p> <dd>
<p><b>Remarks:</b> This overload shall only participate in overload <ul>
resolution when <code>U</code> is not an array type.</p> <li>When an object of a scalar type T is specified to be initialized to
<p><b>Examples:</b></p> a value <code>value</code>, or to <code>T(args...)</code>, where
<blockquote> <code>args...</code> is a list of constructor arguments,
<pre>unique_ptr&lt;float&gt; p1 = boost::make_unique&lt;float&gt;(); <code>make_unique</code> shall perform this initialization via the
unique_ptr&lt;point&gt; p2 = boost::make_unique&lt;point&gt;(x, y);</pre> expression <code>new T(value)</code> or <code>new T(args...)</code>
</blockquote> respectively.</li>
</blockquote> <li>When an object of type <code>T</code> is specified to be
<pre>template&lt;class U&gt; value-initialized, <code>make_unique</code> shall perform this
unique_ptr&lt;U&gt; make_unique(U&amp;&amp; value);</pre> initialization via the expression <code>new T()</code>.</li>
<blockquote> <li>When an object of type <code>T</code> is specified to be
<p><b>Returns:</b> A unique_ptr to an object of type <code>U</code>, default-initialized, <code>make_unique_noinit</code> shall perform this
initialized to <code>move(value)</code>.</p> initialization via the expression <code>new T</code>.</li>
<p><b>Remarks:</b> This overload shall only participate in overload </ul>
resolution when <code>U</code> is not an array type.</p> </dd>
<p><b>Examples:</b></p> </dl>
<blockquote> </div>
<pre>unique_ptr&lt;string&gt; p1 = boost::make_unique&lt;string&gt;({'a', 'b'}); <div id="functions">
unique_ptr&lt;point&gt; p2 = boost::make_unique&lt;point&gt;({-10, 25});</pre> <h2>Free functions</h2>
</blockquote> <div>
</blockquote> <h3><code>template&lt;class T, class... Args&gt;<br>
<pre>template&lt;class U&gt; std::unique_ptr&lt;T&gt;
unique_ptr&lt;U&gt; make_unique(size_t size);</pre> make_unique(Args&amp;&amp;... args);</code></h3>
<blockquote> <dl>
<p><b>Returns:</b> A unique_ptr to a value-initialized object of type <dt><strong>Returns:</strong></dt>
<code>T[size]</code>.</p> <dd>A <code>std::unique_ptr</code> to an object of type <code>T</code>,
<p><b>Remarks:</b> This overload shall only participate in overload initialized to <code>std::forward&lt;Args&gt;(args)...</code>.</dd>
resolution when <code>U</code> is of the form <code>T[]</code>.</p> <dt><strong>Remarks:</strong></dt>
<p><b>Examples:</b></p> <dd>This overload shall only participate in overload resolution when
<blockquote> <code>T</code> is not an array type.</dd>
<pre>unique_ptr&lt;double[]&gt; p1 = boost::make_unique&lt;double[]&gt;(4); <dt><strong>Example:</strong></dt>
unique_ptr&lt;int[][2]&gt; p2 = boost::make_unique&lt;int[][2]&gt;(2);</pre> <dd><code>boost::make_unique&lt;double&gt;(1.0);</code></dd>
</blockquote> </dl>
</blockquote> </div>
<pre>template&lt;class U&gt; <div>
unique_ptr&lt;U&gt; make_unique_noinit();</pre> <h3><code>template&lt;class T&gt;<br>std::unique_ptr&lt;T&gt;
<blockquote> make_unique(<em>T</em>&amp;&amp; value);</code></h3>
<p><b>Returns:</b> A unique_ptr to a default-initialized object of <dl>
type <code>U</code>.</p> <dt><strong>Returns:</strong></dt>
<p><b>Remarks:</b> This overload shall only participate in overload <dd>A <code>std::unique_ptr</code> to an object of type <code>T</code>,
resolution when <code>U</code> is not an array type.</p> initialized to <code>std::move(value)</code>.</dd>
<p><b>Examples:</b></p> <dt><strong>Remarks:</strong></dt>
<blockquote> <dd>This overload shall only participate in overload resolution when
<pre>unique_ptr&lt;float&gt; p1 = boost::make_unique_noinit&lt;float&gt;(); <code>T</code> is not an array type.</dd>
unique_ptr&lt;point&gt; p2 = boost::make_unique_noinit&lt;point&gt;();</pre> <dt><strong>Example:</strong></dt>
</blockquote> <dd><code>boost::make_unique&lt;point&gt;({1.0, -1.0});</code></dd></dl>
</blockquote> </div>
<pre>template&lt;class U&gt; <div>
unique_ptr&lt;U&gt; make_unique_noinit(size_t size);</pre> <h3><code>template&lt;class T&gt;<br>std::unique_ptr&lt;T&gt;
<blockquote> make_unique(std::size_t size);</code></h3>
<p><b>Returns:</b> A unique_ptr to a default-initialized object of <dl>
type <code>T[size]</code>.</p> <dt><strong>Returns:</strong></dt>
<p><b>Remarks:</b> This overload shall only participate in overload <dd>A <code>std::unique_ptr</code> to a value-initialized object of type
resolution when <code>U</code> is of the form <code>T[]</code>.</p> <code>E[size]</code>.</dd>
<p><b>Examples:</b></p> <dt><strong>Remarks:</strong></dt>
<blockquote> <dd>This overload shall only participate in overload resolution when
<pre>unique_ptr&lt;double[]&gt; p1 = boost::make_unique_noinit&lt;double[]&gt;(4); <code>T</code> is of the form <code>E[]</code>.</dd>
unique_ptr&lt;int[][2]&gt; p2 = boost::make_unique_noinit&lt;int[][2]&gt;(2);</pre> <dt><strong>Example:</strong></dt>
</blockquote> <dd><code>boost::make_unique&lt;int[]&gt;(8);</code></dd>
</blockquote> </dl>
<h2><a name="history">History</a></h2> </div>
<p>January 2014. Glen Fernandes contributed implementations of <div>
make_unique for objects and arrays.</p> <h3><code>template&lt;class T&gt;<br>std::unique_ptr&lt;T&gt;
<hr> make_unique_noinit();</code></h3>
<p>$Date$</p> <dl>
<p><small>Copyright 2012-2014 Glen Fernandes. Distributed under the <dt><strong>Returns:</strong></dt>
Boost Software License, Version 1.0. See accompanying file <dd>A <code>std::unique_ptr</code> to a default-initialized object of
<a href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or copy at type <code>T</code>.</dd>
<a href="http://www.boost.org/LICENSE_1_0.txt"> <dt><strong>Remarks:</strong></dt>
http://www.boost.org/LICENSE_1_0.txt</a>.</small></p> <dd>This overload shall only participate in overload resolution when
</body> <code>T</code> is not an array type.</dd>
<dt><strong>Example:</strong></dt>
<dd><code>boost::make_unique_noinit&lt;std::tm&gt;();</code></dd>
</dl>
</div>
<div>
<h3><code>template&lt;class T&gt;<br>std::unique_ptr&lt;T&gt;
make_unique_noinit(std::size_t size);</code></h3>
<dl>
<dt><strong>Returns:</strong></dt>
<dd>A <code>std::unique_ptr</code> to a default-initialized object of
type <code>E[size]</code>.</dd>
<dt><strong>Remarks:</strong></dt>
<dd>This overload shall only participate in overload resolution when
<code>T</code> is of the form <code>E[]</code>.</dd>
<dt><strong>Example:</strong></dt>
<dd><code>boost::make_unique_noinit&lt;char[]&gt;(64);</code></dd>
</dl>
</div>
</div>
<div id="history">
<h2>History</h2>
<dl>
<dt><strong>Boost 1.56</strong></dt>
<dd>Glen Fernandes contributed implementations of make_unique for
scalars and arrays</dd>
</dl>
</div>
<hr>
Copyright 2012-2014 Glen Fernandes. Distributed under the
<a href="http://www.boost.org/LICENSE_1_0.txt">Boost Software License,
Version 1.0</a>.
</body>
</html> </html>

22
meta/libraries.json Normal file
View File

@@ -0,0 +1,22 @@
{
"key": "smart_ptr",
"name": "Smart Ptr",
"authors": [
"Greg Colvin",
"Beman Dawes",
"Peter Dimov",
"Darin Adler",
"Glen Fernandes"
],
"description": "Smart pointer class templates.",
"documentation": "smart_ptr.htm",
"std": [
"tr1"
],
"category": [
"Memory"
],
"maintainers": [
"Peter Dimov <pdimov -at- pdimov.com>"
]
}

View File

@@ -2,16 +2,16 @@
<html> <html>
<head> <head>
<title>pointer_cast</title> <title>pointer_cast</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head> </head>
<body text="#000000" bgcolor="#ffffff" link="#0000ff" vlink="#0000ff"> <body text="#000000" bgcolor="#ffffff" link="#0000ff" vlink="#0000ff">
<h1><img height="86" alt="boost.png (6897 bytes)" src="../../boost.png" <h1><img height="86" alt="boost.png (6897 bytes)" src="../../boost.png"
width="277" align="middle" border="0">pointer_cast</h1> width="277" align="middle" border="0" />pointer_cast</h1>
<p>The pointer cast functions (<code>boost::static_pointer_cast</code> <code>boost::dynamic_pointer_cast</code> <p>The pointer cast functions (<code>boost::static_pointer_cast</code> <code>boost::dynamic_pointer_cast</code>
<code>boost::reinterpret_pointer_cast</code> <code>boost::const_pointer_cast</code>) <code>boost::reinterpret_pointer_cast</code> <code>boost::const_pointer_cast</code>)
provide a way to write generic pointer castings for raw pointers. The functions provide a way to write generic pointer castings for raw pointers, <code>std::shared_ptr</code> and <code>std::unique_ptr</code>. The functions
are defined in <CITE><A href="../../boost/pointer_cast.hpp">boost/pointer_cast.hpp</A>.</CITE></p> are defined in <cite><a href="../../boost/pointer_cast.hpp">boost/pointer_cast.hpp</a>.</cite></p>
<P>There is test/example code in <CITE><A href="test/pointer_cast_test.cpp">pointer_cast_test.cpp</A></CITE>.</p> <p>There is test/example code in <cite><a href="test/pointer_cast_test.cpp">pointer_cast_test.cpp</a></cite>.</p>
<h2><a name="rationale">Rationale</a></h2> <h2><a name="rationale">Rationale</a></h2>
<P>Boost smart pointers usually overload those functions to provide a mechanism to <P>Boost smart pointers usually overload those functions to provide a mechanism to
emulate pointers casts. For example, <code>boost::shared_ptr&lt;...&gt;</code> implements emulate pointers casts. For example, <code>boost::shared_ptr&lt;...&gt;</code> implements
@@ -20,15 +20,15 @@
template&lt;class T, class U&gt; template&lt;class T, class U&gt;
shared_ptr&lt;T&gt; static_pointer_cast(shared_ptr&lt;U&gt; const &amp;r); shared_ptr&lt;T&gt; static_pointer_cast(shared_ptr&lt;U&gt; const &amp;r);
</pre> </pre>
<P>Pointer cast functions from <CITE><A href="../../boost/pointer_cast.hpp">boost/pointer_cast.hpp</A></CITE> <p>Pointer cast functions from <cite><A href="../../boost/pointer_cast.hpp">boost/pointer_cast.hpp</A></CITE>
are overloads of <code>boost::static_pointer_cast</code>, <code>boost::dynamic_pointer_cast</code>, are overloads of <code>boost::static_pointer_cast</code>, <code>boost::dynamic_pointer_cast</code>,
<code>boost::reinterpret_pointer_cast</code> and <code>boost::const_pointer_cast</code> <code>boost::reinterpret_pointer_cast</code> and <code>boost::const_pointer_cast</code>
for raw pointers. This way when developing pointer type independent classes, for raw pointers, <code>std::shared_ptr</code> and <code>std::unique_ptr</code>. This way when developing
for example, memory managers or shared memory compatible classes, the same code pointer type independent classes, for example, memory managers or shared memory compatible classes, the same
can be used for raw and smart pointers.</p> code can be used for raw and smart pointers.</p>
<H2><A name="synopsis">Synopsis</A></H2> <h2><a name="synopsis">Synopsis</a></h2>
<BLOCKQUOTE> <blockquote>
<PRE> <pre>
namespace boost { namespace boost {
template&lt;class T, class U&gt; template&lt;class T, class U&gt;
@@ -46,15 +46,93 @@ inline T* const_pointer_cast(U *ptr)
template&lt;class T, class U&gt; template&lt;class T, class U&gt;
inline T* reinterpret_pointer_cast(U *ptr) inline T* reinterpret_pointer_cast(U *ptr)
{ return reinterpret_cast&lt;T*&gt;(ptr); } { return reinterpret_cast&lt;T*&gt;(ptr); }
template&lt;class T, class U&gt;
inline std::shared_ptr&lt;T&gt; static_pointer_cast(std::shared_ptr&lt;U&gt; const&amp; r);
template&lt;class T, class U&gt;
inline std::shared_ptr&lt;T&gt; dynamic_pointer_cast(std::shared_ptr&lt;U&gt; const&amp; r);
template&lt;class T, class U&gt;
inline std::shared_ptr&lt;T&gt; const_pointer_cast(std::shared_ptr&lt;U&gt; const&amp; r);
template&lt;class T, class U&gt;
inline std::shared_ptr&lt;T&gt; reinterpret_pointer_cast(std::shared_ptr&lt;U&gt; const&amp; r);
template&lt;class T, class U&gt;
inline std::unique_ptr&lt;T&gt; static_pointer_cast(std::unique_ptr&lt;U&gt;&amp;&amp; r);
template&lt;class T, class U&gt;
inline std::unique_ptr&lt;T&gt; dynamic_pointer_cast(std::unique_ptr&lt;U&gt;&amp;&amp; r);
template&lt;class T, class U&gt;
inline std::unique_ptr&lt;T&gt; const_pointer_cast(std::unique_ptr&lt;U&gt;&amp;&amp; r);
template&lt;class T, class U&gt;
inline std::unique_ptr&lt;T&gt; reinterpret_pointer_cast(std::unique_ptr&lt;U&gt;&amp;&amp; r);
} // namespace boost } // namespace boost
</PRE> </pre>
</BLOCKQUOTE> </blockquote>
<P>As you can see from the above synopsis, the pointer cast functions are just <p>As you can see from the above synopsis, the pointer cast functions for raw pointers are just
wrappers around standard C++ cast operators.</P> wrappers around standard C++ cast operators.</p>
<H2><A name="example">Example</A></H2>
<BLOCKQUOTE> <p>The pointer casts for <code>std::shared_ptr</code> are aliases of the corresponding standard
<PRE> functions with the same names and equivalent to <a href="shared_ptr.htm#static_pointer_cast">the
functions taking <code>boost::shared_ptr</code></a>.</p>
<p>The pointer casts for <code>std::unique_ptr</code> are documented below.</p>
<h3 id="static_pointer_cast">static_pointer_cast</h3>
<pre>template&lt;class T, class U&gt;
unique_ptr&lt;T&gt; static_pointer_cast(unique_ptr&lt;U&gt;&amp;&amp; r); // never throws</pre>
<blockquote>
<p><b>Requires:</b> The expression <code>static_cast&lt;T*&gt;( (U*)0 )</code>
must be well-formed.</p>
<p><b>Returns:</b> <code>unique_ptr&lt;T&gt;( static_cast&lt;typename unique_ptr&lt;T&gt;::element_type*&gt;(r.release()) )</code>.</p>
<p><b>Throws:</b> nothing.</p>
<p><b>Notes:</b> the seemingly equivalent expression
<code>unique_ptr&lt;T&gt;(static_cast&lt;T*&gt;(r.get()))</code>
will eventually result in undefined behavior, attempting to delete the same
object twice.</p>
</blockquote>
<h3 id="const_pointer_cast">const_pointer_cast</h3>
<pre>template&lt;class T, class U&gt;
unique_ptr&lt;T&gt; const_pointer_cast(unique_ptr&lt;U&gt;&amp;&amp; r); // never throws</pre>
<blockquote>
<p><b>Requires:</b> The expression <code>const_cast&lt;T*&gt;( (U*)0 )</code>
must be well-formed.</p>
<p><b>Returns:</b> <code>unique_ptr&lt;T&gt;( const_cast&lt;typename unique_ptr&lt;T&gt;::element_type*&gt;(r.release()) )</code>.</p>
<p><b>Throws:</b> nothing.</p>
</blockquote>
<h3 id="dynamic_pointer_cast">dynamic_pointer_cast</h3>
<pre>template&lt;class T, class U&gt;
unique_ptr&lt;T&gt; dynamic_pointer_cast(unique_ptr&lt;U&gt;&amp;&amp; r);</pre>
<blockquote>
<p><b>Requires:</b> The expression <code>dynamic_cast&lt;T*&gt;( (U*)0 )</code>
must be well-formed. <code>T</code> must have a virtual destructor.</p>
<p><b>Returns:</b></p>
<ul>
<li>
When <code>dynamic_cast&lt;typename unique_ptr&lt;T&gt;::element_type*&gt;(r.get())</code> returns a nonzero value,
<code>unique_ptr&lt;T&gt;(dynamic_cast&lt;typename unique_ptr&lt;T&gt;::element_type*&gt;(r.release()))</code>;</li>
<li>
Otherwise, <code>unique_ptr&lt;T&gt;()</code>.</li></ul>
<p><b>Throws:</b> nothing.</p>
</blockquote>
<h3 id="reinterpret_pointer_cast">reinterpret_pointer_cast</h3>
<pre>template&lt;class T, class U&gt;
unique_ptr&lt;T&gt; reinterpret_pointer_cast(unique_ptr&lt;U&gt;&amp;&amp; r); // never throws</pre>
<blockquote>
<p><b>Requires:</b> The expression <code>reinterpret_cast&lt;T*&gt;( (U*)0 )</code>
must be well-formed.</p>
<p><b>Returns:</b> <code>unique_ptr&lt;T&gt;( reinterpret_cast&lt;typename unique_ptr&lt;T&gt;::element_type*&gt;(r.release()) )</code>.</p>
<p><b>Throws:</b> nothing.</p>
</blockquote>
<h2><a name="example">Example</a></h2>
<blockquote>
<pre>
#include &lt;boost/pointer_cast.hpp&gt; #include &lt;boost/pointer_cast.hpp&gt;
#include &lt;boost/shared_ptr.hpp&gt; #include &lt;boost/shared_ptr.hpp&gt;
@@ -79,28 +157,27 @@ void check_if_it_is_derived(const BasePtr &amp;ptr)
int main() int main()
{ {
<I>// Create a raw and a shared_ptr</I> <em>// Create a raw and a shared_ptr</em>
base *ptr = new derived; base *ptr = new derived;
boost::shared_ptr&lt;base&gt; sptr(new derived); boost::shared_ptr&lt;base&gt; sptr(new derived);
<I>// Check that base pointer points actually to derived class</I> <em>// Check that base pointer points actually to derived class</em>
check_if_it_is_derived(ptr); check_if_it_is_derived(ptr);
check_if_it_is_derived(sptr); check_if_it_is_derived(sptr);
// <EM>Ok!</EM> <em>// Ok!</em>
delete ptr; delete ptr;
return 0; return 0;
}</PRE> }</pre>
</BLOCKQUOTE> </blockquote>
<P>The example demonstrates how the generic pointer casts help us create pointer <p>The example demonstrates how the generic pointer casts help us create pointer
independent code.</P> independent code.</p>
<hr> <hr />
<p>$Date$</p>
<p>Copyright 2005 Ion Gazta<74>aga. Use, modification, and distribution are subject to <p>Copyright 2005 Ion Gazta<74>aga. Use, modification, and distribution are subject to
the Boost Software License, Version 1.0. (See accompanying file <A href="../../LICENSE_1_0.txt"> the Boost Software License, Version 1.0. (See accompanying file <a href="../../LICENSE_1_0.txt">
LICENSE_1_0.txt</A> or a copy at &lt;<A href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</A>&gt;.)</p> LICENSE_1_0.txt</a> or a copy at &lt;<a href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</a>&gt;.)</p>
</body> </body>
</html> </html>

View File

@@ -139,6 +139,8 @@ void bad()
template&lt;class Y&gt; <a href="#aliasing_constructor" >shared_ptr</a>(shared_ptr&lt;Y&gt; const &amp; r, element_type * p); // never throws template&lt;class Y&gt; <a href="#aliasing_constructor" >shared_ptr</a>(shared_ptr&lt;Y&gt; const &amp; r, element_type * p); // never throws
template&lt;class Y&gt; <a href="#aliasing_move_constructor" >shared_ptr</a>(shared_ptr&lt;Y&gt; &amp;&amp; r, element_type * p); // never throws
template&lt;class Y&gt; explicit <a href="#weak_ptr_constructor" >shared_ptr</a>(<a href="weak_ptr.htm" >weak_ptr</a>&lt;Y&gt; const &amp; r); template&lt;class Y&gt; explicit <a href="#weak_ptr_constructor" >shared_ptr</a>(<a href="weak_ptr.htm" >weak_ptr</a>&lt;Y&gt; const &amp; r);
template&lt;class Y&gt; explicit <a href="#auto_ptr_constructor" >shared_ptr</a>(std::auto_ptr&lt;Y&gt; &amp; r); template&lt;class Y&gt; explicit <a href="#auto_ptr_constructor" >shared_ptr</a>(std::auto_ptr&lt;Y&gt; &amp; r);
@@ -220,7 +222,7 @@ void bad()
shared_ptr&lt;T&gt; <a href="#dynamic_pointer_cast" >dynamic_pointer_cast</a>(shared_ptr&lt;U&gt; const &amp; r); // never throws shared_ptr&lt;T&gt; <a href="#dynamic_pointer_cast" >dynamic_pointer_cast</a>(shared_ptr&lt;U&gt; const &amp; r); // never throws
template&lt;class T, class U&gt; template&lt;class T, class U&gt;
shared_ptr&lt;T&gt; <a href="#reinterpret_pointer_cast" >reinterpet_pointer_cast</a>(shared_ptr&lt;U&gt; const &amp; r); // never throws shared_ptr&lt;T&gt; <a href="#reinterpret_pointer_cast" >reinterpret_pointer_cast</a>(shared_ptr&lt;U&gt; const &amp; r); // never throws
template&lt;class E, class T, class Y&gt; template&lt;class E, class T, class Y&gt;
std::basic_ostream&lt;E, T&gt; &amp; <a href="#insertion-operator" >operator&lt;&lt;</a> (std::basic_ostream&lt;E, T&gt; &amp; os, shared_ptr&lt;Y&gt; const &amp; p); std::basic_ostream&lt;E, T&gt; &amp; <a href="#insertion-operator" >operator&lt;&lt;</a> (std::basic_ostream&lt;E, T&gt; &amp; os, shared_ptr&lt;Y&gt; const &amp; p);
@@ -352,6 +354,16 @@ template&lt;class Y&gt; shared_ptr(shared_ptr&lt;Y&gt; &amp;&amp; r); // never t
<p><b>Postconditions:</b> <code>get() == p &amp;&amp; use_count() == r.use_count()</code>.</p> <p><b>Postconditions:</b> <code>get() == p &amp;&amp; use_count() == r.use_count()</code>.</p>
<p><b>Throws:</b> nothing.</p> <p><b>Throws:</b> nothing.</p>
</blockquote> </blockquote>
<h3 id="aliasing_move_constructor">aliasing move constructor</h3>
<pre>template&lt;class Y&gt; shared_ptr(shared_ptr&lt;Y&gt; &amp;&amp; r, element_type * p); // never throws</pre>
<blockquote>
<p>
<b>Effects:</b> Move-constructs a <code>shared_ptr</code> from <code>r</code>, while
storing <code>p</code> instead.
</p>
<p><b>Postconditions:</b> <code>get() == p</code> and <code>use_count()</code> equals the old count of <code>r</code>. <code>r</code> is <em>empty</em> and <code>r.get() == 0</code>.</p>
<p><b>Throws:</b> nothing.</p>
</blockquote>
<h3 id="weak_ptr_constructor">weak_ptr constructor</h3> <h3 id="weak_ptr_constructor">weak_ptr constructor</h3>
<pre>template&lt;class Y&gt; explicit shared_ptr(<a href="weak_ptr.htm" >weak_ptr</a>&lt;Y&gt; const &amp; r);</pre> <pre>template&lt;class Y&gt; explicit shared_ptr(<a href="weak_ptr.htm" >weak_ptr</a>&lt;Y&gt; const &amp; r);</pre>
<blockquote> <blockquote>

View File

@@ -136,6 +136,9 @@
<p>Functions which destroy objects of the pointed to type are prohibited from <p>Functions which destroy objects of the pointed to type are prohibited from
throwing exceptions by the <a href="#common_requirements">common requirements</a>.</p> throwing exceptions by the <a href="#common_requirements">common requirements</a>.</p>
<h2><a name="History">History</a> and Acknowledgements</h2> <h2><a name="History">History</a> and Acknowledgements</h2>
<p>February 2017. Glen Fernandes rewrote <b>allocate_shared</b>
and <b>make_shared</b> for arrays for a more optimal and more
maintainable implementation.</p>
<p>February 2014. Glen Fernandes updated overloads of <b>make_shared</b> and <p>February 2014. Glen Fernandes updated overloads of <b>make_shared</b> and
<b>allocate_shared</b> to conform to the specification in C++ standard paper <b>allocate_shared</b> to conform to the specification in C++ standard paper
<a href="#D&amp;F-14">[D&amp;F-14]</a>, and implemented <b>make_unique</b> for <a href="#D&amp;F-14">[D&amp;F-14]</a>, and implemented <b>make_unique</b> for

View File

@@ -29,11 +29,15 @@ import testing ;
[ compile-fail shared_ptr_compare_fail.cpp ] [ compile-fail shared_ptr_compare_fail.cpp ]
[ run shared_ptr_alloc2_test.cpp ] [ run shared_ptr_alloc2_test.cpp ]
[ run pointer_cast_test.cpp ] [ run pointer_cast_test.cpp ]
[ run cpp11_pointer_cast_test.cpp ]
[ compile pointer_to_other_test.cpp ] [ compile pointer_to_other_test.cpp ]
[ run auto_ptr_rv_test.cpp ] [ run auto_ptr_rv_test.cpp ]
[ run shared_ptr_alias_test.cpp ] [ run shared_ptr_alias_test.cpp ]
[ run shared_ptr_rv_test.cpp ] [ run shared_ptr_rv_test.cpp ]
[ run shared_ptr_rv_pointer_cast_test.cpp ]
[ run shared_ptr_move_test.cpp ] [ run shared_ptr_move_test.cpp ]
[ run shared_ptr_alias_move_test.cpp ]
[ run shared_ptr_reinterpret_pointer_cast_test.cpp ]
[ compile-fail shared_ptr_pv_fail.cpp ] [ compile-fail shared_ptr_pv_fail.cpp ]
[ run sp_unary_addr_test.cpp ] [ run sp_unary_addr_test.cpp ]
[ compile-fail scoped_ptr_eq_fail.cpp ] [ compile-fail scoped_ptr_eq_fail.cpp ]
@@ -46,6 +50,7 @@ import testing ;
[ run spinlock_try_test.cpp : : : <threading>multi : spinlock_try_test.mt ] [ run spinlock_try_test.cpp : : : <threading>multi : spinlock_try_test.mt ]
[ run spinlock_pool_test.cpp ] [ run spinlock_pool_test.cpp ]
[ run make_shared_test.cpp ] [ run make_shared_test.cpp ]
[ run make_shared_move_emulation_test.cpp ]
[ run make_shared_perfect_forwarding_test.cpp ] [ run make_shared_perfect_forwarding_test.cpp ]
[ run shared_ptr_convertible_test.cpp ] [ run shared_ptr_convertible_test.cpp ]
[ run wp_convertible_test.cpp ] [ run wp_convertible_test.cpp ]
@@ -60,8 +65,6 @@ import testing ;
[ run sp_recursive_assign2_test.cpp ] [ run sp_recursive_assign2_test.cpp ]
[ run sp_recursive_assign_rv_test.cpp ] [ run sp_recursive_assign_rv_test.cpp ]
[ run sp_recursive_assign2_rv_test.cpp ] [ run sp_recursive_assign2_rv_test.cpp ]
[ run esft_constructor_test.cpp ]
[ run enable_shared_from_raw_test.cpp ]
[ compile-fail auto_ptr_lv_fail.cpp ] [ compile-fail auto_ptr_lv_fail.cpp ]
[ run atomic_count_test2.cpp ] [ run atomic_count_test2.cpp ]
[ run sp_typeinfo_test.cpp ] [ run sp_typeinfo_test.cpp ]
@@ -81,6 +84,7 @@ import testing ;
[ run sa_nullptr_test.cpp ] [ run sa_nullptr_test.cpp ]
[ run shared_ptr_alloc3_test.cpp ] [ run shared_ptr_alloc3_test.cpp ]
[ run shared_ptr_alloc11_test.cpp ] [ run shared_ptr_alloc11_test.cpp ]
[ run shared_ptr_alloc_construct11_test.cpp ]
[ run allocate_shared_alloc11_test.cpp ] [ run allocate_shared_alloc11_test.cpp ]
[ run allocate_shared_construct11_test.cpp ] [ run allocate_shared_construct11_test.cpp ]
[ run sp_interlocked_test.cpp ] [ run sp_interlocked_test.cpp ]
@@ -163,5 +167,46 @@ import testing ;
[ run make_unique_array_test.cpp ] [ run make_unique_array_test.cpp ]
[ run make_unique_array_noinit_test.cpp ] [ run make_unique_array_noinit_test.cpp ]
[ run make_unique_array_throws_test.cpp ] [ run make_unique_array_throws_test.cpp ]
[ run shared_from_raw_test.cpp ]
[ run shared_from_raw_test2.cpp ]
[ run shared_from_raw_test3.cpp ]
[ run shared_from_raw_test4.cpp ]
[ run shared_from_raw_test5.cpp ]
[ run shared_from_raw_test6.cpp ]
[ run weak_from_raw_test.cpp ]
[ run weak_from_raw_test2.cpp ]
[ run weak_from_raw_test3.cpp ]
[ run weak_from_raw_test4.cpp ]
[ run weak_from_raw_test5.cpp ]
[ compile sp_explicit_inst_test.cpp ]
[ run weak_from_this_test.cpp ]
[ run weak_from_this_test2.cpp ]
[ run sp_bml_unique_ptr_test.cpp ]
[ run sp_hash_test2.cpp ]
[ run sp_hash_test3.cpp ]
[ run pointer_cast_test2.cpp ]
[ compile-fail pointer_cast_st_fail.cpp ]
[ compile-fail pointer_cast_st_fail2.cpp ]
[ compile-fail pointer_cast_st_fail3.cpp ]
[ compile-fail pointer_cast_co_fail.cpp ]
[ compile-fail pointer_cast_co_fail2.cpp ]
[ compile-fail pointer_cast_co_fail3.cpp ]
[ compile-fail pointer_cast_dy_fail.cpp ]
[ compile-fail pointer_cast_dy_fail2.cpp ]
[ compile-fail pointer_cast_dy_fail3.cpp ]
[ run sp_nothrow_test.cpp ]
[ compile make_shared_msvc_test.cpp ]
; ;
} }

View File

@@ -1,160 +1,162 @@
/* /*
* Copyright (c) 2012-2014 Glen Joseph Fernandes Copyright 2012-2015 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License,
* Version 1.0. (See accompanying file LICENSE_1_0.txt
* or copy at http://boost.org/LICENSE_1_0.txt)
*/
#include <boost/detail/lightweight_test.hpp>
#if !defined(BOOST_NO_CXX11_ALLOCATOR)
#include <boost/smart_ptr/allocate_shared_array.hpp>
template<typename T> Distributed under the Boost Software License, Version 1.0.
class creator { (http://www.boost.org/LICENSE_1_0.txt)
public: */
#include <boost/core/lightweight_test.hpp>
#include <boost/smart_ptr/make_shared.hpp>
#if !defined(BOOST_NO_CXX11_ALLOCATOR)
struct allow { };
template<class T>
struct creator {
typedef T value_type; typedef T value_type;
creator() { template<class U>
} struct rebind {
typedef creator<U> other;
};
template<typename U> creator() { }
creator(const creator<U>&) {
} template<class U>
creator(const creator<U>&) { }
T* allocate(std::size_t size) { T* allocate(std::size_t size) {
void* p1 = ::operator new(size * sizeof(T)); return static_cast<T*>(::operator new(sizeof(T) * size));
return static_cast<T*>(p1);
} }
void deallocate(T* memory, std::size_t) { void deallocate(T* ptr, std::size_t) {
void* p1 = memory; ::operator delete(ptr);
::operator delete(p1);
} }
template<typename U> template<class U>
void construct(U* memory) { void construct(U* ptr) {
void* p1 = memory; ::new(static_cast<void*>(ptr)) U(allow());
::new(p1) U();
} }
template<typename U> template<class U>
void destroy(U* memory) { void destroy(U* ptr) {
memory->~U(); ptr->~U();
} }
}; };
template<class T, class U>
inline bool
operator==(const creator<T>&, const creator<U>&)
{
return true;
}
template<class T, class U>
inline bool
operator!=(const creator<T>&, const creator<U>&)
{
return false;
}
class type { class type {
friend class creator<type>;
public: public:
static unsigned int instances; static unsigned instances;
static const type object;
protected: explicit type(allow) {
explicit type() { ++instances;
instances++;
}
type(const type&) {
instances++;
} }
~type() { ~type() {
instances--; --instances;
} }
private:
type(const type&);
type& operator=(const type&);
}; };
unsigned int type::instances; unsigned type::instances = 0;
const type type::object;
int main() { int main()
BOOST_TEST(type::instances == 1); {
{ {
boost::shared_ptr<type[]> a1 = boost::allocate_shared<type[]>(creator<void>(), 3); boost::shared_ptr<type[]> result =
BOOST_TEST(a1.use_count() == 1); boost::allocate_shared<type[]>(creator<type>(), 3);
BOOST_TEST(a1.get() != 0); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(type::instances == 3);
result.reset();
BOOST_TEST(type::instances == 0);
}
{
boost::shared_ptr<type[3]> result =
boost::allocate_shared<type[3]>(creator<type>());
BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(type::instances == 3);
result.reset();
BOOST_TEST(type::instances == 0);
}
{
boost::shared_ptr<type[][2]> result =
boost::allocate_shared<type[][2]>(creator<type>(), 2);
BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 1); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 1);
{ {
boost::shared_ptr<type[3]> a1 = boost::allocate_shared<type[3]>(creator<void>()); boost::shared_ptr<type[2][2]> result =
BOOST_TEST(a1.use_count() == 1); boost::allocate_shared<type[2][2]>(creator<type>());
BOOST_TEST(a1.get() != 0); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 1); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 1);
{ {
boost::shared_ptr<type[][2]> a1 = boost::allocate_shared<type[][2]>(creator<void>(), 2); boost::shared_ptr<const type[]> result =
BOOST_TEST(a1.get() != 0); boost::allocate_shared<const type[]>(creator<type>(), 3);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 5); BOOST_TEST(result.use_count() == 1);
a1.reset(); BOOST_TEST(type::instances == 3);
BOOST_TEST(type::instances == 1); result.reset();
BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 1);
{ {
boost::shared_ptr<type[2][2]> a1 = boost::allocate_shared<type[2][2]>(creator<void>()); boost::shared_ptr<const type[3]> result =
BOOST_TEST(a1.get() != 0); boost::allocate_shared<const type[3]>(creator<type>());
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 5); BOOST_TEST(result.use_count() == 1);
a1.reset(); BOOST_TEST(type::instances == 3);
BOOST_TEST(type::instances == 1); result.reset();
BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 1);
{ {
boost::shared_ptr<const type[]> a1 = boost::allocate_shared<const type[]>(creator<void>(), 3); boost::shared_ptr<const type[][2]> result =
BOOST_TEST(a1.get() != 0); boost::allocate_shared<const type[][2]>(creator<type>(), 2);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 1); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 1);
{ {
boost::shared_ptr<const type[3]> a1 = boost::allocate_shared<const type[3]>(creator<void>()); boost::shared_ptr<const type[2][2]> result =
BOOST_TEST(a1.get() != 0); boost::allocate_shared<const type[2][2]>(creator<type>());
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 1); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 1);
{
boost::shared_ptr<const type[][2]> a1 = boost::allocate_shared<const type[][2]>(creator<void>(), 2);
BOOST_TEST(a1.get() != 0);
BOOST_TEST(a1.use_count() == 1);
BOOST_TEST(type::instances == 5);
a1.reset();
BOOST_TEST(type::instances == 1);
}
BOOST_TEST(type::instances == 1);
{
boost::shared_ptr<const type[2][2]> a1 = boost::allocate_shared<const type[2][2]>(creator<void>());
BOOST_TEST(a1.get() != 0);
BOOST_TEST(a1.use_count() == 1);
BOOST_TEST(type::instances == 5);
a1.reset();
BOOST_TEST(type::instances == 1);
}
return boost::report_errors(); return boost::report_errors();
} }
#else #else
int main()
int main() { {
return 0; return 0;
} }
#endif #endif

View File

@@ -1,26 +1,62 @@
/* /*
* Copyright (c) 2012-2014 Glen Joseph Fernandes Copyright 2012-2015 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License,
* Version 1.0. (See accompanying file LICENSE_1_0.txt
* or copy at http://boost.org/LICENSE_1_0.txt)
*/
#include <boost/detail/lightweight_test.hpp>
#include <boost/smart_ptr/allocate_shared_array.hpp>
#include <boost/smart_ptr/enable_shared_from_this.hpp>
class type Distributed under the Boost Software License, Version 1.0.
(http://www.boost.org/LICENSE_1_0.txt)
*/
#include <boost/core/lightweight_test.hpp>
#include <boost/smart_ptr/enable_shared_from_this.hpp>
#include <boost/smart_ptr/make_shared.hpp>
template<class T>
struct creator {
typedef T value_type;
template<class U>
struct rebind {
typedef creator<U> other;
};
creator() { }
template<class U>
creator(const creator<U>&) { }
T* allocate(std::size_t size) {
return static_cast<T*>(::operator new(sizeof(T) * size));
}
void deallocate(T* ptr, std::size_t) {
::operator delete(ptr);
}
};
template<class T, class U>
inline bool
operator==(const creator<T>&, const creator<U>&)
{
return true;
}
template<class T, class U>
inline bool
operator!=(const creator<T>&, const creator<U>&)
{
return false;
}
class type
: public boost::enable_shared_from_this<type> { : public boost::enable_shared_from_this<type> {
public: public:
static unsigned int instances; static unsigned instances;
explicit type() { type() {
instances++; ++instances;
} }
~type() { ~type() {
instances--; --instances;
} }
private: private:
@@ -28,30 +64,31 @@ private:
type& operator=(const type&); type& operator=(const type&);
}; };
unsigned int type::instances = 0; unsigned type::instances = 0;
int main() { int main()
{
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<type[]> a1 = boost::allocate_shared<type[]>(std::allocator<type>(), 3); boost::shared_ptr<type[]> result =
boost::allocate_shared<type[]>(creator<type>(), 3);
try { try {
a1[0].shared_from_this(); result[0].shared_from_this();
BOOST_ERROR("shared_from_this did not throw"); BOOST_ERROR("shared_from_this did not throw");
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
} }
} }
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<type[]> a1 = boost::allocate_shared_noinit<type[]>(std::allocator<type>(), 3); boost::shared_ptr<type[]> result =
boost::allocate_shared_noinit<type[]>(creator<type>(), 3);
try { try {
a1[0].shared_from_this(); result[0].shared_from_this();
BOOST_ERROR("shared_from_this did not throw"); BOOST_ERROR("shared_from_this did not throw");
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
} }
} }
return boost::report_errors(); return boost::report_errors();
} }

View File

@@ -1,181 +1,251 @@
/* /*
* Copyright (c) 2012-2014 Glen Joseph Fernandes Copyright 2012-2015 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License, Distributed under the Boost Software License, Version 1.0.
* Version 1.0. (See accompanying file LICENSE_1_0.txt (http://www.boost.org/LICENSE_1_0.txt)
* or copy at http://boost.org/LICENSE_1_0.txt) */
*/ #include <boost/align/is_aligned.hpp>
#include <boost/detail/lightweight_test.hpp> #include <boost/core/lightweight_test.hpp>
#include <boost/smart_ptr/allocate_shared_array.hpp> #include <boost/smart_ptr/make_shared.hpp>
#include <boost/smart_ptr/weak_ptr.hpp> #include <boost/smart_ptr/weak_ptr.hpp>
#include <boost/type_traits/alignment_of.hpp> #include <boost/type_traits/alignment_of.hpp>
template<class T>
struct creator {
typedef T value_type;
template<class U>
struct rebind {
typedef creator<U> other;
};
creator() { }
template<class U>
creator(const creator<U>&) { }
T* allocate(std::size_t size) {
return static_cast<T*>(::operator new(sizeof(T) * size));
}
void deallocate(T* ptr, std::size_t) {
::operator delete(ptr);
}
};
template<class T, class U>
inline bool
operator==(const creator<T>&, const creator<U>&)
{
return true;
}
template<class T, class U>
inline bool
operator!=(const creator<T>&, const creator<U>&)
{
return false;
}
class type { class type {
public: public:
static unsigned int instances; static unsigned instances;
explicit type() { type()
instances++; : value_(0.0) {
++instances;
} }
~type() { ~type() {
instances--; --instances;
}
void set(long double value) {
value_ = value;
}
long double get() const {
return value_;
} }
private: private:
type(const type&); type(const type&);
type& operator=(const type&); type& operator=(const type&);
long double value_;
}; };
unsigned int type::instances = 0; unsigned type::instances = 0;
int main() { int main()
{
{ {
boost::shared_ptr<int[]> a1 = boost::allocate_shared_noinit<int[]>(std::allocator<int>(), 3); boost::shared_ptr<int[]> result =
int* a2 = a1.get(); boost::allocate_shared_noinit<int[]>(creator<int>(), 3);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<int>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<int>::value));
} }
{ {
boost::shared_ptr<int[3]> a1 = boost::allocate_shared_noinit<int[3]>(std::allocator<int>()); boost::shared_ptr<int[3]> result =
int* a2 = a1.get(); boost::allocate_shared_noinit<int[3]>(creator<int>());
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<int>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<int>::value));
} }
{ {
boost::shared_ptr<int[][2]> a1 = boost::allocate_shared_noinit<int[][2]>(std::allocator<int>(), 2); boost::shared_ptr<int[][2]> result =
BOOST_TEST(a1.get() != 0); boost::allocate_shared_noinit<int[][2]>(creator<int>(), 2);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<int>::value));
} }
{ {
boost::shared_ptr<int[2][2]> a1 = boost::allocate_shared_noinit<int[2][2]>(std::allocator<int>()); boost::shared_ptr<int[2][2]> result =
BOOST_TEST(a1.get() != 0); boost::allocate_shared_noinit<int[2][2]>(creator<int>());
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<int>::value));
} }
{ {
boost::shared_ptr<const int[]> a1 = boost::allocate_shared_noinit<const int[]>(std::allocator<int>(), 3); boost::shared_ptr<const int[]> result =
const int* a2 = a1.get(); boost::allocate_shared_noinit<const
BOOST_TEST(a1.use_count() == 1); int[]>(creator<int>(), 3);
BOOST_TEST(a2 != 0); BOOST_TEST(result.get() != 0);
BOOST_TEST(size_t(a2) % boost::alignment_of<int>::value == 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<int>::value));
} }
{ {
boost::shared_ptr<const int[3]> a1 = boost::allocate_shared_noinit<const int[3]>(std::allocator<int>()); boost::shared_ptr<const int[3]> result =
const int* a2 = a1.get(); boost::allocate_shared_noinit<const int[3]>(creator<int>());
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<int>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<int>::value));
} }
{ {
boost::shared_ptr<const int[][2]> a1 = boost::allocate_shared_noinit<const int[][2]>(std::allocator<int>(), 2); boost::shared_ptr<const int[][2]> result =
BOOST_TEST(a1.get() != 0); boost::allocate_shared_noinit<const
BOOST_TEST(a1.use_count() == 1); int[][2]>(creator<int>(), 2);
BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<int>::value));
} }
{ {
boost::shared_ptr<const int[2][2]> a1 = boost::allocate_shared_noinit<const int[2][2]>(std::allocator<int>()); boost::shared_ptr<const int[2][2]> result =
BOOST_TEST(a1.get() != 0); boost::allocate_shared_noinit<const
BOOST_TEST(a1.use_count() == 1); int[2][2]>(creator<int>());
BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<int>::value));
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<type[]> a1 = boost::allocate_shared_noinit<type[]>(std::allocator<type>(), 3); boost::shared_ptr<type[]> result =
type* a2 = a1.get(); boost::allocate_shared_noinit<type[]>(creator<type>(), 3);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<type>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
boost::weak_ptr<type[]> w1 = a1; boost::weak_ptr<type[]> other = result;
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<type[3]> a1 = boost::allocate_shared_noinit<type[3]>(std::allocator<type>()); boost::shared_ptr<type[3]> result =
type* a2 = a1.get(); boost::allocate_shared_noinit<type[3]>(creator<type>());
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<type>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
boost::weak_ptr<type[3]> w1 = a1; boost::weak_ptr<type[3]> other = result;
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<type[][2]> a1 = boost::allocate_shared_noinit<type[][2]>(std::allocator<type>(), 2); boost::shared_ptr<type[][2]> result =
BOOST_TEST(a1.get() != 0); boost::allocate_shared_noinit<type[][2]>(creator<type>(), 2);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); boost::weak_ptr<type[][2]> other = result;
result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<type[2][2]> a1 = boost::allocate_shared_noinit<type[2][2]>(std::allocator<type>()); boost::shared_ptr<type[2][2]> result =
BOOST_TEST(a1.get() != 0); boost::allocate_shared_noinit<type[2][2]>(creator<type>());
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); boost::weak_ptr<type[2][2]> other = result;
result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<const type[]> a1 = boost::allocate_shared_noinit<const type[]>(std::allocator<type>(), 3); boost::shared_ptr<const type[]> result =
const type* a2 = a1.get(); boost::allocate_shared_noinit<const
BOOST_TEST(a1.use_count() == 1); type[]>(creator<type>(), 3);
BOOST_TEST(a2 != 0); BOOST_TEST(result.get() != 0);
BOOST_TEST(size_t(a2) % boost::alignment_of<type>::value == 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
a1.reset(); boost::weak_ptr<const type[]> other = result;
result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<const type[3]> a1 = boost::allocate_shared_noinit<const type[3]>(std::allocator<type>()); boost::shared_ptr<const type[3]> result =
const type* a2 = a1.get(); boost::allocate_shared_noinit<const
BOOST_TEST(a1.use_count() == 1); type[3]>(creator<type>());
BOOST_TEST(a2 != 0); BOOST_TEST(result.get() != 0);
BOOST_TEST(size_t(a2) % boost::alignment_of<type>::value == 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
a1.reset(); boost::weak_ptr<const type[3]> other = result;
result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<const type[][2]> a1 = boost::allocate_shared_noinit<const type[][2]>(std::allocator<type>(), 2); boost::shared_ptr<const type[][2]> result =
BOOST_TEST(a1.get() != 0); boost::allocate_shared_noinit<const
BOOST_TEST(a1.use_count() == 1); type[][2]>(creator<type>(), 2);
BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); boost::weak_ptr<const type[][2]> other = result;
result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<const type[2][2]> a1 = boost::allocate_shared_noinit<const type[2][2]>(std::allocator<type>()); boost::shared_ptr<const type[2][2]> result =
BOOST_TEST(a1.get() != 0); boost::allocate_shared_noinit<const
BOOST_TEST(a1.use_count() == 1); type[2][2]>(creator<type>());
BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); boost::weak_ptr<const type[2][2]> other = result;
result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
return boost::report_errors(); return boost::report_errors();
} }

View File

@@ -1,209 +1,266 @@
/* /*
* Copyright (c) 2012-2014 Glen Joseph Fernandes Copyright 2012-2015 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License, Distributed under the Boost Software License, Version 1.0.
* Version 1.0. (See accompanying file LICENSE_1_0.txt (http://www.boost.org/LICENSE_1_0.txt)
* or copy at http://boost.org/LICENSE_1_0.txt) */
*/ #include <boost/align/is_aligned.hpp>
#include <boost/detail/lightweight_test.hpp> #include <boost/core/lightweight_test.hpp>
#include <boost/smart_ptr/allocate_shared_array.hpp> #include <boost/smart_ptr/make_shared.hpp>
#include <boost/smart_ptr/weak_ptr.hpp> #include <boost/smart_ptr/weak_ptr.hpp>
#include <boost/type_traits/alignment_of.hpp> #include <boost/type_traits/alignment_of.hpp>
template<class T>
struct creator {
typedef T value_type;
template<class U>
struct rebind {
typedef creator<U> other;
};
creator() { }
template<class U>
creator(const creator<U>&) { }
T* allocate(std::size_t size) {
return static_cast<T*>(::operator new(sizeof(T) * size));
}
void deallocate(T* ptr, std::size_t) {
::operator delete(ptr);
}
};
template<class T, class U>
inline bool
operator==(const creator<T>&, const creator<U>&)
{
return true;
}
template<class T, class U>
inline bool
operator!=(const creator<T>&, const creator<U>&)
{
return false;
}
class type { class type {
public: public:
static unsigned int instances; static unsigned instances;
explicit type() { type()
instances++; : value_(0.0) {
++instances;
} }
~type() { ~type() {
instances--; --instances;
}
void set(long double value) {
value_ = value;
}
long double get() const {
return value_;
} }
private: private:
type(const type&); type(const type&);
type& operator=(const type&); type& operator=(const type&);
long double value_;
}; };
unsigned int type::instances = 0; unsigned type::instances = 0;
int main() { int main()
{
{ {
boost::shared_ptr<int[]> a1 = boost::allocate_shared<int[]>(std::allocator<int>(), 3); boost::shared_ptr<int[]> result =
int* a2 = a1.get(); boost::allocate_shared<int[]>(creator<int>(), 3);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<int>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
BOOST_TEST(a1[0] == 0); boost::alignment_of<int>::value));
BOOST_TEST(a1[1] == 0); BOOST_TEST(result[0] == 0);
BOOST_TEST(a1[2] == 0); BOOST_TEST(result[1] == 0);
BOOST_TEST(result[2] == 0);
} }
{ {
boost::shared_ptr<int[3]> a1 = boost::allocate_shared<int[3]>(std::allocator<int>()); boost::shared_ptr<int[3]> result =
int* a2 = a1.get(); boost::allocate_shared<int[3]>(creator<int>());
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<int>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
BOOST_TEST(a1[0] == 0); boost::alignment_of<int>::value));
BOOST_TEST(a1[1] == 0); BOOST_TEST(result[0] == 0);
BOOST_TEST(a1[2] == 0); BOOST_TEST(result[1] == 0);
BOOST_TEST(result[2] == 0);
} }
{ {
boost::shared_ptr<int[][2]> a1 = boost::allocate_shared<int[][2]>(std::allocator<int>(), 2); boost::shared_ptr<int[][2]> result =
BOOST_TEST(a1.get() != 0); boost::allocate_shared<int[][2]>(creator<int>(), 2);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a1[0][0] == 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(a1[0][1] == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
BOOST_TEST(a1[1][0] == 0); boost::alignment_of<int>::value));
BOOST_TEST(a1[1][1] == 0); BOOST_TEST(result[0][0] == 0);
BOOST_TEST(result[0][1] == 0);
BOOST_TEST(result[1][0] == 0);
BOOST_TEST(result[1][1] == 0);
} }
{ {
boost::shared_ptr<int[2][2]> a1 = boost::allocate_shared<int[2][2]>(std::allocator<int>()); boost::shared_ptr<int[2][2]> result =
BOOST_TEST(a1.get() != 0); boost::allocate_shared<int[2][2]>(creator<int>());
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a1[0][0] == 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(a1[0][1] == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
BOOST_TEST(a1[1][0] == 0); boost::alignment_of<int>::value));
BOOST_TEST(a1[1][1] == 0); BOOST_TEST(result[0][0] == 0);
BOOST_TEST(result[0][1] == 0);
BOOST_TEST(result[1][0] == 0);
BOOST_TEST(result[1][1] == 0);
} }
{ {
boost::shared_ptr<const int[]> a1 = boost::allocate_shared<const int[]>(std::allocator<int>(), 3); boost::shared_ptr<const int[]> result =
const int* a2 = a1.get(); boost::allocate_shared<const int[]>(creator<int>(), 3);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<int>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
BOOST_TEST(a1[0] == 0); boost::alignment_of<int>::value));
BOOST_TEST(a1[1] == 0); BOOST_TEST(result[0] == 0);
BOOST_TEST(a1[2] == 0); BOOST_TEST(result[1] == 0);
BOOST_TEST(result[2] == 0);
} }
{ {
boost::shared_ptr<const int[3]> a1 = boost::allocate_shared<const int[3]>(std::allocator<int>()); boost::shared_ptr<const int[3]> result =
const int* a2 = a1.get(); boost::allocate_shared<const int[3]>(creator<int>());
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<int>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
BOOST_TEST(a1[0] == 0); boost::alignment_of<int>::value));
BOOST_TEST(a1[1] == 0); BOOST_TEST(result[0] == 0);
BOOST_TEST(a1[2] == 0); BOOST_TEST(result[1] == 0);
BOOST_TEST(result[2] == 0);
} }
{ {
boost::shared_ptr<const int[][2]> a1 = boost::allocate_shared<const int[][2]>(std::allocator<int>(), 2); boost::shared_ptr<const int[][2]> result =
BOOST_TEST(a1.get() != 0); boost::allocate_shared<const int[][2]>(creator<int>(), 2);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a1[0][0] == 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(a1[0][1] == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
BOOST_TEST(a1[1][0] == 0); boost::alignment_of<int>::value));
BOOST_TEST(a1[1][1] == 0); BOOST_TEST(result[0][0] == 0);
BOOST_TEST(result[0][1] == 0);
BOOST_TEST(result[1][0] == 0);
BOOST_TEST(result[1][1] == 0);
} }
{ {
boost::shared_ptr<const int[2][2]> a1 = boost::allocate_shared<const int[2][2]>(std::allocator<int>()); boost::shared_ptr<const int[2][2]> result =
BOOST_TEST(a1.get() != 0); boost::allocate_shared<const int[2][2]>(creator<int>());
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a1[0][0] == 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(a1[0][1] == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
BOOST_TEST(a1[1][0] == 0); boost::alignment_of<int>::value));
BOOST_TEST(a1[1][1] == 0); BOOST_TEST(result[0][0] == 0);
BOOST_TEST(result[0][1] == 0);
BOOST_TEST(result[1][0] == 0);
BOOST_TEST(result[1][1] == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<type[]> a1 = boost::allocate_shared<type[]>(std::allocator<type>(), 3); boost::shared_ptr<type[]> result =
type* a2 = a1.get(); boost::allocate_shared<type[]>(creator<type>(), 3);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<type>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
boost::weak_ptr<type[]> w1 = a1; boost::weak_ptr<type[]> w1 = result;
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<type[3]> a1 = boost::allocate_shared<type[3]>(std::allocator<type>()); boost::shared_ptr<type[3]> result =
type* a2 = a1.get(); boost::allocate_shared<type[3]>(creator<type>());
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<type>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
boost::weak_ptr<type[3]> w1 = a1; boost::weak_ptr<type[3]> w1 = result;
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<type[][2]> a1 = boost::allocate_shared<type[][2]>(std::allocator<type>(), 2); boost::shared_ptr<type[][2]> result =
BOOST_TEST(a1.get() != 0); boost::allocate_shared<type[][2]>(creator<type>(), 2);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<type[2][2]> a1 = boost::allocate_shared<type[2][2]>(std::allocator<type>()); boost::shared_ptr<type[2][2]> result =
BOOST_TEST(a1.get() != 0); boost::allocate_shared<type[2][2]>(creator<type>());
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<const type[]> a1 = boost::allocate_shared<const type[]>(std::allocator<type>(), 3); boost::shared_ptr<const type[]> result =
const type* a2 = a1.get(); boost::allocate_shared<const type[]>(creator<type>(), 3);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<type>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<const type[3]> a1 = boost::allocate_shared<const type[3]>(std::allocator<type>()); boost::shared_ptr<const type[3]> result =
const type* a2 = a1.get(); boost::allocate_shared<const type[3]>(creator<type>());
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<type>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<const type[][2]> a1 = boost::allocate_shared<const type[][2]>(std::allocator<type>(), 2); boost::shared_ptr<const type[][2]> result =
BOOST_TEST(a1.get() != 0); boost::allocate_shared<const type[][2]>(creator<type>(), 2);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<const type[2][2]> a1 = boost::allocate_shared<const type[2][2]>(std::allocator<type>()); boost::shared_ptr<const type[2][2]> result =
BOOST_TEST(a1.get() != 0); boost::allocate_shared<const type[2][2]>(creator<type>());
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
return boost::report_errors(); return boost::report_errors();
} }

View File

@@ -1,27 +1,63 @@
/* /*
* Copyright (c) 2012-2014 Glen Joseph Fernandes Copyright 2012-2015 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License, Distributed under the Boost Software License, Version 1.0.
* Version 1.0. (See accompanying file LICENSE_1_0.txt (http://www.boost.org/LICENSE_1_0.txt)
* or copy at http://boost.org/LICENSE_1_0.txt) */
*/ #include <boost/core/lightweight_test.hpp>
#include <boost/detail/lightweight_test.hpp> #include <boost/smart_ptr/make_shared.hpp>
#include <boost/smart_ptr/allocate_shared_array.hpp>
template<class T>
struct creator {
typedef T value_type;
template<class U>
struct rebind {
typedef creator<U> other;
};
creator() { }
template<class U>
creator(const creator<U>&) { }
T* allocate(std::size_t size) {
return static_cast<T*>(::operator new(sizeof(T) * size));
}
void deallocate(T* ptr, std::size_t) {
::operator delete(ptr);
}
};
template<class T, class U>
inline bool
operator==(const creator<T>&, const creator<U>&)
{
return true;
}
template<class T, class U>
inline bool
operator!=(const creator<T>&, const creator<U>&)
{
return false;
}
class type { class type {
public: public:
static unsigned int instances; static unsigned instances;
explicit type() { type() {
if (instances == 5) { if (instances == 5) {
throw true; throw true;
} }
instances++; ++instances;
} }
~type() { ~type() {
instances--; --instances;
} }
private: private:
@@ -29,72 +65,57 @@ private:
type& operator=(const type&); type& operator=(const type&);
}; };
unsigned int type::instances = 0; unsigned type::instances = 0;
int main() { int main()
BOOST_TEST(type::instances == 0); {
try { try {
boost::allocate_shared<type[]>(std::allocator<type>(), 6); boost::allocate_shared<type[]>(creator<type>(), 6);
BOOST_ERROR("allocate_shared did not throw"); BOOST_ERROR("allocate_shared did not throw");
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
try { try {
boost::allocate_shared<type[][2]>(std::allocator<type>(), 3); boost::allocate_shared<type[][2]>(creator<type>(), 3);
BOOST_ERROR("allocate_shared did not throw"); BOOST_ERROR("allocate_shared did not throw");
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
try { try {
boost::allocate_shared<type[6]>(std::allocator<type>()); boost::allocate_shared<type[6]>(creator<type>());
BOOST_ERROR("allocate_shared did not throw"); BOOST_ERROR("allocate_shared did not throw");
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
try { try {
boost::allocate_shared<type[3][2]>(std::allocator<type>()); boost::allocate_shared<type[3][2]>(creator<type>());
BOOST_ERROR("allocate_shared did not throw"); BOOST_ERROR("allocate_shared did not throw");
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
try { try {
boost::allocate_shared_noinit<type[]>(std::allocator<type>(), 6); boost::allocate_shared_noinit<type[]>(creator<type>(), 6);
BOOST_ERROR("allocate_shared_noinit did not throw"); BOOST_ERROR("allocate_shared_noinit did not throw");
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
try { try {
boost::allocate_shared_noinit<type[][2]>(std::allocator<type>(), 3); boost::allocate_shared_noinit<type[][2]>(creator<type>(), 3);
BOOST_ERROR("allocate_shared_noinit did not throw"); BOOST_ERROR("allocate_shared_noinit did not throw");
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
try { try {
boost::allocate_shared_noinit<type[6]>(std::allocator<type>()); boost::allocate_shared_noinit<type[6]>(creator<type>());
BOOST_ERROR("allocate_shared_noinit did not throw"); BOOST_ERROR("allocate_shared_noinit did not throw");
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
try { try {
boost::allocate_shared_noinit<type[3][2]>(std::allocator<type>()); boost::allocate_shared_noinit<type[3][2]>(creator<type>());
BOOST_ERROR("allocate_shared_noinit did not throw"); BOOST_ERROR("allocate_shared_noinit did not throw");
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
return boost::report_errors(); return boost::report_errors();
} }

View File

@@ -1,46 +1,83 @@
/* /*
* Copyright (c) 2012-2014 Glen Joseph Fernandes Copyright 2012-2015 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License,
* Version 1.0. (See accompanying file LICENSE_1_0.txt
* or copy at http://boost.org/LICENSE_1_0.txt)
*/
#include <boost/detail/lightweight_test.hpp>
#include <boost/smart_ptr/allocate_shared_array.hpp>
int main() { Distributed under the Boost Software License, Version 1.0.
{ (http://www.boost.org/LICENSE_1_0.txt)
boost::shared_ptr<int[]> a1 = boost::allocate_shared<int[]>(std::allocator<int>(), 4, 1); */
BOOST_TEST(a1[0] == 1); #include <boost/core/lightweight_test.hpp>
BOOST_TEST(a1[1] == 1); #include <boost/smart_ptr/make_shared.hpp>
BOOST_TEST(a1[2] == 1);
BOOST_TEST(a1[3] == 1); template<class T>
struct creator {
typedef T value_type;
template<class U>
struct rebind {
typedef creator<U> other;
};
creator() { }
template<class U>
creator(const creator<U>&) { }
T* allocate(std::size_t size) {
return static_cast<T*>(::operator new(sizeof(T) * size));
} }
{ void deallocate(T* ptr, std::size_t) {
boost::shared_ptr<int[4]> a1 = boost::allocate_shared<int[4]>(std::allocator<int>(), 1); ::operator delete(ptr);
BOOST_TEST(a1[0] == 1);
BOOST_TEST(a1[1] == 1);
BOOST_TEST(a1[2] == 1);
BOOST_TEST(a1[3] == 1);
} }
};
template<class T, class U>
inline bool
operator==(const creator<T>&, const creator<U>&)
{
return true;
}
template<class T, class U>
inline bool
operator!=(const creator<T>&, const creator<U>&)
{
return false;
}
int main()
{
{ {
boost::shared_ptr<const int[]> a1 = boost::allocate_shared<const int[]>(std::allocator<int>(), 4, 1); boost::shared_ptr<int[]> result =
BOOST_TEST(a1[0] == 1); boost::allocate_shared<int[]>(creator<int>(), 4, 1);
BOOST_TEST(a1[1] == 1); BOOST_TEST(result[0] == 1);
BOOST_TEST(a1[2] == 1); BOOST_TEST(result[1] == 1);
BOOST_TEST(a1[3] == 1); BOOST_TEST(result[2] == 1);
BOOST_TEST(result[3] == 1);
} }
{ {
boost::shared_ptr<const int[4]> a1 = boost::allocate_shared<const int[4]>(std::allocator<int>(), 1); boost::shared_ptr<int[4]> result =
BOOST_TEST(a1[0] == 1); boost::allocate_shared<int[4]>(creator<int>(), 1);
BOOST_TEST(a1[1] == 1); BOOST_TEST(result[0] == 1);
BOOST_TEST(a1[2] == 1); BOOST_TEST(result[1] == 1);
BOOST_TEST(a1[3] == 1); BOOST_TEST(result[2] == 1);
BOOST_TEST(result[3] == 1);
}
{
boost::shared_ptr<const int[]> result =
boost::allocate_shared<const int[]>(creator<int>(), 4, 1);
BOOST_TEST(result[0] == 1);
BOOST_TEST(result[1] == 1);
BOOST_TEST(result[2] == 1);
BOOST_TEST(result[3] == 1);
}
{
boost::shared_ptr<const int[4]> result =
boost::allocate_shared<const int[4]>(creator<int>(), 1);
BOOST_TEST(result[0] == 1);
BOOST_TEST(result[1] == 1);
BOOST_TEST(result[2] == 1);
BOOST_TEST(result[3] == 1);
} }
return boost::report_errors(); return boost::report_errors();
} }

View File

@@ -1,48 +1,92 @@
/* /*
* Copyright (c) 2012-2014 Glen Joseph Fernandes Copyright 2012-2015 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License, Distributed under the Boost Software License, Version 1.0.
* Version 1.0. (See accompanying file LICENSE_1_0.txt (http://www.boost.org/LICENSE_1_0.txt)
* or copy at http://boost.org/LICENSE_1_0.txt) */
*/ #include <boost/core/lightweight_test.hpp>
#include <boost/detail/lightweight_test.hpp> #include <boost/smart_ptr/make_shared.hpp>
#include <boost/smart_ptr/allocate_shared_array.hpp>
int main() {
#if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) #if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)
{ template<class T>
boost::shared_ptr<int[][2]> a1 = boost::allocate_shared<int[][2]>(std::allocator<int>(), 2, {0, 1}); struct creator {
BOOST_TEST(a1[0][0] == 0); typedef T value_type;
BOOST_TEST(a1[0][1] == 1);
BOOST_TEST(a1[1][0] == 0); template<class U>
BOOST_TEST(a1[1][1] == 1); struct rebind {
typedef creator<U> other;
};
creator() { }
template<class U>
creator(const creator<U>&) { }
T* allocate(std::size_t size) {
return static_cast<T*>(::operator new(sizeof(T) * size));
} }
{ void deallocate(T* ptr, std::size_t) {
boost::shared_ptr<int[2][2]> a1 = boost::allocate_shared<int[2][2]>(std::allocator<int>(), { 0, 1 }); ::operator delete(ptr);
BOOST_TEST(a1[0][0] == 0);
BOOST_TEST(a1[0][1] == 1);
BOOST_TEST(a1[1][0] == 0);
BOOST_TEST(a1[1][1] == 1);
} }
};
template<class T, class U>
inline bool
operator==(const creator<T>&, const creator<U>&)
{
return true;
}
template<class T, class U>
inline bool
operator!=(const creator<T>&, const creator<U>&)
{
return false;
}
int main()
{
{ {
boost::shared_ptr<const int[][2]> a1 = boost::allocate_shared<const int[][2]>(std::allocator<int>(), 2, { 0, 1 }); boost::shared_ptr<int[][2]> result =
BOOST_TEST(a1[0][0] == 0); boost::allocate_shared<int[][2]>(creator<int>(), 2, {0, 1});
BOOST_TEST(a1[0][1] == 1); BOOST_TEST(result[0][0] == 0);
BOOST_TEST(a1[1][0] == 0); BOOST_TEST(result[0][1] == 1);
BOOST_TEST(a1[1][1] == 1); BOOST_TEST(result[1][0] == 0);
BOOST_TEST(result[1][1] == 1);
} }
{ {
boost::shared_ptr<const int[2][2]> a1 = boost::allocate_shared<const int[2][2]>(std::allocator<int>(), { 0, 1 }); boost::shared_ptr<int[2][2]> result =
BOOST_TEST(a1[0][0] == 0); boost::allocate_shared<int[2][2]>(creator<int>(), {0, 1});
BOOST_TEST(a1[0][1] == 1); BOOST_TEST(result[0][0] == 0);
BOOST_TEST(a1[1][0] == 0); BOOST_TEST(result[0][1] == 1);
BOOST_TEST(a1[1][1] == 1); BOOST_TEST(result[1][0] == 0);
BOOST_TEST(result[1][1] == 1);
}
{
boost::shared_ptr<const int[][2]> result =
boost::allocate_shared<const
int[][2]>(creator<int>(), 2, {0, 1});
BOOST_TEST(result[0][0] == 0);
BOOST_TEST(result[0][1] == 1);
BOOST_TEST(result[1][0] == 0);
BOOST_TEST(result[1][1] == 1);
}
{
boost::shared_ptr<const int[2][2]> result =
boost::allocate_shared<const
int[2][2]>(creator<int>(), {0, 1});
BOOST_TEST(result[0][0] == 0);
BOOST_TEST(result[0][1] == 1);
BOOST_TEST(result[1][0] == 0);
BOOST_TEST(result[1][1] == 1);
} }
#endif
return boost::report_errors(); return boost::report_errors();
} }
#else
int main()
{
return 0;
}
#endif

View File

@@ -12,8 +12,12 @@ struct X
{ {
}; };
template<class T> void f( T & /*t*/ )
{
}
int main() int main()
{ {
boost::shared_ptr<X> px( new X ); boost::shared_ptr<X> px( new X );
px[ 0 ]; f( px[ 0 ] );
} }

View File

@@ -1,3 +1,5 @@
#include <boost/config.hpp>
// //
// auto_ptr_rv_test.cpp // auto_ptr_rv_test.cpp
// //
@@ -8,6 +10,14 @@
// http://www.boost.org/LICENSE_1_0.txt // http://www.boost.org/LICENSE_1_0.txt
// //
#if defined( BOOST_NO_AUTO_PTR )
int main()
{
}
#else
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>
#include <boost/detail/lightweight_test.hpp> #include <boost/detail/lightweight_test.hpp>
#include <memory> #include <memory>
@@ -109,3 +119,5 @@ int main()
return boost::report_errors(); return boost::report_errors();
} }
#endif // #if defined( BOOST_NO_AUTO_PTR )

View File

@@ -0,0 +1,224 @@
//
// cpp11_pointer_cast_test.cpp - a test for boost/pointer_cast.hpp with std::shared_ptr and std::unique_ptr
//
// Copyright (c) 2016 Karolin Varner
//
// Distributed under 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)
//
#include <boost/pointer_cast.hpp>
#include <boost/config.hpp>
#include <boost/detail/lightweight_test.hpp>
#include <boost/get_pointer.hpp>
#include <boost/shared_ptr.hpp>
#include <memory>
#include <utility>
#include <functional>
#if defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) \
|| defined( BOOST_NO_CXX11_HDR_FUNCTIONAL ) \
|| defined( BOOST_NO_CXX11_HDR_UTILITY ) \
|| defined( BOOST_NO_CXX11_LAMBDAS ) \
|| defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
// We expect all the features or none of the features to be
// available, since we should be on C++11
int main() { return 0; }
#else
namespace
{
// Let's create these inheritance relationship:
//
// base base2
// | |
// derived
// |
// derived_derived
//
class base
{
public:
virtual ~base(){}
int filler [5];
};
class base2
{
public:
virtual ~base2(){}
int filler [5];
};
class derived
: public base, public base2
{
int filler [5];
};
class derived_derived
: public derived
{
int filler [5];
};
// And now some simple check functions
#if !defined( BOOST_NO_RTTI )
template <class BasePtr>
bool check_dynamic_pointer_cast(const BasePtr &ptr)
{
//Check that dynamic_pointer_cast versus dynamic_cast
return
//Correct cast with dynamic_pointer_cast
boost::get_pointer(boost::dynamic_pointer_cast<derived>(ptr)) ==
//Correct cast with dynamic_cast
dynamic_cast<derived*>(boost::get_pointer(ptr))
&&
//Incorrect cast with dynamic_pointer_cast
boost::get_pointer(boost::dynamic_pointer_cast<derived_derived>(ptr)) ==
//Incorrect cast with dynamic_cast
dynamic_cast<derived_derived*>(boost::get_pointer(ptr));
}
#endif
template <class BasePtr>
bool check_static_pointer_cast(const BasePtr &ptr)
{
return
//Cast base -> derived -> base2 using static_pointer_cast
boost::get_pointer(
boost::static_pointer_cast<base2>(
boost::static_pointer_cast<derived>(ptr))) ==
//Now the same with static_cast
static_cast<base2*>(static_cast<derived*>(boost::get_pointer(ptr)));
}
template <class BasePtr>
bool check_const_pointer_cast(const BasePtr &ptr)
{
return
//Unconst and const again using const_pointer_cast
boost::get_pointer(
boost::const_pointer_cast<const base>
(boost::const_pointer_cast<base>(ptr))) ==
//Now the same with const_cast
const_cast<const base*>(const_cast<base*>(boost::get_pointer(ptr)));
}
template <class BasePtr>
void check_all_copy_casts(const BasePtr &ptr)
{
#if !defined( BOOST_NO_RTTI )
BOOST_TEST( check_dynamic_pointer_cast( ptr ) );
#endif
BOOST_TEST( check_static_pointer_cast( ptr ) );
BOOST_TEST( check_const_pointer_cast( ptr ) );
}
#if !defined( BOOST_NO_RTTI )
template <class BasePtr>
bool check_dynamic_moving_pointer_cast(std::function<BasePtr()> f)
{
BasePtr smart1 = f(), smart2 = f();
derived* expect1 = dynamic_cast<derived*>(boost::get_pointer(smart1));
derived_derived* expect2 = dynamic_cast<derived_derived*>(boost::get_pointer(smart2));
//Check that dynamic_pointer_cast versus dynamic_cast
return
//Correct cast with dynamic_pointer_cast
boost::get_pointer(boost::dynamic_pointer_cast<derived>( std::move(smart1) )) == expect1
&&
//Incorrect cast with dynamic_pointer_cast
boost::get_pointer(boost::dynamic_pointer_cast<derived_derived>( std::move(smart2) )) == expect2;
}
#endif
template <class BasePtr>
bool check_static_moving_pointer_cast(std::function<BasePtr()> f)
{
BasePtr smart = f();
base2 *expect = static_cast<base2*>(static_cast<derived*>(boost::get_pointer(smart)));
return
//Cast base -> derived -> base2 using static_pointer_cast
boost::get_pointer(
boost::static_pointer_cast<base2>(
boost::static_pointer_cast<derived>( std::move(smart) ))) ==
//Now the same with static_cast
expect;
}
template <class BasePtr>
bool check_const_moving_pointer_cast(std::function<BasePtr()> f)
{
BasePtr smart = f();
const base *expect = const_cast<const base*>(const_cast<base*>(boost::get_pointer(smart)));
return
//Unconst and const again using const_pointer_cast
boost::get_pointer(
boost::const_pointer_cast<const base>
(boost::const_pointer_cast<base>( std::move(smart) ))) ==
//Now the same with const_cast
expect;
}
template <class BasePtr>
void check_all_moving_casts(std::function<BasePtr()> f) {
#if !defined( BOOST_NO_RTTI )
BOOST_TEST( check_dynamic_moving_pointer_cast( f ) );
#endif
BOOST_TEST( check_static_moving_pointer_cast( f ) );
BOOST_TEST( check_const_moving_pointer_cast( f ) );
}
}
int main()
{
std::shared_ptr<base> std_shared(new derived);
boost::shared_ptr<base> boost_shared(new derived);
base *plain = boost_shared.get();
// plain & boost::shared_ptr moving pointer_cast checks; there
// is no specific handleing for those types at the moment; this
// test just makes sure they won't break when std::move() is used
// in generic code
check_all_moving_casts<boost::shared_ptr<base>>([&boost_shared]() {
return boost_shared;
});
check_all_moving_casts<base*>([plain]() {
return plain;
});
// std::shared_ptr casts
check_all_copy_casts(std_shared);
check_all_moving_casts<std::shared_ptr<base>>([&std_shared]() {
return std_shared;
});
// std::unique_ptr casts
check_all_moving_casts<std::unique_ptr<base>>([]() {
return std::unique_ptr<base>(new derived);
});
return boost::report_errors();
}
#endif

View File

@@ -15,6 +15,7 @@
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp> #include <boost/weak_ptr.hpp>
#include <boost/detail/lightweight_test.hpp> #include <boost/detail/lightweight_test.hpp>
#include <boost/config.hpp>
#include <memory> #include <memory>
#include <string> #include <string>
@@ -77,11 +78,15 @@ void test()
BOOST_TEST( X::instances == 0 ); BOOST_TEST( X::instances == 0 );
#if !defined( BOOST_NO_AUTO_PTR )
{ {
std::auto_ptr<X> px( new X( 0 ) ); std::auto_ptr<X> px( new X( 0 ) );
BOOST_TEST( X::instances == 1 ); BOOST_TEST( X::instances == 1 );
} }
#endif
BOOST_TEST( X::instances == 0 ); BOOST_TEST( X::instances == 0 );
{ {

View File

@@ -143,6 +143,18 @@ int main()
BOOST_TEST( N::base::instances == 0 ); BOOST_TEST( N::base::instances == 0 );
} }
{
boost::intrusive_ptr<Y> p( new Y );
BOOST_TEST( N::base::instances == 1 );
boost::intrusive_ptr<X> p2( std::move( p ) );
BOOST_TEST( N::base::instances == 1 );
BOOST_TEST( p.get() == 0 );
p2.reset();
BOOST_TEST( N::base::instances == 0 );
}
{ {
boost::intrusive_ptr<X> p( new X ); boost::intrusive_ptr<X> p( new X );
BOOST_TEST( N::base::instances == 1 ); BOOST_TEST( N::base::instances == 1 );
@@ -170,6 +182,33 @@ int main()
BOOST_TEST( N::base::instances == 0 ); BOOST_TEST( N::base::instances == 0 );
} }
{
boost::intrusive_ptr<Y> p( new Y );
BOOST_TEST( N::base::instances == 1 );
boost::intrusive_ptr<X> p2;
p2 = std::move( p );
BOOST_TEST( N::base::instances == 1 );
BOOST_TEST( p.get() == 0 );
p2.reset();
BOOST_TEST( N::base::instances == 0 );
}
{
boost::intrusive_ptr<Y> p( new Y );
BOOST_TEST( N::base::instances == 1 );
boost::intrusive_ptr<X> p2( new X );
BOOST_TEST( N::base::instances == 2 );
p2 = std::move( p );
BOOST_TEST( N::base::instances == 1 );
BOOST_TEST( p.get() == 0 );
p2.reset();
BOOST_TEST( N::base::instances == 0 );
}
return boost::report_errors(); return boost::report_errors();
} }

View File

@@ -1,26 +1,25 @@
/* /*
* Copyright (c) 2012-2014 Glen Joseph Fernandes Copyright 2012-2015 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License, Distributed under the Boost Software License, Version 1.0.
* Version 1.0. (See accompanying file LICENSE_1_0.txt (http://www.boost.org/LICENSE_1_0.txt)
* or copy at http://boost.org/LICENSE_1_0.txt) */
*/ #include <boost/core/lightweight_test.hpp>
#include <boost/detail/lightweight_test.hpp>
#include <boost/smart_ptr/enable_shared_from_this.hpp> #include <boost/smart_ptr/enable_shared_from_this.hpp>
#include <boost/smart_ptr/make_shared_array.hpp> #include <boost/smart_ptr/make_shared.hpp>
class type class type
: public boost::enable_shared_from_this<type> { : public boost::enable_shared_from_this<type> {
public: public:
static unsigned int instances; static unsigned instances;
explicit type() { type() {
instances++; ++instances;
} }
~type() { ~type() {
instances--; --instances;
} }
private: private:
@@ -28,30 +27,31 @@ private:
type& operator=(const type&); type& operator=(const type&);
}; };
unsigned int type::instances = 0; unsigned type::instances = 0;
int main() { int main()
{
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<type[]> a1 = boost::make_shared<type[]>(3); boost::shared_ptr<type[]> result =
boost::make_shared<type[]>(3);
try { try {
a1[0].shared_from_this(); result[0].shared_from_this();
BOOST_ERROR("shared_from_this did not throw"); BOOST_ERROR("shared_from_this did not throw");
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
} }
} }
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<type[]> a1 = boost::make_shared_noinit<type[]>(3); boost::shared_ptr<type[3]> result =
boost::make_shared_noinit<type[3]>();
try { try {
a1[0].shared_from_this(); result[0].shared_from_this();
BOOST_ERROR("shared_from_this did not throw"); BOOST_ERROR("shared_from_this did not throw");
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
} }
} }
return boost::report_errors(); return boost::report_errors();
} }

View File

@@ -1,181 +1,207 @@
/* /*
* Copyright (c) 2012-2014 Glen Joseph Fernandes Copyright 2012-2015 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License, Distributed under the Boost Software License, Version 1.0.
* Version 1.0. (See accompanying file LICENSE_1_0.txt (http://www.boost.org/LICENSE_1_0.txt)
* or copy at http://boost.org/LICENSE_1_0.txt) */
*/ #include <boost/align/is_aligned.hpp>
#include <boost/detail/lightweight_test.hpp> #include <boost/core/lightweight_test.hpp>
#include <boost/smart_ptr/make_shared_array.hpp> #include <boost/smart_ptr/make_shared.hpp>
#include <boost/smart_ptr/weak_ptr.hpp> #include <boost/smart_ptr/weak_ptr.hpp>
#include <boost/type_traits/alignment_of.hpp> #include <boost/type_traits/alignment_of.hpp>
class type { class type {
public: public:
static unsigned int instances; static unsigned instances;
explicit type() { type()
instances++; : value_(0.0) {
++instances;
} }
~type() { ~type() {
instances--; --instances;
}
void set(long double value) {
value_ = value;
}
long double get() const {
return value_;
} }
private: private:
type(const type&); type(const type&);
type& operator=(const type&); type& operator=(const type&);
long double value_;
}; };
unsigned int type::instances = 0; unsigned type::instances = 0;
int main() { int main()
{
{ {
boost::shared_ptr<int[]> a1 = boost::make_shared_noinit<int[]>(3); boost::shared_ptr<int[]> result =
int* a2 = a1.get(); boost::make_shared_noinit<int[]>(3);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<int>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<int>::value));
} }
{ {
boost::shared_ptr<int[3]> a1 = boost::make_shared_noinit<int[3]>(); boost::shared_ptr<int[3]> result =
int* a2 = a1.get(); boost::make_shared_noinit<int[3]>();
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<int>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<int>::value));
} }
{ {
boost::shared_ptr<int[][2]> a1 = boost::make_shared_noinit<int[][2]>(2); boost::shared_ptr<int[][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_shared_noinit<int[][2]>(2);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<int>::value));
} }
{ {
boost::shared_ptr<int[2][2]> a1 = boost::make_shared_noinit<int[2][2]>(); boost::shared_ptr<int[2][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_shared_noinit<int[2][2]>();
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<int>::value));
} }
{ {
boost::shared_ptr<const int[]> a1 = boost::make_shared_noinit<const int[]>(3); boost::shared_ptr<const int[]> result =
const int* a2 = a1.get(); boost::make_shared_noinit<const int[]>(3);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<int>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<int>::value));
} }
{ {
boost::shared_ptr<const int[3]> a1 = boost::make_shared_noinit<const int[3]>(); boost::shared_ptr<const int[3]> result =
const int* a2 = a1.get(); boost::make_shared_noinit<const int[3]>();
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<int>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<int>::value));
} }
{ {
boost::shared_ptr<const int[][2]> a1 = boost::make_shared_noinit<const int[][2]>(2); boost::shared_ptr<const int[][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_shared_noinit<const int[][2]>(2);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<int>::value));
} }
{ {
boost::shared_ptr<const int[2][2]> a1 = boost::make_shared_noinit<const int[2][2]>(); boost::shared_ptr<const int[2][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_shared_noinit<const int[2][2]>();
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<int>::value));
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<type[]> a1 = boost::make_shared_noinit<type[]>(3); boost::shared_ptr<type[]> result =
type* a2 = a1.get(); boost::make_shared_noinit<type[]>(3);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<type>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
boost::weak_ptr<type[]> w1 = a1; boost::weak_ptr<type[]> other = result;
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<type[3]> a1 = boost::make_shared_noinit<type[3]>(); boost::shared_ptr<type[3]> result =
type* a2 = a1.get(); boost::make_shared_noinit<type[3]>();
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<type>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
boost::weak_ptr<type[3]> w1 = a1; boost::weak_ptr<type[3]> other = result;
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<type[][2]> a1 = boost::make_shared_noinit<type[][2]>(2); boost::shared_ptr<type[][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_shared_noinit<type[][2]>(2);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); boost::weak_ptr<type[][2]> other = result;
result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<type[2][2]> a1 = boost::make_shared_noinit<type[2][2]>(); boost::shared_ptr<type[2][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_shared_noinit<type[2][2]>();
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); boost::weak_ptr<type[2][2]> other = result;
result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<const type[]> a1 = boost::make_shared_noinit<const type[]>(3); boost::shared_ptr<const type[]> result =
const type* a2 = a1.get(); boost::make_shared_noinit<const type[]>(3);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<type>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
a1.reset(); boost::weak_ptr<const type[]> other = result;
result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<const type[3]> a1 = boost::make_shared_noinit<const type[3]>(); boost::shared_ptr<const type[3]> result =
const type* a2 = a1.get(); boost::make_shared_noinit<const type[3]>();
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<type>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
a1.reset(); boost::weak_ptr<const type[3]> other = result;
result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<const type[][2]> a1 = boost::make_shared_noinit<const type[][2]>(2); boost::shared_ptr<const type[][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_shared_noinit<const type[][2]>(2);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); boost::weak_ptr<const type[][2]> other = result;
result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<const type[2][2]> a1 = boost::make_shared_noinit<const type[2][2]>(); boost::shared_ptr<const type[2][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_shared_noinit<const type[2][2]>();
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); boost::weak_ptr<const type[2][2]> other = result;
result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
return boost::report_errors(); return boost::report_errors();
} }

View File

@@ -1,209 +1,229 @@
/* /*
* Copyright (c) 2012-2014 Glen Joseph Fernandes Copyright 2012-2015 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License, Distributed under the Boost Software License, Version 1.0.
* Version 1.0. (See accompanying file LICENSE_1_0.txt (http://www.boost.org/LICENSE_1_0.txt)
* or copy at http://boost.org/LICENSE_1_0.txt) */
*/ #include <boost/align/is_aligned.hpp>
#include <boost/detail/lightweight_test.hpp> #include <boost/core/lightweight_test.hpp>
#include <boost/smart_ptr/make_shared_array.hpp> #include <boost/smart_ptr/make_shared.hpp>
#include <boost/smart_ptr/weak_ptr.hpp> #include <boost/smart_ptr/weak_ptr.hpp>
#include <boost/type_traits/alignment_of.hpp> #include <boost/type_traits/alignment_of.hpp>
class type { class type {
public: public:
static unsigned int instances; static unsigned instances;
explicit type() { type()
instances++; : value_(0.0) {
++instances;
} }
~type() { ~type() {
instances--; --instances;
}
void set(long double value) {
value_ = value;
}
long double get() const {
return value_;
} }
private: private:
type(const type&); type(const type&);
type& operator=(const type&); type& operator=(const type&);
long double value_;
}; };
unsigned int type::instances = 0; unsigned type::instances = 0;
int main() { int main()
{
{ {
boost::shared_ptr<int[]> a1 = boost::make_shared<int[]>(3); boost::shared_ptr<int[]> result =
int* a2 = a1.get(); boost::make_shared<int[]>(3);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<int>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
BOOST_TEST(a1[0] == 0); boost::alignment_of<int>::value));
BOOST_TEST(a1[1] == 0); BOOST_TEST(result[0] == 0);
BOOST_TEST(a1[2] == 0); BOOST_TEST(result[1] == 0);
BOOST_TEST(result[2] == 0);
} }
{ {
boost::shared_ptr<int[3]> a1 = boost::make_shared<int[3]>(); boost::shared_ptr<int[3]> result =
int* a2 = a1.get(); boost::make_shared<int[3]>();
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<int>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
BOOST_TEST(a1[0] == 0); boost::alignment_of<int>::value));
BOOST_TEST(a1[1] == 0); BOOST_TEST(result[0] == 0);
BOOST_TEST(a1[2] == 0); BOOST_TEST(result[1] == 0);
BOOST_TEST(result[2] == 0);
} }
{ {
boost::shared_ptr<int[][2]> a1 = boost::make_shared<int[][2]>(2); boost::shared_ptr<int[][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_shared<int[][2]>(2);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a1[0][0] == 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(a1[0][1] == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
BOOST_TEST(a1[1][0] == 0); boost::alignment_of<int>::value));
BOOST_TEST(a1[1][1] == 0); BOOST_TEST(result[0][0] == 0);
BOOST_TEST(result[0][1] == 0);
BOOST_TEST(result[1][0] == 0);
BOOST_TEST(result[1][1] == 0);
} }
{ {
boost::shared_ptr<int[2][2]> a1 = boost::make_shared<int[2][2]>(); boost::shared_ptr<int[2][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_shared<int[2][2]>();
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a1[0][0] == 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(a1[0][1] == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
BOOST_TEST(a1[1][0] == 0); boost::alignment_of<int>::value));
BOOST_TEST(a1[1][1] == 0); BOOST_TEST(result[0][0] == 0);
BOOST_TEST(result[0][1] == 0);
BOOST_TEST(result[1][0] == 0);
BOOST_TEST(result[1][1] == 0);
} }
{ {
boost::shared_ptr<const int[]> a1 = boost::make_shared<const int[]>(3); boost::shared_ptr<const int[]> result =
const int* a2 = a1.get(); boost::make_shared<const int[]>(3);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<int>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
BOOST_TEST(a1[0] == 0); boost::alignment_of<int>::value));
BOOST_TEST(a1[1] == 0); BOOST_TEST(result[0] == 0);
BOOST_TEST(a1[2] == 0); BOOST_TEST(result[1] == 0);
BOOST_TEST(result[2] == 0);
} }
{ {
boost::shared_ptr<const int[3]> a1 = boost::make_shared<const int[3]>(); boost::shared_ptr<const int[3]> result =
const int* a2 = a1.get(); boost::make_shared<const int[3]>();
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<int>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
BOOST_TEST(a1[0] == 0); boost::alignment_of<int>::value));
BOOST_TEST(a1[1] == 0); BOOST_TEST(result[0] == 0);
BOOST_TEST(a1[2] == 0); BOOST_TEST(result[1] == 0);
BOOST_TEST(result[2] == 0);
} }
{ {
boost::shared_ptr<const int[][2]> a1 = boost::make_shared<const int[][2]>(2); boost::shared_ptr<const int[][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_shared<const int[][2]>(2);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a1[0][0] == 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(a1[0][1] == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
BOOST_TEST(a1[1][0] == 0); boost::alignment_of<int>::value));
BOOST_TEST(a1[1][1] == 0); BOOST_TEST(result[0][0] == 0);
BOOST_TEST(result[0][1] == 0);
BOOST_TEST(result[1][0] == 0);
BOOST_TEST(result[1][1] == 0);
} }
{ {
boost::shared_ptr<const int[2][2]> a1 = boost::make_shared<const int[2][2]>(); boost::shared_ptr<const int[2][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_shared<const int[2][2]>();
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a1[0][0] == 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(a1[0][1] == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
BOOST_TEST(a1[1][0] == 0); boost::alignment_of<int>::value));
BOOST_TEST(a1[1][1] == 0); BOOST_TEST(result[0][0] == 0);
BOOST_TEST(result[0][1] == 0);
BOOST_TEST(result[1][0] == 0);
BOOST_TEST(result[1][1] == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<type[]> a1 = boost::make_shared<type[]>(3); boost::shared_ptr<type[]> result =
type* a2 = a1.get(); boost::make_shared<type[]>(3);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<type>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
boost::weak_ptr<type[]> w1 = a1; boost::weak_ptr<type[]> w1 = result;
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<type[3]> a1 = boost::make_shared<type[3]>(); boost::shared_ptr<type[3]> result =
type* a2 = a1.get(); boost::make_shared<type[3]>();
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<type>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
boost::weak_ptr<type[3]> w1 = a1; boost::weak_ptr<type[3]> w1 = result;
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<type[][2]> a1 = boost::make_shared<type[][2]>(2); boost::shared_ptr<type[][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_shared<type[][2]>(2);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<type[2][2]> a1 = boost::make_shared<type[2][2]>(); boost::shared_ptr<type[2][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_shared<type[2][2]>();
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<const type[]> a1 = boost::make_shared<const type[]>(3); boost::shared_ptr<const type[]> result =
const type* a2 = a1.get(); boost::make_shared<const type[]>(3);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<type>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<const type[3]> a1 = boost::make_shared<const type[3]>(); boost::shared_ptr<const type[3]> result =
const type* a2 = a1.get(); boost::make_shared<const type[3]>();
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a2 != 0); BOOST_TEST(result.use_count() == 1);
BOOST_TEST(size_t(a2) % boost::alignment_of<type>::value == 0); BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<const type[][2]> a1 = boost::make_shared<const type[][2]>(2); boost::shared_ptr<const type[][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_shared<const type[][2]>(2);
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
{ {
boost::shared_ptr<const type[2][2]> a1 = boost::make_shared<const type[2][2]>(); boost::shared_ptr<const type[2][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_shared<const type[2][2]>();
BOOST_TEST(a1.use_count() == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(result.use_count() == 1);
BOOST_TEST(boost::alignment::is_aligned(result.get(),
boost::alignment_of<type>::value));
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
return boost::report_errors(); return boost::report_errors();
} }

View File

@@ -1,27 +1,26 @@
/* /*
* Copyright (c) 2012-2014 Glen Joseph Fernandes Copyright 2012-2015 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License, Distributed under the Boost Software License, Version 1.0.
* Version 1.0. (See accompanying file LICENSE_1_0.txt (http://www.boost.org/LICENSE_1_0.txt)
* or copy at http://boost.org/LICENSE_1_0.txt) */
*/
#include <boost/detail/lightweight_test.hpp> #include <boost/detail/lightweight_test.hpp>
#include <boost/smart_ptr/make_shared_array.hpp> #include <boost/smart_ptr/make_shared.hpp>
class type { class type {
public: public:
static unsigned int instances; static unsigned instances;
explicit type() { type() {
if (instances == 5) { if (instances == 5) {
throw true; throw true;
} }
instances++; ++instances;
} }
~type() { ~type() {
instances--; --instances;
} }
private: private:
@@ -29,72 +28,57 @@ private:
type& operator=(const type&); type& operator=(const type&);
}; };
unsigned int type::instances = 0; unsigned type::instances = 0;
int main() { int main()
BOOST_TEST(type::instances == 0); {
try { try {
boost::make_shared<type[]>(6); boost::make_shared<type[]>(6);
BOOST_ERROR("make_shared did not throw"); BOOST_ERROR("make_shared did not throw");
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
try { try {
boost::make_shared<type[][2]>(3); boost::make_shared<type[][2]>(3);
BOOST_ERROR("make_shared did not throw"); BOOST_ERROR("make_shared did not throw");
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
try { try {
boost::make_shared<type[6]>(); boost::make_shared<type[6]>();
BOOST_ERROR("make_shared did not throw"); BOOST_ERROR("make_shared did not throw");
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
try { try {
boost::make_shared<type[3][2]>(); boost::make_shared<type[3][2]>();
BOOST_ERROR("make_shared did not throw"); BOOST_ERROR("make_shared did not throw");
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
try { try {
boost::make_shared_noinit<type[]>(6); boost::make_shared_noinit<type[]>(6);
BOOST_ERROR("make_shared_noinit did not throw"); BOOST_ERROR("make_shared_noinit did not throw");
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
try { try {
boost::make_shared_noinit<type[][2]>(3); boost::make_shared_noinit<type[][2]>(3);
BOOST_ERROR("make_shared_noinit did not throw"); BOOST_ERROR("make_shared_noinit did not throw");
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
try { try {
boost::make_shared_noinit<type[6]>(); boost::make_shared_noinit<type[6]>();
BOOST_ERROR("make_shared_noinit did not throw"); BOOST_ERROR("make_shared_noinit did not throw");
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0);
try { try {
boost::make_shared_noinit<type[3][2]>(); boost::make_shared_noinit<type[3][2]>();
BOOST_ERROR("make_shared_noinit did not throw"); BOOST_ERROR("make_shared_noinit did not throw");
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
return boost::report_errors(); return boost::report_errors();
} }

View File

@@ -1,46 +1,46 @@
/* /*
* Copyright (c) 2012-2014 Glen Joseph Fernandes Copyright 2012-2015 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License, Distributed under the Boost Software License, Version 1.0.
* Version 1.0. (See accompanying file LICENSE_1_0.txt (http://www.boost.org/LICENSE_1_0.txt)
* or copy at http://boost.org/LICENSE_1_0.txt) */
*/
#include <boost/detail/lightweight_test.hpp> #include <boost/detail/lightweight_test.hpp>
#include <boost/smart_ptr/make_shared_array.hpp> #include <boost/smart_ptr/make_shared.hpp>
int main() { int main()
{
{ {
boost::shared_ptr<int[]> a1 = boost::make_shared<int[]>(4, 1); boost::shared_ptr<int[]> result =
BOOST_TEST(a1[0] == 1); boost::make_shared<int[]>(4, 1);
BOOST_TEST(a1[1] == 1); BOOST_TEST(result[0] == 1);
BOOST_TEST(a1[2] == 1); BOOST_TEST(result[1] == 1);
BOOST_TEST(a1[3] == 1); BOOST_TEST(result[2] == 1);
BOOST_TEST(result[3] == 1);
} }
{ {
boost::shared_ptr<int[4]> a1 = boost::make_shared<int[4]>(1); boost::shared_ptr<int[4]> result =
BOOST_TEST(a1[0] == 1); boost::make_shared<int[4]>(1);
BOOST_TEST(a1[1] == 1); BOOST_TEST(result[0] == 1);
BOOST_TEST(a1[2] == 1); BOOST_TEST(result[1] == 1);
BOOST_TEST(a1[3] == 1); BOOST_TEST(result[2] == 1);
BOOST_TEST(result[3] == 1);
} }
{ {
boost::shared_ptr<const int[]> a1 = boost::make_shared<const int[]>(4, 1); boost::shared_ptr<const int[]> result =
BOOST_TEST(a1[0] == 1); boost::make_shared<const int[]>(4, 1);
BOOST_TEST(a1[1] == 1); BOOST_TEST(result[0] == 1);
BOOST_TEST(a1[2] == 1); BOOST_TEST(result[1] == 1);
BOOST_TEST(a1[3] == 1); BOOST_TEST(result[2] == 1);
BOOST_TEST(result[3] == 1);
} }
{ {
boost::shared_ptr<const int[4]> a1 = boost::make_shared<const int[4]>(1); boost::shared_ptr<const int[4]> result =
BOOST_TEST(a1[0] == 1); boost::make_shared<const int[4]>(1);
BOOST_TEST(a1[1] == 1); BOOST_TEST(result[0] == 1);
BOOST_TEST(a1[2] == 1); BOOST_TEST(result[1] == 1);
BOOST_TEST(a1[3] == 1); BOOST_TEST(result[2] == 1);
BOOST_TEST(result[3] == 1);
} }
return boost::report_errors(); return boost::report_errors();
} }

View File

@@ -1,48 +1,53 @@
/* /*
* Copyright (c) 2012-2014 Glen Joseph Fernandes Copyright 2012-2015 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License, Distributed under the Boost Software License, Version 1.0.
* Version 1.0. (See accompanying file LICENSE_1_0.txt (http://www.boost.org/LICENSE_1_0.txt)
* or copy at http://boost.org/LICENSE_1_0.txt) */
*/ #include <boost/core/lightweight_test.hpp>
#include <boost/detail/lightweight_test.hpp> #include <boost/smart_ptr/make_shared.hpp>
#include <boost/smart_ptr/make_shared_array.hpp>
int main() {
#if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) #if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)
int main()
{
{ {
boost::shared_ptr<int[][2]> a1 = boost::make_shared<int[][2]>(2, {0, 1}); boost::shared_ptr<int[][2]> result =
BOOST_TEST(a1[0][0] == 0); boost::make_shared<int[][2]>(2, {0, 1});
BOOST_TEST(a1[0][1] == 1); BOOST_TEST(result[0][0] == 0);
BOOST_TEST(a1[1][0] == 0); BOOST_TEST(result[0][1] == 1);
BOOST_TEST(a1[1][1] == 1); BOOST_TEST(result[1][0] == 0);
BOOST_TEST(result[1][1] == 1);
} }
{ {
boost::shared_ptr<int[2][2]> a1 = boost::make_shared<int[2][2]>({ 0, 1 }); boost::shared_ptr<int[2][2]> result =
BOOST_TEST(a1[0][0] == 0); boost::make_shared<int[2][2]>({0, 1});
BOOST_TEST(a1[0][1] == 1); BOOST_TEST(result[0][0] == 0);
BOOST_TEST(a1[1][0] == 0); BOOST_TEST(result[0][1] == 1);
BOOST_TEST(a1[1][1] == 1); BOOST_TEST(result[1][0] == 0);
BOOST_TEST(result[1][1] == 1);
} }
{ {
boost::shared_ptr<const int[][2]> a1 = boost::make_shared<const int[][2]>(2, { 0, 1 }); boost::shared_ptr<const int[][2]> result =
BOOST_TEST(a1[0][0] == 0); boost::make_shared<const int[][2]>(2, {0, 1});
BOOST_TEST(a1[0][1] == 1); BOOST_TEST(result[0][0] == 0);
BOOST_TEST(a1[1][0] == 0); BOOST_TEST(result[0][1] == 1);
BOOST_TEST(a1[1][1] == 1); BOOST_TEST(result[1][0] == 0);
BOOST_TEST(result[1][1] == 1);
} }
{ {
boost::shared_ptr<const int[2][2]> a1 = boost::make_shared<const int[2][2]>({ 0, 1 }); boost::shared_ptr<const int[2][2]> result =
BOOST_TEST(a1[0][0] == 0); boost::make_shared<const int[2][2]>({0, 1});
BOOST_TEST(a1[0][1] == 1); BOOST_TEST(result[0][0] == 0);
BOOST_TEST(a1[1][0] == 0); BOOST_TEST(result[0][1] == 1);
BOOST_TEST(a1[1][1] == 1); BOOST_TEST(result[1][0] == 0);
BOOST_TEST(result[1][1] == 1);
} }
#endif
return boost::report_errors(); return boost::report_errors();
} }
#else
int main()
{
return 0;
}
#endif

View File

@@ -0,0 +1,81 @@
// make_shared_move_emulation_test.cpp - a test of make_shared
// semi-perfect forwarding of constructor arguments when using a C++03
// compiler with move emulation.
// Note the "semi": it means moving temporaries (real r-values) doesn't work.
//
// Copyright 2016 Giel van Schijndel
//
// Distributed under 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
#include <boost/detail/lightweight_test.hpp>
#include <boost/make_shared.hpp>
#include <boost/move/core.hpp>
#include <boost/move/utility_core.hpp>
#include <boost/shared_ptr.hpp>
class movearg
{
private:
BOOST_MOVABLE_BUT_NOT_COPYABLE(movearg)
public:
movearg()
{}
movearg(BOOST_RV_REF(movearg))
{}
movearg& operator=(BOOST_RV_REF(movearg))
{
return *this;
}
};
class ByVal
{
public:
ByVal(movearg) {}
};
class ByRef
{
public:
enum constructor_id
{
move_constructor,
const_ref_constructor
};
ByRef(BOOST_RV_REF(movearg)): constructed_by_(move_constructor)
{}
ByRef(const movearg &arg): constructed_by_(const_ref_constructor)
{}
constructor_id constructed_by_;
};
int main()
{
{
movearg a;
boost::shared_ptr< ByVal > x = boost::make_shared< ByVal >(boost::move(a));
}
{
movearg a;
boost::shared_ptr< ByRef > x = boost::make_shared< ByRef >(boost::move(a));
BOOST_TEST( x->constructed_by_ == ByRef::move_constructor);
}
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
{
boost::shared_ptr< ByVal > x = boost::make_shared< ByVal >(movearg());
boost::shared_ptr< ByRef > y = boost::make_shared< ByRef >(movearg());
BOOST_TEST( y->constructed_by_ == ByRef::move_constructor);
}
#endif // !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
{
const movearg ca;
boost::shared_ptr< ByRef > x = boost::make_shared< ByRef >(ca);
BOOST_TEST( x->constructed_by_ == ByRef::const_ref_constructor);
}
return boost::report_errors();
}

View File

@@ -0,0 +1,19 @@
//
// make_shared_msvc_test.cpp
//
// Copyright 2017 Peter Dimov
//
// Distributed under 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
//
template<class T> struct value
{
};
#include <boost/make_shared.hpp>
int main()
{
}

View File

@@ -1,146 +1,155 @@
/* /*
* Copyright (c) 2014 Glen Joseph Fernandes Copyright 2014 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License, Distributed under the Boost Software License, Version 1.0.
* Version 1.0. (See accompanying file LICENSE_1_0.txt (http://www.boost.org/LICENSE_1_0.txt)
* or copy at http://boost.org/LICENSE_1_0.txt) */
*/
#include <boost/config.hpp> #include <boost/config.hpp>
#if !defined(BOOST_NO_CXX11_SMART_PTR) #if !defined(BOOST_NO_CXX11_SMART_PTR)
#include <boost/detail/lightweight_test.hpp> #include <boost/core/lightweight_test.hpp>
#include <boost/smart_ptr/make_unique_object.hpp> #include <boost/smart_ptr/make_unique.hpp>
class type { class type {
public: public:
static unsigned int instances; static unsigned instances;
explicit type(int v1 = 0, type(int v1 = 0,
int v2 = 0, int v2 = 0,
int v3 = 0, int v3 = 0,
int v4 = 0, int v4 = 0,
int v5 = 0, int v5 = 0,
int v6 = 0, int v6 = 0,
int v7 = 0, int v7 = 0,
int v8 = 0, int v8 = 0,
int v9 = 0) int v9 = 0)
: sum(v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9) { : sum_(v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9) {
instances++; ++instances;
} }
~type() { ~type() {
instances--; --instances;
} }
const int sum; int sum() const {
return sum_;
}
private: private:
int sum_;
type(const type&); type(const type&);
type& operator=(const type&); type& operator=(const type&);
}; };
unsigned int type::instances = 0; unsigned type::instances = 0;
int main() { int main()
{
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
{ {
std::unique_ptr<type> a1 = boost::make_unique<type>(); std::unique_ptr<type> result = boost::make_unique<type>();
BOOST_TEST(a1.get() != 0); BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 1); BOOST_TEST(type::instances == 1);
BOOST_TEST(a1->sum == 0); BOOST_TEST(result->sum() == 0);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
#if !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
{ {
std::unique_ptr<type> a1 = boost::make_unique<type>(1); std::unique_ptr<type> result = boost::make_unique<type>(1);
BOOST_TEST(a1.get() != 0); BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 1); BOOST_TEST(type::instances == 1);
BOOST_TEST(a1->sum == 1); BOOST_TEST(result->sum() == 1);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
{ {
std::unique_ptr<type> a1 = boost::make_unique<type>(1, 2); std::unique_ptr<type> result = boost::make_unique<type>(1, 2);
BOOST_TEST(a1.get() != 0); BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 1); BOOST_TEST(type::instances == 1);
BOOST_TEST(a1->sum == 1 + 2); BOOST_TEST(result->sum() == 1 + 2);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
{ {
std::unique_ptr<type> a1 = boost::make_unique<type>(1, 2, 3); std::unique_ptr<type> result =
BOOST_TEST(a1.get() != 0); boost::make_unique<type>(1, 2, 3);
BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 1); BOOST_TEST(type::instances == 1);
BOOST_TEST(a1->sum == 1 + 2 + 3); BOOST_TEST(result->sum() == 1 + 2 + 3);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
{ {
std::unique_ptr<type> a1 = boost::make_unique<type>(1, 2, 3, 4); std::unique_ptr<type> result =
BOOST_TEST(a1.get() != 0); boost::make_unique<type>(1, 2, 3, 4);
BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 1); BOOST_TEST(type::instances == 1);
BOOST_TEST(a1->sum == 1 + 2 + 3 + 4); BOOST_TEST(result->sum() == 1 + 2 + 3 + 4);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
{ {
std::unique_ptr<type> a1 = boost::make_unique<type>(1, 2, 3, 4, 5); std::unique_ptr<type> result =
BOOST_TEST(a1.get() != 0); boost::make_unique<type>(1, 2, 3, 4, 5);
BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 1); BOOST_TEST(type::instances == 1);
BOOST_TEST(a1->sum == 1 + 2 + 3 + 4 + 5); BOOST_TEST(result->sum() == 1 + 2 + 3 + 4 + 5);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
{ {
std::unique_ptr<type> a1 = boost::make_unique<type>(1, 2, 3, 4, 5, 6); std::unique_ptr<type> result =
BOOST_TEST(a1.get() != 0); boost::make_unique<type>(1, 2, 3, 4, 5, 6);
BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 1); BOOST_TEST(type::instances == 1);
BOOST_TEST(a1->sum == 1 + 2 + 3 + 4 + 5 + 6); BOOST_TEST(result->sum() == 1 + 2 + 3 + 4 + 5 + 6);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
{ {
std::unique_ptr<type> a1 = boost::make_unique<type>(1, 2, 3, 4, 5, 6, 7); std::unique_ptr<type> result =
BOOST_TEST(a1.get() != 0); boost::make_unique<type>(1, 2, 3, 4, 5, 6, 7);
BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 1); BOOST_TEST(type::instances == 1);
BOOST_TEST(a1->sum == 1 + 2 + 3 + 4 + 5 + 6 + 7); BOOST_TEST(result->sum() == 1 + 2 + 3 + 4 + 5 + 6 + 7);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
{ {
std::unique_ptr<type> a1 = boost::make_unique<type>(1, 2, 3, 4, 5, 6, 7, 8); std::unique_ptr<type> result =
BOOST_TEST(a1.get() != 0); boost::make_unique<type>(1, 2, 3, 4, 5, 6, 7, 8);
BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 1); BOOST_TEST(type::instances == 1);
BOOST_TEST(a1->sum == 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8); BOOST_TEST(result->sum() == 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
{ {
std::unique_ptr<type> a1 = boost::make_unique<type>(1, 2, 3, 4, 5, 6, 7, 8, 9); std::unique_ptr<type> result =
BOOST_TEST(a1.get() != 0); boost::make_unique<type>(1, 2, 3, 4, 5, 6, 7, 8, 9);
BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 1); BOOST_TEST(type::instances == 1);
BOOST_TEST(a1->sum == 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9); BOOST_TEST(result->sum() == 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
#endif #endif
return boost::report_errors(); return boost::report_errors();
} }
#else #else
int main()
int main() { {
return 0; return 0;
} }
#endif #endif

View File

@@ -1,26 +1,25 @@
/* /*
* Copyright (c) 2012-2014 Glen Joseph Fernandes Copyright 2014 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License, Distributed under the Boost Software License, Version 1.0.
* Version 1.0. (See accompanying file LICENSE_1_0.txt (http://www.boost.org/LICENSE_1_0.txt)
* or copy at http://boost.org/LICENSE_1_0.txt) */
*/
#include <boost/config.hpp> #include <boost/config.hpp>
#if !defined(BOOST_NO_CXX11_SMART_PTR) #if !defined(BOOST_NO_CXX11_SMART_PTR)
#include <boost/detail/lightweight_test.hpp> #include <boost/detail/lightweight_test.hpp>
#include <boost/smart_ptr/make_unique_array.hpp> #include <boost/smart_ptr/make_unique.hpp>
class type { class type {
public: public:
static unsigned int instances; static unsigned instances;
explicit type() { type() {
instances++; ++instances;
} }
~type() { ~type() {
instances--; --instances;
} }
private: private:
@@ -28,61 +27,61 @@ private:
type& operator=(const type&); type& operator=(const type&);
}; };
unsigned int type::instances = 0; unsigned type::instances = 0;
int main() { int main()
{
{ {
std::unique_ptr<int[]> a1 = boost::make_unique_noinit<int[]>(3); std::unique_ptr<int[]> result =
BOOST_TEST(a1.get() != 0); boost::make_unique_noinit<int[]>(3);
BOOST_TEST(result.get() != 0);
} }
{ {
std::unique_ptr<int[][2]> a1 = boost::make_unique_noinit<int[][2]>(2); std::unique_ptr<int[][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_unique_noinit<int[][2]>(2);
BOOST_TEST(result.get() != 0);
} }
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
{ {
std::unique_ptr<type[]> a1 = boost::make_unique_noinit<type[]>(3); std::unique_ptr<type[]> result =
BOOST_TEST(a1.get() != 0); boost::make_unique_noinit<type[]>(3);
BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
{ {
std::unique_ptr<type[][2]> a1 = boost::make_unique_noinit<type[][2]>(2); std::unique_ptr<type[][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_unique_noinit<type[][2]>(2);
BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
{ {
std::unique_ptr<const type[]> a1 = boost::make_unique_noinit<const type[]>(3); std::unique_ptr<const type[]> result =
BOOST_TEST(a1.get() != 0); boost::make_unique_noinit<const type[]>(3);
BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
{ {
std::unique_ptr<const type[][2]> a1 = boost::make_unique_noinit<const type[][2]>(2); std::unique_ptr<const type[][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_unique_noinit<const type[][2]>(2);
BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
return boost::report_errors(); return boost::report_errors();
} }
#else #else
int main()
int main() { {
return 0; return 0;
} }
#endif #endif

View File

@@ -1,26 +1,25 @@
/* /*
* Copyright (c) 2014 Glen Joseph Fernandes Copyright 2014 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License, Distributed under the Boost Software License, Version 1.0.
* Version 1.0. (See accompanying file LICENSE_1_0.txt (http://www.boost.org/LICENSE_1_0.txt)
* or copy at http://boost.org/LICENSE_1_0.txt) */
*/
#include <boost/config.hpp> #include <boost/config.hpp>
#if !defined(BOOST_NO_CXX11_SMART_PTR) #if !defined(BOOST_NO_CXX11_SMART_PTR)
#include <boost/detail/lightweight_test.hpp> #include <boost/detail/lightweight_test.hpp>
#include <boost/smart_ptr/make_unique_array.hpp> #include <boost/smart_ptr/make_unique.hpp>
class type { class type {
public: public:
static unsigned int instances; static unsigned instances;
explicit type() { type() {
instances++; ++instances;
} }
~type() { ~type() {
instances--; --instances;
} }
private: private:
@@ -28,85 +27,84 @@ private:
type& operator=(const type&); type& operator=(const type&);
}; };
unsigned int type::instances = 0; unsigned type::instances = 0;
int main() { int main()
{
{ {
std::unique_ptr<int[]> a1 = boost::make_unique<int[]>(3); std::unique_ptr<int[]> result = boost::make_unique<int[]>(3);
BOOST_TEST(a1.get() != 0); BOOST_TEST(result.get() != 0);
BOOST_TEST(a1[0] == 0); BOOST_TEST(result[0] == 0);
BOOST_TEST(a1[1] == 0); BOOST_TEST(result[1] == 0);
BOOST_TEST(a1[2] == 0); BOOST_TEST(result[2] == 0);
} }
{ {
std::unique_ptr<int[][2]> a1 = boost::make_unique<int[][2]>(2); std::unique_ptr<int[][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_unique<int[][2]>(2);
BOOST_TEST(a1[0][0] == 0); BOOST_TEST(result.get() != 0);
BOOST_TEST(a1[0][1] == 0); BOOST_TEST(result[0][0] == 0);
BOOST_TEST(a1[1][0] == 0); BOOST_TEST(result[0][1] == 0);
BOOST_TEST(a1[1][1] == 0); BOOST_TEST(result[1][0] == 0);
BOOST_TEST(result[1][1] == 0);
} }
{ {
std::unique_ptr<const int[]> a1 = boost::make_unique<const int[]>(3); std::unique_ptr<const int[]> result =
BOOST_TEST(a1.get() != 0); boost::make_unique<const int[]>(3);
BOOST_TEST(a1[0] == 0); BOOST_TEST(result.get() != 0);
BOOST_TEST(a1[1] == 0); BOOST_TEST(result[0] == 0);
BOOST_TEST(a1[2] == 0); BOOST_TEST(result[1] == 0);
BOOST_TEST(result[2] == 0);
} }
{ {
std::unique_ptr<const int[][2]> a1 = boost::make_unique<const int[][2]>(2); std::unique_ptr<const int[][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_unique<const int[][2]>(2);
BOOST_TEST(a1[0][0] == 0); BOOST_TEST(result.get() != 0);
BOOST_TEST(a1[0][1] == 0); BOOST_TEST(result[0][0] == 0);
BOOST_TEST(a1[1][0] == 0); BOOST_TEST(result[0][1] == 0);
BOOST_TEST(a1[1][1] == 0); BOOST_TEST(result[1][0] == 0);
BOOST_TEST(result[1][1] == 0);
} }
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
{ {
std::unique_ptr<type[]> a1 = boost::make_unique<type[]>(3); std::unique_ptr<type[]> result =
BOOST_TEST(a1.get() != 0); boost::make_unique<type[]>(3);
BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
{ {
std::unique_ptr<type[][2]> a1 = boost::make_unique<type[][2]>(2); std::unique_ptr<type[][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_unique<type[][2]>(2);
BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
{ {
std::unique_ptr<const type[]> a1 = boost::make_unique<const type[]>(3); std::unique_ptr<const type[]> result =
BOOST_TEST(a1.get() != 0); boost::make_unique<const type[]>(3);
BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 3); BOOST_TEST(type::instances == 3);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
{ {
std::unique_ptr<const type[][2]> a1 = boost::make_unique<const type[][2]>(2); std::unique_ptr<const type[][2]> result =
BOOST_TEST(a1.get() != 0); boost::make_unique<const type[][2]>(2);
BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 4); BOOST_TEST(type::instances == 4);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
return boost::report_errors(); return boost::report_errors();
} }
#else #else
int main()
int main() { {
return 0; return 0;
} }
#endif #endif

View File

@@ -1,29 +1,28 @@
/* /*
* Copyright (c) 2014 Glen Joseph Fernandes Copyright 2014 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License, Distributed under the Boost Software License, Version 1.0.
* Version 1.0. (See accompanying file LICENSE_1_0.txt (http://www.boost.org/LICENSE_1_0.txt)
* or copy at http://boost.org/LICENSE_1_0.txt) */
*/
#include <boost/config.hpp> #include <boost/config.hpp>
#if !defined(BOOST_NO_CXX11_SMART_PTR) #if !defined(BOOST_NO_CXX11_SMART_PTR)
#include <boost/detail/lightweight_test.hpp> #include <boost/detail/lightweight_test.hpp>
#include <boost/smart_ptr/make_unique_array.hpp> #include <boost/smart_ptr/make_unique.hpp>
class type { class type {
public: public:
static unsigned int instances; static unsigned instances;
explicit type() { type() {
if (instances == 5) { if (instances == 5) {
throw true; throw true;
} }
instances++; ++instances;
} }
~type() { ~type() {
instances--; --instances;
} }
private: private:
@@ -31,9 +30,10 @@ private:
type& operator=(const type&); type& operator=(const type&);
}; };
unsigned int type::instances = 0; unsigned type::instances = 0;
int main() { int main()
{
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
try { try {
boost::make_unique<type[]>(6); boost::make_unique<type[]>(6);
@@ -41,7 +41,6 @@ int main() {
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
try { try {
boost::make_unique<type[][2]>(3); boost::make_unique<type[][2]>(3);
@@ -49,7 +48,6 @@ int main() {
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
try { try {
boost::make_unique_noinit<type[]>(6); boost::make_unique_noinit<type[]>(6);
@@ -57,7 +55,6 @@ int main() {
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
try { try {
boost::make_unique_noinit<type[][2]>(3); boost::make_unique_noinit<type[][2]>(3);
@@ -65,13 +62,11 @@ int main() {
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
return boost::report_errors(); return boost::report_errors();
} }
#else #else
int main()
int main() { {
return 0; return 0;
} }
#endif #endif

View File

@@ -1,26 +1,25 @@
/* /*
* Copyright (c) 2012-2014 Glen Joseph Fernandes Copyright 2014 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License, Distributed under the Boost Software License, Version 1.0.
* Version 1.0. (See accompanying file LICENSE_1_0.txt (http://www.boost.org/LICENSE_1_0.txt)
* or copy at http://boost.org/LICENSE_1_0.txt) */
*/
#include <boost/config.hpp> #include <boost/config.hpp>
#if !defined(BOOST_NO_CXX11_SMART_PTR) #if !defined(BOOST_NO_CXX11_SMART_PTR)
#include <boost/detail/lightweight_test.hpp> #include <boost/detail/lightweight_test.hpp>
#include <boost/smart_ptr/make_unique_object.hpp> #include <boost/smart_ptr/make_unique.hpp>
class type { class type {
public: public:
static unsigned int instances; static unsigned instances;
explicit type() { type() {
instances++; ++instances;
} }
~type() { ~type() {
instances--; --instances;
} }
private: private:
@@ -28,38 +27,37 @@ private:
type& operator=(const type&); type& operator=(const type&);
}; };
unsigned int type::instances = 0; unsigned type::instances = 0;
int main() { int main()
{
{ {
std::unique_ptr<int> a1 = boost::make_unique_noinit<int>(); std::unique_ptr<int> result = boost::make_unique_noinit<int>();
BOOST_TEST(a1.get() != 0); BOOST_TEST(result.get() != 0);
} }
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
{ {
std::unique_ptr<type> a1 = boost::make_unique_noinit<type>(); std::unique_ptr<type> result =
BOOST_TEST(a1.get() != 0); boost::make_unique_noinit<type>();
BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 1); BOOST_TEST(type::instances == 1);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
{ {
std::unique_ptr<const type> a1 = boost::make_unique_noinit<const type>(); std::unique_ptr<const type> result =
BOOST_TEST(a1.get() != 0); boost::make_unique_noinit<const type>();
BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 1); BOOST_TEST(type::instances == 1);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
return boost::report_errors(); return boost::report_errors();
} }
#else #else
int main()
int main() { {
return 0; return 0;
} }
#endif #endif

View File

@@ -1,26 +1,25 @@
/* /*
* Copyright (c) 2014 Glen Joseph Fernandes Copyright 2014 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License, Distributed under the Boost Software License, Version 1.0.
* Version 1.0. (See accompanying file LICENSE_1_0.txt (http://www.boost.org/LICENSE_1_0.txt)
* or copy at http://boost.org/LICENSE_1_0.txt) */
*/
#include <boost/config.hpp> #include <boost/config.hpp>
#if !defined(BOOST_NO_CXX11_SMART_PTR) #if !defined(BOOST_NO_CXX11_SMART_PTR)
#include <boost/detail/lightweight_test.hpp> #include <boost/detail/lightweight_test.hpp>
#include <boost/smart_ptr/make_unique_object.hpp> #include <boost/smart_ptr/make_unique.hpp>
class type { class type {
public: public:
static unsigned int instances; static unsigned instances;
explicit type() { type() {
instances++; ++instances;
} }
~type() { ~type() {
instances--; --instances;
} }
private: private:
@@ -28,45 +27,44 @@ private:
type& operator=(const type&); type& operator=(const type&);
}; };
unsigned int type::instances = 0; unsigned type::instances = 0;
int main() { int main()
{
{ {
std::unique_ptr<int> a1 = boost::make_unique<int>(); std::unique_ptr<int> result = boost::make_unique<int>();
BOOST_TEST(a1.get() != 0); BOOST_TEST(result.get() != 0);
BOOST_TEST(*a1 == 0); BOOST_TEST(*result == 0);
} }
{ {
std::unique_ptr<const int> a1 = boost::make_unique<const int>(); std::unique_ptr<const int> result =
BOOST_TEST(a1.get() != 0); boost::make_unique<const int>();
BOOST_TEST(*a1 == 0); BOOST_TEST(result.get() != 0);
BOOST_TEST(*result == 0);
} }
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
{ {
std::unique_ptr<type> a1 = boost::make_unique<type>(); std::unique_ptr<type> result =
BOOST_TEST(a1.get() != 0); boost::make_unique<type>();
BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 1); BOOST_TEST(type::instances == 1);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
{ {
std::unique_ptr<const type> a1 = boost::make_unique<const type>(); std::unique_ptr<const type> result =
BOOST_TEST(a1.get() != 0); boost::make_unique<const type>();
BOOST_TEST(result.get() != 0);
BOOST_TEST(type::instances == 1); BOOST_TEST(type::instances == 1);
a1.reset(); result.reset();
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
return boost::report_errors(); return boost::report_errors();
} }
#else #else
int main()
int main() { {
return 0; return 0;
} }
#endif #endif

View File

@@ -1,29 +1,28 @@
/* /*
* Copyright (c) 2014 Glen Joseph Fernandes Copyright 2014 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License, Distributed under the Boost Software License, Version 1.0.
* Version 1.0. (See accompanying file LICENSE_1_0.txt (http://www.boost.org/LICENSE_1_0.txt)
* or copy at http://boost.org/LICENSE_1_0.txt) */
*/
#include <boost/config.hpp> #include <boost/config.hpp>
#if !defined(BOOST_NO_CXX11_SMART_PTR) #if !defined(BOOST_NO_CXX11_SMART_PTR)
#include <boost/detail/lightweight_test.hpp> #include <boost/detail/lightweight_test.hpp>
#include <boost/smart_ptr/make_unique_object.hpp> #include <boost/smart_ptr/make_unique.hpp>
class type { class type {
public: public:
static unsigned int instances; static unsigned instances;
explicit type() { type() {
if (instances == 0) { if (instances == 0) {
throw true; throw true;
} }
instances++; ++instances;
} }
~type() { ~type() {
instances--; --instances;
} }
private: private:
@@ -31,9 +30,10 @@ private:
type& operator=(const type&); type& operator=(const type&);
}; };
unsigned int type::instances = 0; unsigned type::instances = 0;
int main() { int main()
{
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
try { try {
boost::make_unique<type>(); boost::make_unique<type>();
@@ -41,13 +41,11 @@ int main() {
} catch (...) { } catch (...) {
BOOST_TEST(type::instances == 0); BOOST_TEST(type::instances == 0);
} }
return boost::report_errors(); return boost::report_errors();
} }
#else #else
int main()
int main() { {
return 0; return 0;
} }
#endif #endif

View File

@@ -1,58 +1,56 @@
/* /*
* Copyright (c) 2014 Glen Joseph Fernandes Copyright 2014 Glen Joseph Fernandes
* glenfe at live dot com (glenjofe@gmail.com)
*
* Distributed under the Boost Software License, Distributed under the Boost Software License, Version 1.0.
* Version 1.0. (See accompanying file LICENSE_1_0.txt (http://www.boost.org/LICENSE_1_0.txt)
* or copy at http://boost.org/LICENSE_1_0.txt) */
*/
#include <boost/config.hpp> #include <boost/config.hpp>
#if !defined(BOOST_NO_CXX11_SMART_PTR) #if !defined(BOOST_NO_CXX11_SMART_PTR)
#include <boost/detail/lightweight_test.hpp> #include <boost/detail/lightweight_test.hpp>
#include <boost/smart_ptr/make_unique_object.hpp> #include <boost/smart_ptr/make_unique.hpp>
struct type { struct type {
int x; int x;
int y; int y;
}; };
int main() { int main()
{
{ {
std::unique_ptr<type> a1 = boost::make_unique<type>(); std::unique_ptr<type> result = boost::make_unique<type>();
BOOST_TEST(a1.get() != 0); BOOST_TEST(result.get() != 0);
BOOST_TEST(a1->x == 0); BOOST_TEST(result->x == 0);
BOOST_TEST(a1->y == 0); BOOST_TEST(result->y == 0);
} }
{ {
std::unique_ptr<const type> a1 = boost::make_unique<const type>(); std::unique_ptr<const type> result =
BOOST_TEST(a1.get() != 0); boost::make_unique<const type>();
BOOST_TEST(a1->x == 0); BOOST_TEST(result.get() != 0);
BOOST_TEST(a1->y == 0); BOOST_TEST(result->x == 0);
BOOST_TEST(result->y == 0);
} }
#if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) #if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)
{ {
std::unique_ptr<type> a1 = boost::make_unique<type>({ 1, 2 }); std::unique_ptr<type> result =
BOOST_TEST(a1.get() != 0); boost::make_unique<type>({ 1, 2 });
BOOST_TEST(a1->x == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a1->y == 2); BOOST_TEST(result->x == 1);
BOOST_TEST(result->y == 2);
} }
{ {
std::unique_ptr<const type> a1 = boost::make_unique<const type>({ 1, 2 }); std::unique_ptr<const type> result =
BOOST_TEST(a1.get() != 0); boost::make_unique<const type>({ 1, 2 });
BOOST_TEST(a1->x == 1); BOOST_TEST(result.get() != 0);
BOOST_TEST(a1->y == 2); BOOST_TEST(result->x == 1);
BOOST_TEST(result->y == 2);
} }
#endif #endif
return boost::report_errors(); return boost::report_errors();
} }
#else #else
int main()
int main() { {
return 0; return 0;
} }
#endif #endif

View File

@@ -0,0 +1,18 @@
//
// A negative test for unique_ptr const_cast
//
// Copyright 2016 Peter Dimov
//
// Distributed under 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
//
#include <boost/pointer_cast.hpp>
#include <memory>
int main()
{
std::unique_ptr<int> p1( new int );
std::unique_ptr<int[]> p2 = boost::const_pointer_cast<int[]>( std::move( p1 ) );
}

View File

@@ -0,0 +1,18 @@
//
// A negative test for unique_ptr const_cast
//
// Copyright 2016 Peter Dimov
//
// Distributed under 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
//
#include <boost/pointer_cast.hpp>
#include <memory>
int main()
{
std::unique_ptr<int[]> p1( new int[ 1 ] );
std::unique_ptr<int> p2 = boost::const_pointer_cast<int>( std::move( p1 ) );
}

View File

@@ -0,0 +1,29 @@
//
// A negative test for unique_ptr const_cast
//
// Copyright 2016 Peter Dimov
//
// Distributed under 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
//
#include <boost/pointer_cast.hpp>
#include <memory>
struct B
{
virtual ~B()
{
}
};
struct D: B
{
};
int main()
{
std::unique_ptr<D[]> p1( new D[ 1 ] );
std::unique_ptr<B[]> p2 = boost::const_pointer_cast<B[]>( std::move( p1 ) );
}

View File

@@ -0,0 +1,25 @@
//
// A negative test for unique_ptr dynamic_cast
//
// Copyright 2016 Peter Dimov
//
// Distributed under 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
//
#include <boost/pointer_cast.hpp>
#include <memory>
struct B
{
virtual ~B()
{
}
};
int main()
{
std::unique_ptr<B> p1( new B );
std::unique_ptr<B[]> p2 = boost::dynamic_pointer_cast<B[]>( std::move( p1 ) );
}

View File

@@ -0,0 +1,25 @@
//
// A negative test for unique_ptr dynamic_cast
//
// Copyright 2016 Peter Dimov
//
// Distributed under 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
//
#include <boost/pointer_cast.hpp>
#include <memory>
struct B
{
virtual ~B()
{
}
};
int main()
{
std::unique_ptr<B[]> p1( new B[ 1 ] );
std::unique_ptr<B> p2 = boost::dynamic_pointer_cast<B>( std::move( p1 ) );
}

View File

@@ -0,0 +1,29 @@
//
// A negative test for unique_ptr dynamic_cast
//
// Copyright 2016 Peter Dimov
//
// Distributed under 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
//
#include <boost/pointer_cast.hpp>
#include <memory>
struct B
{
virtual ~B()
{
}
};
struct D: B
{
};
int main()
{
std::unique_ptr<D[]> p1( new D[ 1 ] );
std::unique_ptr<B[]> p2 = boost::dynamic_pointer_cast<B[]>( std::move( p1 ) );
}

View File

@@ -0,0 +1,18 @@
//
// A negative test for unique_ptr static_cast
//
// Copyright 2016 Peter Dimov
//
// Distributed under 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
//
#include <boost/pointer_cast.hpp>
#include <memory>
int main()
{
std::unique_ptr<int> p1( new int );
std::unique_ptr<int[]> p2 = boost::static_pointer_cast<int[]>( std::move( p1 ) );
}

View File

@@ -0,0 +1,18 @@
//
// A negative test for unique_ptr static_cast
//
// Copyright 2016 Peter Dimov
//
// Distributed under 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
//
#include <boost/pointer_cast.hpp>
#include <memory>
int main()
{
std::unique_ptr<int[]> p1( new int[ 1 ] );
std::unique_ptr<int> p2 = boost::static_pointer_cast<int>( std::move( p1 ) );
}

View File

@@ -0,0 +1,29 @@
//
// A negative test for unique_ptr static_cast
//
// Copyright 2016 Peter Dimov
//
// Distributed under 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
//
#include <boost/pointer_cast.hpp>
#include <memory>
struct B
{
virtual ~B()
{
}
};
struct D: B
{
};
int main()
{
std::unique_ptr<D[]> p1( new D[ 1 ] );
std::unique_ptr<B[]> p2 = boost::static_pointer_cast<B[]>( std::move( p1 ) );
}

View File

@@ -104,33 +104,25 @@ bool check_const_pointer_cast(const BasePtr &ptr)
const_cast<const base*>(const_cast<base*>(boost::get_pointer(ptr))); const_cast<const base*>(const_cast<base*>(boost::get_pointer(ptr)));
} }
template <class BasePtr>
void check_all_casts(const BasePtr &ptr)
{
#if !defined( BOOST_NO_RTTI )
BOOST_TEST( check_dynamic_pointer_cast( ptr ) );
#endif
BOOST_TEST( check_static_pointer_cast( ptr ) );
BOOST_TEST( check_const_pointer_cast( ptr ) );
}
} }
int main() int main()
{ {
{ boost::shared_ptr<base> boost_shared(new derived);
// Try casts with shared_ptr base *plain = boost_shared.get();
boost::shared_ptr<base> ptr(new derived); check_all_casts(boost_shared);
check_all_casts(plain);
#if !defined( BOOST_NO_RTTI )
BOOST_TEST( check_dynamic_pointer_cast( ptr ) );
#endif
BOOST_TEST( check_static_pointer_cast( ptr ) );
BOOST_TEST( check_const_pointer_cast( ptr ) );
}
{
// Try casts with raw pointer
boost::scoped_ptr<base> ptr(new derived);
#if !defined( BOOST_NO_RTTI )
BOOST_TEST( check_dynamic_pointer_cast( ptr.get() ) );
#endif
BOOST_TEST( check_static_pointer_cast( ptr.get() ) );
BOOST_TEST( check_const_pointer_cast( ptr.get() ) );
}
return boost::report_errors(); return boost::report_errors();
} }

Some files were not shown because too many files have changed in this diff Show More